iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
AI & Data

進擊的 n8n系列 第 16

Day 16:n8n on VM / Bare-Metal 部署的疑難雜症解決分享

  • 分享至 

  • xImage
  •  

上一天的「VM / Bare-Metal 安裝」跟大家分享如何在自己的機器或 VM 上部署。今天就把最常見、最實用的排查與強化整理成一篇排查的清單吧!系統以 Ubuntu/Debian 為例,不使用 Docker。

今天會分享(再次感謝強者我朋友):

  • 3 步驟快速健診(服務、連線、權限)
  • 5 個高命中率修法(Host/Protocol、DB、CA、Queue、加密金鑰)
  • 極簡 systemd 與 Nginx HTTPS
  • 一鍵小工具:n8n-doctor.sh

  1. 三步驟極速健檢
  • 服務狀態 & 日誌
sudo systemctl status n8n --no-pager -l
journalctl -u n8n -n 80 --no-pager
  • 5678 是否在監聽、能 response
ss -lntp | grep 5678 || sudo lsof -i :5678
curl -I http://127.0.0.1:5678

看見 HTTP/1.1 200302 通常代表後端活著。

  • 防火牆(先本機測通,再考慮對外開)
sudo ufw status
sudo ufw allow 5678/tcp

  1. 五個最常見問題
  • 登入卡轉圈、Cookie 混亂(反向代理/子路徑)
    systemd 加這些環境變數(Host/Protocol 跟外部一致):
Environment=N8N_HOST=your.domain.com
Environment=N8N_PORT=5678
Environment=N8N_PROTOCOL=https
# 若走子路徑(例:/n8n)
Environment=N8N_PATH=/n8n
Environment=WEBHOOK_URL=https://your.domain.com/n8n/

套用:sudo systemctl daemon-reload && sudo systemctl restart n8n

  • Postgres 連不上 / SQLite 被鎖
    建帳號與 DB,先本機測通:
sudo -u postgres createuser -P n8n
sudo -u postgres createdb -O n8n n8n
psql "postgresql://n8n:<密碼>@127.0.0.1:5432/n8n" -c 'select now();'

systemd(或 .env)對應:

Environment=DB_TYPE=postgresdb
Environment=DB_POSTGRESDB_HOST=127.0.0.1
Environment=DB_POSTGRESDB_DATABASE=n8n
Environment=DB_POSTGRESDB_USER=n8n
Environment=DB_POSTGRESDB_PASSWORD=<密碼>
  • 公司自簽/企業 CA 導致外連失敗
Environment=NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/company-root.pem

放入 PEM 後:

sudo update-ca-certificates
sudo systemctl restart n8n
  • Queue Mode / Webhook 404
    單機先確定 Redis 啟用後再開 Queue:
Environment=EXECUTIONS_MODE=queue
Environment=QUEUE_BULL_REDIS_HOST=127.0.0.1
Environment=QUEUE_BULL_REDIS_PORT=6379
# 有密碼/TLS再加:
# Environment=QUEUE_BULL_REDIS_PASSWORD=******
# Environment=QUEUE_BULL_REDIS_TLS=true

Webhook 多半是 外部 URL 不一致:請務必正確設定 WEBHOOK_URL(含協定、網域、子路徑)。

  • 重裝後 Credentials 消失
    固定加密金鑰(只做一次):
openssl rand -base64 32

放入:

Environment=N8N_ENCRYPTION_KEY=<上面那串>

  1. 極簡版的 systemd
  • 建使用者與目錄
sudo useradd -r -s /usr/sbin/nologin -m -d /var/lib/n8n n8n || true
sudo mkdir -p /var/log/n8n /etc/n8n
sudo chown -R n8n:n8n /var/lib/n8n /var/log/n8n
  • /etc/n8n/.env(集中管理環境)
sudo tee /etc/n8n/.env >/dev/null <<'EOF'
N8N_ENCRYPTION_KEY=請換成你自己的超長金鑰
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=127.0.0.1
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=n8npass
# 可選:之後要開 Queue 再解註
# EXECUTIONS_MODE=queue
# QUEUE_BULL_REDIS_HOST=127.0.0.1
# QUEUE_BULL_REDIS_PORT=6379
# WEBHOOK_URL=https://your.domain.com/
# N8N_HOST=your.domain.com
# N8N_PROTOCOL=https
EOF
sudo chmod 640 /etc/n8n/.env
sudo chown n8n:root /etc/n8n/.env
  • /etc/systemd/system/n8n.service ExecStart 路徑以 which n8n 為準(常見:/usr/bin/n8n
[Unit]
Description=n8n Automation
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=n8n
Group=n8n
EnvironmentFile=-/etc/n8n/.env
WorkingDirectory=/var/lib/n8n
ExecStart=/usr/bin/n8n
Restart=always
RestartSec=5

# 基本安全強化
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/n8n /var/log/n8n /etc/n8n

[Install]
WantedBy=multi-user.target

啟用:

sudo systemctl daemon-reload
sudo systemctl enable --now n8n

  1. Nginx 反向代理 + HTTPS
sudo apt install -y nginx certbot python3-certbot-nginx

/etc/nginx/sites-available/n8n:
server {
  listen 80;
  server_name your.domain.com;

  location / {
    proxy_pass http://127.0.0.1:5678/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

啟用 + 憑證:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d your.domain.com

若是走 sun path /n8n,請同步在環境變數設定 N8N_PATH=/n8nWEBHOOK_URL=https://your.domain.com/n8n/(結尾要有斜線)。


  1. 建立 Doctor(存成 n8n-doctor.sh
#!/usr/bin/env bash
set -euo pipefail
echo "== Service ==" && systemctl is-active n8n && systemctl is-enabled n8n
echo "== Port 5678 ==" && (ss -lntp | grep 5678 || echo "not listening")
echo "== Curl local ==" && (curl -sS -I http://127.0.0.1:5678 | head -n1 || true)
echo "== Logs (tail) ==" && journalctl -u n8n -n 60 --no-pager
echo "== Env check ==" && (grep -E 'N8N_ENCRYPTION_KEY|DB_TYPE|WEBHOOK_URL|N8N_HOST|N8N_PROTOCOL|EXECUTIONS_MODE' /etc/n8n/.env || true)

使用:

chmod +x n8n-doctor.sh
./n8n-doctor.sh

  1. Queue Mode:本機安裝 Redis
# 安裝並啟動 Redis
sudo apt install -y redis
sudo systemctl enable --now redis-server
redis-cli PING  # 應回 PONG

# 在 /etc/n8n/.env 加入以下設定
EXECUTIONS_MODE=queue
QUEUE_BULL_REDIS_HOST=127.0.0.1
QUEUE_BULL_REDIS_PORT=6379

# 套用
sudo systemctl restart n8n

# 驗證(看到 bull:* 代表 n8n 的 queue 成功套用)
redis-cli --scan --pattern 'bull:*' | head

上一篇
Day 15:n8n 在 VM / Bare Metal 部署流程
下一篇
Day 17:快速部署 n8n on Google Cloud Run
系列文
進擊的 n8n25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言