Blog

ติดตั้ง n8n แบบกระจายโหลดด้วย Docker + Redis + PostgreSQL ง่ายๆ ในไม่กี่ขั้นตอน

n8n คือเครื่องมือ Workflow Automation แบบโอเพนซอร์ส ที่ช่วยให้คุณเชื่อมต่อบริการและระบบต่าง ๆ เข้าด้วยกันโดยไม่ต้องเขียนโค้ดมากนัก เหมาะสำหรับงานอัตโนมัติ เช่น ส่งอีเมล แจ้งเตือน ดึงข้อมูล API หรือประมวลผลข้อมูล

แต่ถ้าใช้งานแค่ Single Node อาจเจอปัญหาโหลดสูงหรือทำงานช้าเมื่อ workflow มีจำนวนมาก ดังนั้นในบทความนี้เราจะมาเรียนรู้การ ติดตั้ง n8n แบบกระจายโหลด (Multi-Node / Queue Mode) ด้วย Docker + Redis + PostgreSQL บนเครื่องคอมพิวเตอร์ของคุณง่าย ๆ ในไม่กี่ขั้นตอน เพื่อให้ระบบทำงานได้เสถียรและรองรับการขยายตัวในอนาคต.


ในบทความนี้จะเป็นการ ทดสอบติดตั้งบนเครื่องคอมพิวเตอร์ระบบปฏิบัติการ Windows โดยใช้ Docker Desktop เป็นหลัก ขั้นตอนต่าง ๆ สามารถประยุกต์ใช้กับ Linux หรือ macOS ได้เช่นกัน เพียงแค่แตกต่างกันเล็กน้อยในคำสั่งและการตั้งค่า


ขั้นแรก ให้ทำการสร้างโฟลเดอร์สำหรับเก็บไฟล์ติดตั้งและการตั้งค่าต่าง ๆ ของ n8n โดยในบทความนี้เราจะใช้ชื่อว่า n8n-docker


จากนั้นสร้างไฟล์ .env และ docker-compose.yml ในโฟลเดอร์ n8n-docker


แก้ไขไฟล์ .env สำหรับเก็บค่าตัวแปร (Environment Variables) ที่จะใช้ร่วมกับ docker-compose.yml

# postgreSQL
POSTGRES_USER=n8nTest
POSTGRES_PASSWORD=n8nTest@DB
POSTGRES_DB=n8n
# n8n
N8N_ENCRYPTION_KEY=WYfsfrihvynh4EIXTeHXSKGyNQE97Z17lh0C3RBaa1M=


อธิบายการตั้งค่า

POSTGRES_USER: ชื่อผู้ใช้สำหรับฐานข้อมูล PostgreSQL

POSTGRES_PASSWORD: รหัสผ่านของฐานข้อมูล

POSTGRES_DB: ชื่อฐานข้อมูลที่จะสร้างขึ้นมาให้ n8n ใช้งาน

N8N_ENCRYPTION_KEY: รหัสเข้ารหัสสำหรับปกป้องข้อมูลสำคัญในระบบ n8n (เช่น credentials)


แก้ไขไฟล์ docker-compose.yml เพื่อกำหนด service ต่าง ๆ ที่จำเป็นสำหรับการรัน n8n แบบกระจายโหลด

services:
postgres:
image: postgres:16
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- ./pg_data:/var/lib/postgresql/data

redis:
image: redis:7
restart: always
volumes:
- ./redis_data:/data

n8n-main:
image: n8nio/n8n:1.107.4
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=localhost
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=development
- WEBHOOK_URL=http://localhost:5678/
- TZ=Asia/Bangkok
- GENERIC_TIMEZONE=Asia/Bangkok
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
- postgres
- redis

n8n-worker:
image: n8nio/n8n:1.107.4
restart: always
command: worker
environment:
- NODE_ENV=development
- TZ=Asia/Bangkok
- GENERIC_TIMEZONE=Asia/Bangkok
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
- postgres
- redis


อธิบายการตั้งค่า

postgres:

- ใช้ image postgres:16

- อ่านค่า user, password, database จากไฟล์ .env

- เก็บข้อมูลถาวรในโฟลเดอร์ ./pg_data

redis

- ใช้ image redis:7 สำหรับทำงานเป็น queue

- เก็บข้อมูลถาวรในโฟลเดอร์ ./redis_data

n8n-main

- ใช้ image n8nio/n8n:1.107.4

- เปิดพอร์ต 5678 สำหรับเข้าถึง UI

- เชื่อมต่อ PostgreSQL และ Redis

- ตั้งค่าให้ทำงานใน Queue Mode (EXECUTIONS_MODE=queue)

- ใช้ ./n8n_data เก็บข้อมูลของ n8n (credentials, workflows)

n8n-worker

- ใช้ image เดียวกับ n8n-main แต่รันคำสั่ง worker

- ทำหน้าที่ประมวลผลงานที่ส่งเข้ามาใน queue

- สามารถเพิ่มหลาย worker ได้เพื่อกระจายโหลด

- ใช้ environment และ volume เหมือน n8n-main


เมื่อเราเตรียมไฟล์ .env และ docker-compose.yml เสร็จเรียบร้อยแล้ว สามารถเริ่มรันระบบทั้งหมดได้ด้วยคำสั่ง

docker compose up -d --build --remove-orphans --scale n8n-worker=4


อธิบายคำสั่ง

docker compose up (สั่งให้ Docker Compose รัน service ตามที่กำหนดใน docker-compose.yml)


-d (detached mode รัน container แบบ background ไม่ผูกกับ terminal)


--build (บังคับให้ Docker ทำการ build image ใหม่อีกครั้ง)


--remove-orphans (ลบ container/service ที่ไม่ได้อยู่ในไฟล์ docker-compose.yml ปัจจุบัน)


--scale n8n-worker=4 (กำหนดให้ service n8n-worker รัน 4 instance พร้อมกัน)



คำสั่งนี้จะทำการรัน PostgreSQL, Redis, n8n-main และ n8n-worker แบบเบื้องหลัง (detached mode) จากนั้นคุณสามารถตรวจสอบ container ว่าทำงานอยู่หรือไม่ด้วยคำสั่ง:

docker ps



หากทุกอย่างปกติ คุณจะเห็น container ทั้งหมดทำงานอยู่ และสามารถเปิด n8n UI ผ่านเบราว์เซอร์ได้ที่ http://localhost:5678


เสร็จสิ้นการติดตั้ง n8n แบบกระจายโหลด


หากต้องการทดสอบการกระจายโหลด ให้ทำการสร้าง Workflow ขึ้นมา แล้วทดสอบให้ Workflow นั้นทำงานจำนวนมาก จากนั้นใช้คำสั่ง

docker logs -f worker_container_name


หาก Workflow ทำงาน เราจะเห็นว่า worker_container_name มีการรับคิวงานมาประมวลผล


ด้วยวิธีนี้ เราจะได้ระบบ n8n ที่เสถียรและรองรับการทำงานจำนวนมาก เหมาะทั้งสำหรับการทดสอบบนเครื่องส่วนตัว และการต่อยอดไปใช้งานจริงในระดับ Production

บทความนี้มีประโยชน์หรือไม่? (9)
Share
Share Facbook Share Twitter
 

e-Profile RMUTL

เว็บไซต์สำหรับแสดงโปรไฟล์ ผลงาน และข้อมูลวิชาการของบุคลากร

มหาวิทยาลัยเทคโนโลยีราชมงคลล้านนา