本文與《多可用區網關與 Webhook 摘要》互補:那篇談拓樸與流量;這篇談租戶邊界內的目錄、鎖檔與觀測合併。產物扇出與 rsync 矩陣請見《並聯叢集決策矩陣》;完整索引在技術部落格首頁。
目錄約定
在每台專用 Mac 採固定骨架:/usr/local/openclaw/tenants/<tenant>/fragments/*.yaml 只放租戶可編輯片段;/var/lib/openclaw/merged 放合併後產物與 SHA256 校驗檔;/var/log/openclaw 放結構化 JSON 行與 Webhook 重試指紋。合併腳本必須「寫暫存再 mv」,避免 launchd 讀到半截 YAML。
安裝:先以單租戶驗證合併器輸出與 OpenClaw 啟動旗標相容,再複製骨架到第二台節點。編排:以租戶標籤選擇要載入的片段集合,禁止在執行路徑直接手改 merged。排錯:比對校驗檔與合併器日誌列印的最終鍵名;若片段 YAML 語法錯誤,合併應非零退出並阻擋 reload。
版本鎖
在 repo 或設定倉庫根目錄維護 versions.lock:列出 OpenClaw 二進位 digest、sidecar 映像標籤與合併器腳本 Git SHA。CI 在推上 clustervps 前比對鎖檔;漂移時只允許走「金絲雀 Mac → 全節點」兩階段。
升級當日流程:凍結片段提交、在單台 Mac 跑 doctor 與合成探針、觀察二十分鐘錯誤預算,再批次替換鎖檔並觸發滾動重啟。若僅修補 Webhook 合作方 URL,仍應記錄鎖檔修訂號,避免「口頭升級」造成節點間行為分叉。容量與儲存水位可對照方案頁預先留緩衝。
健康探針合併
對外只暴露 /healthz/composite:處理常式依序執行磁碟水位、launchd 單元狀態、OpenClaw 內建 doctor(設定語意、依賴端點、Webhook 出站 TLS)與佇列深度;回傳單一 JSON,含 tenant、az 與子檢查陣列。負載平衡器與監控只打這一支 URL,避免「探針全綠但業務全紅」的經典誤判。
將 Webhook 失敗摘要廣播掛在同一觀測管線:網關寫結構化失敗事件到本機佇列或檔案尾,通知器節點以五分鐘視窗依 HTTP 狀態與租戶去重,再推一則 Slack/郵件摘要;複合探針在摘要堆積或背壓超標時回傳 degraded,讓流量仍可疏導但值班主任會收到黃燈。
#!/usr/bin/env bash
set -euo pipefail
/usr/bin/openclaw doctor --tenant "${TENANT}" --json >"/tmp/d.json"
/usr/bin/curl -fsS --max-time 4 "${WEBHOOK_PING_URL}" >/dev/null
/usr/bin/printf '{"tenant":"%s","doctor_ok":true,"webhook_ok":true,"queue_depth":0}\n' "${TENANT}"
各節點路徑一致,排錯時才能用同一條 SSH 劇本;連線說明請對齊說明中心截圖。
令牌輪換
Webhook Bearer 與 mTLS 用戶端憑證分開存放:租戶令牌檔路徑寫在片段內,但實際密文由節點密鑰庫注入,合併產物只保留路徑引用。輪換時鑄造影子憑證,先掛到單台金絲雀 Mac,驗證出站與摘要廣播皆成功兩個輪詢週期後,再以設定修訂標籤推廣到全叢集。
讀取端用短命檔加 rename 原子更新,避免半寫入。撤銷舊密鑰前保留至少十二小時重疊,並在稽核日誌寫操作者與工單 ID。公網 Webhook 建議月級輪換;內網整合可放寬至季,但一旦懷疑外洩須立即全租戶輪換並檢視合併產物是否仍引用舊路徑。
步驟清單
- 準備三台 clustervps Mac(或可縮為兩台+筆電模擬通知器)。角色:網關 A/B、通知器 N。
- 建立租戶片段與合併腳本,產出
merged/openclaw.yaml與.sha256;以openclaw validate(或專案等效指令)阻擋語法錯誤上線。 - 寫入
versions.lock並在 CI 比對;首台節點安裝後跑 doctor 與手動 Webhook ping。 - 部署複合探針,確認 LB 僅配置單一路徑;人為拔掉上游 DNS 驗證 JSON 子欄位是否反映失敗。
- 啟動通知器聚合,注入可重現的 4xx/5xx 測試流量,檢查五分鐘視窗內只收到一則摘要且含租戶與關聯 ID。
- 演練影子令牌:金絲雀成功後全節點提升,舊密鑰撤銷並 grep merged 確認無殘留引用。
- 把 SSH 跳躍與回滾開關寫進 runbook;擴容前先瀏覽購買頁與首頁公開資訊對齊預算。
FAQ:租戶切片下的常見誤判
片段合併會不會悄悄覆蓋共用鍵? 在合併器實作「鍵衝突即失敗」策略,並把最終鍵序寫進日誌;禁止靜默後勝。
doctor 變慢會拖垮 LB 嗎? 為 doctor 設硬逾時與快取欄位;超時時標記 degraded 而非讓連線掛死。
摘要會不會吃掉關鍵細節? 摘要只承載計數與代表 URL,完整事件仍保留在節點本機 JSONL,供單筆重播。