OpenClaw 救援机器人建设与演进全记录 - 从单点故障到双实例自愈体系
🤖 OpenClaw 救援机器人建设全记录
从单点故障到双实例自愈体系的演进之路
📌 核心摘要
这次改造的本质不是"换个命令名",而是把 OpenClaw 从单点机器人升级为双实例、可救援、可复盘、可持续进化的运维体系。
- ✅ 物理隔离:主实例与救援实例独立运行
- ✅ 行为闭环:发现问题 → 修复 → 验证 → 归档 → 复用
- ✅ 稳定性提升:减少人为依赖,提升自动恢复能力
- ✅ 知识沉淀:同类问题可快速定位并准确修复
📑 目录
| 1. | 为什么要增加维修机器人 |
| 2. | 整体架构与隔离原则 |
| 3. | 如何安装(源码方式) |
| 4. | 为什么要修改源码 |
| 5. | 如何修改(关键改造点) |
| 6. | 实际踩坑与修复结论 |
| 7. | 维修流程制度化 |
| 8. | 记忆系统改造 |
| 9. | 验收与检查清单 |
| 10. | 实测过程(本次演练) |
| 11. | 最终结论 |
1️⃣ 为什么要增加维修机器人
在单实例 OpenClaw 架构里,主机器人一旦出现以下问题,会陷入"无人值守失败":
- 网关配置错误导致服务起不来
- 端口监听异常(例如 18789 未监听)
- 模型认证丢失导致任务无法执行
- 自动化流程中断后无自恢复能力
因此需要一个独立的救援机器人实例,专门负责:
- 监控主机器人状态
- 故障时执行诊断与修复
- 修复后验证并回报
- 失败时继续二次排障
- 持续沉淀故障经验,避免重复踩坑
核心设计思想:主实例做业务,救援实例做运维与修复,两者物理隔离、逻辑闭环
2️⃣ 整体架构与隔离原则
2.1 双实例隔离
| 📌 主机器人:openclaw(端口 18789) |
| 🔧 救援机器人:openclaw-rescue(端口 20260) |
2.2 关键隔离点
| 主:~/.openclaw/openclaw.json |
| 救援:~/.openclaw-rescue/openclaw.json |
| 主:~/.openclaw/ |
| 救援:~/.openclaw-rescue/ |
| 主:openclaw-gateway.service |
| 救援:openclaw-gateway-rescue.service |
| 主:openclaw ... |
| 救援:openclaw-rescue ... |
3️⃣ 如何安装(源码方式)
3.1 源码获取与构建
| # 在救援目录中拉取源码并构建 |
| cd ~/.openclaw-rescue |
| git clone https://github.com/openclaw/openclaw openclaw-src |
| cd openclaw-src |
| git checkout v2026.3.2 |
| pnpm install |
| pnpm build |
说明: 稳定版本固定为 2026.3.2,避免随主线变化导致不可控回归。
3.2 建立救援命令入口
创建专用包装命令 ~/.openclaw-rescue/bin/openclaw-rescue,核心固定项:
| OPENCLAW_CONFIG_PATH=~/.openclaw-rescue/openclaw.json |
| OPENCLAW_STATE_DIR=~/.openclaw-rescue |
| OPENCLAW_PROFILE=rescue |
| OPENCLAW_CLI_NAME=openclaw-rescue |
| OPENCLAW_BRAND_NAME=OpenClaw Rescue |
| OPENCLAW_GATEWAY_URL=ws://127.0.0.1:20260 |
4️⃣ 为什么要修改源码
仅靠外层脚本改名不够,TUI/日志/提示语仍可能显示 openclaw,容易误判"连在一起"。
🎯 源码级改造目标:
- 命令名可动态替换(
openclaw→openclaw-rescue) - 品牌名可动态替换(
OpenClaw→OpenClaw Rescue) - TUI 头部、提示文案、日志前缀统一隔离
- 异常日志中能明确区分实例来源
5️⃣ 如何修改(关键改造点)
5.1 CLI 与品牌动态化
改造了 CLI 命名与品牌解析逻辑,新增环境驱动能力:
| OPENCLAW_CLI_NAME |
| OPENCLAW_BRAND_NAME |
使 Banner、帮助页、状态页、异常前缀按实例动态展示。
5.2 TUI 隔离修复
- 标题从写死
openclaw tui改为动态openclaw-rescue tui - pairing 提示中的命令也动态替换
clientDisplayName改为实例化命名(如openclaw-rescue-tui)
5.3 服务启动方式修复
早期 gateway start 在服务内会产生递归问题,修复为前台方式:
| ExecStart=/home/iuriooo/.openclaw-rescue/bin/openclaw-rescue gateway run |
并单独注册:openclaw-gateway-rescue.service
5.4 防止误重启自己
新增安全服务脚本:workspace/scripts/safe-service.sh
只允许:
| main → openclaw-gateway.service |
| rescue → openclaw-gateway-rescue.service |
6️⃣ 实际踩坑与修复结论
❌ 坑 1:openclaw-rescue tui 仍显示主实例
根因: 交互 shell 里存在旧 alias,把 openclaw-rescue 映射回 openclaw。
修复: 清理旧 alias → 在 ~/.bashrc 固定 rescue 入口 → 新开终端后验证 type -a openclaw-rescue
❌ 坑 2:模型代理失败(No API key found)
根因: 救援实例缺失 auth-profiles.json。
修复: 从主实例复制认证文件到救援目录 → chmod 600 → 重启救援服务
❌ 坑 3:看起来网关不断重连
根因有两类:
- 救援服务确实被 SIGTERM 重启(误操作链路)
- Telegram 通道 404 导致通道层持续重连(常见于 token 配置问题)
修复方向: 引入 safe-service.sh 约束重启目标 / 修正 channels.telegram.botToken 或临时禁用该通道
7️⃣ 维修流程制度化(从"会修"到"稳定会修")
已建立强制维修 SOP:
Wake → Log → RAG → LLM → Fix → Restart → Verify → Report
🚪 新增关键门禁:
- 完成前必须归档(不能先说"修好")
- 同类问题不重复建档(更新同一经验条目)
- 断线后自动续跑(通过
memory/repair-state.json记录 step)
8️⃣ 记忆系统改造
采用四层记忆结构:
💡 价值:下次同类故障可直接命中历史经验,减少重复试错,形成可审计维修知识库
9️⃣ 验收与检查清单
9.1 隔离验收
| type -a openclaw-rescue |
| openclaw-rescue --version |
| openclaw-rescue config get gateway.port |
预期: 命中 ~/.openclaw-rescue/bin/openclaw-rescue,端口返回 20260
9.2 服务验收
| systemctl --user status openclaw-gateway.service |
| systemctl --user status openclaw-gateway-rescue.service |
| lsof -nP -iTCP -sTCP:LISTEN | rg '18789|20260' |
预期: 两个 service 同时独立运行,18789 和 20260 各自监听
9.3 流程验收
触发一次故障演练(人为注入配置非法字段),检查是否满足:自动诊断、自动修复、自动归档、同类经验更新不重复新增
🔟 实测过程(本次演练)
🧪 测试 A:实例隔离与命令路由
测试动作: 执行 openclaw-rescue tui,检查 TUI 顶部连接地址和监听端口
结果: TUI 连接为 ws://127.0.0.1:20260,主实例保持 18789,救援实例保持 20260 ✅
🧪 测试 B:主网关故障注入(配置非法字段)
测试动作: 人为在主实例 openclaw.json 注入非法字段(para),触发"主机器人不在线"维修流程
结果: 救援流程能定位到配置非法字段,删除后主网关恢复监听 ✅
🧪 测试 C:同类故障复测(重复注入)
测试动作: 再次注入同类非法字段,重复故障
结果: 没有创建重复事件档案,经验库以"更新同类条目"为主 ✅
🧪 测试 D:记忆与归档能力
测试动作: 检查每日日志、事件档案、经验库、长期记忆是否都有记录
结果: 四层记忆均有写入,已建立"完成前必须归档"的门禁规则 ✅
⚠️ 测试 E:异常行为发现(误重启与中断续跑)
观察到的问题: 维修过程中曾出现救援网关被重启(SIGTERM),一次中断后未立即续跑
修复动作: 增加 safe-service.sh,增加 repair-state.json 要求中断后按 next_step 自动续跑
结果: 误重启风险显著降低,流程具备断线恢复约束 ✅
1️⃣1️⃣ 最终结论
这次改造的本质不是"换个命令名",而是把 OpenClaw 从单点机器人升级为双实例、可救援、可复盘、可持续进化的运维体系。
最终达成:
- 物理隔离:主实例与救援实例独立
- 行为闭环:发现问题 → 修复 → 验证 → 归档 → 复用
- 稳定性提升:减少人为提醒依赖,提升自动恢复能力
- 知识沉淀:同类问题可快速定位并准确修复
本次测试结论:
- ✅ 架构隔离成立(命令、端口、服务、配置目录)
- ✅ 故障注入可被识别并修复
- ✅ 同类问题可复用经验,避免重复建档
- ✅ 归档制度已具备强制门禁
- ⚠️ Telegram 通道配置不正确时会产生重连噪音(需单独校正 token)
- ⚠️ 若外部仍直接调用裸
systemctl,仍可能绕过流程约束(应统一走安全脚本)
⭐ 项目完成度
5.0 / 5.0
双实例救援体系正式建成 🎉
发布日期:2026-03-06
标签:#OpenClaw #救援机器人 #自动化运维 #AI Agent #双实例架构
作者:龙虾 master 🦐
厉害了
回复删除