面向需在远程 Mac常驻 OpenClaw、收 Harbor Webhook、在 CI 前预拉取镜像并把 JSON 摘要打到出站白名单的工程师。2026 常见流程可引用curl 装 Node/CLI、文档支持时的 openclaw onboard --install-daemonopenclaw doctor 与本机 curl 健康探针做网关自检——以发行版文档为准,不绑定任意外链为必需。内链:GHCR 拉取矩阵网关加固Docker CI 对接
  • 冷启动拉取:Harbor 已接收清单,但 Runner 仍在大层上排队,构建窗口被网络拖长。
  • 伪造与重放:未保存原始 HTTP 体、或对 JSON 重新序列化后再验签,导致“永远验签失败”。
  • 出站失控:摘要回调指向任意公网 URL,违背企业代理与 DNS 白名单策略。

目标与前置条件

目标。推送类事件到达后:验真 Webhook;解析完整镜像引用;在有界并发磁盘水位下预拉取;向白名单主机 POST 数 KB 内 JSON 摘要(成功或结构化失败),供值班或 CI 聚合。

前置条件。Harbor 可配 Webhook;TLS 入口转发到 OpenClaw(多为本机回环加反代/隧道);Docker 能非交互 docker login;凭据文件 0600。对齐 Node 与 OpenClaw 说明后装 CLI(官方脚本或团队沿用的 curl 管道均可);openclaw doctor;文档支持则 openclaw onboard --install-daemon;用与 Harbor 同源路径做一次网关自检(如 curl -fsS 健康 URL)。书面登记出站白名单:Harbor 源、registry、摘要端各最少一项。

最小验收。在预发 Mac 上重放一份已脱敏的 Harbor 投递:日志中的 digest 行与真实事件一致;预拉取在配置的超时预算内结束;摘要 JSON 被白名单主机成功接收。

Harbor Webhook 事件字段与签名校验清单

信封含 typeoccur_atoperatorevent_data。预拉取重点:仓库名tag/digest制品 digest。Runbook 附一份与当前 Harbor 小版本一致的样例 JSON。

签名校验清单。(1)先存原始体JSON.parse。(2)常量时间比对共享密钥(自定义头或 Bearer)。(3)校验 Content-Type 与体长上限。(4)可选:occur_at 新鲜度。(5)日志禁打密钥。(6)HMAC 若启用,摘要对象须与 Harbor 同一段原始字节;反代勿改写字节序。

字段 / 关注点在 OpenClaw 处理器中的用途
type分支:推送/重打标签触发预拉取;删除事件可选择触发本地 prune 或忽略。
event_data.resources映射为 registry/项目/仓库:标签;标签为空时改用 digest 固定拉取。
operator审计与按自动化身份限流。
原始体完整性先验签再解析;失败返回 401 且不回显请求体。
1
在 Harbor 项目设置中新建 Webhook,URL 形如 https://你的入口/hooks/harbor?v=…,路径令牌勿进入公共截图。
2
在 Harbor「Webhook 投递历史」复制一次成功或失败样例,保存为解析器单元测试夹具。
3
在 OpenClaw 路由中实现「先验签、再解析」;对未知 type 快速返回 204 以降噪。
4
用与线上一致的 curl 重放原始头与体,确认日志与真实投递逐行对齐。

远程 Mac 上预拉取脚本参数(并发 / 超时 / 磁盘配额)

用独立 shell 脚本包 docker pull,路由层少改代码。推荐默认:并发 2~4;单拉超时 6~15 分钟;MIN_FREE_GB 约 15~25。plist 注入 PREFETCH_CONCURRENCYPULL_TIMEOUT_SECMIN_FREE_GBMAX_IMAGES_PER_EVENT。BSD xargs -P 即可;单拉硬超时可用 gtimeout 或包装进程。

#!/usr/bin/env bash
set -euo pipefail
: "${PREFETCH_CONCURRENCY:=3}"
: "${PULL_TIMEOUT_SEC:=600}"
: "${MIN_FREE_GB:=18}"
avail_gib="$(df -g / | awk 'NR==2 {print $4}')"
if [ "${avail_gib:-0}" -lt "${MIN_FREE_GB}" ]; then
  printf '{"prefetch":"skipped","reason":"disk_low","avail_gib":%s}\n' "${avail_gib}"
  exit 0
fi
printf '%s\n' "$@" | xargs -n1 -P"${PREFETCH_CONCURRENCY}" -IREF docker pull REF

将每批结果追加一行 JSON 到 OpenClaw 可读的日志路径,便于与构建摘要合并。磁盘与并发策略建议在团队 Runbook 中写明水位线与 prune 窗口,避免与高峰构建争用同一卷。

OpenClaw 网关路由与失败摘要模板

每集成单路径(如 /hooks/harbor/v1)收窄防火墙。验签后按 type 分支并投递预拉取;输出须机器可读,避免散文式日志。

{
  "source": "harbor-webhook",
  "event_type": "PUSH_ARTIFACT",
  "repository": "acme/base/nodejs",
  "digest": "sha256:……",
  "prefetch": {
    "ok": false,
    "failed_image": "reg.example/acme/base/nodejs:20",
    "exit_code": 1,
    "log_tail": "……末尾约 400 字符……"
  },
  "host": "mac-ci-07",
  "duration_ms": 8420
}

出站前校验主机名在白名单。摘要 POST 设 curl --max-time 25 类上限;失败 2/4/8 秒 退避至多三次。Harbor 限时紧时可验签后先 202 再异步拉取(须满足幂等与审计)。

常见报错 FAQ(鉴权 / 超时 / 磁盘满)

鉴权:Harbor 或 registry 在预拉取阶段返回 401

机器人密码已轮换但 plist 仍导出旧值;docker pull 主机名与令牌 scope 不一致;非 GUI 会话无法弹出钥匙串。改为文件或环境变量注入凭据,用自动化用户执行单次 docker pull 验证。

超时:Harbor 标记 Webhook 失败而本机仍在拉层

Harbor 同步等待 HTTP 响应期间执行大体积拉取会超时。验签后尽快返回;将 docker pull 挪到工作队列;或缩小单次事件内的镜像数量。

磁盘满:批处理中途失败

共享 Runner 堆积悬空镜像。遵守 MIN_FREE_GB;绿构建后在维护窗口执行 docker image prune -f;大文件不要放在 Docker 数据根同一卷。

本机 curl 健康而 Harbor 看到 502

反代 upstream 与内网监听地址不一致,或 SNI 与证书 CN/SAN 不匹配。从跳板机访问公网 URL 对照 TLS 链路与响应码。

总结购买引导

主线:原始体验签 → 显式参数预拉取 → 固定路由 JSON 摘要 → 短白名单与有界重试;可降噪且不把 Mac 暴露成开放中继。

长期在线与稳定 TLS,可考虑 MacPull 远程 Mac。免登录可浏览首页购买帮助博客列表

MacPull 提供专用 Mac mini 节点,便于 OpenClaw 与 Harbor 驱动的预拉取网关持续运行、可监控、且便于向安全评审说明边界。

在常驻远程 Mac 上跑 Harbor 驱动的镜像预拉取

稳定 TLS、守护进程与可预期磁盘,适合与 OpenClaw 同事。首页、购买、帮助与博客均可免登录访问。

出站可审计 并发有界 支持渠道