SSD Nodes Learn
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24

วิธีติดตั้ง n8n บน VPS ด้วย Docker และ HTTPS

คู่มือติดตั้ง n8n บน VPS ด้วย Docker Compose และ Postgres พร้อมวิธีแก้ปัญหา WEBHOOK_URL และการตั้งค่า encryption-key เพื่อให้ระบบทำงานได้อย่างสมบูรณ์

สิ่งที่คุณกำลังสร้าง

n8n คือเครื่องมือสำหรับทำ workflow automation โดยเป็น visual editor ที่ใช้ trigger เช่น webhook, schedule หรือ form submission เพื่อเริ่มการทำงานของ node ต่างๆ ที่ทำหน้าที่เรียกใช้งาน API, ปรับแต่งข้อมูล และเขียนข้อมูลลงในระบบอื่น n8n กลายเป็นเครื่องมือหลักสำหรับ AI-agent workflows เนื่องจากสามารถเชื่อมต่อกับ model provider และ database ทุกประเภทได้โดยไม่ต้องเขียน service เอง ผู้ใช้งาน docker run สามารถเริ่มใช้งาน editor ได้ภายใน 2 นาที คู่มือนี้จะเน้นไปที่ส่วนที่เหลืออีก 90% ได้แก่ การทำให้ระบบมีความเสถียรด้วยการใช้ Postgres แทนไฟล์ SQLite แบบเริ่มต้น, การทำให้ระบบเข้าถึงได้ผ่าน HTTPS และส่วนที่สำคัญที่สุดคือการตั้งค่า webhook ให้ส่ง URL ที่โลกภายนอกสามารถเข้าถึงได้จริง

Stack ที่เสร็จสมบูรณ์จะประกอบด้วย 2 containers บน Docker network เดียวกัน ได้แก่ n8n และ Postgres database สำหรับเก็บ workflows และ credentials โดยมี reverse proxy บน host ทำหน้าที่ terminate TLS และส่งต่อ request ไปยัง n8n บน localhost เพื่อไม่ให้มีบริการใดเปิดสู่ internet โดยตรงยกเว้นผ่าน proxy นี้เท่านั้น ซึ่ง n8n เป็นหนึ่งในบริการที่อยู่ใน 2026 self-hosting shortlist

สิ่งที่ต้องเตรียม และข้อจำกัดที่ควรทราบ

คุณต้องมี VPS ที่มี RAM อย่างน้อย 1 GB หากเริ่มใช้งาน workflow ที่ซับซ้อน ควรเตรียมไว้ 2 GB เนื่องจากกระบวนการทำงานและ Node.js runtime ใช้หน่วยความจำสูง การที่ out-of-memory killer สั่งปิด container ระหว่างทำงานจะทำให้เกิดปัญหาในการเรียนรู้ การใช้ vCPU เพียง 1 core สามารถเริ่มต้นใช้งานได้

คุณต้องมี domain หรือ subdomain เช่น n8n.example.com โดยต้องตั้งค่า A record ให้ชี้ไปยัง public IP ของ VPS และต้องสามารถ resolve ได้ก่อนการขอ certificate ต้องเปิด port 80 และ 443 สำหรับ proxy ส่วน port 5678 ของ n8n ต้องไม่ เปิดสู่สาธารณะ คุณต้องติดตั้ง Docker Engine และ Compose plugin หาก docker compose version แสดงข้อผิดพลาด docker: 'compose' is not a docker command แสดงว่าคุณใช้ standalone binary รุ่นเก่า และ plugin คือ sudo apt install docker-compose-plugin

SQLite เหมาะสำหรับการทดสอบ แต่ควรใช้ Postgres สำหรับระบบที่ใช้งานจริง

ฐานข้อมูลเริ่มต้นของ n8n คือไฟล์ SQLite ที่ตำแหน่ง /home/node/.n8n/database.sqlite ซึ่งเพียงพอสำหรับการทดสอบเบื้องต้น หากคุณไม่ทำการ mount volume ข้อมูลจะสูญหายทันทีเมื่อมีการ recreate container ซึ่งเป็นบทเรียนที่ควรระวัง สาเหตุที่ควรเปลี่ยนไปใช้ Postgres ไม่ใช่เรื่องของความเร็วในการประมวลผลเพียงอย่างเดียว แต่เนื่องจาก SQLite มีข้อจำกัดเรื่อง single writer lock ทำให้เมื่อมีการรันหลาย workflow พร้อมกัน หรือเมื่อใช้งานใน queue mode จะเกิดข้อผิดพลาด SQLITE_BUSY: database is locked เนื่องจากปัญหา concurrency Postgres ไม่มีข้อจำกัดดังกล่าว สามารถสำรองข้อมูลได้อย่างสมบูรณ์ด้วย pg_dump และเป็นฐานข้อมูลที่เอกสารของ n8n แนะนำสำหรับระบบที่ต้องการความเสถียร การเปลี่ยนภายหลังจำเป็นต้องทำการ migrate ข้อมูลด้วยตนเอง ดังนั้นหากข้อมูลในเครื่องนี้มีความสำคัญ ควรเริ่มต้นใช้งานด้วย Postgres ตั้งแต่แรก

DNS และ firewall

ดำเนินการชี้ record และเปิด port ให้เรียบร้อยก่อน เพื่อป้องกันไม่ให้ขั้นตอนการออก certificate ล้มเหลวเนื่องจากชื่อ domain ไม่สามารถ resolve ได้

dig +short n8n.example.com
curl -s ifconfig.me
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow OpenSSH
sudo ufw enable

ห้ามเปิด port 5678 เนื่องจาก compose file กำหนดให้ n8n ผูกกับ 127.0.0.1:5678 เพื่อให้เฉพาะ reverse proxy ของ host เท่านั้นที่เข้าถึงได้ การเปิด ufw allow 5678 จะทำให้การแยกส่วน (isolation) ดังกล่าวถูกยกเลิกไป

The Compose file

สร้าง working directory และ docker-compose.yml ไฟล์นี้คือโครงสร้างทั้งหมด ประกอบด้วย 2 services, 1 private network และ 2 named volumes

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - n8n_net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: docker.n8n.io/n8nio/n8n:2.29.10
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=n8n.example.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.example.com/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Europe/London
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n
    networks:
      - n8n_net
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres_data:
  n8n_data:

networks:
  n8n_net:

ข้อกำหนดบางประการที่ควรระบุไว้ชัดเจน DB_POSTGRESDB_HOST=postgres คือ service name ซึ่ง Docker ใช้ในการระบุตัวตนบน shared network ไม่ใช่ localhost ซึ่งภายใน n8n container หมายถึงตัว n8n เอง การใช้ depends_on ร่วมกับ condition: service_healthy จะช่วยป้องกันไม่ให้ n8n เริ่มทำงานก่อน Postgres เมื่อ boot ระบบ หากไม่มีส่วนนี้ n8n จะเริ่มทำงานแต่ไม่พบ database และจะหยุดทำงานทันที named volume n8n_data ที่ /home/node/.n8n ใช้สำหรับเก็บ encryption key และเก็บ database สำหรับ SQLite ซึ่งเป็น directory เดียวที่คุณห้ามทำหาย ควรระบุ image เป็นเวอร์ชันที่แน่นอน และห้ามใช้ latest โดยเหตุผลจะระบุไว้ในส่วนการ upgrade ด้านล่าง

ไฟล์ secrets

ห้ามใส่รหัสผ่านลงใน compose file โดยเด็ดขาด ให้ใช้ไฟล์ .env ที่วางไว้ข้างกันเพื่อให้ Compose อ่านโดยอัตโนมัติ และควรสร้างรหัสผ่านแบบสุ่มเพื่อให้มีความปลอดภัย

printf 'POSTGRES_PASSWORD=%s\n'  "$(openssl rand -hex 24)" >  .env
printf 'N8N_ENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" >> .env
chmod 600 .env

N8N_ENCRYPTION_KEY คือค่าที่สำคัญที่สุดในที่นี้ เนื่องจากเป็นกุญแจที่ใช้เข้ารหัสข้อมูลประจำตัว (credential) ทั้งหมดที่ถูกจัดเก็บไว้ ควรตั้งค่านี้ด้วยตนเองแทนการปล่อยให้ n8n สร้างให้ เพราะค่าที่คุณกำหนดเองจะสามารถจดบันทึกและนำมาใช้กู้คืนได้ เมื่อ n8n ใช้กุญแจนี้เข้ารหัส credential ชุดแรกแล้ว การเปลี่ยนกุญแจจะทำให้ไม่สามารถถอดรหัส credential ทุกตัวได้ ดังนั้นควรตั้งค่าเพียงครั้งเดียวและห้ามแก้ไขบรรทัดนั้นอีก

ตัวแปรสภาพแวดล้อมที่กำหนดการทำงานของ webhooks

ตัวแปร 4 ตัว ใช้ควบคุมการระบุตัวตนของ n8n ต่อระบบภายนอก การตั้งค่าตัวแปรเหล่านี้ผิดพลาดเป็นสาเหตุหลักของคำถามด้าน support ของ n8n

  • N8N_HOST คือ public hostname, n8n.example.com หากปล่อยไว้เป็นค่าเริ่มต้นคือ localhost เมื่อใช้งานผ่าน proxy ตัว editor จะพยายามโหลด API ของตนเองจาก localhost ผ่าน browser ของคุณ ซึ่งจะทำให้เกิดข้อผิดพลาด
  • N8N_PROTOCOL=https ใช้ระบุว่า n8n ทำงานผ่าน TLS เพื่อให้ระบบกำหนดค่า session cookie เป็น Secure และสร้าง URL แบบ https://
  • N8N_PORT=5678 คือ port ที่ n8n ใช้รับข้อมูล ภายใน container ไม่ใช่ public port เนื่องจาก port 443 ถูกใช้งานโดย proxy
  • WEBHOOK_URL=https://n8n.example.com/ คือตัวแปรที่สำคัญที่สุด n8n จะสร้าง webhook address สำหรับนำไปใช้ใน Stripe, GitHub หรือระบบภายนอกอื่นๆ จากค่าเหล่านี้ หากไม่ได้ตั้งค่าหรือตั้งค่าผิด n8n จะใช้ค่า N8N_HOST:N8N_PORT แทน และจะแสดงผลเป็น https://n8n.example.com:5678/webhook/... หรือที่แย่กว่านั้นคือ http://localhost:5678/webhook/... ซึ่งดูเหมือนใช้งานได้จริงแต่ไม่สามารถเข้าถึงได้จากอินเทอร์เน็ต ส่งผลให้ request จากภายนอกส่งมาไม่ถึงโดยไม่มีการแจ้งเตือนข้อผิดพลาด ให้ตั้งค่าเป็น public base URL ที่ถูกต้องพร้อมเครื่องหมาย slash (/) ปิดท้าย จากนั้นตรวจสอบว่า webhook node แสดง URL ที่ไม่มี port

N8N_PROXY_HOPS=1 สั่งให้ Express server ของ n8n เชื่อถือ proxy ที่อยู่ด้านหน้า เพื่อให้ระบบ rate-limiting และฟีเจอร์ที่ต้องอ่าน client IP เห็นที่อยู่ IP จริงแทนที่จะเป็น IP ของ proxy ตัวแปรหนึ่งที่ควรตั้งค่า ไม่ ต้องกำหนดคือ N8N_RUNNERS_ENABLED เนื่องจาก task runners (การรัน logic ของ Code-node ใน process แยกต่างหากแบบ sandboxed) เป็นค่าเริ่มต้นตั้งแต่เวอร์ชัน 1.69 และเป็นค่าบังคับตั้งแต่เวอร์ชัน 2.x ตามที่คู่มือนี้กำหนดไว้ ดังนั้นการเลือกใช้งานแบบเดิม (opt-in) จึงถูกยกเลิกการใช้งานแล้ว หากตั้งค่าไว้ n8n จะแสดง log แจ้งเตือนให้ลบการตั้งค่าดังกล่าวออก

การเริ่มต้นใช้งานครั้งแรก

docker compose up -d
docker compose ps
docker compose logs -f n8n

การบูตเครื่องครั้งแรกที่สมบูรณ์จะแสดงบรรทัด Editor is now accessible via: และมีบรรทัด n8n ready on ..., port 5678 อยู่ด้านบน docker compose ps ควรแสดงสถานะ Up ของทั้งสอง container โดยมี postgres ระบุว่าเป็น (healthy) หาก n8n ติดอยู่ใน loop ของ Restarting ให้ตรวจสอบ logs ซึ่งมักเกิดจากปัญหาการเชื่อมต่อ database หรือสิทธิ์การเข้าถึง volume ตามที่ระบุไว้ด้านล่าง

TLS with a reverse proxy

n8n ใช้โปรโตคอล HTTP บนพอร์ต 5678 โดยตรง แต่ต้องมีระบบอื่นทำหน้าที่จัดการ HTTPS ให้ มี 2 วิธีที่แนะนำดังนี้

หากคุณรัน container หลายตัวอยู่แล้ว ให้ใช้ Traefik reverse proxy ที่ออกใบรับรอง TLS โดยอัตโนมัติ ร่วมกับการตั้งค่า labels เพียงไม่กี่ค่า โดย Traefik จะทำหน้าที่ขอและต่ออายุใบรับรองให้คุณ

หากแอปพลิเคชันนี้เป็นแอปเดียวในเครื่อง การใช้ nginx virtual host ร่วมกับใบรับรอง Let's Encrypt จะทำได้ง่ายกว่า ให้ใช้ การตั้งค่า Certbot และ nginx TLS สำหรับ Ubuntu 24.04 เพื่อขอใบรับรอง จากนั้นใช้ server block ดังนี้:

server {
    listen 443 ssl;
    server_name n8n.example.com;

    ssl_certificate     /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600;
        client_max_body_size 16m;
    }
}

การตั้งค่า header Upgrade และ Connection "upgrade" เป็นสิ่งจำเป็น เนื่องจาก n8n ส่งข้อมูลการทำงานแบบ real-time ไปยัง editor ผ่าน WebSocket หากไม่มีสองบรรทัดนี้ หน้า login จะโหลดขึ้นมาแล้วค้างพร้อมแถบแจ้งเตือนการเชื่อมต่อหลุด ส่วน proxy_read_timeout 3600 ช่วยป้องกันไม่ให้การทำงานที่ใช้เวลานานถูกตัดการเชื่อมต่อที่ 60 วินาทีตามค่าเริ่มต้นของ nginx และ header X-Forwarded-Proto $scheme ทำงานร่วมกับ N8N_PROXY_HOPS=1 เพื่อแจ้งให้ n8n ทราบว่าคำขอต้นทางเป็น HTTPS แม้ว่า proxy จะเชื่อมต่อผ่าน HTTP ปกติก็ตาม เพื่อป้องกันไม่ให้ n8n ปฏิเสธ cookie เนื่องจากมองว่าการเชื่อมต่อไม่ปลอดภัย

การสร้าง workflow แรกของคุณให้ใช้งานได้จริง

เปิด https://n8n.example.com/ สร้างบัญชีเจ้าของระบบ (ดูในหัวข้อถัดไป) และสร้าง workflow ที่มีขนาดเล็กที่สุดเพื่อทดสอบว่าระบบทำงานได้หรือไม่ โดยประกอบด้วย: webhook รับข้อมูล, การเรียกใช้ HTTP และการส่ง response กลับออกไป

  1. เพิ่มโหนด Webhook กำหนด method เป็น POST และกำหนด path เช่น hello ระบบจะแสดง URL สองรูปแบบ คือ Test URL และ Production URL ซึ่งเป็นสาเหตุหลักที่ทำให้ผู้ใช้รายงานว่า "webhook ใช้งานไม่ได้" โดย Test URL จะตอบรับการเรียกใช้งานเพียงครั้งเดียว และจะใช้งานได้เฉพาะตอนที่คุณคลิก Listen for test event เท่านั้น หลังจากนั้นจะหมดอายุ ส่วน Production URL จะตอบรับการเรียกใช้งานเมื่อ workflow อยู่ในสถานะ Active
  2. เพิ่มโหนด HTTP Request ต่อจากโหนดเดิม โดยกำหนดให้เรียกไปยัง public JSON API ใดก็ได้ เช่น การส่ง GET ไปยัง https://api.github.com/zen เพื่อรับค่า string บรรทัดเดียว ซึ่งเพียงพอสำหรับการทดสอบ
  3. เพิ่มโหนด Respond to Webhook และตั้งค่าตัวเลือก Respond ในโหนด Webhook เป็น "Using Respond to Webhook node" เพื่อให้ผู้เรียกใช้งานได้รับข้อมูล output จากโหนด HTTP กลับไป
  4. เปิดใช้งาน workflow โดยเลือก Active (มุมขวาบน) และทดสอบเรียกใช้งานผ่าน curl -X POST https://n8n.example.com/webhook/hello คุณควรได้รับข้อมูลบรรทัดเดิมกลับมา ซึ่งเป็นการทำงานแบบ POST รับข้อมูล, เรียก API และส่ง response กลับ ซึ่งเป็นรูปแบบพื้นฐานของ automation ส่วนใหญ่

หากต้องการใช้งานแบบตั้งเวลา ให้เปลี่ยนจากโหนด Webhook เป็น Schedule Trigger และเปลี่ยนจากการเรียก API ทั่วไปเป็นการเรียก model endpoint แทน เช่น การใช้ Ollama running on the same VPS ซึ่งเป็นวิธีที่สะดวกในการสร้างระบบสรุปข้อมูลประจำคืน (nightly summariser)

การจัดการผู้ใช้ แทนที่ basic auth

คู่มือ n8n รุ่นเก่าแนะนำให้ตั้งค่า N8N_BASIC_AUTH_ACTIVE=true แต่ตัวแปรเหล่านั้นถูกนำออกไปแล้วใน n8n 1.0 และไม่มีผลใดๆ ในปัจจุบัน การยืนยันตัวตนในปัจจุบันใช้ owner account: เมื่อคุณเปิด editor เป็นครั้งแรก n8n จะบังคับให้คุณสร้าง owner ด้วย email-and-password และขั้นตอนการตรวจสอบนี้เป็นสิ่งจำเป็น — ไม่มีโหมด anonymous ให้ใช้งาน โปรดสร้างบัญชีทันทีหลังจากเริ่มระบบครั้งแรก ก่อนที่จะส่ง URL ให้ผู้อื่น: ในช่วงระหว่าง docker compose up จนถึงการส่งฟอร์มครั้งแรก ใครก็ตามที่เข้าถึงระบบได้ก่อนจะสามารถเป็นเจ้าของ instance นั้นได้ การใช้ reverse-proxy basic-auth เป็นการเพิ่มความปลอดภัยอีกชั้นหนึ่งที่เหมาะสม แต่ถือเป็นปัจจัยที่สอง ไม่ใช่การยืนยันตัวตนหลัก

Backups: encryption key ก่อน แล้วจึงเป็น database

มีสองสิ่งที่ต้องสำรองข้อมูล และทั้งสองอย่างมีความสำคัญไม่เท่ากัน

N8N_ENCRYPTION_KEY ข้อมูลประจำตัว (credentials) ทุกอย่างที่คุณจัดเก็บใน n8n เช่น API tokens, database passwords และ OAuth secrets จะถูกเข้ารหัสไว้ด้วยคีย์นี้ ข้อมูล workflow ใน Postgres จะใช้งานไม่ได้หากไม่มีคีย์นี้ หากคุณกู้คืน database ไปยังเครื่องใหม่ที่มีคีย์ต่างออกไป n8n จะไม่สามารถถอดรหัสข้อมูลประจำตัวใดๆ ได้เลย และไม่สามารถกู้คืนหรือรีเซ็ตได้ ไฟล์ .env คือไฟล์ที่เก็บคีย์นี้ไว้ ควรคัดลอกไฟล์นี้ไปเก็บไว้ที่อื่นนอกเครื่องเซิร์ฟเวอร์ทันทีที่สร้างขึ้น เช่น การเก็บไว้ใน password-manager นี่คือการสำรองข้อมูลที่สำคัญที่สุด

Postgres database สำหรับเก็บ workflow, execution history และข้อมูลประจำตัวที่ถูกเข้ารหัสไว้:

docker compose exec -T postgres pg_dump -U n8n -d n8n \
  | gzip > n8n-db-$(date +%F).sql.gz

ควรตั้งเวลาทำงาน (schedule) เพื่อรันคำสั่งนี้และคัดลอกไฟล์ dump ออกจากเครื่อง สำหรับการกู้คืนบน VPS เครื่องใหม่: ให้รัน stack ขึ้นมาหนึ่งครั้งเพื่อให้ database ถูกสร้างขึ้น จากนั้นหยุดการทำงานของ n8n, นำไฟล์ dump กลับเข้าสู่ระบบด้วย psql, ใส่ N8N_ENCRYPTION_KEY ตัวเดิมลงใน .env แล้วจึงเริ่มการทำงานของ n8n การใช้คีย์เดิมร่วมกับไฟล์ dump จะทำให้ระบบกลับมาใช้งานได้ตามปกติ แต่หากใช้คีย์ใหม่ workflow จะไม่สามารถใช้งานข้อมูลประจำตัวใดๆ ได้เลย

Upgrades: pin the tag

ไฟล์ compose มีการระบุเวอร์ชันเป็น n8nio/n8n:2.29.10 แทนที่จะเป็น latest โดยเจตนา เนื่องจาก n8n มีการออกเวอร์ชัน minor ใหม่เกือบทุกสัปดาห์ และอาจมีการเปลี่ยนแปลง database schema หรือพฤติกรรมของ node ในระหว่างนั้น ดังนั้นการใช้ latest อาจทำให้การ pull แบบอัตโนมัติได้รับ build ที่ทำการ migrate database ทันทีที่เริ่มทำงาน ควรระบุเวอร์ชันให้แน่นอน และอ่าน release notes ก่อนทำการอัปเดต เนื่องจาก n8n จะระบุการเปลี่ยนแปลงที่ส่งผลกระทบต่อระบบ (breaking changes) ไว้ในนั้น และควรทำการอัปเกรดอย่างระมัดระวัง:

docker compose exec -T postgres pg_dump -U n8n -d n8n | gzip > pre-upgrade.sql.gz
# edit the image tag in docker-compose.yml, then:
docker compose pull n8n
docker compose up -d n8n
docker compose logs -f n8n

การข้ามเวอร์ชันหลัก (Major-version) คือจุดที่ต้องระวังมากที่สุด ตัวอย่างเช่น เวอร์ชัน 2.0 ได้เปลี่ยนค่า N8N_BLOCK_ENV_ACCESS_IN_NODE เป็น true โดยค่าเริ่มต้น ส่งผลให้ Code node ใดๆ ที่อ่านค่า process.env จะสูญเสียการเข้าถึงโดยไม่แจ้งเตือน จนกว่าคุณจะตั้งค่ากลับเป็น false นอกจากนี้ เวอร์ชันดังกล่าวเริ่มบังคับใช้สิทธิ์การเข้าถึง (strict permissions) กับ settings file ด้วย ควรศึกษา 2.0 breaking-changes page ก่อนข้ามเวอร์ชันหลัก n8n จะรัน database migrations ที่จำเป็นโดยอัตโนมัติเมื่อเริ่มทำงาน นี่คือเหตุผลที่การทำ pg_dump ก่อนอัปเกรดเป็นสิ่งที่จำเป็น เนื่องจาก credentials ถูกเข้ารหัสด้วย key ใน .env และข้อมูลถูกเก็บไว้ใน Postgres ทำให้ container สามารถลบทิ้งและสร้างใหม่ได้ (disposable) คุณสามารถอัปเกรดได้โดยการแทนที่ container และสามารถ roll back ได้โดยการระบุเวอร์ชันเดิม (pinning the previous tag) และทำการ restore dump กลับคืนมา

Failure modes, with the strings you will see

The requested webhook "POST hello" is not registered. เกิดขึ้นเมื่อเรียกใช้งาน webhook ที่ workflow ไม่ได้เปิดใช้งาน (Active) หรือเรียกใช้งาน test path ในขณะที่ไม่มีการรอรับเหตุการณ์ Test paths (/webhook-test/...) จะตอบสนองเฉพาะเมื่อคุณคลิก "Listen for test event" เท่านั้น ส่วน production paths (/webhook/...) จะตอบสนองเมื่อเปิดใช้งาน workflow toggle เท่านั้น ส่วน This webhook is not registered for GET requests. Did you mean to make a POST request? หมายถึงการใช้ method ไม่ถูกต้อง — node ต้องการ POST แต่คุณส่ง GET มา

Webhook URL แสดงค่า :5678 หรือ localhost node แสดงค่า https://n8n.example.com:5678/webhook/... หรือ http://localhost:5678/... สาเหตุเกิดจาก WEBHOOK_URL ไม่ถูกต้องหรือไม่ได้ตั้งค่าไว้ n8n จึงสร้างที่อยู่จาก N8N_HOST:N8N_PORT แทนที่จะใช้ public base ของคุณ ให้ตั้งค่า WEBHOOK_URL=https://n8n.example.com/ และสร้าง container ใหม่ด้วย docker compose up -d เพื่อแก้ไขปัญหาเรื่อง port

There was a problem loading init data ใน browser เกิดขึ้นเมื่อ editor โหลดขึ้นมาได้แต่ไม่สามารถเชื่อมต่อกับ backend API ของตนเองได้ หากใช้งานผ่าน proxy มักเกิดจาก N8N_HOST หรือ WEBHOOK_URL ไม่ถูกต้อง, proxy ไม่ได้ส่ง WebSocket Upgrade headers, หรือ N8N_PROTOCOL ไม่ตรงกับวิธีการเชื่อมต่อของคุณ ให้ตรวจสอบตัวแปร public-facing ทั้ง 4 ตัว และตรวจสอบว่า proxy ได้ส่งต่อ Upgrade และ Connection หรือไม่

password authentication failed for user "n8n" ใน logs พร้อมกับ container ที่กำลัง restart เกิดจากรหัสผ่านที่ n8n ส่งไปไม่ตรงกับรหัสผ่านที่ใช้ตอนเริ่มต้น database ข้อควรระวังคือ Postgres จะอ่านค่า POSTGRES_PASSWORD เฉพาะตอนที่เริ่มสร้าง directory ข้อมูลที่ ว่างเปล่า เท่านั้น หากคุณเริ่มรัน stack ไปแล้วครั้งหนึ่ง แล้วเปลี่ยนค่า POSTGRES_PASSWORD ใน .env volume postgres_data เดิมจะยังคงเก็บรหัสผ่านเก่าไว้ ให้เปลี่ยนกลับเป็นค่าเดิม หรือหากไม่มีข้อมูลสำคัญที่ต้องรักษา ให้ทำการ docker compose down และ docker volume rm postgres volume แล้วเริ่มรันระบบใหม่

EACCES: permission denied, open '/home/node/.n8n/config' เมื่อเริ่มระบบ เกิดจาก n8n รันด้วย user node (UID 1000) และไม่มีสิทธิ์เขียนข้อมูลลงใน config directory ปัญหานี้มักเกิดกับผู้ที่ใช้ bind-mount โฟลเดอร์จาก host (./n8n_data:/home/node/.n8n) ที่เป็นของ root ให้ใช้ named volume ตามที่ระบุไว้ด้านบน หรือหากจำเป็นต้องใช้ bind mount ให้ทำการ sudo chown -R 1000:1000 ./n8n_data ก่อน

Permissions 0644 for n8n settings file /home/node/.n8n/config are too wide. Changing permissions to 0600.. ตั้งแต่ n8n เวอร์ชัน 2.x เป็นต้นไป ระบบจะบังคับใช้ 0600 กับไฟล์ settings โดยค่าเริ่มต้นและจะแก้ไขให้เองเมื่อเริ่มระบบ — log line นี้หมายความว่าระบบได้แก้ไข mode ให้ถูกต้องแล้ว ซึ่งมักเกิดขึ้นหลังจากการใช้ bind mount หรือหลังจากการ restore ไฟล์ที่มี permission ไม่ถูกต้อง ให้ไม่ต้องดำเนินการใดๆ และให้ตั้งค่า N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false เฉพาะในกรณีที่ filesystem ของคุณไม่รองรับการกำหนด permissions เท่านั้น

Mismatching encryption keys — ข้อความเต็มระบุว่า encryption key ในไฟล์ settings (/home/node/.n8n/config) ไม่ตรงกับ N8N_ENCRYPTION_KEY ใน environment ของคุณ คีย์ใน environment แตกต่างจากคีย์ที่ n8n เขียนลงใน data volume ในการรันครั้งก่อนหน้า ส่วนใหญ่เกิดจาก n8n สร้างคีย์แบบสุ่มเมื่อเริ่มระบบครั้งแรกในขณะที่ยังไม่ได้ตั้งค่าตัวแปร และคุณมาเปลี่ยนเป็นคีย์อื่นในภายหลัง ให้ใส่คีย์เดิมกลับคืนใน .env หรือหากไม่มีข้อมูล credentials ที่สำคัญ ให้ลบไฟล์ config ใน volume n8n_data เพื่อให้ n8n สร้างใหม่ — ซึ่งจะทำให้ credentials เดิมไม่สามารถใช้งานได้

Banner แจ้งเตือนเรื่อง secure cookies: Your n8n server is configured to use a secure cookie, however you are either visiting this via an insecure URL, or using Safari. คุณตั้งค่า N8N_PROTOCOL=https แต่เข้าใช้งาน n8n ผ่าน HTTP ปกติ — มักเกิดจากการเข้าใช้งานผ่าน IP และ port โดยตรงแทนที่จะผ่าน HTTPS proxy ให้เข้าใช้งานผ่าน https://n8n.example.com/ เท่านั้น หากไม่สามารถใช้ HTTPS ได้จริงๆ จึงควรตั้งค่า N8N_SECURE_COOKIE=false และห้ามตั้งค่านี้บนเครื่องที่เชื่อมต่อกับอินเทอร์เน็ตโดยตรง

หากต้องการใช้งาน language model ใน workflow เหล่านี้ โปรดดูที่ การสร้าง AI workflows ด้วย Claude และ n8n

FAQ

ควรใช้ SQLite หรือ Postgres สำหรับ n8n?

SQLite (ค่าเริ่มต้น) เหมาะสำหรับการทดลองใช้งาน n8n หรือการใช้งานส่วนบุคคลที่รันทีละหนึ่ง workflow หากต้องการใช้งานจริงที่สำคัญควรเปลี่ยนไปใช้ Postgres เนื่องจาก SQLite มีระบบ single writer lock ซึ่งทำให้เกิด database is locked เมื่อมีการทำงานพร้อมกัน ส่วน Postgres สามารถสำรองข้อมูลได้อย่างสมบูรณ์ด้วย pg_dump การย้ายข้อมูลในภายหลังต้องทำด้วยตนเอง ดังนั้นหากข้อมูลมีความสำคัญ ควรเริ่มต้นด้วย Postgres

ทำไม webhook ของ n8n ถึงไม่ทำงาน?

สาเหตุส่วนใหญ่เกิดจาก WEBHOOK_URL หากไม่ได้ตั้งค่าหรือตั้งค่าผิด n8n จะแสดง webhook address ที่สร้างจาก N8N_HOST:N8N_PORT ซึ่งมักจะมี :5678 หรือ localhost ปนอยู่ แม้จะดูเหมือนใช้งานได้แต่ไม่สามารถเข้าถึงได้จากอินเทอร์เน็ต ทำให้คำขอจากต้นทางส่งมาไม่ถึง วิธีแก้ไขคือตั้งค่า WEBHOOK_URL=https://n8n.example.com/ และตรวจสอบว่า node แสดง URL ที่ไม่มี port สาเหตุที่สองคือการเรียก webhook ที่ workflow ไม่ได้เปิดสถานะ Active ซึ่งจะส่งผลให้เกิด The requested webhook ... is not registered.

สิ่งที่ต้องสำรองข้อมูลใน n8n มีอะไรบ้าง?

มี 2 ส่วน คือ N8N_ENCRYPTION_KEY จากไฟล์ .env เนื่องจาก credential ที่ถูกจัดเก็บจะถูกเข้ารหัสด้วยคีย์นี้ หากสูญเสียคีย์ไปจะไม่สามารถถอดรหัสข้อมูลได้อีกต่อไป ควรคัดลอกคีย์ออกจาก server ทันทีที่สร้างขึ้น และต้องสำรองข้อมูล pg_dump ของ Postgres database สำหรับเก็บ workflow, history และ credentials การกู้คืนข้อมูลจำเป็นต้องใช้ทั้งสองส่วน คือคีย์เดิมและไฟล์ dump

วิธีการตั้งค่า n8n ให้ใช้งานผ่าน HTTPS ทำอย่างไร?

n8n ทำงานผ่าน HTTP บน port 5678 โดยต้องใช้ reverse proxy มาวางไว้ด้านหน้าเพื่อทำ TLS termination ให้ผูก n8n ไว้กับ 127.0.0.1:5678 เพื่อให้เข้าถึงได้ผ่าน proxy เท่านั้น จากนั้นใช้ Traefik พร้อมระบบ automatic certificates หรือใช้ nginx ร่วมกับ Let's Encrypt certificate ต้องตั้งค่า N8N_PROTOCOL=https และ WEBHOOK_URL=https://your-host/ และตรวจสอบให้แน่ใจว่า proxy มีการส่งต่อ WebSocket Upgrade headers มิฉะนั้นหน้า editor จะค้าง

วิธีการอัปเกรด n8n อย่างปลอดภัยทำอย่างไร?

ให้ระบุ image tag ที่เฉพาะเจาะจงแทนการใช้ latest ควรทำการ pg_dump ก่อนเสมอเนื่องจาก n8n จะรัน migrations โดยอัตโนมัติเมื่อเริ่มทำงาน ให้ตรวจสอบ release notes เพื่อดูการเปลี่ยนแปลงที่อาจส่งผลกระทบ (breaking changes) จากนั้นจึงเปลี่ยน tag และรัน docker compose pull n8n && docker compose up -d n8n เนื่องจาก container สามารถลบทิ้งและสร้างใหม่ได้ หากเกิดปัญหาให้ทำการ rollback โดยการระบุ tag เดิมและกู้คืนข้อมูล dump ที่ทำไว้ก่อนอัปเกรด