ระบบทำงานแบบนี้
ก่อนเริ่ม ขอให้เข้าใจภาพรวมก่อน:
Browser (ทั่วโลก)
↓
Cloudflare Network
↓
Cloudflare Tunnel (cloudflared daemon)
↓
Ubuntu Server 192.168.1.2 (LAN)
↓
Gunicorn port 8000 → Django Appข้อดีของระบบนี้: ไม่ต้องมี Public IP จาก ISP, ไม่ต้องเปิด port บน router, Cloudflare รับ HTTPS แล้วส่งต่อผ่าน tunnel เข้า LAN

ขั้นตอนที่ 1 — ตรวจสอบปัญหาก่อนแก้ (สำคัญมาก)
ก่อนจะไปแตะอะไร ให้ตรวจ 3 จุดก่อนเสมอ
เช็ค cloudflared logs
sudo journalctl -u cloudflared -fเช็ค DNS records ใน Cloudflare Dashboard
เข้า dash.cloudflare.com → เลือก domain → DNS → Records ถ้า domain ใช้ Cloudflare Tunnel ถูกต้อง DNS record จะเป็น CNAME ชี้ไปที่ <tunnel-id>.cfargotunnel.com
ขั้นตอนที่ 2 — Update cloudflared ให้เป็น version ล่าสุด
sudo apt-get update && sudo apt-get install cloudflared -y
cloudflared --version
sudo systemctl restart cloudflared
sudo systemctl status cloudflaredต้องเห็น Active: active (running) ถึงจะเดินต่อได้
ขั้นตอนที่ 3 — แก้ ALLOWED_HOSTS ใน .env
Django จะตอบ request จาก host ที่อยู่ใน list นี้เท่านั้น ถ้า domain ใหม่ไม่อยู่ใน list → Django ตอบกลับ 400 Bad Request ทันที
ALLOWED_HOSTS=192.168.1.2,localhost,noodee-bootbiz.com,www.noodee-bootbiz.comใช้ sed แก้แบบ non-interactive:
sed -i 's|ALLOWED_HOSTS=...(เดิม)...|ALLOWED_HOSTS=...(ใหม่)...|' .envขั้นตอนที่ 4 — เพิ่ม CSRF_TRUSTED_ORIGINS ใน settings.py
Django ตั้งแต่ version 4.0 ต้องระบุ trusted origins ด้วย ถ้าไม่ใส่ → form ทุกอันจะขึ้น 403 CSRF verification failed
CSRF_TRUSTED_ORIGINS = [
'https://noodee-bootbiz.com',
'https://www.noodee-bootbiz.com',
]หมายเหตุ: ต้องใส่ https:// นำหน้าเสมอ
ขั้นตอนที่ 5 — Restart Django service
sudo systemctl restart peyo-agent
sudo systemctl status peyo-agentขั้นตอนที่ 6 — เพิ่ม Route ใน Cloudflare Zero Trust Dashboard
ไปที่ one.dash.cloudflare.com → Networks → Tunnels → คลิก tunnel
⚠️ สำคัญมาก: ต้องใช้ tab "Published application routes" เท่านั้น ไม่ใช่ "Hostname routes (Beta)"
| Tab | ใช้งานได้จริง |
|---|---|
| Hostname routes (Beta) | ❌ ไม่แนะนำ — ยังไม่ stable |
| Published application routes | ✅ ใช้อันนี้ |
- Subdomain: (เว้นว่าง)
- Domain: noodee-bootbiz.com
- Path: (เว้นว่าง — รับทุก path)
- Type: HTTP | URL: localhost:8000

ขั้นตอนที่ 7 — ตรวจสอบว่าทุกอย่างทำงาน
sudo journalctl -u cloudflared -fถ้า config update สำเร็จ จะเห็น: Updated to new configuration ที่มี domain ใหม่
คำถามที่พบบ่อย (FAQ)

Error 522 คืออะไร
522 Connection Timed Out หมายความว่า Cloudflare เชื่อมต่อมาถึง server แต่ server ไม่ตอบ สาเหตุที่พบบ่อย: Gunicorn ไม่รัน, cloudflared หยุดทำงาน, Route ชี้ไป port ผิด, ALLOWED_HOSTS ไม่มี domain
หลาย domain ชี้มา port เดียวกันได้ไหม
ได้ครับ ไม่มี conflict Cloudflare Tunnel รองรับ multiple hostnames ต่อ tunnel ได้ Django แยก domain ผ่าน request.get_host() ไม่ใช่ port
ทำไม IP จริงของ server ไม่กระทบ
เพราะ cloudflared ทำงานแบบ outbound connection ISP เปลี่ยน IP ไม่กระทบเลย ย้าย server ไปอยู่ที่อื่น แค่ run cloudflared ที่ใหม่ก็ใช้งานได้ทันที
สรุป Checklist ครบ 10 ขั้น
