BotKit
บทความ › เขียนโค้ด & ดูแลระบบ

Cloudflare Tunnel: เปิดเครื่องที่บ้านให้รับ webhook ได้ ไม่ต้องเปิดพอร์ต

ถ้ารัน n8n, Postiz หรือบอทไว้บนคอมที่บ้าน ปัญหาแรกที่เจอคือบริการข้างนอกเรียกเข้ามาไม่ได้ LINE หรือ Facebook ส่ง webhook มาที่ localhost ไม่ได้ และเน็ตบ้านส่วนใหญ่ไม่มี IP คงที่หรือเปิดพอร์ตไม่ได้

Cloudflare Tunnel แก้ตรงนี้โดยให้โปรแกรมเล็กๆ ชื่อ cloudflared บนเครื่องเรา ต่อออกไปหา Cloudflare แทนที่จะให้คนข้างนอกต่อเข้ามา ไม่ต้องเปิดพอร์ตที่เราเตอร์ และได้ HTTPS ให้อัตโนมัติ

แบบทดสอบเร็ว: Quick Tunnel (ไม่ต้องมีโดเมน)

ติดตั้ง cloudflared แล้วสั่ง

cloudflared tunnel --url http://localhost:5678

จะได้ URL แบบ https://คำสุ่ม.trycloudflare.com ที่ชี้เข้าเครื่องเราทันที เหมาะกับลองยิง webhook ทดสอบ แต่URL เปลี่ยนทุกครั้งที่รันใหม่ จึงใช้กับงานจริงไม่ได้ (ต้องไปแก้ URL webhook ทุกที่ทุกครั้ง)

แบบใช้จริง: Named Tunnel + โดเมนของตัวเอง

ต้องมีโดเมนที่ใช้ DNS ของ Cloudflare ก่อน (ย้าย nameserver มาที่ Cloudflare แผนฟรีก็ได้)

1. ล็อกอินและสร้าง tunnel

cloudflared tunnel login
cloudflared tunnel create home

คำสั่งที่สองจะสร้างไฟล์ credentials (ชื่อเป็น ID ของ tunnel ลงท้าย .json) ไว้ในโฟลเดอร์ .cloudflared ของผู้ใช้ เก็บไฟล์นี้ดีๆ ใครได้ไปก็รัน tunnel ของเราได้

2. เขียนไฟล์ config

สร้าง config.yml ในโฟลเดอร์เดียวกัน บอกว่าชื่อโดเมนไหนชี้ไปบริการไหนบนเครื่อง

tunnel: home
credentials-file: C:\Users\ชื่อผู้ใช้\.cloudflared\<tunnel-id>.json

ingress:
  - hostname: n8n.example.com
    service: http://localhost:5678
  - hostname: postiz.example.com
    service: http://localhost:5000
  - service: http_status:404

บรรทัดสุดท้าย (ไม่มี hostname) จำเป็นต้องมี เป็นตัวรับทุกอย่างที่ไม่ตรงกฎข้างบน

3. ผูกชื่อโดเมนกับ tunnel

cloudflared tunnel route dns home n8n.example.com
cloudflared tunnel route dns home postiz.example.com

4. รัน

cloudflared tunnel run home

เปิด https://n8n.example.com จากมือถือที่ใช้เน็ตมือถือ (ไม่ใช่ WiFi บ้าน) เพื่อยืนยันว่าเข้าจากข้างนอกได้จริง

กับดักที่เจอจริง: ปิดหน้าต่างแล้ว tunnel ตาย

ถ้ารัน cloudflared tunnel run ในหน้าต่าง PowerShell ธรรมดา มันคือโปรแกรมของผู้ใช้ ปิดหน้าต่าง ล็อกเอาต์ หรือรีสตาร์ตเครื่อง tunnel ก็หยุด และ webhook ทั้งหมดก็หยุดตาม

บน Windows ให้ติดตั้งเป็น service ที่เริ่มเองตอนเปิดเครื่อง เปิด PowerShell แบบ Run as administrator แล้วสั่ง

cloudflared service install
Start-Service Cloudflared

ตอนติดตั้งแบบ service ตัว cloudflared จะไม่ได้อ่าน config จากโฟลเดอร์ของผู้ใช้เสมอไป ถ้า service ขึ้นแต่เข้าโดเมนไม่ได้ ให้เช็คเอกสารของ Cloudflare เรื่องตำแหน่งไฟล์ config ของ service บน Windows หรือเปลี่ยนไปสร้าง tunnel ผ่านหน้า Dashboard (Zero Trust → Networks → Tunnels) ซึ่งให้คำสั่งติดตั้ง service พร้อม token มาเลย ไม่ต้องจัดการไฟล์ config เอง

อีกกับดัก: บริการต้นทางตาย tunnel ยังอยู่

tunnel แค่ส่งต่อ ถ้าโปรแกรมปลายทางไม่ทำงาน คนข้างนอกจะเจอ error 502 เคสที่ผมเจอคือ Docker Desktop ปิดตัวเองตอนบูตเครื่อง ทำให้ทุกบริการที่รันใน Docker หายหมด ทั้งที่ tunnel ยังขึ้นปกติ สิ่งที่ช่วยได้คือ

  • ตั้งให้ Docker Desktop เริ่มเองตอนล็อกอิน และใส่ restart: unless-stopped ให้ทุก container
  • มีตัวตรวจจากข้างนอก (เช่นบริการ uptime monitor ฟรี) ยิงเช็ค URL ทุก 5 นาที และแจ้งเตือนเมื่อล่ม

เรื่องความปลอดภัย

  • tunnel ทำให้บริการบนเครื่องเราอยู่บนอินเทอร์เน็ตจริง ทุกบริการที่เปิดต้องมีรหัสผ่านที่แข็งแรง
  • หน้าแอดมินที่ไม่ต้องให้คนนอกเข้า ใช้ Cloudflare Access ครอบไว้ (ล็อกอินด้วยอีเมลก่อนถึงตัวบริการ)
  • บริการที่เปิดให้สมัครสมาชิกเอง (เช่น Postiz) ให้ปิดการสมัครหลังสร้างบัญชีแอดมินแล้ว
  • อัปเดตบริการที่เปิดออกไปสม่ำเสมอ โดยเฉพาะเมื่อมีประกาศช่องโหว่

อ่านต่อ: ติดตั้ง n8n ใช้ฟรีบนเครื่องตัวเอง

เกี่ยวกับผู้เขียน — Jark นักพัฒนา LINE Bot และระบบ AI อัตโนมัติ อยู่เชียงใหม่ ทำระบบตอบแชทและจองคิวให้ร้านค้าจริง บทความในเว็บนี้มาจากงานที่ลงมือทำเอง อ่านเพิ่ม