OmniRoute Remote Mode 連不上時,先用健康檢查和遠程 context 確認服務端真的可達,再依序檢查存取位址、令牌範圍、反向代理與客戶端設定;不要一開始就重裝 OmniRoute,也不要為了排障把未受認證的管理介面直接暴露到公網。
本週建議動作:先完成「服務健康 → 網路入口 → 令牌權限 → 遠程模型 → Claude Code → 長任務」六段驗證,並保存每一段的命令輸出與日誌。只有在證據顯示安裝檔或資料庫損壞時,才把重裝列入後續方案。
這篇適合三類讀者:從筆記型電腦連線遠程 OmniRoute、需要定位 connect 或模型清單失敗的個人開發者;讓多個 AI 程式設計工具共用持續在線遠程 AI 網關的團隊;以及使用雲端 Mac 作為執行端,必須驗證重啟、斷線和長任務恢復的開發者。
先辨認最容易誤判的故障:已 connect,但請求仍走本機
常見失敗案例是:終端機顯示 connect 成功,Claude Code 也能啟動,但模型清單、供應商設定或呼叫紀錄仍然來自筆記型電腦上的本機實例。這不是「網路已通所以一切正常」,而是連線憑證已保存,客戶端實際讀取的 context 卻沒有切換。
先不要依賴介面上的名稱判斷路徑,應同時保留以下證據:
omniroute --help
omniroute connect --help
curl -i https://<REMOTE_HOST>/api/monitoring/health \
-H "Authorization: Bearer <REMOTE_ACCESS_TOKEN>"
curl -i https://<REMOTE_HOST>/v1/models \
-H "Authorization: Bearer <REMOTE_ACCESS_TOKEN>"
官方 API 文件將 /api/monitoring/health 定義為健康檢查與供應商摘要端點,模型查詢則應觀察遠程 /v1/models 的實際回應。若遠程回應中的模型、設定或時間戳與本機不同,才可證明請求確實抵達遠端。(github.com)
本段檢查清單
- [ ]
connect使用的是<REMOTE_HOST>,不是localhost或127.0.0.1 - [ ]
curl的回應來自遠程主機,而非本機轉發埠 - [ ] 客戶端啟動時讀取的是遠程 context
- [ ] 模型清單與遠程服務端的
/v1/models一致 - [ ] 遠程日誌出現本次測試的請求時間或請求識別資訊
若只完成第一項而沒有遠程模型或請求日誌證據,排障仍停留在「看起來連上」階段。
第一步:先確認遠程實例不是只有程序存在
識別信號
遠程伺服器上看得到 OmniRoute 程式、容器或背景服務,但健康端點回傳錯誤、模型數量為空、重啟後設定消失,通常表示服務只是「有程序」,尚未進入可用狀態。常見原因包括資料目錄不可寫、環境變數未載入、供應商初始化失敗,以及服務監聽在錯誤介面。
官方文件列出的預設 API 埠是 20128,資料目錄預設為 ~/.omniroute;若部署時自行改過 PORT 或 DATA_DIR,排障必須以實際環境值為準,不能直接套用預設值。(github.com)
取證命令
在遠程主機執行:
omniroute --help
printenv | grep -E '^(PORT|DATA_DIR|REQUIRE_API_KEY|REQUEST_TIMEOUT_MS)='
ps aux | grep -i '[o]mniroute'
ss -ltnp | grep ':<REMOTE_PORT>'
curl -i http://127.0.0.1:<REMOTE_PORT>/api/monitoring/health
ls -la <DATA_DIR>
若使用容器或服務管理器,則補充查看對應日誌:
docker ps
docker logs --tail 200 <CONTAINER_NAME>
# 或依實際服務名稱查看
journalctl -u <SERVICE_NAME> -n 200 --no-pager
不要只貼「程序仍在執行」的畫面;需要同時記錄監聽位址、健康回應、資料目錄權限和最近一次啟動錯誤。
處理結論與修復後驗證
- 健康端點失敗:先修正環境變數、資料目錄或供應商初始化,不要先刪除資料庫。
- 只監聽
127.0.0.1:遠程入口必須透過受保護的反向代理、私有網路或安全隧道提供,不能直接把管理埠公開。 - 重啟後模型與設定消失:確認資料目錄有持久化掛載,並測試寫入後重啟是否仍存在。
- 本機健康、遠程健康失敗:問題已縮小到入口、TLS、主機防火牆或代理,而不是 OmniRoute 核心程序。
修復後至少重做一次「本機回環位址健康檢查」和一次「遠程 HTTPS 健康檢查」,兩者都成功才進入令牌排查。
OmniRoute connect 為什麼一直超時?先拆開網路與應用層
識別信號
connect 長時間沒有回應、顯示 connection timeout,或 TCP 可以建立但 HTTP 沒有狀態碼,這三種情況不能混為一談:
- 主機名無法解析,請求尚未離開本機。
- 埠或防火牆阻擋,TCP 連線無法建立。
- TCP 已建立,但反向代理、應用程式或健康端點沒有及時回應。
取證命令
在本機逐層執行:
getent hosts <REMOTE_HOST>
nc -vz <REMOTE_HOST> <REMOTE_PORT>
curl -vk --connect-timeout 10 \
https://<REMOTE_HOST>/api/monitoring/health
curl -vk --http1.1 \
https://<REMOTE_HOST>/v1/models \
-H "Authorization: Bearer <REMOTE_ACCESS_TOKEN>"
macOS 若沒有 getent,可改用:
dscacheutil -q host -a name <REMOTE_HOST>
若 nc 失敗,先處理 DNS、主機防火牆、安全群組、私有網路路由或隧道;若 nc 成功而 curl 卡住,則查看反向代理錯誤日誌與上游服務狀態。這個分層可以避免把「網路不可達」誤判為「令牌無效」。
注意:不要使用永久關閉認證、開放全部埠或把管理介面直接暴露到公網作為臨時修復。遠程 AI 網關至少應使用 HTTPS、私有網路入口,或限制來源位址的安全隧道;管理路徑與模型呼叫路徑也應分開控管。
處理結論與修復後驗證
若遠程服務只在本地網路可用,正確處理順序是:
- 先建立受保護的 HTTPS 或私有網路入口;
- 只放行必要的服務路徑與來源;
- 確認 TLS 憑證和主機名一致;
- 再用相同入口執行
connect和/v1/models驗證。
修復後,從至少一個不在同一區域網路的客戶端測試;否則只能證明區域網路內可用,不能證明遠程入口可靠。
OmniRoute 遠程令牌認證失敗如何處理?
識別信號
若回應是 401 或 403,且服務健康檢查本身可達,問題通常不在主機連線,而在令牌來源、請求標頭、有效狀態或權限範圍。最容易犯的錯,是把上游模型供應商的 Key 當成 OmniRoute 的存取令牌;兩者用途不同,不能互換。
Remote Mode 使用遠程 context 和受範圍限制的存取令牌;Claude Code 設定則可使用 ANTHROPIC_AUTH_TOKEN,官方整合文件也提醒,令牌不應被寫入模型設定檔,而應在啟動時注入。(github.com)
取證命令
不要把完整令牌貼到工單或聊天紀錄,先用遮罩方式確認目前讀取的值:
printf 'host=%s\n' "$REMOTE_HOST"
printf 'token_prefix=%.8s...\n' "$REMOTE_ACCESS_TOKEN"
curl -i https://<REMOTE_HOST>/v1/models \
-H "Authorization: Bearer <REMOTE_ACCESS_TOKEN>"
若透過 Claude Code:
env | grep -E '^(ANTHROPIC_BASE_URL|ANTHROPIC_AUTH_TOKEN|ANTHROPIC_API_KEY|ANTHROPIC_MODEL)=' \
| sed 's/\(TOKEN\|KEY\)=.*/\1=<REDACTED>/'
官方文件指出,ANTHROPIC_BASE_URL 應填 Gateway 根網址,不要自行加上 /v1,因為客戶端會再組合 /v1/messages;修改環境變數後也必須重新啟動 Claude Code。(github.com)
處理結論與修復後驗證
令牌修復後,不要只測一次聊天請求,應按權限由低至高驗證:
- [ ] 只讀:健康檢查、模型清單
- [ ] 必要配置:讀取目前 context 或工具配置
- [ ] 受控修改:只在需要時測試設定更新
- [ ] 模型呼叫:使用指定模型完成一個短請求
- [ ] 撤銷測試:撤銷令牌後,確認原客戶端確實收到拒絕
若只讀命令成功、模型呼叫失敗,通常是令牌沒有相應模型或供應商範圍;若所有命令都被拒絕,應重新確認令牌是否屬於遠程 OmniRoute,以及 Authorization: Bearer 格式是否被代理保留。
Remote Mode 連線成功但看不到模型怎麼辦?
識別信號
連線命令顯示成功,但模型選擇器空白、列出的模型與遠程伺服器不同,或 Claude Code 仍使用本機預設模型,通常是 context 沒有真正套用,或者客戶端生成的設定檔仍指向本機。
官方 CLI 整合文件說明,setup-* 類命令會從目前運行中的本機或遠程 OmniRoute 讀取模型目錄,再寫入客戶端設定;因此模型目錄本身就是判斷請求路徑的重要證據。(github.com)
取證命令
先直接比較兩個來源:
curl -s https://<REMOTE_HOST>/v1/models \
-H "Authorization: Bearer <REMOTE_ACCESS_TOKEN>" \
| tee /tmp/remote-models.json
curl -s http://127.0.0.1:<LOCAL_PORT>/v1/models \
-H "Authorization: Bearer <LOCAL_ACCESS_TOKEN>" \
| tee /tmp/local-models.json
diff -u /tmp/local-models.json /tmp/remote-models.json
再檢查客戶端實際參數:
env | grep -E '^(ANTHROPIC_BASE_URL|ANTHROPIC_MODEL|CLAUDE_CONFIG_DIR)='
如果使用明確遠程參數,應依當前版本說明確認格式,例如官方 Claude Code 文件列出的形式:
omniroute launch \
--remote https://<REMOTE_HOST> \
--api-key <REMOTE_ACCESS_TOKEN>
不要把介面顯示的「Remote」名稱當成證據;真正有效的是遠程 /v1/models 回應、遠程請求日誌,以及客戶端環境變數中的 Base URL。(github.com)
處理結論與修復後驗證
- 遠程模型目錄有資料、本機模型目錄也有資料:檢查 context 選擇和客戶端啟動參數。
- 遠程模型目錄為空:回到服務健康、供應商配置和令牌範圍。
ANTHROPIC_BASE_URL帶有/v1:依官方格式移除尾端/v1,再重新啟動 Claude Code。- 模型存在但選擇器不顯示:確認客戶端的模型探索功能、模型命名規則和當前版本限制;必要時使用明確的
ANTHROPIC_MODEL。
若團隊同時使用多個工具,應為每個工具保存獨立設定檔,避免本機舊環境變數覆蓋遠程 context。
反向代理後 Claude Code 為什麼連不上?先檢查路徑與長連線
識別信號
直連遠程埠正常,經 HTTPS 反向代理後失敗,常見於四個位置:
- URL 路徑被重寫,
/v1/messages沒有正確轉發; - 代理把
Authorization標頭移除或自行替換; - HTTPS 終止後,上游仍被錯誤轉成另一個路徑;
- SSE 或長時間串流被代理當成閒置連線關閉。
OmniRoute 的資料流包含 /v1/* 請求,並支援 SSE 與 WebSocket 相關介面;因此普通健康檢查成功,不代表長流式請求也能完整回傳。(github.com)
取證命令
先比較直連和代理入口的狀態:
curl -vk --http1.1 \
https://<REMOTE_HOST>/api/monitoring/health
curl -vk --http1.1 \
https://<REMOTE_HOST>/v1/models \
-H "Authorization: Bearer <REMOTE_ACCESS_TOKEN>"
再從代理日誌確認:
# 依實際代理軟體替換路徑
grep -E '401|403|499|502|504|/v1|/api/monitoring/health' \
<REVERSE_PROXY_ACCESS_LOG>
檢查內容時,應特別確認:
- 公開入口是否把
/v1重複加成/v1/v1; Host、Authorization和Content-Type是否傳到上游;- HTTPS 憑證主機名是否與
<REMOTE_HOST>一致; - SSE 回應是否保留串流內容類型與持續傳輸;
- 代理的讀取與閒置逾時是否有官方文件或實測依據。
官方目前文件列出的 REQUEST_TIMEOUT_MS 預設值為 600000 毫秒,但這是 OmniRoute 應用層設定,不等於反向代理的逾時值;代理逾時不能直接照抄這個數字,必須以代理本身的官方配置說明和實際長任務測試為準。(github.com)
處理結論與修復後驗證
先用短請求確認路徑,再測試會持續輸出的長請求;若短請求成功、長請求中途斷線,優先調查代理的串流轉發、讀取逾時和閒置連線政策,而不是重新產生令牌。
修復後必須保存:
- 代理入口的完整狀態碼;
- 上游收到請求的時間與路徑;
- 串流開始、斷線或完成的時間;
- 客戶端收到的錯誤類型;
- 同一請求直連與代理的差異。
重啟後如何讓遠程客戶端恢復?
遠程 OmniRoute 重啟後,客戶端能否恢復,取決於三個條件:資料目錄是否持久化、服務是否以相同入口重新監聽、遠程存取令牌是否仍有效。若任一項改變,單靠客戶端重試通常沒有用。
依序執行:
- 保存重啟前證據:記錄健康端點、模型清單、目前 context 名稱和代理入口。
- 重啟服務:使用現有部署方式,不要同時更換埠、資料目錄和反向代理設定。
- 確認程序與監聽:檢查程序狀態、實際監聽埠和啟動日誌。
- 確認資料恢復:檢查原有模型、供應商設定和令牌狀態是否仍存在。
- 重新驗證入口:從本機、外部網路和實際 AI 工具各測一次。
- 測試失聯恢復:在長任務期間短暫中斷客戶端網路,確認錯誤可辨識、重新連線後不會默默切回本機。
- 記錄接管方式:寫清楚由誰檢查日誌、誰撤銷令牌、誰切換到備用入口。
遠程環境驗收的決策條件
- 若遠程健康端點、遠程模型清單和請求日誌全部一致,則保留 Remote Mode,進入長流式驗收。
- 若健康端點成功但模型清單為空,則回退到資料目錄、供應商配置和令牌範圍,不要調整代理逾時。
- 若直連成功、HTTPS 入口失敗,則回退到反向代理路徑、標頭與 TLS,不要重裝 OmniRoute。
- 若本機與遠程模型清單不同,則回退到 context 和客戶端設定檔,明確指定遠程參數。
- 若重啟後設定消失,則先修復持久化目錄,再做令牌輪換與客戶端恢復測試。
- 若只有未受保護的公網入口可用,則停止上線,先建立 HTTPS 或私有網路入口。
用這張矩陣完成修復後驗收
| 驗收對象 | 必須觀察的證據 | 通過條件 | 不通過時的回退方向 |
|---|---|---|---|
| 服務端 | 健康端點、啟動日誌、監聽位址 | 遠程健康回應正常,重啟後設定仍在 | 資料目錄、環境變數、程序狀態 |
| 網路入口 | DNS、TCP、HTTPS 狀態碼 | 外部客戶端可達,未暴露未受認證管理介面 | 防火牆、隧道、反向代理與 TLS |
| 存取令牌 | 401/403、令牌狀態、權限範圍 |
只讀、配置和模型呼叫符合最小權限 | 重新建立或撤銷令牌 |
| 客戶端 | context、Base URL、生成的設定檔 | 請求日誌顯示實際走遠程 | 清除本機覆蓋環境變數 |
| 長任務 | SSE、代理日誌、完成或斷線時間 | 串流可完成,斷線時能被辨識 | 只調整有文件或實測依據的代理設定 |
| 團隊接管 | 不同成員、重啟、撤銷令牌 | 另一位成員可按紀錄重現和接管 | 補齊運維紀錄與權限分工 |
多成員驗收時,至少應使用一個只讀令牌和一個需要模型呼叫的令牌,並在測試結束後撤銷臨時令牌。這能避免「管理員能用,但一般成員不能用」的假性通過。
若需要把排障命令、部署紀錄和交付文件集中保存,可將操作紀錄整理到 Vuncloud 幫助中心;若遠程執行端需要長時間保持在線,也應把重啟與斷線恢復列入 雲端 Mac 租用方案 的交付驗收,而不是只驗證第一次登入。
當故障最後被定位為本機經常關機、網路入口不穩定,或共享環境沒有持續執行能力時,繼續修補本機並不是最佳長期方案:本機方案容易受睡眠、路由器、埠轉發和個人權限影響;臨時雲端伺服器則常見持久化、TLS、監控與團隊交接責任分散。若需求是臨時算力、測試環境或需要長時間在線的 Mac 執行端,租用 Vuncloud 的遠程 Mac 通常能把硬體在線、重啟恢復與交付驗收集中處理;但若是長期固定重負載,或必須直接使用特定實體介面,自購設備仍可能更合適。
需要穩定的遠端 Mac?選擇 Vuncloud
透過 Vuncloud 租用專屬 Mac,讓開發、測試與日常工作不受本機效能限制。
Vuncloud 提供遠端 Mac 存取,方便您在不同地點連線使用 macOS 環境。