↓

n8n 伺服器自架攻略:使用 Docker Compose 快速部署你的自動化工作流中心!

··
資訊科技應用 伺服器管理 N8n 自動化 伺服器部署 工作流

n8n 是開源的視覺化工作流工具,可以把各種服務串成自動化流程。雲端版需要付費,自架則只需要一台常開的機器。這篇整理在 Ubuntu 22.04 上用 Docker Compose 部署 n8n 的完整步驟,設定的重點是資料要能持久保存,以及重開機後位址不會變。


1. 前置準備
#

確認 Docker 環境
#

docker -v
docker compose version

兩個指令都要有版本輸出。Compose 請用 V2(指令是 docker compose,中間沒有連字號)。

固定伺服器 IP
#

n8n 的 Webhook 需要一個穩定的位址。如果伺服器 IP 是 DHCP 配發的,重開機後可能改變,原本設定好的 Webhook 就失效了。以下以 192.168.0.103 為例,請依自己的網路環境調整:

參數 範例值
IP 位址 192.168.0.103/24
閘道器 192.168.0.1
DNS 8.8.8.8、8.8.4.4

用 nmcli 設定(網卡名稱請先用 nmcli device 確認,這裡是 enp6s0):

nmcli connection modify enp6s0 \
  ipv4.method manual \
  ipv4.addresses 192.168.0.103/24 \
  ipv4.gateway 192.168.0.1 \
  ipv4.dns "8.8.8.8 8.8.4.4" \
  autoconnect yes
nmcli connection up enp6s0

如果是透過 SSH 連線操作,執行 nmcli connection up 時連線可能會中斷。確認新 IP 無誤再執行,並用新位址重新連線。


2. 建立專案
#

目錄與權限
#

n8n 容器內是以 UID 1000 的 node 使用者執行,資料目錄必須讓這個使用者可寫:

mkdir -p n8n-server/n8n-data
cd n8n-server
sudo chown 1000:1000 n8n-data

.env
#

nano .env
N8N_HOST=192.168.0.103
N8N_PORT=5678
N8N_PROTOCOL=http
WEBHOOK_URL=http://192.168.0.103:5678/
GENERIC_TIMEZONE=Asia/Taipei
TZ=Asia/Taipei

# 用 http 透過區網 IP 存取時必須關閉,否則登入頁會提示 secure cookie 錯誤
# 之後改用 HTTPS 就應該移除這一行
N8N_SECURE_COOKIE=false

這裡沒有設定帳號密碼。較新版本的 n8n 已經移除 Basic Auth 的環境變數,第一次開啟網頁時會引導你建立擁有者帳號,密碼在那個畫面自己設定即可。

.env 如果放進 Git 倉庫,記得先加進 .gitignore。

docker-compose.yml
#

nano docker-compose.yml
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n-server
    restart: always
    env_file: .env
    ports:
      - "5678:5678"
    volumes:
      - ./n8n-data:/home/node/.n8n

幾個要注意的地方:

  • 資料目錄必須掛載到 /home/node/.n8n。n8n 把資料庫、Credentials 和加密金鑰都放在這裡,掛到別的路徑,容器一刪除,所有工作流就消失了。
  • env_file 會把 .env 整份載入容器,不需要在 environment 逐項列出。
  • 新版 Compose 不再需要 version: 欄位。
  • 上面用 latest 方便跑起來;正式使用建議改成固定的版本號,避免某次 pull 之後行為改變。

3. 啟動與驗證
#

Docker 權限
#

如果執行 docker 時出現 permission denied,把目前使用者加入 docker 群組:

sudo usermod -aG docker $USER

加入群組後必須登出再重新登入才會生效。

啟動
#

docker compose up -d
docker ps --filter name=n8n-server

STATUS 欄位顯示 Up ... 就是成功。要看啟動日誌:

docker logs -f n8n-server

開放防火牆
#

sudo ufw status

如果狀態是 active,需要放行 5678:

sudo ufw allow 5678/tcp
sudo ufw reload

連線
#

  • 區網內其他電腦:http://192.168.0.103:5678
  • 伺服器本機:http://localhost:5678

第一次進入會要求建立擁有者帳號。


4. 驗證資料有被保存
#

建議部署完成後立刻確認一次,不要等到出問題才發現:

docker compose down
docker compose up -d

重新登入後,剛才建立的帳號和工作流都還在,就代表資料目錄掛載正確。如果被要求重新建立帳號,表示資料沒有寫到 n8n-data,回頭檢查 volumes 的路徑。


5. 常見問題
#

狀況 處理方式
瀏覽器顯示 Error connecting to n8n 確認防火牆已放行 5678;在伺服器本機改用 localhost 測試;檢查路由器是否開啟客戶端隔離(Client Isolation),這會讓區網內的裝置彼此連不到
登入頁出現 secure cookie 相關提示 用 http 透過 IP 存取時的預期行為,在 .env 加上 N8N_SECURE_COOKIE=false 後重啟容器;長期做法是改用 HTTPS
permission denied 或連不到 Docker daemon 確認已加入 docker 群組,並且重新登入過
容器啟動後馬上退出 先用 docker logs n8n-server 看錯誤;最常見的原因是 n8n-data 目錄的擁有者不是 UID 1000,重新執行 sudo chown 1000:1000 n8n-data
Telegram 等服務的 Webhook 收不到事件 這類服務要求公開的 HTTPS 網址,區網 IP 不行。需要用反向代理或 Tunnel 對外提供 HTTPS,並把 WEBHOOK_URL 改成該網址

最後一項是區網自架最容易遇到的限制。如果工作流只由排程或手動觸發,目前的設定就夠用;要接 Telegram Bot 這類需要回呼的服務,就得先處理對外的 HTTPS。