iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
AI & Data

進擊的 n8n系列 第 13

Day 13:最簡單的本機部署+n8n 提供的 Queue Mode

  • 分享至 

  • xImage
  •  

今日目標:用 Docker Compose 在本機 run Postgres + Redis Cluster(3主3從) + n8n Main + n8n Worker,驗證 Queue Mode。


  1. docker-compose.yml
    把下面整段存成 docker-compose.yml:
services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: n8n
      POSTGRES_DB: n8n
    volumes:
      - pgdata:/var/lib/postgresql/data

  # --- Redis Cluster (3 masters + 3 replicas) ---
  # 密碼:bitnami;所有節點互相認得彼此的主機名(service name)
  redis-node-0:
    image: docker.io/bitnami/redis-cluster:7.4
    environment:
      - REDIS_PASSWORD=bitnami
      - REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5
    # 若要用 redis-cli 測,開放一個節點的 6379 方便連
    ports:
      - "6379:6379"

  redis-node-1:
    image: docker.io/bitnami/redis-cluster:7.4
    environment:
      - REDIS_PASSWORD=bitnami
      - REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-2:
    image: docker.io/bitnami/redis-cluster:7.4
    environment:
      - REDIS_PASSWORD=bitnami
      - REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-3:
    image: docker.io/bitnami/redis-cluster:7.4
    environment:
      - REDIS_PASSWORD=bitnami
      - REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  redis-node-4:
    image: docker.io/bitnami/redis-cluster:7.4
    environment:
      - REDIS_PASSWORD=bitnami
      - REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5

  # 叢集建立者(等前 5 個起來,再建立 3 主 3 從)
  redis-node-5:
    image: docker.io/bitnami/redis-cluster:7.4
    depends_on:
      - redis-node-0
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
    environment:
      - REDIS_PASSWORD=bitnami
      - REDISCLI_AUTH=bitnami
      - REDIS_CLUSTER_REPLICAS=1
      - REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5
      - REDIS_CLUSTER_CREATOR=yes

  # (可選)RedisInsight:用網頁看 cluster
  redis-insight:
    image: redis/redisinsight:latest
    restart: always
    ports:
      - "5540:5540"

  n8n-main:
    image: n8nio/n8n:latest
    depends_on:
      - postgres
      - redis-node-5
    ports:
      - "5678:5678"
    environment:
      N8N_ENCRYPTION_KEY: changeme-super-secret
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: n8n
      EXECUTIONS_MODE: queue
      # --- Redis Cluster 連線(逗號分隔 host:port)---
      QUEUE_BULL_REDIS_CLUSTER_NODES: "redis-node-0:6379,redis-node-1:6379,redis-node-2:6379"
      QUEUE_BULL_REDIS_PASSWORD: "bitnami"
      QUEUE_BULL_REDIS_USERNAME: "default"
      # 僅 main 啟用 triggers/webhooks
      N8N_RUNNERS_ENABLED: "false"

  n8n-worker:
    image: n8nio/n8n:latest
    depends_on:
      - postgres
      - redis-node-5
      - n8n-main
    environment:
      N8N_ENCRYPTION_KEY: changeme-super-secret
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: n8n
      EXECUTIONS_MODE: queue
      # --- 同樣使用 Cluster 連線 ---
      QUEUE_BULL_REDIS_CLUSTER_NODES: "redis-node-0:6379,redis-node-1:6379,redis-node-2:6379"
      QUEUE_BULL_REDIS_PASSWORD: "bitnami"
      QUEUE_BULL_REDIS_USERNAME: "default"
      N8N_DISABLE_PRODUCTION_MAIN_PROCESS: "true"
    command: ["worker"]

volumes:
  pgdata:
  1. 啟動與觀察
docker compose pull
docker compose up -d
docker compose ps
# 觀察叢集建立(看 redis-node-5)
docker compose logs -f redis-node-5   # 出現 "Cluster correctly created" 類訊息即可 Ctrl+C
  1. 開 UI、建最小測試 Workflow
  • 打開 http://localhost:5678 建立帳號
  • 建一個 Interval Trigger(每 1 分鐘) → Code (JavaScript):
const tz = 'Asia/Taipei';
const now = new Date();
const formatted = new Intl.DateTimeFormat('zh-TW', { timeZone: tz, dateStyle: 'medium', timeStyle: 'medium', hourCycle: 'h23' }).format(now);
console.log(`[Time][${tz}]`, formatted);
return [{ message: '報時', tz, nowIso: now.toISOString(), nowLocal: formatted }];
  • 點 Activate 讓它定時觸發
  1. 驗證「Queue Mode」
    A. 看 Worker 日誌
  • docker compose logs -f n8n-worker
  • 每次觸發會看到:Worker 開始接到任務 → 你的 console.log → 完成。
    B. Queue Mode 觀察
docker compose stop n8n-worker
# 在 UI 點一次 Execute once
docker compose exec redis-node-0 redis-cli -a bitnami -c --scan --pattern "bull:*:wait" \
| xargs -I{} sh -c 'echo -n "{} => "; docker compose exec -T redis-node-0 redis-cli -a bitnami -c LLEN {}'
# 看到 wait > 0 就代表任務在 Queue 中等 Worker 接手
docker compose start n8n-worker
docker compose logs -f n8n-worker   # 會把剛剛的 workflow 任務慢慢消耗掉
  1. 一行擴充多個 Worker
docker compose up -d --scale n8n-worker=3
docker compose ps

觀察日誌會看到 3 個 Worker 輪流去跟 n8n main 拿取任務。

  1. 常見錯誤速解
  • Port already in use:lsof -i :5678/:6379 殺掉舊程式或修改 port mapping。
  • bitnami/redis-cluster image 如果拉不到:改 :latest;或改官方 redis:7 + 自建 cluster。
  • n8n UI 起來但 Worker 沒跑:檢查 N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true 是否只在 worker;Main 有 N8N_RUNNERS_ENABLED=false
  • Webhook 404:記得在正式環境設定 WEBHOOK_URL(含協定/網域/子路徑)。
  1. 清掉資源
docker compose down
docker compose down -v   # 連 volumes 一起清(會刪 DB)

上一篇
Day 12:n8n Queue Mode 架構與設計理念
下一篇
Day 14:最簡單的本機部署+n8n 提供的 Queue Mode 常見問題整理分享
系列文
進擊的 n8n14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言