mem_limit · WASM 首轮等待 · allowedOrigins · compose exec 配对 · 可复制 compose
已按教程拉起 docker compose 的开发者在小内存 VPS 上最常遇到三类表象:容器秒退 137、18789 长时间无响应、Control UI 报 non-loopback 或 Host 头相关错误。本文先给free -h 与 mem_limit、首轮 WASM 编译 3~7 分钟窗口的可执行清单,再用症状 → docker logs 证据 → 修复动作表覆盖 Exit 137、卷权限与挂载错位;接着用127.0.0.1 绑定、allowedOrigins 与反代决策表收敛 UI 报错;最后给出六步容器内设备配对与上线前十项勾选。可与OpenClaw v2026.4 安装与 Docker 加固长文、Gateway 安装与 doctor 排障清单、运行期三段式排障交叉阅读,把「能起容器」升级到「无人值守也稳定」。
OpenClaw Gateway 在容器内首次启动时常见CPU 打满但端口迟迟不开,多数属于 WASM 沙箱编译阶段而非死锁。与v2026.4 安装长文中的资源建议对齐:宿主可用内存与 mem_limit 同时过紧时,Linux OOM 会直接给出 Exit 137,日志里未必来得及打印友好错误。
宿主侧:在宿主机执行 free -h,确认可用内存是否长期低于约 1.5~2 GiB 的可用余量;swap 为 0 时 137 更常见。
Compose 侧:为服务设置 mem_limit: 2g 或更高,并避免与其它重服务同机抢内存。
首轮窗口:冷启动预留 3~7 分钟再判定失败;期间可用 docker logs -f 观察是否仍在编译链。
健康检查:healthcheck.start_period 建议至少 360s,避免 compose 在 WASM 完成前误杀重启。
误判止损:不要在首轮窗口内连续 docker compose restart,否则每次都会重新触发冷编译峰值。
把以上五条写进「VPS 上架 OpenClaw」Runbook 的第一页,可显著减少「教程一步步照做仍起不来」的工单量。更完整的 Gateway 分层排障见运行期三段式长文。
下列表格刻意保持「先证据后动作」顺序,便于把工单从「感觉网关坏了」收敛到可复现字段。与doctor 安装排障清单联用时,可把表格行号写进工单模板。
| 症状 | docker logs / 宿主证据 | 优先修复动作 |
|---|---|---|
| 秒退 137 | dmesg 出现 OOM;或日志突然中断 | 提高 mem_limit / 升级规格;减少同机竞争 |
| Permission denied 读 workspace | 挂载目录属主为 root,容器内 node 用户无法写 | chown 到容器 UID 或改用 user: 与卷一致 |
| 配置写了但不生效 | 宿主机路径与 compose 卷指向两套 .openclaw | 统一为单一绑定路径;重启前 docker compose config 校验 |
| DNS 偶发失败 | 容器内 curl 模型端点超时 | 按安装长文检查 Docker dns 与宿主解析 |
| 反复重启无新日志 | 健康检查过短触发杀进程 | 放宽 start_period 与 retries |
Docker 排障是否高效,取决于「137 是否先被证明为 OOM,而不是先被猜为应用 bug」。
若你把 Gateway 与始终在线的远程 Mac 节点组合使用,请把「容器资源」和「节点 SLA」分成两条验收线:前者看 compose 与日志,后者看供应商可用区与维护窗口。
在 VPS 上把 18789 暴露到公网是最常见的误配置之一。安装长文推荐容器只绑定回环地址,由 Caddy 或 Nginx 在 443 终止 TLS。Control UI 若报 non-loopback 类错误,本质是浏览器来源与 Gateway 允许的 Origin 不一致,而不是「Docker 坏了」。
| 场景 | 监听与反代 | 配置取向 |
|---|---|---|
| 仅本机 SSH 隧道调试 | 127.0.0.1:18789 | allowedOrigins 含 http://127.0.0.1:18789 |
| HTTPS 域名正式访问 | 反代到回环上游 | allowedOrigins 列出 https://你的域名;优先不用 Host 回退 |
| 临时实验室 | HTTP 内网 IP | 显式列出 IP 来源;缩小 CIDR;配好维护窗口后回收 |
| 排障期「只想先看到 UI」 | 仍建议保留 TLS 外层 | 仅在理解风险下使用官方文档提到的 Host 头回退开关;事后必须回滚 |
{
"gateway": {
"mode": "local",
"controlUi": {
"allowedOrigins": ["https://openclaw.example.com"]
}
}
}
提示:改 openclaw.json 后观察 docker compose restart 是否落在首轮 WASM 窗口内,避免与第二节的误判叠加。
容器内执行 openclaw 时,HOME 与配置卷必须与运行时进程一致,否则会出现「宿主机已 approve、容器里仍 pending」。下列步骤默认服务名 openclaw,请按你的 compose 服务名替换。
确认服务名:docker compose ps 找到实际运行 Gateway 的容器。
进入相同环境:docker compose exec openclaw sh -lc 'pwd; echo $HOME; ls -la ~/.openclaw | head'
列出待配对请求:docker compose exec openclaw openclaw devices list
复制 Request ID:从 UI 或日志拿到 ID 后执行 openclaw devices approve <id>。
校验 API Key 可见性:若报 No API key found for provider,检查 .env 是否被 compose 传入容器,而非只写在宿主机 shell profile。
写回工单字段:把 compose 文件路径、镜像 tag、openclaw.json 摘要与 approve 命令贴进工单,便于下次复用。
注意:在宿主机直接跑 openclaw devices approve 但配置卷只挂在容器内时,会出现「命令成功但 Gateway 仍不认」的假阴性。
下列三条为社区与生产环境常见的核对区间,请用你们宿主机的真实监控数据替换;写进 README 可避免新人重复踩坑。
| 序号 | 上线前勾选 | 通过判据 |
|---|---|---|
| 01 | ports 仅绑定 127.0.0.1 | 公网直连 18789 关闭 |
| 02 | env_file 与密钥注入路径一致 | 容器内可读到模型供应商 Key |
| 03 | mem_limit 与 swap 策略写明 | 压测一轮无 137 |
| 04 | healthcheck.start_period ≥ 360s | 首轮窗口内无重启风暴 |
| 05 | openclaw.json 中 gateway.mode 为 local | 非法键已清理 |
| 06 | 反代 TLS 与 HSTS 策略 | 浏览器无混容警告 |
| 07 | allowedOrigins 覆盖真实访问来源 | Control UI 无 non-loopback 报错 |
| 08 | 设备配对在容器内走通 | devices list 为空或已 approve |
| 09 | 备份 .openclaw 路径与版本号 | 可在一页 runbook 复原 |
| 10 | 与通道文档对齐 | IM 或 Webhook 侧回调可达 |
services:
openclaw:
image: ghcr.io/openclaw/openclaw:latest
restart: unless-stopped
mem_limit: 2g
ports:
- "127.0.0.1:18789:18789"
volumes:
- ${HOME}/.openclaw:/home/node/.openclaw
env_file:
- .env
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/health"]
interval: 60s
timeout: 15s
retries: 5
start_period: 360s
在笔记本上长期跑 Gateway 往往被休眠、合盖与不稳定上行拖累;纯靠家用宽带也很难给出可验收 SLA。相较之下,按周期计费的云端 Mac Mini 节点更适合承载「需要与 VPS 上 OpenClaw 协同、又要图形或 Xcode 侧操作」的混合工作流。
常见误区:把 0.0.0.0:18789 当作「方便调试」;在公网 VPS 上这等于把控制面暴露给扫描器。
若你希望Docker 网关稳定在线,同时把重编译或真机相关步骤放到可合同化的 macOS 环境,继续维护自购固定资产往往在采购与多地同步上不占优。对需要7×24 可验收节点与弹性规格 的场景,VpsMesh 的 Mac Mini 云端租赁通常是更优解:把 VPS 上的 OpenClaw 与专用远程 Mac 的分工写进架构图,再用价格页与订购页做容量评审,比口头承诺更容易落地。
多数情况下应先对照宿主 dmesg 与 mem_limit 是否触发 OOM;同时预留首轮 WASM 编译窗口。资源基线可与OpenClaw v2026.4 安装长文中的建议一起评审。
优先在 openclaw.json 的 gateway.controlUi.allowedOrigins 列出真实 HTTPS 来源,并确认反代没有把错误的 Host 传到上游。更完整的安装与 doctor 流程见Gateway 安装排障清单。