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。