網關安裝與令牌
拓撲採網關優先:一台穩定主機(堡壘、小型 Linux VM 或指定 Mac)執行 OpenClaw、負責對外 Webhook,密鑰目錄與 daemon 環境一致。工作者節點只排程事件,不各自保存 Chat URL。安裝與多機編排可對照 多節點部署指南;事件進網關前的佇列與同步見 部署與任務佇列同步。
完成 OPENCLAW_CONFIG_ROOT、引導與健康檢查後,將 Webhook 目標寫入例如 /etc/openclaw/secrets.d/google-chat/build-status.url,權限 0440、屬主 root、群組專用 openclaw-notify,避免建置帳號讀取。
檢查點 A(檔案權限)。
sudo install -d -m 0750 -o root -g openclaw-notify /etc/openclaw/secrets.d/google-chat
sudo sh -c 'umask 077; cat > /etc/openclaw/secrets.d/google-chat/build-status.url' <<'EOF'
https://chat.googleapis.com/v1/spaces/SPACE/messages?key=KEY&token=TOKEN
EOF
sudo chown root:openclaw-notify /etc/openclaw/secrets.d/google-chat/build-status.url
sudo chmod 0440 /etc/openclaw/secrets.d/google-chat/build-status.url
將佔位 URL 換成 Chat 主控台產生的實際位址。若暫無專用群組,可先以 root 可讀檔驗證流程,再上收斂為最小權限。
Google Chat incoming webhook 配置
在目標Chat 空間新增 Incoming Webhook(命名建議含儲存庫或集區代號),複製一次性完整 URL。其中 key、token 查詢參數在效果上等同無範圍 HTTPS 密鑰;外洩時應撤銷並重建,無法只做「部分輪替」。
- 分環境分空間,避免測試流水線誤傳「綠燈」到正式公告空間。
- 出站:在與 daemon 相同環境的 shell 確認可連
chat.googleapis.com,且HTTPS_PROXY等變數與服務一致。 - 管理政策:若 Workspace 限制自訂 Webhook,可改經核准的 Chat 應用程式或 Apps Script 端點,仍維持單一網關發送者。
檢查點 B(連線)。
export HTTPS_PROXY="${HTTPS_PROXY:-}"
curl -sS -o /dev/null -w "%{http_code}\n" -I "https://chat.googleapis.com/"
預期可完成 TLS(裸 GET 常見 Google 的 404 等回應),但不可出現握手失敗或企業代理的 403。網路政策放行後再查 JSON 本文。
訊息載荷模板
應用程式產生文字時,最小可靠本體為 UTF-8 JSON,含 text 欄位;卡片與互動元件可在 plain text 驗證通過後再加。
export CHAT_URL="$(sudo cat /etc/openclaw/secrets.d/google-chat/build-status.url)"
curl -sS -X POST "$CHAT_URL" \
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{"text":"MeshMac 網關探測:'"$(hostname -s)"' OK"}'
檢查點 C(空間可見)。數秒內應在空間看到探測行;若回應 JSON 含錯誤物件,先美化輸出修正本文,再接到 CI。
正式通知建議單行呈現:state 標籤或圖示、workflow、短 commit、run_url 連結(勿貼完整日誌);長度遵守 Chat 限制。多平台時 Teams 改為連接器卡片 JSON、Matrix 改為房間訊息,網關內部鍵仍一致。
多節點狀態聚合範例
假設三台 MeshMac 建置機在同一分鐘內結束作業:各 runner 將事件送入 Redis、NATS 或 OpenClaw 任務網格,由唯一消費端對照下列內部鍵後再格式化 text:
| 正規化鍵 | 示例值 | Chat 行內用途 |
|---|---|---|
workflow | ios-release | 前綴或標題片段 |
state | succeeded/failed | 團隊約定的圖示或標籤 |
mesh_node_id | mm-pool-2 | 標示池中哪台 Mac 執行 |
provider_run_id | 18451203 | 與 state 組合做冪等鍵 |
單次 POST 渲染示例:
✅ ios-release · main · abc1234 · <https://github.com/org/repo/actions/runs/18451203> · node mm-pool-2
若同一 provider_run_id 與 state 重複回報,網關應在選定時間窗(常見 24~72 小時)內去重,避免重試洗版。內部佇列退避與上限請對齊 任務佇列重試步驟,與「重新跑建置」分開治理。
鑑權與重試 FAQ
- Webhook URL 是 OAuth 權杖嗎?
- 不是。它是無範圍 HTTPS 端點密鑰。請比照 API Key:檔案 ACL、禁止進 Git、日誌僅保留主機與 token 末四碼。
- 哪些狀態碼應重試?
429與5xx可用指數退避加抖動並設次數上限(例如兩分鐘內至多五次)。勿對400/401盲目重試;應修正 JSON 或輪替 Webhook。連續404視為連結已刪除。- 如何避免重複 Chat 訊息?
- 成功投遞後以
provider_run_id + state寫入 SQLite、Redis 或網關本機快取;窗內已存在則略過第二次 POST。 - 建置機能否暫時直連 Chat?
- 不建議。密鑰與出站規則會隨節點數倍增;收斂到單一網關程序才利於輪替、稽核與演練。
0440、僅網關 POST、探測 curl、去重視窗 24~72h、重試僅 429/5xx。
下一步(免登入導覽)
完成後應由單一網關對外呼叫 Chat。無需帳號即可瀏覽:首頁、購買/套餐與節點選擇、幫助中心(SSH/VNC 與接入說明)、部落格列表、OpenClaw 索引。若需擴充多台遠端 Mac 集區,請於套餐頁依併發與地域加節點,再將網關與建置機分離並收斂出站與密鑰面。