คำตอบสั้น ๆ: ติดตั้ง n8n เชื่อมระบบต่าง ๆ เข้าด้วยกันโดยไม่ต้องเขียนโค้ด บนเซิร์ฟเวอร์ของตัวเองที่ข้อมูลไม่ออกนอกองค์กร
คู่มือนี้อธิบาย n8n ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
n8n คือเครื่องมือเชื่อมระบบต่าง ๆ เข้าด้วยกันแบบลากวาง เช่น เมื่อมีคนกรอกฟอร์มบนเว็บ ให้บันทึกลง Google Sheets ส่งแจ้งเตือนเข้า LINE และสร้างงานใน Trello โดยไม่ต้องเขียนโค้ดเชื่อมเอง
ข้อดีของการติดตั้งบนเซิร์ฟเวอร์ตัวเองเทียบกับบริการสำเร็จรูปคือไม่มีขีดจำกัดจำนวนการทำงานต่อเดือน และข้อมูลที่ไหลผ่านไม่ออกนอกองค์กร ซึ่งสำคัญเมื่อมีข้อมูลลูกค้าเกี่ยวข้อง
สิ่งที่ต้องเตรียม
- Cloud VPS ที่มี RAM อย่างน้อย 2 GB
- โดเมนที่ชี้มาที่เซิร์ฟเวอร์แล้ว จำเป็นสำหรับ Webhook
- Docker และ Docker Compose
ขั้นตอนที่ 1: เตรียมไฟล์
sudo mkdir -p /opt/n8n/{data,db,files}
cd /opt/n8n
sudo nano .env
DOMAIN=n8n.example.com
GENERIC_TIMEZONE=Asia/Bangkok
TZ=Asia/Bangkok
POSTGRES_USER=n8n
POSTGRES_PASSWORD=รหัสผ่านที่ยาวและสุ่ม
POSTGRES_DB=n8n
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=รหัสผ่านผู้ดูแล
# กุญแจเข้ารหัสข้อมูลรับรองที่บันทึกไว้ สร้างครั้งเดียวแล้วห้ามเปลี่ยน
N8N_ENCRYPTION_KEY=สตริงสุ่มยาว 32 ตัวอักษรขึ้นไป
openssl rand -hex 32
sudo chmod 600 .env
เก็บ N8N_ENCRYPTION_KEY ไว้นอกเครื่องทันที ข้อมูลรับรองทั้งหมดที่บันทึกไว้ใน n8n ถูกเข้ารหัสด้วยกุญแจนี้ หากหายไปจะต้องกรอกรหัสผ่านของทุกบริการใหม่ทั้งหมด
ขั้นตอนที่ 2: เขียนไฟล์ Compose
sudo nano docker-compose.yml
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
retries: 5
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:5678:5678"
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: db
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${DOMAIN}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://${DOMAIN}/
N8N_EDITOR_BASE_URL: https://${DOMAIN}/
N8N_BASIC_AUTH_ACTIVE: ${N8N_BASIC_AUTH_ACTIVE}
N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${TZ}
# ลบประวัติการทำงานเก่าอัตโนมัติ ไม่ให้ฐานข้อมูลโตไม่หยุด
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 336
EXECUTIONS_DATA_SAVE_ON_SUCCESS: none
EXECUTIONS_DATA_SAVE_ON_ERROR: all
volumes:
- ./data:/home/node/.n8n
- ./files:/files
ค่า EXECUTIONS_DATA_SAVE_ON_SUCCESS: none สำคัญมาก หากเก็บประวัติของทุกการทำงานที่สำเร็จ ฐานข้อมูลจะโตหลายกิกะไบต์ภายในไม่กี่สัปดาห์สำหรับ Workflow ที่ทำงานถี่
ขั้นตอนที่ 3: เริ่มและตั้ง Nginx
sudo docker compose up -d
sudo docker compose logs -f n8n
sudo nano /etc/nginx/sites-available/n8n
server {
listen 80;
server_name n8n.example.com;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# จำเป็นสำหรับหน้าจอแก้ไข Workflow ที่ใช้ WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 600s;
proxy_buffering off;
}
}
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d n8n.example.com --agree-tos -m [email protected] --redirect
ขั้นตอนที่ 4: สร้าง Workflow แรก
เปิด https://n8n.example.com เข้าสู่ระบบด้วยบัญชีที่ตั้งไว้ แล้วสร้าง Workflow ทดสอบ
- เพิ่ม Node ชนิด Webhook เป็นจุดเริ่ม คัดลอก URL ที่ได้
- เพิ่ม Node ชนิด Set เพื่อจัดรูปข้อมูล
- เพิ่ม Node ปลายทาง เช่น ส่งอีเมลหรือบันทึกลงฐานข้อมูล
- กด Execute Workflow แล้วยิงคำขอเข้ามาทดสอบ
curl -X POST https://n8n.example.com/webhook-test/abc123 \
-H 'Content-Type: application/json' \
-d '{"name":"สมชาย","email":"[email protected]"}'
เมื่อทดสอบผ่านแล้วกด Active เพื่อเปิดใช้งานจริง URL จะเปลี่ยนจาก webhook-test เป็น webhook
ขั้นตอนที่ 5: ตั้งสำรองข้อมูล
sudo nano /usr/local/bin/n8n-backup.sh
#!/bin/bash
set -euo pipefail
cd /opt/n8n
source .env
DEST=/var/backups/n8n
STAMP=$(date +%F-%H%M)
mkdir -p "$DEST"
docker compose exec -T db pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" \
| gzip > "$DEST/db-$STAMP.sql.gz"
tar czf "$DEST/data-$STAMP.tar.gz" ./data
find "$DEST" -name '*.gz' -mtime +30 -delete
echo "n8n backup ok: $STAMP"
ส่งออก Workflow เป็นไฟล์แยกด้วย เพื่อให้เก็บใน Git ได้
sudo docker compose exec -T n8n n8n export:workflow --all --output=/files/workflows.json
sudo docker compose exec -T n8n n8n export:credentials --all --decrypted=false --output=/files/credentials.json
ขั้นตอนที่ 6: อัปเดต
cd /opt/n8n
sudo /usr/local/bin/n8n-backup.sh
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f n8n
อ่านบันทึกการเปลี่ยนแปลงก่อนอัปเดตเสมอ n8n มีการเปลี่ยนแปลงที่กระทบ Workflow เดิมเป็นครั้งคราว