目錄
n8n 自架部署:Docker Compose + PostgreSQL + HTTPS
在自己電腦上測試沒問題後,要讓工作流程 24 小時運作、讓 Webhook 和 Telegram 等外部服務連得進來,就需要部署到一台有固定網址的伺服器上。
需要準備
- 一台 Linux 雲端主機(VPS)。輕度使用 1~2 核心、2 GB 記憶體就夠;工作流程多或要跑本機 AI 模型則需要更多。
- 一個網域,並把子網域(例如
n8n.example.com)的 DNS A 記錄指向主機 IP。 - 主機上安裝好 Docker 與 Docker Compose(見 Docker 教學:安裝)。
- 防火牆開放 80、443 連接埠。
架構
網際網路 ──HTTPS──▶ Caddy(自動憑證) ──▶ n8n:5678 ──▶ PostgreSQL
- Caddy:反向代理,自動申請與更新 Let’s Encrypt 憑證
- PostgreSQL:正式使用建議的資料庫(預設的 SQLite 適合個人或測試)
- n8n 與資料庫都不直接對外開放
n8n 2.x 起,MySQL / MariaDB 不再支援作為 n8n 的資料庫,請使用 PostgreSQL 或 SQLite。
檔案
在主機上建立資料夾 /opt/n8n:
/opt/n8n/
├── compose.yaml
├── .env
└── Caddyfile
.env
DOMAIN=n8n.example.com
POSTGRES_PASSWORD=請換成一組很長的隨機密碼
N8N_ENCRYPTION_KEY=請換成另一組很長的隨機字串
產生隨機字串:
openssl rand -hex 32
N8N_ENCRYPTION_KEY用來加密所有憑證。請另外妥善備份,遺失後所有憑證都無法使用。
Caddyfile
{$DOMAIN} {
reverse_proxy n8n:5678
}
compose.yaml
services:
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
environment:
DOMAIN: ${DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
restart: unless-stopped
postgres:
image: postgres:17
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
interval: 5s
retries: 10
restart: unless-stopped
n8n:
image: n8nio/n8n:2.42.7 # 請改成你要使用的固定版本
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_HOST: ${DOMAIN}
N8N_PORT: 5678
N8N_PROTOCOL: https
N8N_WEBHOOK_URL: https://${DOMAIN}/
N8N_PROXY_HOPS: 1
NODE_ENV: production
GENERIC_TIMEZONE: Asia/Taipei
TZ: Asia/Taipei
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 336
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
volumes:
caddy_data:
pg_data:
n8n_data:
重要環境變數說明
| 變數 | 說明 |
|---|---|
N8N_HOST、N8N_PROTOCOL | 對外的網域與協定,影響 OAuth 回呼網址等 |
N8N_WEBHOOK_URL | Webhook 的對外網址。沒設定時,Webhook 節點會顯示 http://localhost:5678/...。n8n 2.30 之前的版本請改用 WEBHOOK_URL |
N8N_PROXY_HOPS | 位於反向代理後方時設為 1,n8n 才能取得使用者的真實 IP |
N8N_ENCRYPTION_KEY | 憑證加密金鑰 |
GENERIC_TIMEZONE | 排程使用的時區 |
EXECUTIONS_DATA_PRUNE、EXECUTIONS_DATA_MAX_AGE | 自動刪除超過指定時數(336 小時 = 14 天)的執行紀錄,避免資料庫無限成長 |
啟動
cd /opt/n8n
docker compose up -d
docker compose logs -f n8n
幾分鐘內 Caddy 會自動取得憑證。打開 https://n8n.example.com,建立擁有者帳號。
請立刻建立帳號。 在設定好擁有者帳號之前,任何連到這個網址的人都可以搶先建立帳號。
安全性建議
- 使用固定版本的映像檔 tag,不要使用
latest,升級前先閱讀版本說明。 - 主機只開放 22、80、443 連接埠,SSH 只允許金鑰登入。
- 為帳號開啟兩步驟驗證(在個人設定中)。
- 不需要的危險節點(例如執行系統指令)在 2.x 中預設已停用,不要隨意開啟。
- 定期備份(見 備份與更新)。
搭配本機 AI 模型
想讓 n8n 使用本機的 Ollama 模型,可以在同一個 compose.yaml 中加入 ollama 服務,見 n8n 串接 Ollama。注意 AI 模型需要較多的記憶體與運算資源,一般的小型 VPS 跑不動。
大量執行:Queue mode
工作流程數量很多、執行頻繁時,可以啟用 queue mode:由主程序接收觸發,交給多個 worker 透過 Redis 佇列平行執行。這屬於進階部署,請參考官方文件的 queue mode 說明。
更新於 2026年10月12日