ติดตั้ง n8n ทำระบบอัตโนมัติบน Cloud VPS

ติดตั้ง n8n เชื่อมระบบต่าง ๆ เข้าด้วยกันโดยไม่ต้องเขียนโค้ด บนเซิร์ฟเวอร์ของตัวเองที่ข้อมูลไม่ออกนอกองค์กร

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 11 นาที เข้าชม 4 ครั้ง

แชร์FacebookXLINELinkedIn
n8n — ติดตั้ง n8n ทำระบบอัตโนมัติบน Cloud VPS
ติดตั้ง n8n ทำระบบอัตโนมัติบน Cloud VPS

คำตอบสั้น ๆ: ติดตั้ง 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 เดิมเป็นครั้งคราว

ปัญหาที่พบบ่อยเกี่ยวกับ n8n

Webhook จากภายนอกเรียกไม่ได้

ตรวจว่าตั้ง WEBHOOK_URL เป็นโดเมนจริงแล้ว และตรวจว่า URL ที่คัดลอกไปใช้เป็นแบบ production ไม่ใช่ webhook-test ซึ่งทำงานเฉพาะตอนกด Execute

หน้าจอแก้ไขค้างหรือไม่อัปเดต

Nginx ไม่ได้ส่งต่อ WebSocket ตรวจว่ามี proxy_http_version 1.1 และ header Upgrade กับ Connection ตามคอนฟิกในขั้นตอนที่ 3

ข้อมูลรับรองเปิดไม่ได้หลังย้ายเครื่อง

N8N_ENCRYPTION_KEY ไม่ตรงกับเครื่องเดิม ต้องใช้กุญแจเดียวกันเสมอ หากหายไปจริง ต้องกรอกข้อมูลรับรองใหม่ทั้งหมด

ฐานข้อมูลโตเร็วมาก

ตั้งค่าการลบประวัติตามขั้นตอนที่ 2 และตรวจขนาดด้วย

sudo docker compose exec -T db psql -U n8n -c "SELECT pg_size_pretty(pg_database_size('n8n'));"

ต้องการ Cloud VPS ที่พร้อมรันระบบอัตโนมัติขององค์กร ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ทำความเข้าใจ n8n ก่อนเริ่ม

ระบบอัตโนมัติแบบต่อบล็อกทำงานได้ดีกับงานที่เชื่อมหลายบริการเข้าด้วยกัน เช่น รับฟอร์มจากเว็บไซต์ บันทึกลงตาราง แล้วแจ้งทีมขาย สิ่งที่ต้องตัดสินใจก่อนติดตั้งคือจะเปิดให้เข้าถึงจากภายนอกหรือไม่ เพราะเครื่องมือประเภทนี้ถือกุญแจของทุกบริการที่เชื่อมไว้ ทั้งโทเค็นของระบบอีเมล ระบบแชต และฐานข้อมูล การเปิดหน้าจัดการทิ้งไว้บนอินเทอร์เน็ตโดยไม่มีการยืนยันตัวตนที่แน่นหนา จึงเท่ากับวางกุญแจทั้งพวงไว้หน้าบ้าน

สิ่งที่ต้องเตรียมก่อนใช้งาน n8n

  • เซิร์ฟเวอร์ที่ติดตั้งระบบคอนเทนเนอร์เรียบร้อยแล้ว และโดเมนย่อยสำหรับหน้าจัดการ
  • ใบรับรอง SSL และตัวรับคำขอด้านหน้า เพื่อไม่ให้เปิดพอร์ตของแอปตรงสู่อินเทอร์เน็ต
  • พื้นที่จัดเก็บถาวรสำหรับข้อมูลของแอป เพราะข้อมูลที่อยู่ในคอนเทนเนอร์อย่างเดียวจะหายเมื่อสร้างใหม่

ตรวจสอบว่า n8n ทำงานถูกต้องแล้ว

  1. เปิดหน้าจัดการผ่านโดเมนที่ตั้งไว้ด้วย https ได้ และถูกถามให้เข้าสู่ระบบ
  2. สร้างงานทดสอบหนึ่งงานแล้วสั่งรัน ผลลัพธ์ต้องถูกบันทึกและดูย้อนหลังได้
  3. รีสตาร์ตบริการหนึ่งครั้ง แล้วตรวจว่างานและข้อมูลเดิมยังอยู่ ซึ่งพิสูจน์ว่าพื้นที่จัดเก็บถาวรทำงานถูกต้อง

ข้อควรรู้และข้อจำกัดของ n8n

  • สำรองพื้นที่จัดเก็บข้อมูลเป็นประจำ เพราะในนั้นมีทั้งงานที่สร้างไว้และข้อมูลเชื่อมต่อบริการภายนอก
  • อย่าเก็บโทเค็นไว้ในตัวงานโดยตรง ให้ใช้ที่เก็บข้อมูลลับของระบบ เพื่อให้เปลี่ยนโทเค็นได้โดยไม่ต้องแก้ทุกงาน
  • ตั้งการแจ้งเตือนเมื่องานล้มเหลว มิฉะนั้นระบบอัตโนมัติที่หยุดทำงานจะเงียบจนกว่าจะมีคนทักว่าไม่ได้รับข้อมูล

คำถามที่พบบ่อยเกี่ยวกับ n8n

ควรเปิดให้เข้าถึงจากอินเทอร์เน็ตหรือไม่

เปิดเท่าที่จำเป็นครับ ถ้าต้องรับข้อมูลจากภายนอกให้เปิดเฉพาะเส้นทางที่รับข้อมูลนั้น และปิดหน้าจัดการไว้หลังการยืนยันตัวตนหรือจำกัดตามไอพี

ข้อมูลหายหลังอัปเดตเวอร์ชัน

เกือบทั้งหมดเกิดจากไม่ได้ผูกพื้นที่จัดเก็บถาวรไว้ ทำให้ข้อมูลอยู่ในคอนเทนเนอร์ที่ถูกสร้างใหม่ ให้ตรวจการผูกพื้นที่ก่อนอัปเดตทุกครั้ง

ใช้ฐานข้อมูลภายนอกดีกว่าฐานข้อมูลในตัวหรือไม่

สำหรับงานจริงที่มีการรันจำนวนมาก ฐานข้อมูลภายนอกจะรองรับได้ดีกว่าและสำรองข้อมูลได้ตามมาตรฐานเดียวกับระบบอื่นขององค์กร

อ่านเพิ่มเติมเกี่ยวกับ n8n

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน