--repair)。站內:閘道健康與 LaunchAgent、GitOps 預檢鏈與 MCP、失敗恢復與重試。
前置條件(Node、令牌、出站)
Node:建議 22 LTS 或更新;全域安裝 openclaw 後執行互動式 openclaw onboard(可搭配 --flow quickstart),再以 openclaw doctor 或 openclaw doctor --yes 驗證設定、OAuth/沙箱與閘道埠是否衝突;進階可用 openclaw doctor --deep 掃描多餘閘道服務。常駐請用 launchd 寫死 PATH/NODE_BINARY,避免僅登入 shell 才載入 nvm。
令牌:閘道使用窄用途 Bearer;Argo CD 使用帳號權杖或 SSO 下發、僅含目標 Application/專案讀寫所需 RBAC;兩者分桶,勿把 Argo 權杖寫進可被建置日誌列印的欄位。
出站:Mac 節點需能連 Argo CD API(HTTPS)、Git/OCI Registry(預檢拉清單所需),以及摘要回傳端點;其餘走企業出站白名單或代理,邊界策略與閘道強化文常見做法一致(路由/憑證分離)。
# 安裝與診斷(示例) npm i -g openclaw openclaw onboard openclaw doctor --yes
Webhook 與閘道串聯步驟清單
1)對外只暴露 TLS 終止(Caddy/Nginx/雲端 LB),轉發到本機 127.0.0.1:PORT;URL 含長隨機路徑當共享祕鑰,必要時再加 Authorization: Bearer。
2)在 argocd-notifications 設定 trigger(例如 on-sync-succeeded/on-sync-failed)與 template,將 app.metadata.name、app.status.sync.status 等欄位 POST 到上述 URL;若用同步 Webhook 外掛,同樣確認 Content-Type 為 application/json。
3)OpenClaw handler:驗簽 → 解析應用名稱 → 觸發預檢腳本 → 呼叫 Argo CD REST 取完整狀態 → 組摘要 JSON → curl 回傳內部觀測;非 2xx 依下文 FAQ 重試。
| 現象 | 處理 |
|---|---|
| 反向代理 502 | 確認閘道行程與本機埠;curl 直打 127.0.0.1 |
| 403/簽章不符 | 核對路徑祕鑰與 Bearer;payload 是否被代理改寫 |
預檢腳本與健康探針參數
預檢:依事件中的 revision 在暫存目錄 git clone --depth 1,對 Chart 路徑執行 helm template(可加 --debug 限長輸出),或對 Kustomize 目錄執行 kubectl kustomize build;錯誤時取 stderr 最後數十行作為摘要片段。子程序務必包 timeout(例如 120s),避免占滿通知外掛連線。
探針:排程或監控每 60 秒以 curl 打閘道 /health,設定 --connect-timeout 3、--max-time 10,並帶閘道 Bearer;預期 2xx。與導讀所附 LaunchAgent 健康文併用可快速分辨「網路問題」與「handler 邏輯錯誤」。
# 閘道健康(替 PORT、GATEWAY_TOKEN)
curl -sS -o /dev/null -w '%{http_code}\n' \
-H "Authorization: Bearer YOUR_GATEWAY_TOKEN" \
--connect-timeout 3 --max-time 10 \
http://127.0.0.1:PORT/health
# 讀取 Application 同步摘要(替 HOST、APP、ARGOCD_TOKEN)
curl -sS -H "Authorization: Bearer $ARGOCD_TOKEN" \
--connect-timeout 5 --max-time 25 \
"https://HOST/api/v1/applications/APP" | jq '{sync:.status.sync.status,health:.status.health.status}'
- 預檢通過後再讀 API,可減少「清單已壞仍進同步」的噪音。
- 完整日誌落盤,摘要只送濃縮 JSON,便於稽核與對時戳。
FAQ(鑑權失敗、逾時、重試)
鑑權失敗(401/403)
輪換 Argo CD 權杖並確認 RBAC 含該 Application;閘道 Bearer 是否過期;API URL 是否混用 http/https;企業 MITM 是否需匯入 CA。勿在重試迴圈中重複送同一過期權杖。
逾時
區分 connect 與讀取逾時:網路抖動時先加大 --max-time 仍不行則檢查代理;預檢過長應改為非同步佇列,Webhook 先回 202/204。
重試
僅對可重試錯誤使用 2/4/8 秒有界退避並加抖動;同一 app 建議互斥或串列,避免與進行中同步互搶;退避語意與導讀「失敗恢復與重試」文一致。