2026 在 Mac VPS 上用 Docker 跑通 OpenClaw:Gateway Token、CLI 容器网络与「配对死锁」排障 Runbook

Compose 搬到 7×24 Mac VPS 后常见 token mismatch1008 pairing、CLI 127.0.0.1:18789 拒绝连接。本文面向分容器托管网关与 CLI 的读者:五条根因、症状对照表、五步 Runbook(Token 冻结、双源对齐、网络缝合、配对出口、healthz+launchd),并链 Compose 7×24网关 ladder

在 Mac VPS 上以 Docker 运行 OpenClaw 网关与 CLI 容器的示意图

本文要点

1. 痛点拆解:双源 Token、127 回路、配对死锁与卷权限

上游 Docker 文档与 docker-setup.sh 默认假设「人与脚本在同一网络命名空间内点下一步」,Mac VPS 上无人值守时最常见的五类断裂如下:

  1. 环境变量静默覆盖配置文件:容器内若存在 OPENCLAW_GATEWAY_TOKEN,其优先级可能覆盖 openclaw.jsongateway.auth.token,表现为 UI 粘贴「看起来对」的 token 仍报 mismatch。
  2. CLI 与网关分容器时的 127.0.0.1 误连openclaw-cli 默认尝试 ws://127.0.0.1:18789,但该地址指向CLI 容器自身的回环,而非网关容器;日志常见 ECONNREFUSED1006 异常关闭。
  3. 配对死锁:网关绑定 lan 后,控制面与 CLI 互相要求对方先被批准,若文档未给出「先用带 token 的 dashboard URL 或 CLI devices approve」的明确顺序,会在 1008 上循环。
  4. bind 模式与 Docker 网桥语义混用gateway.bind=loopback 与「跨容器访问」目标冲突;切到 lan 后若未同步调整 CLI 的可达 URL,会出现「网关日志已 listen,但外部握手仍失败」。
  5. 卷权限与 uid 1000:镜像内进程常以 node uid 1000 写入挂载目录;宿主机若用 root 生成文件,会在 Mac VPS 上表现为间歇性写入失败,进一步放大 token 持久化失败。

2. 对照表:症状、根因与首选命令

下表可直接贴进值班手册「首屏 triage」;与站内 生产加固:暴露面与 Token 对照阅读可补齐长期策略。

症状(日志/CLI)高概率根因首选动作(可审计)
token mismatch环境变量与 json 双源不一致grep 对齐;setup 前固定 hex token
127.0.0.1:18789 拒绝CLI 与 gateway 分命名空间network_mode: service:openclaw-gatewayGATEWAY_URL 指服务名
1008 配对循环互等批准dashboard --no-opendevices approve
健康检查飘红未探端口HTTP 探 /healthz/readyz
写入又丢卷或 uidbind 到 VPS 盘;chown -R 1000:1000
单一真源原则:在 Mac VPS 上首次部署前执行 export OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32),将同一字符串写入 .env、Compose 的 gateway 与 CLI 环境块,并在 onboarding 全过程中只粘贴这一份;禁止在排障中途让脚本重新生成第二份 token。

3. 五步 Runbook:从预置 Token 到可值班验收

  1. 冻结 token:在任意管理终端生成 hex,写入版本库外的 .env.production,并在变更单记录「镜像 tag + token 指纹(前 8 位)」。
  2. 对齐双源:启动前用只读命令确认 gateway.auth.tokenOPENCLAW_GATEWAY_TOKEN 完全一致;若使用多阶段 compose,检查 CLI service 是否继承了同名环境变量。
  3. 修正网络:若必须分容器,优先让 CLI network_mode: service:openclaw-gateway;否则为 CLI 设置 GATEWAY_URL=ws://openclaw-gateway:18789 并保证 DNS 在 compose 网络内可解析。
  4. 打破配对环:在网关容器内执行 openclaw dashboard --no-open,用打印的 URL 完成控制面;再于 CLI 侧 devices approve;全程保留审计日志片段。
  5. 探活与 launchd:主机侧用 curl -fsS http://127.0.0.1:18789/healthzreadyz 写入 plist 的 SuccessfulExit 判定;与站内 Compose 7×24 文对齐 restart 与资源上限,避免「网关进程在但 WS 未就绪」的假绿。

Compose 片段示例(仅示意网络缝合,生产请按官方仓库模板合并):

services: openclaw-gateway: image: ghcr.io/openclaw/openclaw:latest environment: OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN} ports: - "18789:18789" openclaw-cli: network_mode: "service:openclaw-gateway" environment: OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}

4. 可引用技术信息:端口、UID 与探活路径

5. 与 Compose 7×24 与原生网关 Runbook 的阅读顺序

Compose 语言先读 7×24;网关/CLI 真相源分歧再读 ladder。笔记本演示在无 UI 的 Mac VPS上会放大双源 token 与分容器网络成本。Docker 比 launchd 多一层排障心智;要独占 Apple Silicon、固定出口、可预期并发承载网关,租赁 VPSMAC M4 Mac 云更易把卷、plist 与 Compose 写进同一手册。开通自动化见 90 秒 API 文。