visionA/local-agent/start-agent.sh
jim800121chen 145ed8e960 fix(local-agent): start-agent.sh 補設 VISIONA_CLOUD_ORIGINS(ADR-019 localhost 直連 CORS)
start-agent.sh 漏設 VISIONA_CLOUD_ORIGINS → local-agent CORS 白名單為空 →
影片分頁從瀏覽器打 local-agent 的 preflight 被 403 → 前端判 LOCAL_AGENT_NOT_FOUND
(顯示「需同一台電腦操作」)。

依 MODE 補設雙入口白名單(public: 公網 https + 內網 http;internal 同);
用 ${VISIONA_CLOUD_ORIGINS:-預設} 尊重外部覆寫;啟動 log 印出白名單。
origin 字串與 middleware.go 完整精確比對相容。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 03:16:05 +08:00

140 lines
7.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
#
# visionA Agent 本地啟動腳本(公網正式路徑 demo 驗證用)
#
# 用途:在本機起 agent GUI走公網邊界反代stage-9527.innovedus.com:9527
# 連 tunnel驗證「網管開通邊界反代 WS 轉發」是否生效 + 雲端 device online 顯示。
#
# ⚠️ 實測重點Wails app 不能用 `go run .`(會 panic: missing build tags
# 必須先用 `make wails-macos` build 成 .app需先裝 wails CLI本腳本直接開 .app。
# 這個腳本只設環境變數 + 開既有 build 好的 .app不改任何 agent 原始碼。
#
# 前置(首次):
# go install github.com/wailsapp/wails/v2/cmd/wails@latest
# cd local-agent && make wails-macos
#
# 用法:
# ./start-agent.sh # 走公網正式路徑(預設)
# ./start-agent.sh internal # 走內網 demo 路徑ws://192.168.0.130:9527需 VPN
#
# 起來後:在 GUI 配對頁貼上瀏覽器拿到的配對碼vAc_ 開頭),狀態頁看 online。
set -euo pipefail
# ── 腳本所在目錄(讓從任何地方呼叫都能定位 agent──
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP="$SCRIPT_DIR/visiona-agent/build/bin/visiona-agent.app"
APP_BIN="$APP/Contents/MacOS/visiona-agent"
# ── 選路徑public預設公網正式/ internal內網 demo──
MODE="${1:-public}"
case "$MODE" in
public)
HOST="stage-9527.innovedus.com:9527"
CLOUD_API_URL="https://$HOST"
RELAY_URL="wss://$HOST/tunnel/connect"
WS_SCHEME="https"
# ADR-019 §2.5 CORS 白名單stage 雙入口):影片分頁 localhost 直連時,
# 瀏覽器可能從公網 HTTPS 或內網純 HTTP 任一入口開啟,兩者都要放行。
CLOUD_ORIGINS="https://stage-9527.innovedus.com:9527,http://192.168.0.130:9527"
;;
internal)
HOST="192.168.0.130:9527"
CLOUD_API_URL="http://$HOST"
RELAY_URL="ws://$HOST/tunnel/connect"
WS_SCHEME="http"
# ADR-019 §2.5 CORS 白名單internal 走內網純 HTTP 入口;一併帶公網入口
# 以便同一台 agent 兩種路徑都能開影片分頁(多帶白名單不會放寬安全性)。
CLOUD_ORIGINS="http://192.168.0.130:9527,https://stage-9527.innovedus.com:9527"
;;
*)
echo "用法:$0 [public|internal]" >&2
echo " public = 公網正式路徑 wss://stage-9527.innovedus.com:9527預設" >&2
echo " internal = 內網 demo 路徑 ws://192.168.0.130:9527需 VPN" >&2
exit 1
;;
esac
echo "════════════════════════════════════════════════════════"
echo " visionA Agent 啟動($MODE 路徑)"
echo "════════════════════════════════════════════════════════"
echo " Cloud API : $CLOUD_API_URL"
echo " Relay URL : $RELAY_URL"
echo ""
# ── 前置檢查:.app 存在嗎?──
if [ ! -x "$APP_BIN" ]; then
echo "❌ 找不到 build 好的 app$APP_BIN" >&2
echo " 請先 build首次" >&2
echo " go install github.com/wailsapp/wails/v2/cmd/wails@latest" >&2
echo " cd \"$SCRIPT_DIR\" && PATH=\"\$(go env GOPATH)/bin:\$PATH\" make wails-macos" >&2
exit 1
fi
# ────────────────────────────────────────────────────────────
# 預檢:開 GUI 前先測邊界反代 WS 握手(省得白貼配對碼)
# 回 101 = WS 轉發通400 = 邊界反代還在剝 header網管沒設對
# 444 = Host 沒帶對;逾時 = 防火牆/DNS。
# ────────────────────────────────────────────────────────────
echo "──▶ 預檢:測 $HOST 的 WS 握手 ..."
# httpsstage 自簽憑證)時帶 -k預檢只測可達性不驗憑證
# 否則 TLS 握手直接失敗回 000被誤判成「防火牆/DNS 問題」誤導排查。
CURL_INSECURE=""
if [ "$WS_SCHEME" = "https" ]; then
CURL_INSECURE="-k"
fi
WS_CODE="$(curl -s $CURL_INSECURE -o /dev/null -w '%{http_code}' -m 10 -N \
-H 'Connection: Upgrade' \
-H 'Upgrade: websocket' \
-H 'Sec-WebSocket-Version: 13' \
-H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' \
"$WS_SCHEME://$HOST/tunnel/connect" 2>/dev/null || echo "000")"
case "$WS_CODE" in
101) echo " ✅ 101 — 邊界反代 WS 轉發已生效tunnel 可通。" ;;
401) echo " ✅ 401WS header 有過、卡在 token 驗證)— WS 轉發 OK屬正常配對後帶 token。" ;;
400)
echo " ❌ 400 — 邊界反代還在剝 WS upgrade header唯一根因未解。"
echo " → 請網管在公網入口 proxy 開 WS 轉發h1.1 + Upgrade/Connection header。"
echo " 5 秒後仍會續開 GUICtrl-C 中止)。"; sleep 5 ;;
444)
echo " ⚠️ 444 — Host 白名單擋掉(邊界反代沒帶對 Host: ${HOST}。5 秒後續開Ctrl-C 中止)。"; sleep 5 ;;
000)
echo " ⚠️ 連線逾時/拒絕 — 防火牆沒放行 :9527 或 DNS 解錯internal 請確認 VPN。"
echo " 5 秒後續開Ctrl-C 中止)。"; sleep 5 ;;
*) echo " ⚠️ 收到 HTTP ${WS_CODE}非預期。5 秒後續開Ctrl-C 中止)。"; sleep 5 ;;
esac
echo ""
# ── 設環境變數優先級env > config.yaml > 內建預設)──
export VISIONA_CLOUD_API_URL="$CLOUD_API_URL"
export VISIONA_RELAY_URL="$RELAY_URL"
# ADR-019 localhost 直連的 CORS 白名單server 讀 middleware.go:46 os.Getenv
# 漏設會導致影片分頁的 preflightOPTIONS被 local-agent 回 403 → 前端 port 探測
# 掃不到同機 agent → 影片分頁顯示 LOCAL_AGENT_NOT_FOUND「需在同一台電腦操作」
# 格式:逗號分隔的完整 originscheme+host+port 一字不差、結尾無斜線),與
# middleware.go 的「完整 origin 精確比對」相容。
# 尊重外部覆寫(與上方優先級 env > 內建預設一致):若使用者已設則沿用其值。
export VISIONA_CLOUD_ORIGINS="${VISIONA_CLOUD_ORIGINS:-$CLOUD_ORIGINS}"
echo " CORS 白名單VISIONA_CLOUD_ORIGINS$VISIONA_CLOUD_ORIGINS"
echo ""
# public 模式stage 用自簽憑證agent 需明確 opt-in 跳過 TLS 驗證
# pairing exchange + tunnel WSS + 設定頁「測試連線」三條路徑共用此開關),
# 否則全部 x509 失敗,與本腳本的 demo 目的自相矛盾。
# ⚠️ DEV / DEMO ONLY — 正式環境絕不可設此變數。
if [ "$MODE" = "public" ]; then
export VISIONA_INSECURE_SKIP_TLS_VERIFY=true
echo "⚠️ 已設 VISIONA_INSECURE_SKIP_TLS_VERIFY=truestage 自簽憑證用;跳過 TLS 驗證,僅 demo 用)"
echo ""
fi
# ── 直接執行 .app 內的 binary保留 stdout/stderr 在終端看 logenv 有帶進去)──
echo "──▶ 啟動 GUI${APP_BIN}..."
echo " 起來後配對頁貼上瀏覽器拿到的配對碼vAc_ 開頭)→ 狀態頁看 online。"
echo " (關 GUI 視窗即結束 agent"
echo ""
exec "$APP_BIN"