Ubuntu 24.04.3 LTS 自架 Snipe‑IT(資產管理系統

摘要:這篇文章示範如何在 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

上一篇
下一篇