lief-tunnel — คู่มือใช้งาน
Adminlief-tunnel เปิด service ที่รันอยู่บน localhost ของเครื่องคุณ ให้คนภายนอกเข้าถึงได้ผ่าน
https://<ชื่อ>.tunnel.liefcapital.com — เหมือน ngrok แต่เป็นของบริษัทเอง ใช้เทสเว็บกับมือถือ, ให้ลูกค้าดู demo หรือรับ webhook (LINE, Stripe ฯลฯ)
1. ขอ token
ติดต่อแอดมินเพื่อขอ token ส่วนตัว (ขึ้นต้นด้วย lt_) — token จะแสดงให้แอดมินเห็นเพียงครั้งเดียว
ห้ามแชร์ token กับคนอื่น ถ้าหลุดให้แจ้งแอดมินยกเลิกทันที
2. ติดตั้ง
macOS / Linux — คำสั่งเดียว ติดตั้งและ login ให้เลย:
curl -sSL https://tunnel.liefcapital.com/install.sh | sh -s -- lt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
หรือติดตั้งอย่างเดียว (login ทีหลัง):
curl -sSL https://tunnel.liefcapital.com/install.sh | sh
สคริปต์ตรวจ checksum ก่อนติดตั้ง ไฟล์อยู่ที่ /usr/local/bin/lief-tunnel (หรือ ~/.local/bin ถ้าไม่มีสิทธิ์)
Windows — ดาวน์โหลด https://tunnel.liefcapital.com/download/windows-amd64.exe
เปลี่ยนชื่อเป็น lief-tunnel.exe แล้ววางในโฟลเดอร์ที่อยู่ใน PATH
ตรวจว่าติดตั้งแล้ว: lief-tunnel version
3. Login
lief-tunnel login lt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
token ถูกเก็บที่ ~/.config/lief-tunnel/config.json (สิทธิ์ 600) — ใน CI ใช้ env LIEF_TUNNEL_TOKEN หรือ --token แทนได้
4. เปิด tunnel
lief-tunnel http 3000 --name myapp
จะได้ URL https://myapp.tunnel.liefcapital.com ส่งต่อไปที่ http://127.0.0.1:3000 — กด Ctrl+C เพื่อปิด
| ตัวอย่าง | ความหมาย |
|---|---|
lief-tunnel http 3000 | สุ่มชื่อให้ เช่น brave-otter-k3f9x2 |
lief-tunnel http localhost:8080 --name api | ระบุ host:port เอง |
lief-tunnel http 192.168.1.10:80 --name nas | ส่งต่อไปเครื่องอื่นในวง LAN ก็ได้ |
ชื่อใช้ได้: a-z, 0-9, - ยาวไม่เกิน 63 ตัว ห้ามขึ้นต้น/ลงท้ายด้วย -
ถ้าเน็ตหลุด client จะต่อใหม่เองและได้ชื่อเดิม ทุก request จะแสดงในหน้าจอ เช่น 10:15:02 GET /api/users → 200 12ms
5. Static subdomain (ชื่อถาวร)
ชื่อทั่วไปเป็นแบบ "ใครมาก่อนได้ก่อน" ถ้าต้องการชื่อที่เป็นของคุณถาวร (เช่น URL webhook ที่ไปตั้งไว้กับ LINE/Stripe) ให้ขอแอดมินจองให้ — ค่าเริ่มต้นสูงสุด 3 ชื่อต่อคน คนอื่นจะใช้ชื่อนั้นไม่ได้แม้คุณออฟไลน์
ถ้าเปิดชื่อ static เดียวกันจากอีกเครื่อง tunnel เก่าจะถูกปิด (client เก่าแจ้งว่า "opened from another session")
6. ข้อจำกัด
- ค่าเริ่มต้น: เปิดได้สูงสุด 5 tunnel พร้อมกันต่อ token
- ค่าเริ่มต้น: เมื่อหลุด ชื่อ (ที่ไม่ใช่ static) จะถูกกันไว้ให้คุณ 60 วินาที
- ค่าเริ่มต้น: รับ request พร้อมกันได้สูงสุด 64 ต่อ tunnel (รวม WebSocket/SSE ที่เปิดค้างไว้) เกินจะได้ 503 Tunnel busy
- รองรับ HTTP/HTTPS, WebSocket, Server-Sent Events และอัปโหลดไฟล์ใหญ่ (ไม่จำกัดขนาด)
- URL ของ tunnel เป็นสาธารณะ ไม่มีการ login — ใครก็ตามที่มี URL เข้าถึงแอป local ของคุณได้ทันที
- ยังไม่รองรับ TCP ดิบ (เช่น SSH, database)
- แอดมินเห็น access log (เวลา, IP, method, path, status) แต่ ไม่เก็บ header หรือ body — ค่าเริ่มต้นเก็บ log 7 วัน
7. Header ที่แอป local ได้รับ
| Header | ค่า |
|---|---|
Host | myapp.tunnel.liefcapital.com (ชื่อจริงที่ผู้ใช้เรียก) |
X-Forwarded-For | IP จริงของผู้เรียก |
X-Real-IP | IP จริงของผู้เรียก (ค่าเดียวกับ X-Forwarded-For) |
X-Forwarded-Proto | https |
X-Forwarded-Host | myapp.tunnel.liefcapital.com |
dev server บางตัวปฏิเสธ Host ที่ไม่รู้จัก — เช่น Vite ให้ตั้ง server.allowedHosts: ['.tunnel.liefcapital.com'],
webpack-dev-server ตั้ง allowedHosts: 'all', Django เพิ่ม .tunnel.liefcapital.com ใน ALLOWED_HOSTS
8. ปัญหาที่พบบ่อย
| อาการ | สาเหตุ / วิธีแก้ |
|---|---|
your token is invalid or has been revoked (run: lief-tunnel login <token>) | token ผิดหรือถูกยกเลิก — ขอ token ใหม่จากแอดมินแล้วรัน lief-tunnel login <token> ใหม่ |
your token was revoked by an admin | แอดมินยกเลิก token นี้แล้ว — ขอ token ใหม่จากแอดมิน |
"myapp" is already in use(name_taken) "myapp" was just in use; try again in a minute(name_taken) | มีคนใช้ชื่อนี้อยู่ หรือเพิ่งใช้ไปภายใน 60 วินาที — เปลี่ยนชื่อหรือ try again in a minute (รอสักครู่) |
"admin" is reserved(name_reserved) "myapp" is reserved for another user(name_reserved) | ชื่อนี้เป็นชื่อระบบ (www, api, admin ฯลฯ) หรือเป็น static ของคนอื่น — ใช้ชื่ออื่น |
an admin reserved this subdomain for another user | แอดมินจองชื่อนี้ให้คนอื่นแล้ว — ใช้ชื่ออื่น |
a token may have at most 5 tunnels open(limit_exceeded) | เปิด tunnel ครบตามจำนวนสูงสุดของ token (ค่าเริ่มต้น 5) — ปิดตัวที่ไม่ใช้ก่อน |
names may contain a-z, 0-9 and '-' (max 63 chars)(name_invalid) | ชื่อใช้ได้เฉพาะ a-z, 0-9, - ยาวไม่เกิน 63 ตัว และห้ามขึ้นต้นหรือลงท้ายด้วย - |
this subdomain was opened from another session | มีการเปิดชื่อ static เดียวกันจากเครื่องอื่น tunnel นี้จึงถูกปิด — ปิดเครื่องอื่นหรือเปลี่ยนชื่อ |
| เบราว์เซอร์ขึ้น Tunnel offline (404) | ยังไม่ได้รัน lief-tunnel http หรือพิมพ์ชื่อผิด |
| เบราว์เซอร์ขึ้น Local service not responding (502) | tunnel ต่ออยู่ แต่แอปบนเครื่องคุณไม่ได้รันที่ port นั้น — เช็คด้วย curl http://127.0.0.1:3000 |
| Dev server ตอบ "Invalid Host header" / 403 | ดูหัวข้อ Header ที่แอปได้รับ |
| client ขึ้น "an admin disconnected this tunnel" | แอดมินกดปิด tunnel — สอบถามแอดมิน |
9. ถอนการติดตั้ง
sudo rm -f /usr/local/bin/lief-tunnel ~/.local/bin/lief-tunnel rm -rf ~/.config/lief-tunnel