用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

分享
用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

# 用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

我有一台 local Hermes。

平常它就在自己的機器上跑。

可能是家裡的桌機。
可能是 NAS。
可能是一台一直開著的 Linux box。
也可能只是我自己的筆電。

問題是,人一離開那個網路,Hermes dashboard 就變成一個只存在於 localhost 的東西。

我想在外面打開它。

但我沒有 static IP。
沒有買網域。
也不想進路由器開 port forwarding。

因為那條路通常長這樣:

    • 找 public IP
    • 設定 NAT
    • 開 port
    • 處理防火牆
    • 補 HTTPS
    • 設定憑證
    • 再擔心 origin IP 被掃

非常友善。

所以這篇先走另一條路:Cloudflare Tunnel
目標很單純:在沒有 static IP沒有買網域的情況下,先拿到一個臨時 HTTPS 網址,讓我人在外面也能連回本機 Hermes dashboard。

Cloudflare Tunnel 在這裡扮演什麼角色

傳統 expose 服務,是外面打進你的機器​
Cloudflare Tunnel 反過來,它讓你的機器主動連出去到 Cloudflare。

Hermes 機器
  ↓
cloudflared 主動連線到 Cloudflare
  ↓
Cloudflare 給一個公開 HTTPS 網址
  ↓
外部瀏覽器透過這個網址連回本機服務

所以你不需要:

    • static IP
    • router port forwarding
    • 自己簽 HTTPS 憑證
    • 把本機服務直接暴露在公網 IP 上

對 local 工具來說,這個用法很愜意,不需要每年買網域,還怕被打爆。
Hermes dashboard 繼續跑在本機。而且有 Cloudflare Tunnel 幫你做安全防禦。

這篇先用 Quick Tunnel

因為這篇假設沒有購買網域。

所以我們用 Cloudflare 的 Quick Tunnel。

它會給你一個像這樣的網址:

https://random-name.trycloudflare.com

好處是:

不用網域
不用 DNS
不用設定 Cloudflare zone
幾分鐘內可以測通

缺點也要講清楚:

網址是隨機的
重啟後可能會換
沒有 SLA
不適合長期 production

如果你要固定網址,例如:

https://hermes.example.com

那就需要買網域,並且把 DNS 交給 Cloudflare 管。

這篇先不走那條。

先做最小可行版本。

最終架構

我們要做的是這樣:

手機 / 外部筆電
  ↓
https://xxxx.trycloudflare.com
  ↓
Cloudflare Edge
  ↓
Cloudflare Tunnel
  ↓
本機 cloudflared
  ↓
http://localhost:PORT
  ↓
Hermes Dashboard

Hermes dashboard 還是只需要跑在 localhost。

例如:

http://localhost:3000

或:

http://127.0.0.1:8080

Cloudflare Tunnel 負責把外部 HTTPS 流量轉進來。

Step 1:先確認 Hermes dashboard 本機可以開

先不要急著碰 Cloudflare。

先在本機確認 Hermes dashboard 已經跑起來。

假設它跑在:

http://localhost:3000

可以先測:

curl http://localhost:3000

或直接用瀏覽器打開:

http://localhost:3000

如果這一步不通,Cloudflare Tunnel 也救不了。

Tunnel 只是幫你轉流量。

它不會修好本機服務本來就沒啟動的問題。

Step 2:安裝 cloudflared

Cloudflare Tunnel 需要一個工具:

cloudflared

在 Debian / Ubuntu 上,可以這樣裝:

curl -L --output cloudflared.deb \
  https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb

sudo dpkg -i cloudflared.deb

確認版本:

cloudflared --version

有看到版本號,就可以繼續。

macOS、Windows 或其他 Linux 發行版,照 Cloudflare 官方下載頁裝對應版本即可。

Step 3:開一條 Quick Tunnel

假設 Hermes dashboard 在:

http://localhost:3000

執行:

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

接著你會看到類似這樣的輸出:

Your quick Tunnel has been created!
Visit it at:
https://something-random.trycloudflare.com

這個 trycloudflare.com 網址,就是外部入口。

拿手機切到 5G。
不要用同一個 Wi-Fi。

打開那個網址。

如果看到 Hermes dashboard,代表路通了。

Step 4:把指令寫成腳本

每次手打有點煩。

可以寫成一個小腳本。

mkdir -p ~/scripts
nano ~/scripts/start-hermes-tunnel.sh

內容放這個:

#!/usr/bin/env bash
set -euo pipefail

HERMES_DASHBOARD_URL="${HERMES_DASHBOARD_URL:-http://localhost:3000}"

echo "Starting Cloudflare Quick Tunnel..."
echo "Forwarding:"
echo "  ${HERMES_DASHBOARD_URL}"
echo ""

cloudflared tunnel --url "${HERMES_DASHBOARD_URL}"

加上執行權限:

chmod +x ~/scripts/start-hermes-tunnel.sh

之後啟動:

~/scripts/start-hermes-tunnel.sh

如果你的 Hermes dashboard 不是跑在 3000,可以這樣覆蓋:

HERMES_DASHBOARD_URL=http://localhost:8080 ~/scripts/start-hermes-tunnel.sh

這樣就不用改腳本。

Step 5:讓它在背景跑

如果只是測試,前景跑就好。

但如果你想讓它留在背景,可以用 tmux

tmux new -s hermes-tunnel

在 tmux 裡跑:

~/scripts/start-hermes-tunnel.sh

然後按:

Ctrl-b
然後 d

這樣會 detach。

想回去看 tunnel URL:

tmux attach -t hermes-tunnel

你就能看到 Cloudflare 印出來的 trycloudflare.com 網址。

安全問題,不要跳過

Quick Tunnel 給你的網址雖然隨機,但它仍然是公開網址。

也就是說:

知道網址的人,就能連到你的 Hermes dashboard

如果 dashboard 本身沒有登入保護,這其實就是把 agent 入口丟到公網上。

這件事有點刺激。

至少要做其中一個:

1. Hermes dashboard 本身要有登入、token 或其他保護
2. 只在需要時開 tunnel,用完就關
3. 不要把 URL 貼到公開地方
4. 保留 Hermes 的 dangerous command approval
5. 長期使用時,改用正式 Cloudflare Tunnel + Access policy

我會把 Quick Tunnel 當成臨時入口。

例如:

    • 人在外面臨時救火
    • 測手機連線
    • 短時間 demo
    • 驗證 dashboard 從外網能不能通

但我不會把它當成長期管理入口。

如果要穩定網址,就需要網域

如果你真的想每天用,建議不要長期靠 random URL。

比較完整的版本會是:

hermes.example.com
  ↓
Cloudflare Access
  ↓
Cloudflare Tunnel
  ↓
localhost Hermes dashboard

這樣可以做:

固定 hostname
Cloudflare Access 登入保護
email allowlist
Google / GitHub login
Zero Trust policy

但這需要你有一個網域,並且把它接到 Cloudflare。

沒有網域時,Quick Tunnel 很適合先測。

有網域後,named tunnel + Access 才比較像長期方案。

我會怎麼用

我自己的做法會分兩階段。

第一階段,只測路徑:

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

手機切外網。

確認 trycloudflare.com 能打開 Hermes dashboard。

第二階段,如果真的常用,就買個便宜網域。

然後改成 named tunnel。

再加 Cloudflare Access。

因為 agent dashboard 這種東西,不太適合裸丟在外面。

工程師寫工具很多時候不是為了優雅。

是為了讓自己少生一點氣。

Cloudflare Tunnel 在這個情境裡剛好很實用。

它讓 Hermes 仍然留在本機。

但我在外面需要它的時候,也能有一條路回來。

不用 static IP。
不用開 router port。
不用先買網域。

先能用。

後面再把安全邊界補完整。

Read more

Gaze Guard 短影片旁白的 TTS 成本與隱私防護示意圖

短影片旁白的成本,其實比我想像低

我最近在做一支 Gaze Guard 的 20 秒產品介紹影片。 原本想說簡單做個動畫就好。 後來想說如果有配音,會感覺比較生動也比較能夠描述使用的情境和達成的效果。 這次我測了什麼 我測的是產品介紹影片用的英文旁白。 工具底層使用的是 Edge TTS,也就是 Microsoft Edge 的線上 Text-to-Speech 服務。常見的底層工具是 edge-tts。 這不是正式 Azure Speech API 的計費路徑。 在我這次的環境裡,它沒有要求 API key,也沒有回傳可見的 per-use billing。 所以這次測試本身,比較像是快速 prototype。 如果未來要正式商用、穩定大量產出,就要回頭看 Azure Speech、OpenAI TTS、ElevenLabs 這類正式付費方案。

By SteepingLogic
Invoshot 開發日記|正向回饋

Invoshot 開發日記|正向回饋

想信很多人在開發的時候都常常會做一件事,那就是: 不斷地反覆思考,在腦袋內把流程跑過很多次,然後思考哪裡可以做得更好 不限坐在電腦前的時後,可能是在捷運上,在人行道上, 在馬桶上或是在洗澡的時候 🤪 我不斷地在想:AI 辨識完一張發票後,使用者接下來最需要的是什麼? 每個欄位都要核對嗎? 這麼多欄位真的不會漏看嗎? 所以我在 Invoshot 裡加了提醒功能。 辨識結果出來後,系統會把比較需要注意的地方標出來。 不是把所有不確定都丟給使用者,而是把他真正需要介入的那幾秒鐘留出來。 今天收到一則訊息: 今天用了有新增提醒功能很棒! 真的有變輕鬆 😎 看到這句的時候,我第一個想到的是: 原來那些只是我腦內風暴的優化項目,使用者是真的可以感受到差異的! 感覺又有動力了!

By SteepingLogic