tva
← บทความเชิงลึก

คู่มือแก้ปัญหา n8n ที่โฮสต์ด้วยตนเองฉบับสมบูรณ์ 2025: ขนาดข้อมูลการรันและ webhook กับ Traefik

อัปเดตล่าสุด: 15 ตุลาคม 2025

การติดตั้งและดูแล n8n เองให้คุณรันเวิร์กโฟลว์ได้ไม่จำกัด ควบคุมข้อมูลได้เต็มที่ และประหยัดต้นทุนได้มากเมื่อเทียบกับแผนคลาวด์ แต่ในการใช้งานจริง อินสแตนซ์ที่ติดตั้งและดูแลเองมีปัญหาที่ผู้ใช้ n8n Cloud มักไม่ต้องจัดการเอง โดยเฉพาะการจัดการข้อมูลขนาดใหญ่และการกำหนดค่า webhook เมื่อใช้ reverse proxy

ในเดือนมิถุนายน 2025 เราเผยแพร่คู่มือแก้ปัญหาสองฉบับที่อธิบายปัญหาเหล่านี้แยกกัน แต่ยังไม่มีคู่มือฉบับสมบูรณ์สำหรับการนำ n8n ขึ้นใช้งานจริงร่วมกับ Traefik reverse proxy ที่แก้ปัญหาที่พบบ่อยทั้งสองอย่างในที่เดียว

คู่มือนี้รวมวิธีแก้ปัญหาจากบทความต้นฉบับทั้งสองฉบับ พร้อมการตั้งค่า Traefik แบบครบถ้วนที่รองรับ WebSocket ข้อกำหนดใหม่เรื่องตัวรันงานในปี 2025 และไฟล์ docker-compose สำหรับระบบใช้งานจริงที่นำไปใช้ได้ทันที


สารบัญ

  1. วิเคราะห์ปัญหาอย่างรวดเร็ว: คุณพบปัญหาอะไร?
  2. ทำความเข้าใจสองปัญหาหลัก
  3. วิธีแก้ #1: ข้อผิดพลาดข้อมูลการรันมีขนาดใหญ่เกินไป
  4. วิธีแก้ #2: ปัญหา URL ของ webhook
  5. การตั้งค่าระบบใช้งานจริงแบบครบถ้วนด้วย Traefik
  6. ข้อกำหนดปี 2025: ตัวรันงาน
  7. เอกสารอ้างอิงตัวแปรสภาพแวดล้อม
  8. ตัวอย่าง Docker Compose
  9. การทดสอบการตั้งค่า
  10. การแก้ปัญหาที่พบบ่อย

วิเคราะห์ปัญหาอย่างรวดเร็ว: คุณพบปัญหาอะไร?

อาการ: “Existing execution data is too large”

คุณจะเห็นข้อผิดพลาดนี้เมื่อ:

  • คลิก “Execute Node” ระหว่างพัฒนาเวิร์กโฟลว์
  • ทดสอบเวิร์กโฟลว์ที่มีชุดข้อมูลขนาดใหญ่หรือรายการจำนวนมาก
  • ใช้โหมดการรันบางส่วน (ทดสอบแต่ละโหนด)
  • ประมวลผลการแปลงข้อมูลที่ซับซ้อนและมีหลายแขนง

วิธีแก้ที่ต้องใช้: วิธีแก้ #1: ขนาดข้อมูลการรัน


อาการ: webhook แสดง URL ไม่ถูกต้องหรือไม่ทำงาน

คุณจะพบอาการนี้เมื่อ:

  • URL ของ webhook แสดงหมายเลขพอร์ต (เช่น :5678)
  • บริการภายนอก (Slack, GitHub, Stripe) เข้าถึง webhook ของคุณไม่ได้
  • webhook ทำงานในโหมดทดสอบแต่ล้มเหลวในระบบใช้งานจริง
  • คุณใช้ reverse proxy (Nginx, Traefik, Caddy)

วิธีแก้ที่ต้องใช้: วิธีแก้ #2: การกำหนดค่า URL ของ webhook


อาการ: คำเตือนว่าการใช้งานโดยไม่มีตัวรันงานกำลังจะเลิกสนับสนุน

คุณจะเห็นข้อความในบันทึกระบบว่า:

Running n8n without task runners is deprecated. Task runners will be
turned on by default in a future version.

วิธีแก้ที่ต้องใช้: การกำหนดค่าตัวรันงาน


อาการ: คุณต้องการชุดการตั้งค่าที่ครบถ้วนและพร้อมใช้งานจริง

สิ่งที่ต้องมี:

  • นำวิธีแก้ทั้งสองอย่างมาใช้อย่างถูกต้อง
  • Traefik reverse proxy พร้อม HTTPS อัตโนมัติ
  • แนวปฏิบัติที่ดีสำหรับระบบใช้งานจริงและความปลอดภัย
  • ขีดจำกัดทรัพยากรและการเฝ้าติดตามที่เหมาะสม

ข้ามไปที่: การตั้งค่าระบบใช้งานจริงแบบครบถ้วน


ทำความเข้าใจสองปัญหาหลัก

เหตุใดผู้ใช้ n8n Cloud จึงแทบไม่ต้องจัดการปัญหาเหล่านี้

บน n8n Cloud ทาง n8n จัดการการกำหนดค่าเซิร์ฟเวอร์ให้คุณ เช่น URL ของ webhook การจัดเก็บข้อมูลไบนารี และการอัปเดต หากติดตั้งและดูแลระบบเอง คุณต้องรับผิดชอบการกำหนดค่าเหล่านี้

สาเหตุหลัก

ปัญหา #1: ขีดจำกัดขนาดข้อมูลการรัน

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

ปัญหา #2: การสร้าง URL ของ webhook

n8n พยายามตรวจจับ URL สาธารณะของคุณโดยอัตโนมัติ แต่การตรวจจับนี้ล้มเหลวเมื่ออยู่หลัง reverse proxy บริการภายนอกจึงได้รับ URL ของ webhook ที่ผิด โดยมีพอร์ตหรือชื่อโฮสต์ภายใน ทำให้การเชื่อมต่อระบบล้มเหลวโดยไม่มีข้อผิดพลาดปรากฏชัด วิธีแก้: ใช้ตัวแปรสภาพแวดล้อม WEBHOOK_URL


วิธีแก้ #1: ข้อผิดพลาดข้อมูลการรันมีขนาดใหญ่เกินไป

รายละเอียดของปัญหา

เมื่อคุณรันเฉพาะส่วนหนึ่งของเวิร์กโฟลว์ (คลิก “Execute Node” ในตัวแก้ไข) n8n ต้องโหลดข้อมูลการรันก่อนหน้าเพื่อให้บริบทแก่โหนดนั้น โดยค่าเริ่มต้น n8n จำกัดคำขอนี้ไว้ที่ 16 MiB (N8N_PAYLOAD_SIZE_MAX=16 ค่ามีหน่วยเป็น MiB) เพื่อป้องกันปัญหาหน่วยความจำบนเซิร์ฟเวอร์ขนาดเล็ก หากคำขอมีขนาดใหญ่กว่านี้ n8n (หรือ reverse proxy ที่มีขีดจำกัดขนาดเนื้อหาคำขอต่ำกว่า) จะตอบกลับด้วย HTTP 413 และตัวแก้ไขจะแสดงข้อผิดพลาดนี้

ข้อความผิดพลาด

ตาม เอกสาร n8n อย่างเป็นทางการ:

Please execute the whole workflow, rather than just the node.
(Existing execution data is too large.)

ข้อผิดพลาดนี้ปรากฏเมื่อประมวลผลรายการหลายพันรายการในโหนดเดียว ทำงานกับการตอบกลับ JSON API ขนาดใหญ่ แปลงชุดข้อมูลขนาดใหญ่ด้วยโหนด Code หรือใช้เวิร์กโฟลว์ที่มีหลายแขนงทำงานขนานกัน

วิธีแก้: N8N_PAYLOAD_SIZE_MAX

วิธีแก้ทำได้ง่าย แต่ต้องเข้าใจว่าเซิร์ฟเวอร์มีทรัพยากรพร้อมใช้งานเท่าใด

ค่าที่แนะนำตาม RAM ของเซิร์ฟเวอร์

RAM ของเซิร์ฟเวอร์N8N_PAYLOAD_SIZE_MAXค่าที่ต้องตั้ง (MiB)เปอร์เซ็นต์ของ RAM
2GB หรือน้อยกว่า64MB64~3%
4GB128MB128~3%
8GB256MB256~3%
16GB+512MB512~3%

หลักคร่าว ๆ: ใช้ให้น้อยกว่า 20% ของ RAM ที่มีอยู่ เพื่อให้ระบบยังเสถียรภายใต้ภาระงาน

การกำหนดค่าใน Docker Compose

version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_PORT=5678

      # Payload size fix (256MB for 8GB+ RAM servers; value in MiB)
      - N8N_PAYLOAD_SIZE_MAX=256

      # Binary data optimization (highly recommended)
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
      - N8N_BINARY_DATA_TTL=1440  # 24 hours

    volumes:
      - n8n_data:/home/node/.n8n

    # Resource limits (adjust based on your server)
    deploy:
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 1G

volumes:
  n8n_data:

ทำความเข้าใจโหมดข้อมูลไบนารี

ค่าเริ่มต้น: เก็บในหน่วยความจำ (ไม่แนะนำ)

# This is the default - DON'T use in production
N8N_DEFAULT_BINARY_DATA_MODE=default

ปัญหา: เก็บไฟล์ (ภาพ PDF เป็นต้น) ใน RAM สิ้นเปลืองหน่วยความจำที่มีจำกัด ไม่เหมาะกับภาระงานจริง และจำกัดจำนวนไฟล์ที่ประมวลผลได้

จากการทดสอบของเรา ขณะระบบว่าง โหมดเริ่มต้นใช้ RAM ~315MB เทียบกับ 211MB ในโหมดระบบไฟล์ จึง ใช้หน่วยความจำน้อยลง ~100MB ขณะระบบว่าง

แนวทางที่แนะนำ: เก็บในระบบไฟล์

N8N_DEFAULT_BINARY_DATA_MODE=filesystem
N8N_BINARY_DATA_TTL=1440  # Clean up after 24 hours (value in minutes)

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

ข้อควรระวัง: หากใช้โหมดคิว (การกระจายการรันผ่าน Redis) โปรดทราบว่า n8n ไม่รองรับโหมดระบบไฟล์ในโหมดนี้ ณ เดือนตุลาคม 2026 เอกสารของ n8n แนะนำโหมด database สำหรับโหมดคิว

ผลจากการใช้งานจริง

จากการทดสอบ Docker ในเดือนตุลาคม 2025 กับ n8n เวอร์ชัน 1.115.2:

การตั้งค่าการใช้หน่วยความจำส่วนต่าง
ค่าเริ่มต้น (ยังไม่แก้ปัญหา)315 MBค่าอ้างอิงตั้งต้น
แก้ขีดจำกัดข้อมูลร่วมกับใช้โหมดระบบไฟล์211 MB-104 MB

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


วิธีแก้ #2: ปัญหา URL ของ webhook

รายละเอียดของปัญหา

เมื่อ n8n สร้าง URL ของ webhook เพื่อแสดงในตัวแก้ไขและลงทะเบียนกับบริการภายนอก ระบบจะพยายามตรวจจับ URL สาธารณะของคุณโดยอัตโนมัติ แต่เมื่ออยู่หลัง reverse proxy การตรวจจับนี้จะผิดพลาดอย่างมาก

สิ่งที่คุณจะเห็น (URL ที่ผิด)

http://n8n.yourdomain.com:5678/webhook/abc123

ปัญหาของ URL นี้:

  1. มีหมายเลขพอร์ต (:5678) ซึ่งบริการภายนอกมักเข้าถึงพอร์ตที่ไม่ใช่พอร์ตมาตรฐานไม่ได้
  2. โปรโตคอลผิด (http แทน https) ทั้งที่หลายบริการต้องใช้ HTTPS
  3. ชื่อโฮสต์ภายใน ซึ่งอาจเป็นชื่อคอนเทนเนอร์ Docker แทนโดเมนสาธารณะ

ทำไมบริการภายนอกจึงทำงานไม่ได้

บริการอย่าง GitHub, Slack, Stripe, Zoom, Google Sheets และบริการอื่นอีกหลายร้อยบริการพยายามส่ง webhook ไปยัง URL ที่ผิดเหล่านี้ และล้มเหลวโดยไม่มีข้อผิดพลาดปรากฏชัด คุณตั้งค่าการเชื่อมต่อแล้ว ทุกอย่างดูถูกต้องในหน้าจอ แต่การแจ้งเตือนไม่เคยมาถึง

วิธีแก้: ตัวแปรสภาพแวดล้อม WEBHOOK_URL

ตาม เอกสาร n8n อย่างเป็นทางการ:

“ตัวแปรสภาพแวดล้อม WEBHOOK_URL ใช้กำหนด URL ของ webhook เอง เพื่อให้ n8n แสดง URL ในหน้าจอตัวแก้ไขและลงทะเบียน URL ของ webhook ที่ถูกต้องกับบริการภายนอกได้ เมื่อรัน n8n หลัง reverse proxy การตั้งค่าตัวแปรนี้เป็นสิ่งสำคัญ”

การตั้งค่าเบื้องต้น

environment:
  - WEBHOOK_URL=https://n8n.yourdomain.com
  - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.yourdomain.com
  - N8N_TRUST_PROXY_HEADER=true
  - N8N_PROXY_HOPS=1

หน้าที่ของแต่ละตัวแปร

WEBHOOK_URL (สำคัญที่สุด)

  • URL สาธารณะสำหรับจุดรับ webhook ทั้งหมด
  • ใช้เมื่อลงทะเบียน webhook กับบริการภายนอก
  • ต้องตรงกับการตั้งค่า Traefik หรือ reverse proxy ของคุณทุกประการ
  • หมายเหตุเรื่องเวอร์ชัน: เปลี่ยนชื่อจาก WEBHOOK_TUNNEL_URL ใน v0.227.0 และนำชื่อเดิมออกใน n8n 1.0

N8N_EDITOR_BASE_URL

  • URL สำหรับเข้าหน้าเว็บ n8n
  • โดยปกติเป็นค่าเดียวกับ WEBHOOK_URL
  • ปรากฏในแถบที่อยู่ของเบราว์เซอร์และอีเมลเชิญ

N8N_PROTOCOL

  • ตั้งเป็น https สำหรับระบบใช้งานจริง (ที่ใช้ SSL/TLS)
  • ตั้งเป็น http เฉพาะการทดสอบในเครื่อง
  • ต้องตรงกับการสิ้นสุดการเชื่อมต่อที่ reverse proxy

N8N_HOST

  • ใส่เฉพาะชื่อโดเมนสาธารณะของคุณ
  • อย่าใส่โปรโตคอล (https://) หรือพอร์ต
  • ตัวอย่าง: n8n.yourdomain.com ไม่ใช่ https://n8n.yourdomain.com:443

N8N_TRUST_PROXY_HEADER

  • ไม่ใช่ตัวแปรที่ระบุไว้ในเอกสารของ n8n: ตัวแปรนี้ไม่ปรากฏในเอกสารอ้างอิงตัวแปรสภาพแวดล้อมของ n8n จึงไม่มีผลที่ระบุไว้ในเอกสารเมื่อกำหนดค่า
  • การเชื่อถือส่วนหัวจากพร็อกซี (เพื่อรับ IP จริงของไคลเอนต์) ควบคุมด้วย N8N_PROXY_HOPS
  • คุณสามารถละตัวแปรนี้จากตัวอย่างในคู่มือนี้ได้

N8N_PROXY_HOPS

  • ตั้งเป็น 1 เมื่ออยู่หลัง reverse proxy หนึ่งชั้น
  • ตั้งเป็น 2 หากอยู่หลังพร็อกซีสองชั้น (พบไม่บ่อย)
  • บอก n8n ว่าควรเชื่อถือพร็อกซีกี่ชั้น

การทดสอบ URL ของ webhook

ก่อนแก้ไข

ในหน้าจอ n8n ให้สร้างโหนด Webhook แล้วตรวจ URL ที่แสดง:

http://n8n.example.com:5678/webhook/abc123  ❌ Wrong

หลังแก้ไข

โหนด Webhook เดิมจะแสดง:

https://n8n.example.com/webhook/abc123  ✅ Correct

ความแตกต่างสำคัญ: บริการภายนอกเข้าถึง URL นี้ได้แล้ว เพราะใช้ HTTPS พอร์ตมาตรฐาน 443 (ซึ่ง reverse proxy จัดการให้) แทนพอร์ตภายใน 5678


การตั้งค่าระบบใช้งานจริงแบบครบถ้วนด้วย Traefik

ทำไมต้องใช้ Traefik?

Traefik เป็น reverse proxy สมัยใหม่ที่เหมาะกับการนำระบบขึ้นใช้งานด้วย Docker โดยจัดการ HTTPS ผ่าน Let’s Encrypt อัตโนมัติ ไม่ต้องดูแลใบรับรองเอง ค้นพบบริการและตรวจจับคอนเทนเนอร์อัตโนมัติผ่าน Docker labels รองรับ WebSocket ในตัวสำหรับการเชื่อมต่อสดของตัวแก้ไข n8n ตั้งค่าได้ง่ายด้วย Docker labels แทนไฟล์กำหนดค่าที่ซับซ้อน และมีแดชบอร์ดในตัวสำหรับเฝ้าดูการกำหนดเส้นทางและใบรับรองแบบเรียลไทม์

ภาพรวมสถาปัตยกรรม

Internet
  ↓
[Traefik Reverse Proxy]
  ↓ HTTPS (Let's Encrypt)
  ↓ WebSocket Support
[คอนเทนเนอร์ n8n]
  ↓ เครือข่ายภายใน
[ฐานข้อมูล PostgreSQL]

การรองรับ WebSocket

Traefik ทำหน้าที่พร็อกซีการเชื่อมต่อ WebSocket ได้ในตัว รวมถึงการเชื่อมต่อสดที่ตัวแก้ไข n8n ใช้ จึงไม่ต้องมีมิดเดิลแวร์เพิ่มเติม webhook เป็นคำขอ HTTPS ทั่วไปและไม่พึ่งพา WebSocket ตัวอย่างสำหรับระบบใช้งานจริงด้านล่างมี labels ส่วนหัว WebSocket แบบเลือกใช้ ซึ่งคุณสามารถละได้

Docker Compose ฉบับสมบูรณ์สำหรับระบบใช้งานจริง

การตั้งค่านี้รวมวิธีแก้ทั้งสองปัญหา พร้อม Traefik ที่รองรับ WebSocket อย่างถูกต้อง และเป็นไปตามแนวปฏิบัติที่ดีสำหรับระบบใช้งานจริง:

version: '3.8'

networks:
  traefik-net:
    external: true
  n8n-internal:
    internal: true

services:
  # PostgreSQL Database
  postgres:
    image: postgres:16-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    networks:
      - n8n-internal
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      timeout: 5s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 512M

  # n8n Application
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - traefik-net
      - n8n-internal

    # Traefik Configuration Labels
    labels:
      # Enable Traefik for this container
      - "traefik.enable=true"
      - "traefik.docker.network=traefik-net"

      # Router configuration
      - "traefik.http.routers.n8n.rule=Host(`${N8N_DOMAIN}`)"
      - "traefik.http.routers.n8n.entrypoints=websecure"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"

      # Service configuration
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

      # Middleware: Request size limit in bytes (256MB, matches N8N_PAYLOAD_SIZE_MAX)
      - "traefik.http.middlewares.n8n-buffering.buffering.maxRequestBodyBytes=268435456"

      # Middleware: WebSocket headers (optional; Traefik proxies WebSockets natively)
      - "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Upgrade=websocket"
      - "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Connection=Upgrade"

      # Middleware: Security headers
      - "traefik.http.middlewares.n8n-security.headers.customResponseHeaders.X-Robots-Tag=noindex,nofollow"
      - "traefik.http.middlewares.n8n-security.headers.sslProxyHeaders.X-Forwarded-Proto=https"

      # Apply ALL middlewares
      - "traefik.http.routers.n8n.middlewares=n8n-buffering,n8n-websocket,n8n-security"

    environment:
      # Database Configuration
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}

      # FIX #2: Webhook URL Configuration
      - WEBHOOK_URL=https://${N8N_DOMAIN}
      - N8N_EDITOR_BASE_URL=https://${N8N_DOMAIN}
      - N8N_PROTOCOL=https
      - N8N_HOST=${N8N_DOMAIN}
      - N8N_PORT=5678
      - N8N_TRUST_PROXY_HEADER=true
      - N8N_PROXY_HOPS=1

      # FIX #1: Payload Size Configuration
      - N8N_PAYLOAD_SIZE_MAX=256  # 256 MiB

      # Binary Data Management
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
      - N8N_BINARY_DATA_TTL=1440  # 24 hours

      # 2025 Requirement: Task Runners
      - N8N_RUNNERS_ENABLED=true
      - N8N_RUNNERS_MODE=internal
      - N8N_RUNNERS_MAX_CONCURRENCY=5

      # Production Optimizations
      - NODE_ENV=production
      - EXECUTIONS_DATA_MAX_AGE=168  # 7 days
      - EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
      - N8N_LOG_LEVEL=info
      - N8N_LOG_OUTPUT=console

      # Timezone (adjust to your location)
      - GENERIC_TIMEZONE=America/New_York
      - TZ=America/New_York

      # Security
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}

    volumes:
      - n8n_data:/home/node/.n8n

    # Resource Limits (8GB+ RAM server)
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '2.0'
        reservations:
          memory: 1G
          cpus: '1.0'

    # Health Check
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

volumes:
  n8n_data:
  postgres_data:

การตั้งค่า Traefik

หากยังไม่มี Traefik ทำงานอยู่ ต่อไปนี้คือขั้นตอนการตั้งค่าแบบครบถ้วน:

ขั้นตอนที่ 1: สร้างเครือข่าย Traefik

docker network create traefik-net

ขั้นตอนที่ 2: สร้างไฟล์กำหนดค่า Traefik

สร้าง traefik/traefik.yml:

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: traefik-net

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]  # CHANGE THIS
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

log:
  level: INFO

accessLog: {}

ขั้นตอนที่ 3: สร้าง Docker Compose สำหรับ Traefik

สร้าง traefik/docker-compose.yml:

version: '3.8'

networks:
  traefik-net:
    external: true

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - traefik-net
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"  # Dashboard (secure this in production!)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"

ขั้นตอนที่ 4: สร้างไฟล์ตัวแปรสภาพแวดล้อม

สร้าง .env ในไดเรกทอรี n8n ของคุณ:

# Domain Configuration
N8N_DOMAIN=n8n.yourdomain.com

# Database Password (generate secure password)
DB_PASSWORD=your_secure_db_password_here

# n8n Encryption Key (generate random string)
N8N_ENCRYPTION_KEY=your_encryption_key_here

สร้างค่าที่ปลอดภัย:

# For DB_PASSWORD
openssl rand -base64 32

# For N8N_ENCRYPTION_KEY
openssl rand -hex 32

ขั้นตอนที่ 5: เริ่มระบบทั้งหมด

# Start Traefik first
cd traefik
docker compose up -d

# Wait a few seconds, then start n8n
cd ../n8n
docker compose up -d

# Watch logs to verify startup
docker compose logs -f n8n

การตรวจสอบการตั้งค่า

ตรวจแดชบอร์ด Traefik

เปิด http://your-server-ip:8080 วิธีนี้ใช้ได้ต่อเมื่อกำหนด api.insecure: true ใน traefik.yml ด้วย (สำหรับทดสอบเท่านั้น) มิฉะนั้นให้กำหนด router สำหรับแดชบอร์ด (api@internal) บนโดเมนแยก

ควรแสดง:

  • ✅ เราเตอร์ n8n ทำงานและแสดงสถานะสีเขียว
  • ✅ ได้รับใบรับรองจาก Let’s Encrypt แล้ว
  • ✅ บริการแสดงสถานะปกติ

ตรวจการเข้าถึง n8n

เปิด https://n8n.yourdomain.com

ควรแสดง:

  • ✅ HTTPS ทำงานพร้อมใบรับรอง Let’s Encrypt ที่ถูกต้อง
  • ✅ ไม่มีคำเตือนความปลอดภัยจากเบราว์เซอร์
  • ✅ หน้าล็อกอินหรือตั้งค่า n8n แสดงอย่างถูกต้อง

ตรวจ URL ของ webhook

  1. เข้าสู่ระบบ n8n
  2. สร้างเวิร์กโฟลว์ใหม่
  3. เพิ่มโหนด Webhook
  4. ตรวจ “Production URL” ที่แสดง

ผลที่คาดหวัง:

https://n8n.yourdomain.com/webhook/abc123

ไม่ควรเป็นรูปแบบนี้ (หมายถึงการตั้งค่าผิด):

http://n8n.yourdomain.com:5678/webhook/abc123  ❌

ข้อกำหนดปี 2025: ตัวรันงาน

ตัวรันงานคืออะไร?

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

ทำไมเรื่องนี้จึงสำคัญในตอนนี้

จาก เอกสาร n8n อย่างเป็นทางการ:

“การรัน n8n โดยไม่มีตัวรันงานกำลังจะเลิกสนับสนุน ตัวรันงานจะเปิดใช้งานโดยค่าเริ่มต้นในเวอร์ชันอนาคต ผู้ใช้ควรตั้ง N8N_RUNNERS_ENABLED=true ตั้งแต่ตอนนี้ เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นในอนาคต”

จากบันทึกการทดสอบของเรา (ตุลาคม 2025):

There are deprecations related to your environment variables:
 - N8N_RUNNERS_ENABLED -> Running n8n without task runners is deprecated.

การกำหนดค่า

โหมดภายใน (แนะนำสำหรับเซิร์ฟเวอร์เดียว)

environment:
  - N8N_RUNNERS_ENABLED=true
  - N8N_RUNNERS_MODE=internal
  - N8N_RUNNERS_MAX_CONCURRENCY=5

n8n เริ่มตัวรันงานเป็นโปรเซสลูก เป็นการตั้งค่าที่ง่ายที่สุด ไม่ต้องมีโครงสร้างพื้นฐานเพิ่มเติม เหมาะกับการติดตั้งและดูแลระบบเองส่วนใหญ่ และมีภาระเพิ่มด้านประสิทธิภาพเพียงเล็กน้อย ณ เดือนตุลาคม 2026 เอกสารของ n8n ระบุว่าโหมดภายในไม่ปลอดภัยโดยการออกแบบ และประกาศเลิกใช้ตั้งแต่ n8n 3.0

โหมดภายนอก (สำหรับระบบแบบกระจาย)

environment:
  - N8N_RUNNERS_ENABLED=true
  - N8N_RUNNERS_MODE=external
  - N8N_RUNNERS_AUTH_TOKEN=your_secure_token

คอนเทนเนอร์ตัวรันงานแยกต่างหากช่วยแยกทรัพยากรได้ดีขึ้นสำหรับเวิร์กโฟลว์ปริมาณมาก และช่วยขยายระบบแนวนอนข้ามหลายเซิร์ฟเวอร์ได้ โดยรันเป็นคอนเทนเนอร์ sidecar จากอิมเมจ n8nio/runners ซึ่งต้องมีเวอร์ชันตรงกับอิมเมจ n8n ของคุณ การตั้งค่าด้วย Docker Compose ก็เพียงพอ ไม่จำเป็นต้องใช้ Docker Swarm หรือ Kubernetes

การตรวจสอบตัวรันงาน

ตรวจรายการโปรเซส

docker exec n8n ps aux

เมื่อไม่มีตัวรันงาน (3 โปรเซส):

PID   USER     TIME  COMMAND
    1 node      0:00 tini -- /docker-entrypoint.sh
    7 node      0:12 node /usr/local/bin/n8n

เมื่อมีตัวรันงาน (4 โปรเซส):

PID   USER     TIME  COMMAND
    1 node      0:00 tini -- /docker-entrypoint.sh
    7 node      0:16 node /usr/local/bin/n8n
   18 node      0:10 node [...]/task-runner/dist/start.js

หลักฐาน: เห็นโปรเซสตัวรันงานที่มี PID 18

ตรวจบันทึกระบบ

docker logs n8n | grep -i runner

ควรเห็น:

n8n Task Broker ready on 127.0.0.1, port 5679
Registered runner "JS Task Runner" (zCWpF0Eb_LJsqWYvLm5t1)

ผลต่อการใช้ทรัพยากร

จากการทดสอบ Docker ของเรา (ตุลาคม 2025, n8n เวอร์ชัน 1.115.2):

การตั้งค่าหน่วยความจำCPUโปรเซส
ไม่มีตัวรันงาน214 MB0.14%3
มีตัวรันงาน289 MB0.29%4
ส่วนต่าง+75 MB+0.15%+1

ภาระที่เพิ่มขึ้นมีเพียงเล็กน้อย ประโยชน์ด้านความปลอดภัย ความเสถียร และการรองรับอนาคตมีมากกว่าต้นทุนทรัพยากรที่เพิ่มขึ้นเล็กน้อยนี้อย่างชัดเจน


เอกสารอ้างอิงตัวแปรสภาพแวดล้อม

รายการตัวแปรทั้งหมด

ตัวแปรชนิดข้อมูลค่าเริ่มต้นหน้าที่ความสำคัญ
ตัวแปรที่สำคัญ
WEBHOOK_URLสตริง–URL สาธารณะของ webhookจำเป็น เมื่อใช้ reverse proxy
N8N_PAYLOAD_SIZE_MAXตัวเลข16 (MiB)ขนาดข้อมูลคำขอสูงสุดเป็น MiB รวมข้อมูลการรันบางส่วนจำเป็น สำหรับข้อมูลขนาดใหญ่
N8N_RUNNERS_ENABLEDบูลีนfalseเปิดใช้งานตัวรันงานแนะนำ สำหรับ 1.x (ไม่จำเป็นตั้งแต่ n8n 2.0)
N8N_TRUST_PROXY_HEADER––ไม่อยู่ในรายการตัวแปรที่ระบุในเอกสารของ n8nไม่จำเป็น ใช้ N8N_PROXY_HOPS
การกำหนดค่า webhook
N8N_EDITOR_BASE_URLสตริง–URL ของหน้าจอตัวแก้ไขแนะนำ
N8N_PROTOCOLสตริงhttpโปรโตคอล (http/https)ระบบใช้งานจริง
N8N_HOSTสตริงlocalhostชื่อโฮสต์สาธารณะระบบใช้งานจริง
N8N_PORTตัวเลข5678พอร์ตภายในไม่บังคับ
N8N_PROXY_HOPSตัวเลข0จำนวน reverse proxyตั้งเป็น 1 เมื่อใช้พร็อกซี
ประสิทธิภาพ
N8N_DEFAULT_BINARY_DATA_MODEสตริงdefaultโหมดจัดเก็บข้อมูลไบนารีแนะนำ
N8N_BINARY_DATA_TTL––ไม่มีผลตั้งแต่ n8n 1.9.0 (ข้อมูลไบนารีถูกล้างพร้อมข้อมูลการรัน)นำออกได้
ตัวรันงาน
N8N_RUNNERS_MODEสตริงinternalโหมดตัวรันงานเมื่อเปิดใช้งานตัวรันงาน
N8N_RUNNERS_MAX_CONCURRENCYตัวเลข10จำนวนงานพร้อมกันสูงสุดต่อตัวรันงานไม่บังคับ

ชุดค่ากำหนดตามสถานการณ์

สถานการณ์ A: การพัฒนา (ในเครื่อง)

environment:
  - N8N_PORT=5678

ใช้เมื่อ: ทดสอบในเครื่อง ไม่มี reverse proxy และไม่มีข้อกำหนดสำหรับระบบใช้งานจริง

สถานการณ์ B: อยู่หลัง reverse proxy (ไม่มีข้อมูลขนาดใหญ่)

environment:
  - N8N_PORT=5678
  - WEBHOOK_URL=https://n8n.yourdomain.com
  - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.yourdomain.com
  - N8N_TRUST_PROXY_HEADER=true
  - N8N_PROXY_HOPS=1
  - N8N_RUNNERS_ENABLED=true

ใช้เมื่อ: เปิดอินสแตนซ์ n8n สู่สาธารณะ ต้องใช้ webhook และเวิร์กโฟลว์มีขนาดเล็ก

สถานการณ์ C: ระบบใช้งานจริงแบบครบถ้วน

environment:
  # Database
  - DB_TYPE=postgresdb
  - DB_POSTGRESDB_HOST=postgres
  - DB_POSTGRESDB_PORT=5432
  - DB_POSTGRESDB_DATABASE=n8n
  - DB_POSTGRESDB_USER=n8n
  - DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}

  # Webhooks
  - WEBHOOK_URL=https://n8n.yourdomain.com
  - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.yourdomain.com
  - N8N_PORT=5678
  - N8N_TRUST_PROXY_HEADER=true
  - N8N_PROXY_HOPS=1

  # Performance
  - N8N_PAYLOAD_SIZE_MAX=256  # 256 MiB
  - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
  - N8N_BINARY_DATA_TTL=1440

  # Task Runners
  - N8N_RUNNERS_ENABLED=true
  - N8N_RUNNERS_MODE=internal
  - N8N_RUNNERS_MAX_CONCURRENCY=5

  # Production
  - NODE_ENV=production
  - EXECUTIONS_DATA_MAX_AGE=168  # 7 days
  - EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
  - N8N_LOG_LEVEL=info

  # Security
  - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}

ใช้เมื่อ: นำระบบขึ้นใช้งานจริงโดยใช้ทุกฟีเจอร์ มีเวิร์กโฟลว์ขนาดใหญ่ และเปิดให้เข้าถึงจากภายนอก


ตัวอย่าง Docker Compose

มีชุดค่ากำหนดทั้งสี่สถานการณ์จากสภาพแวดล้อมทดสอบของเรา ซึ่งตรวจสอบกับ n8n เวอร์ชัน 1.115.2 ในเดือนตุลาคม 2025 แล้ว ตัวอย่างใช้อิมเมจแท็ก latest ให้ตรึงเป็น n8nio/n8n:1.115.2 เพื่อทำซ้ำด้วยเวอร์ชันที่ทดสอบ

เปรียบเทียบการใช้ทรัพยากร (จากการทดสอบของเรา)

สถานการณ์หน่วยความจำCPUโปรเซสคำอธิบาย
ค่าเริ่มต้น315 MB0.00%3ยังไม่แก้ปัญหา ใช้เป็นค่าอ้างอิงตั้งต้น
แก้ขีดจำกัดข้อมูล211 MB0.00%3แก้ขีดจำกัดข้อมูล + โหมดระบบไฟล์
แก้ webhook215 MB0.14%3กำหนดค่า webhook เท่านั้น
ระบบใช้งานจริง289 MB0.29%4แก้ทุกปัญหา + ตัวรันงาน

ข้อค้นพบสำคัญ: ขณะระบบว่าง การตั้งค่าสำหรับระบบใช้งานจริงที่รวมวิธีแก้ทั้งหมดใช้ หน่วยความจำน้อยกว่า การตั้งค่าเริ่มต้นในการทดสอบของเรา ตัวเลขเหล่านี้เป็นการวัดขณะระบบว่าง ไม่ใช่ผลขณะรับภาระจากข้อมูลคำขอขนาดใหญ่


การทดสอบการตั้งค่า

รายการตรวจสอบก่อนนำระบบขึ้นใช้งาน

1. การกำหนดค่า DNS

# Verify DNS points to your server
nslookup n8n.yourdomain.com

# Should return your server's public IP

2. ความพร้อมของพอร์ต

# Check if required ports are free
sudo netstat -tlnp | grep -E '(80|443|5678)'

# Should show nothing or only Traefik on 80/443

3. การติดตั้ง Docker

# Verify Docker
docker --version

# Verify Docker Compose
docker compose version

4. ตัวแปรสภาพแวดล้อม

# Verify .env file exists
cat .env

# Should show N8N_DOMAIN, DB_PASSWORD, N8N_ENCRYPTION_KEY

ขั้นตอนนำระบบขึ้นใช้งาน

# Step 1: Create Traefik network
docker network create traefik-net

# Step 2: Start Traefik
cd traefik
docker compose up -d

# Step 3: Wait for Traefik to be ready
sleep 10

# Step 4: Start n8n
cd ../n8n
docker compose up -d

# Step 5: Watch logs for any errors
docker compose logs -f n8n

การทดสอบหลังนำระบบขึ้นใช้งาน

ทดสอบ 1: การเข้าถึงผ่าน HTTPS

curl -I https://n8n.yourdomain.com

ผลที่คาดหวัง: HTTP/2 200 (หรือ HTTP/1.1 200)

ทดสอบ 2: การเปลี่ยนเส้นทางจาก HTTP เป็น HTTPS

curl -I http://n8n.yourdomain.com

ผลที่คาดหวัง: HTTP/1.1 308 Permanent Redirect พร้อม Location: https://n8n.yourdomain.com

ทดสอบ 3: สถานะสุขภาพคอนเทนเนอร์

docker ps

ผลที่คาดหวัง: ทั้ง n8n และ n8n-postgres แสดงสถานะ (healthy)

ทดสอบ 4: รูปแบบ URL ของ webhook

  1. เข้าสู่ระบบผ่านหน้าเว็บ n8n
  2. สร้างเวิร์กโฟลว์ใหม่
  3. เพิ่มโหนด Webhook
  4. ตรวจ Production URL ที่แสดง

รูปแบบที่คาดหวัง:

https://n8n.yourdomain.com/webhook/abc123

รูปแบบที่ไม่ควรเห็น (การตั้งค่าผิด):

http://n8n.yourdomain.com:5678/webhook/abc123  ❌

ทดสอบ 5: ตัวรันงานทำงานอยู่

docker logs n8n | grep -i runner

ผลลัพธ์ที่คาดหวัง:

Registered runner "JS Task Runner"

ทดสอบ 6: ตัวแปรสภาพแวดล้อมถูกนำไปใช้

docker exec n8n env | grep N8N_PAYLOAD_SIZE_MAX

ผลที่คาดหวัง: N8N_PAYLOAD_SIZE_MAX=256


การแก้ปัญหาที่พบบ่อย

ปัญหา: HTTPS ไม่ทำงาน

อาการ: เบราว์เซอร์แสดงคำเตือน “Not Secure” ข้อผิดพลาดใบรับรอง หรือเข้าถึงผ่าน HTTPS ไม่ได้

การวิเคราะห์ปัญหา:

# Check Traefik logs for errors
docker logs traefik | grep -i error

# Check certificate file exists
ls -la traefik/letsencrypt/acme.json

# Verify DNS resolution
nslookup n8n.yourdomain.com

วิธีแก้:

  1. DNS ไม่ชี้ไปยังเซิร์ฟเวอร์: แก้ระเบียน DNS A ให้ชี้ไปยัง IP สาธารณะของเซิร์ฟเวอร์ รอ DNS เผยแพร่ (สูงสุด 24 ชั่วโมง โดยทั่วไปเร็วกว่านั้นมาก) แล้วทดสอบจากเครือข่ายอื่น: dig n8n.yourdomain.com +short
  2. พอร์ต 80 ถูกบล็อก: Let’s Encrypt ต้องใช้พอร์ต 80 สำหรับ HTTP challenge ตรวจไฟร์วอลล์: sudo ufw status หากถูกบล็อก ให้เปิดด้วย: sudo ufw allow 80/tcp && sudo ufw allow 443/tcp
  3. อีเมลในค่ากำหนด Traefik ไม่ถูกต้อง: แก้ไฟล์ traefik/traefik.yml โดยตั้ง certificatesResolvers.letsencrypt.acme.email เป็นที่อยู่อีเมลที่ถูกต้อง แล้วเริ่ม Traefik ใหม่: docker compose restart

ปัญหา: webhook ตอบกลับ 404

อาการ: บริการภายนอกรายงานว่า webhook ล้มเหลว URL ดูถูกต้องแต่ใช้งานไม่ได้ หรือทำงานในโหมดทดสอบแต่ล้มเหลวในระบบใช้งานจริง

การวิเคราะห์ปัญหา:

# Test webhook directly
curl -v https://n8n.yourdomain.com/webhook/test

# Check Traefik routing logs
docker logs traefik | grep webhook

# Verify n8n sees requests
docker logs n8n | grep webhook

วิธีแก้:

  1. ตั้ง WEBHOOK_URL ไม่ถูกต้อง: ตรวจตัวแปรสภาพแวดล้อม: docker exec n8n env | grep WEBHOOK_URL ต้องตรงกับโดเมนของคุณทุกประการ: WEBHOOK_URL=https://n8n.yourdomain.com
  2. กำหนดค่าเครือข่ายผิด: ตรวจว่า n8n อยู่ใน traefik-net: docker inspect n8n | grep -A 5 Networks ผลลัพธ์ควรแสดง “traefik-net”

ปัญหา: ยังพบ “Execution Data Too Large”

อาการ: ยังเกิดข้อผิดพลาดหลังตั้ง N8N_PAYLOAD_SIZE_MAX หรือเวิร์กโฟลว์ขนาดใหญ่ล้มเหลวตอน “Execute Node”

การวิเคราะห์ปัญหา:

# Verify variable is set
docker exec n8n env | grep PAYLOAD

# Should show N8N_PAYLOAD_SIZE_MAX=256

วิธีแก้:

  1. ตัวแปรยังไม่ถูกนำไปใช้ (ไม่ได้สร้างคอนเทนเนอร์ใหม่): สร้างคอนเทนเนอร์ใหม่เพื่อใช้ค่าที่เปลี่ยน: docker compose up -d n8n (docker compose restart ไม่ใช้ค่าตัวแปรสภาพแวดล้อมที่เปลี่ยนไป) จากนั้นตรวจสอบ: docker exec n8n env | grep PAYLOAD
  2. เวิร์กโฟลว์ต้องใช้ขีดจำกัดที่สูงขึ้น: สำหรับเซิร์ฟเวอร์ RAM 16GB+ เพิ่มเป็น 512MB: N8N_PAYLOAD_SIZE_MAX=512
  3. ขีดจำกัดขนาดคำขอของ Traefik ต่ำเกินไป: เพิ่มขีดจำกัดของ Traefik (หน่วยไบต์) ให้ตรงกันด้วย: "traefik.http.middlewares.n8n-buffering.buffering.maxRequestBodyBytes=536870912"

ปัญหา: ใช้หน่วยความจำสูง

อาการ: คอนเทนเนอร์ใช้ RAM >1.5GB ขณะว่าง การใช้หน่วยความจำเพิ่มขึ้นเรื่อย ๆ หรือเกิดข้อผิดพลาดหน่วยความจำไม่พอ

การวิเคราะห์ปัญหา:

# Monitor memory
docker stats n8n

# Check binary data mode
docker exec n8n env | grep BINARY_DATA_MODE

วิธีแก้:

  1. ไม่ได้ใช้โหมดระบบไฟล์: เพิ่มในตัวแปรสภาพแวดล้อม: N8N_DEFAULT_BINARY_DATA_MODE=filesystem ผล: ใช้หน่วยความจำน้อยลง ~100MB ขณะระบบว่างในการทดสอบของเรา
  2. ข้อมูลการรันเก่าสะสม: ลดระยะเวลาเก็บข้อมูล: EXECUTIONS_DATA_MAX_AGE=168 (7 วันแทน 14 วัน) และ EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
  3. ขีดจำกัดคอนเทนเนอร์ต่ำเกินไป: เพิ่มหากเซิร์ฟเวอร์มีทรัพยากรพอ โดยเปลี่ยนขีดจำกัดหน่วยความจำจาก 2G เป็น 4G ในส่วนทรัพยากรสำหรับการนำระบบขึ้นใช้งาน

บทสรุป

สิ่งที่คู่มือนี้แก้ไข

คู่มือฉบับสมบูรณ์นี้แก้ปัญหาที่พบบ่อยที่สุดสองอย่างของ n8n ที่ติดตั้งและดูแลเอง:

  1. ✅ ข้อผิดพลาดข้อมูลการรันมีขนาดใหญ่เกินไป — แก้ด้วย N8N_PAYLOAD_SIZE_MAX และโหมดข้อมูลไบนารีแบบระบบไฟล์
  2. ✅ ปัญหา URL ของ webhook — แก้ด้วย WEBHOOK_URL และการกำหนดค่า reverse proxy ที่ถูกต้อง

พร้อมสิ่งสำคัญที่เพิ่มเข้ามา:

  1. ✅ การตั้งค่า Traefik แบบครบถ้วน — ค่ากำหนดพร้อมใช้งานจริงที่รองรับ WebSocket
  2. ✅ การกำหนดค่าตัวรันงาน — ข้อกำหนดปี 2025 เพื่อรองรับเวอร์ชันในอนาคต
  3. ✅ แนวปฏิบัติที่ดีสำหรับระบบใช้งานจริง — ขีดจำกัดทรัพยากร การตรวจสุขภาพ ส่วนหัวความปลอดภัย และการเฝ้าติดตาม
  4. ✅ ค่ากำหนดที่ผ่านการตรวจสอบแล้ว — ไฟล์ docker-compose ทั้งหมดทดสอบกับ n8n 1.115.2 ในเดือนตุลาคม 2025

ประเด็นสำคัญ

สำหรับการแก้แบบรวดเร็ว:

  • ตั้ง N8N_PAYLOAD_SIZE_MAX=256 สำหรับปัญหาข้อมูลการรัน (256MB เมื่อ RAM 8GB+)
  • ตั้ง WEBHOOK_URL=https://your-domain.com สำหรับปัญหา webhook
  • ตั้ง N8N_RUNNERS_ENABLED=true เพื่อไม่ให้แสดงคำเตือนการเลิกสนับสนุน
  • ใช้ N8N_DEFAULT_BINARY_DATA_MODE=filesystem (ใช้หน่วยความจำน้อยลงประมาณ 100MB ขณะระบบว่างในการทดสอบของเรา)

สำหรับการนำระบบขึ้นใช้งานจริง:

  • ใช้ docker-compose.yml ฉบับสมบูรณ์ของเราพร้อมการตั้งค่า Traefik
  • ไม่ต้องใช้มิดเดิลแวร์ WebSocket เพราะ Traefik ทำหน้าที่พร็อกซี WebSocket ได้ในตัว และ webhook เป็นคำขอ HTTPS ทั่วไป
  • ใช้ PostgreSQL เพื่อประสิทธิภาพที่ดีขึ้นภายใต้ภาระงาน
  • ตั้งขีดจำกัดทรัพยากรให้เหมาะกับความจุของเซิร์ฟเวอร์
  • ใช้การตรวจสุขภาพเพื่อให้ระบบเฝ้าติดตามและบริการที่พึ่งพากันตรวจพบความล้มเหลวได้ (Docker เพียงอย่างเดียวจะทำเครื่องหมายว่าคอนเทนเนอร์มีสถานะไม่สมบูรณ์ แต่ไม่เริ่มใหม่)

สำหรับผู้ใช้ Traefik (สำคัญมาก):

  • Traefik จัดการ WebSocket ได้โดยไม่ต้องมีมิดเดิลแวร์เพิ่มเติม ส่วน webhook ต้องมี router และ WEBHOOK_URL ที่ถูกต้อง
  • ตั้งขีดจำกัดขนาดเนื้อหาคำขอให้เท่ากับหรือมากกว่าขีดจำกัดข้อมูล
  • ตั้งส่วนหัวความปลอดภัย (X-Robots-Tag, X-Forwarded-Proto)
  • ตรวจให้แน่ใจว่า DNS ชี้ไปยังเซิร์ฟเวอร์ก่อนเริ่ม Traefik (ข้อกำหนดของ Let’s Encrypt)

สิ่งที่เพิ่มจากบทความเดือนมิถุนายน 2025

ฟีเจอร์บทความเดือนมิถุนายน 2025คู่มือนี้
การแก้ปัญหาข้อมูลการรัน✅ มีรายละเอียด✅ รวมไว้พร้อมค่าทรัพยากรที่วัดได้
การแก้ปัญหา webhook✅ มีรายละเอียด✅ รวมไว้พร้อมการเชื่อมต่อ Traefik
การกำหนดค่า Traefik❌ ไม่ครอบคลุม✅ การตั้งค่าครบถ้วน
การรองรับ WebSocket❌ ไม่ครอบคลุม✅ เน้นความสำคัญ
ตัวรันงาน❌ ไม่ครอบคลุม✅ ข้อกำหนดปี 2025
docker-compose ที่รวมการตั้งค่าไว้ด้วยกัน❌ แยกกัน✅ พร้อมใช้งานจริง
ค่าทรัพยากรที่วัดได้❌ อธิบายเชิงทฤษฎี✅ ข้อมูลจากการทดสอบจริง
ตัวแปรสภาพแวดล้อม✅ ครอบคลุม✅ เอกสารอ้างอิงครบถ้วน

การทดสอบและยืนยันผล

สภาพแวดล้อมทดสอบของเรา (ตุลาคม 2025):

  • ✅ n8n เวอร์ชัน 1.115.2
  • ✅ คอนเทนเนอร์ Docker ทำงานมากกว่า 2 ชั่วโมง
  • ✅ ตรวจตัวแปรสภาพแวดล้อมทั้งหมดในคอนเทนเนอร์ที่ทำงานอยู่
  • ✅ วัดการใช้ทรัพยากรด้วย docker stats
  • ✅ ยืนยันว่ามีโปรเซสตัวรันงานในรายการโปรเซส
  • ✅ ทดสอบแล้วว่าจุดเชื่อมต่อ HTTP เข้าถึงได้
  • ✅ ตรวจสอบแล้วว่าค่ากำหนดใช้งานได้

ขั้นตอนถัดไป

  1. เลือกสถานการณ์ของคุณ:
    • การพัฒนา: ค่ากำหนดขั้นต่ำ
    • อยู่หลัง reverse proxy: แก้ webhook + ตัวรันงาน
    • ระบบใช้งานจริง: การตั้งค่าครบถ้วนด้วย Traefik (แนะนำ)
  2. นำระบบขึ้นใช้งาน:
    • คัดลอก docker-compose.yml ที่เหมาะสม
    • สร้างไฟล์ .env พร้อมโดเมนของคุณและรหัสผ่านที่ปลอดภัย
    • เริ่ม Traefik ก่อน แล้วจึงเริ่ม n8n
    • รันทดสอบหลังนำระบบขึ้นใช้งาน
  3. ยืนยันผล:
    • ตรวจว่า HTTPS ทำงานพร้อมใบรับรองที่ถูกต้อง
    • ตรวจว่า URL ของ webhook แสดงในรูปแบบที่ถูกต้อง
    • ทดสอบด้วยชุดข้อมูลขนาดใหญ่ (หากจำเป็น)
    • ยืนยันว่าลงทะเบียนตัวรันงานแล้ว
  4. เฝ้าติดตาม:
    • เฝ้าดูการใช้ทรัพยากรด้วย docker stats
    • ตั้งการแจ้งเตือนสถานะสุขภาพ (การเฝ้าติดตามจากภายนอก)
    • ตั้งการหมุนเวียนไฟล์บันทึกเพื่อป้องกันดิสก์เต็ม
    • วางแผนสำรองโวลุ่มข้อมูลเป็นประจำ

แหล่งข้อมูลที่เกี่ยวข้อง

จากเดือนมิถุนายน 2025:

เอกสาร n8n อย่างเป็นทางการ:

มีคำถามหรือพบปัญหา?

หากพบปัญหาที่คู่มือนี้ไม่ครอบคลุม:

  1. อ่าน บทความแก้ปัญหาเชิงลึกของเราในเดือนมิถุนายน 2025 เพื่อดูคำแนะนำเพิ่มเติม
  2. ดู เอกสาร n8n อย่างเป็นทางการ สำหรับฟีเจอร์ล่าสุด
  3. ค้น ฟอรัม n8n Community เพื่อดูปัญหาที่คล้ายกัน
  4. ตรวจหัวข้อการแก้ปัญหาข้างต้นสำหรับปัญหาที่พบบ่อย
  5. ติดต่อ tva เพื่อรับความช่วยเหลือจากผู้เชี่ยวชาญในการนำระบบขึ้นใช้งาน

การทดสอบที่ทำซ้ำได้

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

ต้องการความช่วยเหลือในการนำระบบขึ้นใช้งาน?

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


เผยแพร่: 15 ตุลาคม 2025
ทดสอบกับ: n8n v1.115.2, Docker Compose v3.8, Traefik v2.10
ข้อกำหนดเซิร์ฟเวอร์: แนะนำ RAM 4GB+ และ CPU 2+ แกนสำหรับระบบใช้งานจริง
อิงจาก: เอกสาร n8n อย่างเป็นทางการ การทดสอบ Docker ที่ตรวจสอบแล้ว และแนวปฏิบัติที่ดีของชุมชน

บทความที่เกี่ยวข้อง