目錄

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_URLWebhook 的對外網址。沒設定時,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日