摘要:這篇文章示範如何在 Ubuntu 24.04.3 LTS 自架 Snipe‑IT(資產管理系統),採用 Nginx + PHP‑FPM 8.3 + MariaDB + Composer。內含一條條可直接貼上的指令、.env 設定、Nginx 站台檔、Cron/Queue、Let’s Encrypt SSL、升級與疑難排解。
適用情境:自管主機或 VM、公司內網 PoC、需要自訂與長期維運的環境。
0. 前置準備
- Ubuntu 24.04.3 LTS(實體機或 VM)
- 可連網安裝套件與憑證
- sudo 權限帳號
sudo apt update && sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Taipei
# 防火牆
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # 同時開 80/443
sudo ufw --force enable
sudo ufw status
1. 安裝 Nginx / MariaDB / PHP 8.3 / Composer
sudo apt install -y nginx mariadb-server unzip git
sudo apt install -y php8.3-fpm php8.3-cli php8.3-mysql php8.3-xml php8.3-mbstring \
php8.3-gd php8.3-curl php8.3-zip php8.3-bcmath php8.3-intl php8.3-gmp php8.3-ldap
sudo apt install -y composer
sudo systemctl enable --now nginx php8.3-fpm mariadb
php -v && composer --version
2. 建立資料庫與帳號
先準備一組資料庫密碼(請自行更換為強密碼)。
DB_PASS='Strong!Snipe2025'
sudo mysql -u root -e "CREATE DATABASE snipeit CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -u root -e "CREATE USER 'snipeit'@'localhost' IDENTIFIED BY '${DB_PASS}';"
sudo mysql -u root -e "GRANT ALL PRIVILEGES ON snipeit.* TO 'snipeit'@'localhost'; FLUSH PRIVILEGES;"
3. 佈署 Snipe‑IT 程式碼
sudo mkdir -p /var/www
sudo chown -R $USER:$USER /var/www
cd /var/www
composer create-project --no-dev --prefer-dist snipe/snipe-it snipe-it
cd /var/www/snipe-it
cp .env.example .env
4. 設定 .env(語系、時區、URL、DB)
SITE_URL="http://192.168.0.191" # 先用裸 IP,之後再換網域
DB_PASS='Strong!Snipe2025'
sed -i "s|^APP_ENV=.*|APP_ENV=production|" .env
sed -i "s|^APP_DEBUG=.*|APP_DEBUG=false|" .env
sed -i "s|^APP_URL=.*|APP_URL=${SITE_URL}|" .env
sed -i "s|^APP_TIMEZONE=.*|APP_TIMEZONE=Asia/Taipei|" .env
sed -i "s|^APP_LOCALE=.*|APP_LOCALE=zh-TW|" .env
sed -i "s|^DB_DATABASE=.*|DB_DATABASE=snipeit|" .env
sed -i "s|^DB_USERNAME=.*|DB_USERNAME=snipeit|" .env
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" .env
# 產生 APP_KEY
php artisan key:generate
5. 權限與符號連結
sudo chown -R www-data:www-data /var/www/snipe-it
sudo find /var/www/snipe-it/storage -type d -exec chmod 775 {} \;
sudo find /var/www/snipe-it/bootstrap/cache -type d -exec chmod 775 {} \;
sudo -u www-data php /var/www/snipe-it/artisan storage:link
# www-data 的 Composer 快取(避免權限問題)
sudo mkdir -p /var/www/.config/composer
sudo chown -R www-data:www-data /var/www/.config
6. Nginx 站台設定
sudo tee /etc/nginx/sites-available/snipe-it >/dev/null <<'EOF'
server {
listen 80;
server_name _; # 之後改為你的網域,例如 asset.example.com
root /var/www/snipe-it/public;
index index.php index.html;
client_max_body_size 32m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
location ~* \.(?:htaccess|htpasswd)$ {
deny all;
}
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}
EOF
sudo ln -s /etc/nginx/sites-available/snipe-it /etc/nginx/sites-enabled/snipe-it
sudo nginx -t && sudo systemctl reload nginx
7. 初始化資料庫(可走精靈或 CLI)
開瀏覽器跑安裝精靈建立第一個管理者;或用 CLI 直接遷移:
sudo -u www-data php /var/www/snipe-it/artisan migrate --force
打開:http://192.168.0.191(或你的網域)。
8. 排程(cron)與 Queue(systemd)
Cron(每分鐘)
echo "* * * * * www-data php /var/www/snipe-it/artisan schedule:run >/dev/null 2>&1" \
| sudo tee /etc/cron.d/snipeit-schedule
sudo systemctl restart cron
Queue worker(systemd)
sudo tee /etc/systemd/system/snipeit-queue.service >/dev/null <<'EOF'
[Unit]
Description=Snipe-IT Queue Worker
After=network.target
[Service]
User=www-data
Group=www-data
Restart=always
RestartSec=3
WorkingDirectory=/var/www/snipe-it
ExecStart=/usr/bin/php /var/www/snipe-it/artisan queue:work --sleep=3 --tries=3 --max-time=3600
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now snipeit-queue
systemctl status snipeit-queue --no-pager
9. 綁網域與免費 SSL(Let’s Encrypt)
DNS A 記錄指向伺服器 IP,並在站台把 server_name 改成你的網域,再執行:
sudo snap install core && sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx -d asset.example.com -m you@example.com \
--agree-tos --redirect --no-eff-email
10. 郵件(SMTP)設定
sed -i "s|^MAIL_MAILER=.*|MAIL_MAILER=smtp|" .env
sed -i "s|^MAIL_HOST=.*|MAIL_HOST=smtp.yourmail.tld|" .env
sed -i "s|^MAIL_PORT=.*|MAIL_PORT=587|" .env
sed -i "s|^MAIL_USERNAME=.*|MAIL_USERNAME=noreply@yourmail.tld|" .env
sed -i "s|^MAIL_PASSWORD=.*|MAIL_PASSWORD=SuperSecretPass|" .env
sed -i "s|^MAIL_ENCRYPTION=.*|MAIL_ENCRYPTION=tls|" .env
sed -i "s|^MAIL_FROM_ADDR=.*|MAIL_FROM_ADDR=noreply@yourmail.tld|" .env
sed -i "s|^MAIL_FROM_NAME=.*|MAIL_FROM_NAME=\"Snipe-IT\"|" .env
sudo systemctl reload php8.3-fpm
11. 上傳大小(413 修正)
sudo sed -i 's/^upload_max_filesize.*/upload_max_filesize = 32M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/^post_max_size.*/post_max_size = 32M/' /etc/php/8.3/fpm/php.ini
sudo systemctl reload php8.3-fpm
# Nginx 已於站台設定 client_max_body_size 32m
12. 升級流程(安全版)
cd /var/www/snipe-it
sudo -u www-data php artisan down
sudo -u www-data composer update --no-dev --prefer-dist
sudo -u www-data php artisan migrate --force
sudo -u www-data php artisan config:cache
sudo -u www-data php artisan route:cache
sudo -u www-data php artisan view:cache
sudo -u www-data php artisan up
sudo systemctl restart snipeit-queue
13. 備份與還原
# DB 備份
sudo mysqldump -u root -p snipeit | gzip > /root/snipeit-$(date +%F).sql.gz
# 檔案備份(含 .env / uploads / storage)
sudo tar -czf /root/snipeit-files-$(date +%F).tar.gz \
-C /var/www snipe-it/.env snipe-it/public/uploads snipe-it/storage
14. 快速除錯字典
500 Internal Server Error:未產生 APP_KEY、權限錯、缺模組、或快取髒掉。
# 產生 APP_KEY
php artisan key:generate
# 權限(storage / bootstrap/cache)
sudo chown -R www-data:www-data /var/www/snipe-it/{storage,bootstrap/cache}
sudo find /var/www/snipe-it/{storage,bootstrap/cache} -type d -exec chmod 775 {} \;
# 清快取
sudo -u www-data php /var/www/snipe-it/artisan config:clear
sudo -u www-data php /var/www/snipe-it/artisan cache:clear
sudo -u www-data php /var/www/snipe-it/artisan view:clear
502 Bad Gateway:PHP‑FPM 掛了或 socket 路徑不對(Ubuntu 24:/run/php/php8.3-fpm.sock)。
systemctl status php8.3-fpm
journalctl -u php8.3-fpm -f
sudo tail -n 50 /var/log/nginx/error.log
瀏覽器超時:多半是防火牆未開 80/443 或上游阻擋。
sudo ufw allow 80,443/tcp
sudo tcpdump -i any -nn port 80 -c 10 # 看封包是否進主機
15. 一鍵診斷(3 分鐘定位)
IP="192.168.0.191" # 換成你的伺服器 IP
sudo bash -c '
echo "=== 1) IPv4 位址 ==="; ip -4 addr | awk "/inet /{print \$2, \"on\", \$NF}";
echo; echo "=== 2) Route/GW ==="; ip route | sed -n "1,5p";
echo; echo "=== 3) 服務啟動 ==="; systemctl is-active nginx php8.3-fpm mariadb || true;
echo; echo "=== 4) 80/443 監聽 ==="; ss -ltnp | awk "NR==1 || /:80 |:443 /";
echo; echo "=== 5) UFW 狀態 ==="; ufw status numbered || true;
echo; echo "=== 6) Nginx 檢查 ==="; nginx -t 2&1;
echo; echo "=== 7) 本機/對外自測 ==="; curl -I --max-time 3 http://127.0.0.1 2>/dev/null | head -n1; curl -I --max-time 3 http://'"$IP"' 2>/dev/null | head -n1
'
附錄:下載原始 HackMD 版
需要 Markdown 版本?下載:Snipe-IT_Ubuntu24.04.3_zh-TW_HackMD.md