前情提要
在本機開發 LINE Bot,撞上了第一道牆:LINE Messaging API 的 Webhook 只接受 HTTPS endpoint,localhost 根本不在它的認知裡。
第一反應是用 Quick Tunnel,指令一行就能跑:
1 | cloudflared tunnel --url http://localhost:3000 |
跑起來,去 LINE Console 貼上 URL,Verify 成功。
隔天重開,URL 換了,再去貼一次。
第三次之後決定換個做法。
其他常見做法與沒選的原因
| 方案 | 為什麼沒選 |
|---|---|
| ngrok | 免費版 URL 每次重啟都變,跟 Quick Tunnel 一樣的問題 |
| localtunnel | 開源,URL 可指定但不保證穩定,偶有被佔用的情況 |
| smee.io | Webhook 轉發專用,需要額外的 client 程式,多一層複雜度 |
| VS Code Dev Tunnels | 綁定 VS Code,換編輯器就失效 |
| Tailscale Funnel | 要先建 Tailscale 網路,對沒在用的人成本高 |
| 直接部署到雲端 | URL 穩定,但每次改 code 都要重部署,開發迭代太慢 |
| Cloudflare Quick Tunnel | URL 每次重啟都換,手動更新 Webhook 很煩 |
選 Cloudflare Named Tunnel 的原因:
- URL 固定(綁自己的 domain),設定一次就好
- 已有 Cloudflare 管理 domain,沒有額外成本
- 搭配 launchd 開機自啟,幾乎感覺不到它的存在
前置條件
- 已有 Cloudflare 帳號
- 要使用的 domain 已托管在 Cloudflare(NS 已指向 Cloudflare)
- 本機 LINE Bot 已可正常啟動並監聽某個 port
為什麼選 Named Tunnel,不用 Quick Tunnel
Quick Tunnel 每次啟動 URL 都會變,要一直去 LINE Console 更新 Webhook URL,很麻煩。
Named Tunnel 設定一次,URL 固定(綁自己的 domain),之後只管跑就好。
設定步驟
本文以 tunnel 名稱 mybot、domain mybot.example.com、本機 port 3000 為例。
1. 安裝 cloudflared
1 | brew install cloudflare/cloudflare/cloudflared |
2. 登入
1 | cloudflared tunnel login |
瀏覽器會開啟授權頁面,選擇要綁定的 domain。
3. 建立 Named Tunnel
1 | cloudflared tunnel create mybot |
會產生一組 tunnel ID 跟 credentials 檔,路徑類似 ~/.cloudflared/<tunnel-id>.json。
4. 設定 config
寫入 ~/.cloudflared/config.yml:
1 | tunnel: <tunnel-id> |
<tunnel-id> 從 Step 3 的輸出取得,或執行 cloudflared tunnel list 查看。
5. 設定 DNS
1 | cloudflared tunnel route dns mybot mybot.example.com |
Cloudflare DNS 會自動新增一筆 CNAME 指向 tunnel,不用手動加。
6. 跑起來
1 | cloudflared tunnel run mybot |
這樣 https://mybot.example.com 的流量就會轉進 localhost:3000。
LINE Console 設定
注意:Verify 前要確認 bot 已在本機跑起來, LINE 會實際打一個請求過來,bot 沒跑就會 Verify 失敗。
LINE Developers Console → Messaging API → Webhook URL 填:
1 | https://mybot.example.com/webhook |
勾選「Use webhook」→ 點「Verify」,回傳 200 就完成了。
Port 選擇
LINE 打來的 Webhook 是外部流量,建議選高號碼 port(49152–65535),
比常見的 3000、8080 不容易被掃描到。
在 config.yml 的 service 欄位對應好本機 port 即可。
小結
Cloudflare Named Tunnel 解決了「本機服務需要公開 HTTPS endpoint」的問題,
對 LINE Bot 開發來說特別實用——URL 固定,不用每次重啟都更新 Webhook 設定。
搭配 launchd 讓 cloudflared 開機自動啟動,幾乎可以忘記它的存在。
(fin)