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 ใช้ฟรีบนเครื่องตัวเอง