導讀:Harbor 推送新工件時,以 Webhook 將事件 JSON POST 到遠端 Mac本機 OpenClaw 閘道(建議僅 127.0.0.1),觸發依賴鏡像預拉取並把成功/失敗摘要回傳內部 CI;同時維護出站白名單,只放行 Registry、OIDC 與回呼端點。延伸閱讀:私有 Registry 拉取矩陣閘道安全強化併發與磁碟 FAQ

目標與前置條件

目標:在推送當下把常用基底鏡像與服務映像預熱到建置節點,縮短後續 docker pull;並以結構化摘要讓編排器決定是否繼續流水線。

前置條件:遠端 Mac 已安裝 Docker Desktop 或對等執行環境;Harbor 專案具 Webhook 權限;內網可達閘道對外 URL(TLS 終止建議在反向代理)。

1

工具鏈(引用式):2026 社群常見做法為以套件管理器安裝 curljq 等輔助工具,再安裝 Node 22+ 與 OpenClaw CLI;完成後執行 openclaw doctor 檢查版本與憑證。

2

守護程序(引用式):執行 openclaw onboard,若需常駐可加上 --install-daemon(實際旗標以你安裝的 OpenClaw 版本說明為準),並以 launchd 寫死 PATHNODE_BINARY,與 SSH 互動殼層一致。

3

閘道自檢:http://127.0.0.1:PORT/health 發送帶 Authorization: Bearer … 的探針,確認 HTTP 狀態碼與延遲;排程每 60 秒一次並寫入本地日誌。

# 閘道狀態自檢(替換 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

可複現串聯:Harbor 建立 Webhook Endpoint → 反向代理轉發至閘道路徑 → Handler 驗簽 → 呼叫預拉取腳本 → curl 將 JSON 摘要 POST 至 CI 回呼 URL。

Harbor Webhook 事件欄位與簽名校驗清單

Harbor 事件本文多為 JSON,實務上請先列印一筆真實推送再對照欄位設計 Handler,避免版本差異。下列為校驗清單(非 Harbor 版本綁定):

欄位與簽章勾選
檢查項說明未過關時行為
type/事件類型僅處理如推送工件等必要類型直接 204 忽略並寫審計
operator/觸發者可選:限制機器人帳號或命名空間標記為人工覆核
資源路徑event_data 內巢狀取出 repository.nametagdigest拒絕並回錯誤摘要
簽章本體原始 HTTP 本文位元組計算 HMAC 或比對共享祕鑰標頭401,不執行 pull
重放/時效可選:檢查時間戳窗口與事件 ID 去重丟棄重複事件
Content-Type固定 application/json避免中介改寫造成簽章漂移

若 Harbor 與閘道之間還有 API 閘道,請確認未重新序列化 JSON,否則 HMAC 將與傳送端不一致。

遠端 Mac 上預拉取腳本參數(並行/逾時/磁碟配額)

建議以環境變數驅動同一套腳本,方便在 OpenClaw Handler 內與手動除錯時共用。參數語意如下表;數值可依節點 CPU、網路與磁碟型號調整。

建議環境變數
變數用途起步值(參考)
PREFETCH_CONCURRENCY同時 docker pull 條目數上限2~4(弱網改 1~2)
PULL_TIMEOUT_SEC單一映像拉取逾時(外層 timeout 或 client 旗標)300~900
MIN_FREE_GB工作卷可用空間低於此值則中止或改排程30~80(視映像基線)
REGISTRY_USERNAMEREGISTRY_PASSWORD機器人唯讀帳密或短期權杖與 Harbor Robot 帳號對齊
# 單一映像預拉取(示例;實務請改為清單迴圈+並行控制)
export PULL_TIMEOUT_SEC=600
timeout "${PULL_TIMEOUT_SEC}" docker pull harbor.example.com/app/api:v2026.04.15
  • 腳本開頭以 df -hdiskutil info 取得同一掛載點剩餘空間,換算 GB 後低於 MIN_FREE_GBexit 2 讓上游感知。
  • 並行請搭配 Registry 限流策略;必要時在 Harbor 前加區域拉取快取。

OpenClaw 閘道路由與失敗摘要模板

在閘道設定中將 Harbor 專用路徑(例如 /hooks/harbor)綁定至固定 Handler:先驗簽、再解析映像清單、最後以非同步佇列執行預拉取,避免阻塞 Harbor 重試窗口。

出站白名單:於主機防火牆或出口代理列出允許的 FQDN:Harbor UI/Registry 主機、OIDC(若啟用)、以及 CI 回呼 URL;其餘對外 HTTPS 預設拒絕,降低誤設 Webhook 目標造成的 SSRF 面。

# 建議摘要 JSON 範本(寫入檔後以 curl POST)
{
  "source": "harbor-webhook",
  "repository": "library/demo",
  "tag": "v2026.04.15",
  "digest": "sha256:…",
  "prefetch_status": "failed",
  "error_code": "PULL_TIMEOUT",
  "duration_ms": 0,
  "host_disk_free_gb": 12.4
}

成功時將 prefetch_status 設為 ok 並帶上耗時;失敗時務必帶穩定機讀錯誤碼(如 AUTH_DENIEDDISK_LOW),方便 CI 規則引擎分支。

# 回傳摘要至內部 CI(替換 CALLBACK_URL、CI_TOKEN)
curl -sS -X POST "$CALLBACK_URL" \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $CI_TOKEN" \
  --data-binary @/tmp/harbor-prefetch-summary.json \
  --connect-timeout 5 --max-time 25

常見報錯 FAQ(鑑權/逾時/磁碟滿)

鑑權:Harbor 回 401 或 Robot 權杖被拒?

確認映像路徑與 Robot 範圍一致;權杖是否過期;docker login 與實際 docker pull 引用是否同一 Registry 主機名;企業 MITM 是否已信任根憑證。

逾時:Webhook 已重試但 Mac 端仍卡住?

降低 PREFETCH_CONCURRENCY;為每層拉取設定合理 PULL_TIMEOUT_SEC;檢查 HTTPS_PROXY 是否與 Daemon 一致;對照出站白名單是否漏放行 CDN 或子網域。

磁碟滿:預拉取中途報 no space?

先以 docker system df 檢視可回收空間;設定 MIN_FREE_GB 門檻並在成功建置後排程 docker image prune;將 Docker 資料目錄遷至獨立 APFS 卷。

閘道 /health 正常但 Harbor 日誌顯示 delivery failed?

核對反向代理路徑、TLS SNI、以及 Harbor Endpoint 是否指向正確埠;檢查來源 IP 是否被邊界 ACL 攔截。

總結與購買引導

總結:Harbor Webhook 與 OpenClaw 的最小閉環在於:原始本文驗簽參數化預拉取磁碟水位門檻結構化摘要出站白名單五件事一起落地,才能把「推送即預熱」變成可稽核的常態流程。需要常駐遠端 Mac承載閘道與 Docker 預拉取負載時,可前往站內購買說明中心(免登入瀏覽),或回到技術部落格繼續查閱其他 OpenClaw 實戰文。

Harbor × OpenClaw × 遠端 Mac

租用遠端 Mac 承載 Registry 預拉取閘道

說明中心購買頁定價首頁OpenClaw 實戰合集 皆站內公開免登入。

多地域可選
SSH 存取
彈性租期
支援管道