openclaw onboard --install-daemon、openclaw 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 事件字段与签名校验清单
信封含 type、occur_at、operator、event_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 且不回显请求体。 |
https://你的入口/hooks/harbor?v=…,路径令牌勿进入公共截图。type 快速返回 204 以降噪。curl 重放原始头与体,确认日志与真实投递逐行对齐。远程 Mac 上预拉取脚本参数(并发 / 超时 / 磁盘配额)
用独立 shell 脚本包 docker pull,路由层少改代码。推荐默认:并发 2~4;单拉超时 6~15 分钟;MIN_FREE_GB 约 15~25。plist 注入 PREFETCH_CONCURRENCY、PULL_TIMEOUT_SEC、MIN_FREE_GB、MAX_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(鉴权 / 超时 / 磁盘满)
机器人密码已轮换但 plist 仍导出旧值;docker pull 主机名与令牌 scope 不一致;非 GUI 会话无法弹出钥匙串。改为文件或环境变量注入凭据,用自动化用户执行单次 docker pull 验证。
Harbor 同步等待 HTTP 响应期间执行大体积拉取会超时。验签后尽快返回;将 docker pull 挪到工作队列;或缩小单次事件内的镜像数量。
共享 Runner 堆积悬空镜像。遵守 MIN_FREE_GB;绿构建后在维护窗口执行 docker image prune -f;大文件不要放在 Docker 数据根同一卷。
反代 upstream 与内网监听地址不一致,或 SNI 与证书 CN/SAN 不匹配。从跳板机访问公网 URL 对照 TLS 链路与响应码。