Back to News
Troubleshooting
BlueBubbles 配置排障:OpenClaw 可能写入无效键,并在下次重启时自我卡死(v2026.3.28)

BlueBubbles 配置排障:OpenClaw 可能写入无效键,并在下次重启时自我卡死(v2026.3.28)

OpenClaw News 编辑部

OpenClaw News 编辑部

一条新的 BlueBubbles 故障报告表明:OpenClaw 2026.3.28 可能把一次原本正常的重启,变成一次“自己把自己锁死”的启动事故。

危险点不只是“配置非法”,而是 gateway 看起来会先把问题字段自己写进 openclaw.json,然后下一次启动时又拒绝承认这个字段。

来源:

运维侧实际会看到什么

当前报告描述的故障链路是这样的:

  1. BlueBubbles 按常规必填项配置完成。
  2. Gateway 第一次可以正常启动。
  3. 启动过程中或启动后,openclaw.json 里多出:
"enrichGroupParticipantsFromContacts": true
  1. 下一次重启时,gateway 又把这个键报成 unrecognized key。
  2. 不手动删掉该字段,服务就无法恢复正常启动。

所以这个问题的本质不是“用户填错了配置”,而是更像系统把自己写进了一个无效状态。

为什么这是高优先级故障

这个问题比普通的配置校验失败更麻烦,原因有三点。

1)系统看起来在制造自己的坏配置

如果用户根本没有手工加过这个键,那排障第一步就变难了:你不能再默认“重启是安全动作”。

2)重启本身会变成故障触发点

同一份配置第一次启动没问题,第二次启动却能直接把服务打挂。这会让日常维护、升级、验证都变得高风险。

3)自动拉起机制会放大伤害

如果宿主机配置了自动重启,gateway 可能反复进入 crash loop,而不是干脆停住并给出一次明确错误。

怎么确认你命中的是同一类问题

如果下面几条同时成立,你大概率遇到的是同一类故障:

  • OpenClaw 版本接近 2026.3.28
  • 使用了 BlueBubbles 渠道
  • 初始配置里本来没有这个额外字段
  • 第一次成功启动后,openclaw.json 里出现了 enrichGroupParticipantsFromContacts
  • 下一次重启报错指向这个字段,提示它是未知键或不被识别

一个务实的确认顺序:

  1. 先备份 ~/.openclaw/openclaw.json。
  2. 检查 BlueBubbles 配置块里是否出现了 enrichGroupParticipantsFromContacts。
  3. 对比文件修改时间与上一次 gateway 启动时间。
  4. 再做一次重启,并记录完整报错。
  5. 只删除这一个字段,再测试是否恢复启动。

如果删掉这一个键之后,服务马上能恢复起来,那就与当前 issue 非常接近。

这不是什么问题

不要把它和下面几类情况混在一起:

  • 用户自己手工写了一个不受支持的 BlueBubbles 配置项
  • JSON 语法本身被改坏了
  • 安装包缺了整个 BlueBubbles schema
  • gateway 在跑到 BlueBubbles 校验前就已经先崩了

这次报告更窄,也更危险:同一个 gateway 先写入该字段,后续又不接受该字段。

可能的根因边界

从 issue 描述看,问题很像是一次 schema round-trip 不一致:

  • 某个解析路径给 enrichGroupParticipantsFromContacts 设置了默认值
  • 解析后的结果被回写到磁盘
  • 之后另一条更严格的校验路径又把这个持久化字段当成未知键

说白了,就是 “解析时默认值” 和 “落盘后的严格校验” 之间不一致。

这也就解释了为什么:第一次能启动,第二次却可能直接起不来。

上游修复前,先怎么止血

1)把“重启”当成一次验证动作,而不是例行动作

只要 BlueBubbles 还在启用,重启后就应立即确认 gateway 是否真的健康恢复,而不是默认它已经回来。

2)保留一份干净可回滚的配置备份

在配置可能被系统自己漂移的前提下,回滚速度比“优雅修复”更重要。

3)如果命中循环,只删问题字段,不做大手术

如果日志明确指向 enrichGroupParticipantsFromContacts,那就先做最小可逆编辑。事故处理中最怕顺手改多处,最后定位边界更模糊。

4)排障阶段不要让自动重启无限狂拉

如果进程管理器不停瞬间重启一个坏配置,你既难抓到关键日志,也难确认故障是不是稳定复现。

最短运维检查清单

如果你只想走最短路径:

  1. 打开 openclaw.json 里的 channels.bluebubbles
  2. 查是否存在 enrichGroupParticipantsFromContacts
  3. 如果重启失败且报错指向它,先临时删掉它
  4. 再重启一次并确认服务恢复
  5. 保存日志与配置 diff,作为上游 issue 证据

如果你要补充 issue,最好带什么

想让维护者更快确认问题,建议带上:

  • 精确 OpenClaw 版本
  • 安装方式(npm、源码构建等)
  • 操作系统与架构
  • 第一次启动前该字段是否不存在
  • gateway 是否在启动过程中把它写进了配置
  • 下一次重启的完整校验报错
  • 删除该字段后是否立刻恢复启动

比起一句“BlueBubbles 重启后坏了”,这些证据价值高得多。

值班时的快速决策树

如果你正在值班,想在几分钟内判断这是不是同一类事故,可以直接按这个顺序分流:

  1. 第一次启动正常,第二次重启才挂
    • 优先怀疑配置 round-trip 或 schema 注入,不要先把锅甩给网络或 BlueBubbles 连通性。
    • 先检查 channels.bluebubbles.enrichGroupParticipantsFromContacts 是否被自动写回。
  2. 第一次启动就已经失败
    • 这更像原始配置、JSON 语法或安装本身的问题,不要直接套用这篇的结论。
  3. 删掉该字段后可以立刻恢复
    • 先把它当成最小止血动作,同时保留坏配置快照和报错日志,再决定是否继续深挖。

宣布事故结束前,还要补验什么

服务恢复启动后,不要只看“进程起来了”,至少还要补验这四件事:

  1. 再做一次干净的第二次重启,确认不会再次把坏字段写回配置;
  2. openclaw.json 在恢复后保持稳定,没有重新出现 enrichGroupParticipantsFromContacts;
  3. 至少一条真实 BlueBubbles 关键链路可以正常通过,尤其是群组或参与者相关路径;
  4. 事故记录里已经保存坏配置、恢复前后 diff 和完整校验报错。

第二次重启前,先留下这 4 个证据

这个故障的关键不是“第一次能不能启动”,而是 BlueBubbles 配置被写回后,第二次启动是否会被 schema 卡死。重启前先保存四类证据:

  1. 原始 BlueBubbles 配置片段:尤其是 enrichGroupParticipantsFromContacts 是否本来不存在、为 undefined,还是被写成了默认值。
  2. 第一次启动后的配置 diff:确认 gateway 或插件是否把缺省字段写回了本地配置。
  3. 第二次启动的完整校验错误:保留字段路径、期望类型、实际值,不要只截取最后一行。
  4. 绕过后的对照结果:删除该字段或回滚配置后,记录 gateway 是否能恢复启动。

这 4 个证据能把问题从“BlueBubbles 不能用”收敛为“默认值注入和 zod 校验不一致”。对后续 issue、补丁或回滚判断都更有价值。

如果你是从 ACPX、Feishu /stop 或 gateway 重启入口来的

这些入口都容易被归成“gateway 又不稳定了”,但 BlueBubbles 这类故障的核心不是 session 生命周期,也不是 interrupt 没落到执行层,而是配置回写后让下一次启动直接失败。先按这个顺序拆开:

  • Claude ACP 一开始就没有可用 session ID:优先看 ACPX silent session 排障,那是创建入口失败。
  • Feishu 线程继续跑,/stop 或 /new 停不下来:优先看 Feishu /stop 排障,那是控制命令没有中断执行层。
  • gateway 崩溃重启后 session 没恢复:优先看 orphaned sessions 恢复页,那是运行时恢复链路问题。
  • 第一次启动正常,第二次重启因 enrichGroupParticipantsFromContacts 校验失败:再按本文保存坏配置、删除该键并做第二次重启复验。

这段分流可以把“session 没建出来”“任务停不下来”“重启后会话没恢复”和“BlueBubbles 配置被污染导致 gateway 起不来”拆开,减少错误止血动作,也让搜索入口更快进入正确排障路径。

下一步优先覆盖的精确 BlueBubbles gateway 搜索词

当读者从 BlueBubbles 或 Zod default 的窄搜索进入这里,重点是判断问题属于 schema、联系人 enrichment,还是 gateway 打包生成层。

  • BlueBubbles gateway injects Zod default enrichGroupParticipantsFromContacts:先检查生成出来的 gateway schema 是否加入了真实 BlueBubbles action 并不需要的 default。
  • OpenClaw BlueBubbles enrichGroupParticipantsFromContacts default bug:不要先怀疑 contacts sync,先对比 action input schema 和实际传进 plugin 的 payload。
  • fix BlueBubbles gateway Zod default group participants:移除或覆盖生成出来的 default 后,用同一个 group chat enrichment 调用做 smoke test。

从 BlueBubbles 错误流量转成最小排查路径

如果你是因为 enrichGroupParticipantsFromContacts、Zod default 或 BlueBubbles gateway 相关错误搜到这里,先不要直接改联系人同步逻辑。更稳的顺序是先确认入参形状、插件层默认值、Gateway 转发前后的 payload 差异,再判断是不是应该在 OpenClaw 侧补 schema guard。

最小排查路径可以压成三步:保留一次失败 payload,复跑同一条 BlueBubbles 事件,比较注入 default 前后的字段变化。只有当错误能稳定复现,且 default 注入确实改变了联系人 enrich 行为时,再把它升级成插件兼容性修复,而不是把它当成普通网络或账号问题。

相关阅读

FAQ:运维最先要做的三个判断

BlueBubbles 已在生产跑着,这种情况下是不是先别重启?

不是完全不能重启,而是别再把重启当成无害例行动作。上游还没把这类问题彻底收口前,每次重启后都要立刻做健康核验,尽早发现配置漂移,不要等它演变成长时间中断。

如果删掉这个键就恢复了,事故是不是就算结束?

只能算服务恢复,不算事故闭环。你还需要保留坏掉时的配置、校验报错和版本/安装方式信息,否则下一个维护窗口很可能再次复现,却没有更强证据帮助上游定位。

交接给值班同事时,最该强调哪一句?

直接写清楚这一句:BlueBubbles 重启后挂掉时,先检查 channels.bluebubbles.enrichGroupParticipantsFromContacts,再决定要不要动其他配置。这个判断点最能缩短恢复时间,也最能避免事故中顺手误改太多。

怎样快速判断这是不是 schema 注入,而不是联系人数据本身有问题,或一次普通的 BlueBubbles 故障?

别靠猜,先看故障顺序。

如果下面这些信号同时出现,更像是 schema 注入:

  • 第一次启动是成功的,说明最初的 BlueBubbles 连通性并没有先坏掉
  • 配置文件里出现了 enrichGroupParticipantsFromContacts,而操作者并没有主动加它
  • 下一次重启时,报错刚好指向这个字段的配置校验失败
  • 只删掉这一项,服务就能立刻恢复启动

这种模式更像配置 round-trip 出了问题,而不像联系人同步错误、群成员数据异常,或普通链路中断。

修完或绕过 BlueBubbles 群发链路问题后,最该先核对什么?

别看到“进程起来了”就停,最好立刻补一轮短检查:

  1. gateway 在一次干净的第二次重启后仍能正常启动,不会再次写回坏字段
  2. openclaw.json 保持稳定,不会重新冒出 enrichGroupParticipantsFromContacts
  3. 至少一条真实 BlueBubbles 链路,尤其是群发或参与者相关路径,表现正常
  4. 进程管理器已经不再围绕旧 crash-restart 状态反复拉起
  5. 事故记录里已经保存坏配置快照和完整校验报错

这里最关键的是“第二次重启”检查,因为这个问题最危险的地方,本来就是第一次能起,第二次才挂。

相关阅读

为什么这题值得单独发,而不是并进旧文

这篇不应并入我们之前那篇关于 restart 的文章。

之前那篇关注的是 crash/restart 后 session 无法恢复。 这一次关注的是 配置被回写后与校验器不一致,导致 gateway 根本启动不起来。

故障面完全不同,搜索意图也不同。

值班 Runbook:10 分钟内决定删键、回滚还是升级

如果这篇是搜索进来的第一落点,值班者通常不是想读完整背景,而是要在 10 分钟内恢复 gateway。可以按这张短 runbook 走:

  1. 先冻结现场:复制当前 openclaw.json、最近一次成功启动后的 diff、第二次启动的 zod 校验错误。
  2. 只做最小绕过:如果错误只指向 channels.bluebubbles.enrichGroupParticipantsFromContacts,先删除这个键,不要顺手改其他 BlueBubbles 配置。
  3. 做第二次重启复验:恢复后立刻再重启一次,确认坏字段不会被重新写回。
  4. 决定是否回滚版本:如果字段反复被写回,或删除后仍无法启动,再把范围升级到插件版本、gateway 版本和最近配置迁移。
  5. 补 issue 证据:把坏配置、恢复 diff、版本、安装方式和两次启动日志一起贴给维护者。

这段 runbook 的目标是防止把一个配置 round-trip 问题扩大成全量配置重写,也让高意图读者知道什么时候该止血,什么时候该升级。

复盘后,把这 5 条写进重启 SOP

恢复 gateway 只是第一步。为了让下一次维护窗口不再靠临场记忆排障,建议把这 5 条直接写进 BlueBubbles 重启 SOP:

  1. 重启前先备份配置:保存 openclaw.json 和 BlueBubbles 相关片段,不要只依赖进程日志。
  2. 重启后立刻 diff 配置:确认是否新增、删除或改写了 enrichGroupParticipantsFromContacts。
  3. 必须做第二次重启:第一次成功不算通过,第二次仍能启动才算通过。
  4. 把群发链路列为验收项:至少跑一条真实群组或参与者相关路径,避免只看 health endpoint。
  5. 定义升级条件:只要坏字段再次被写回、删除后仍失败,或 schema 报错扩散到其他字段,就停止本地猜测,升级给维护者。

这段 SOP 的价值在于把“BlueBubbles 又挂了”变成一个可复现、可交接、可升级的维护流程,也更符合从 GA4 进来的高意图运维搜索。

搜索进来的读者,先别忽略这三个相似故障

从 GA4 看,这个入口已经有持续访问。为了让读者更快确认自己是不是同一类问题,落地页需要把相似故障提前拆开:

  1. 配置字段被写回后启动失败:本文场景,关键词通常是 enrichGroupParticipantsFromContacts、zod validation、second restart。
  2. BlueBubbles API 本身连不上:更可能是服务地址、token、网络或手机端桥接问题,先不要删 OpenClaw 配置字段。
  3. gateway 起得来但群发失败:先看真实发送日志和参与者解析结果,不要只根据启动日志判断。

如果你是值班同事,最省时间的判断方式是:先找第二次启动的 schema 错误,再看这个字段是不是由系统自动写回。只有这两点同时成立,才优先按本文的删键、复验、升级路径处理。

删 BlueBubbles 配置前,先排除三个误判

在删除自动生成的 BlueBubbles 字段前,先排除三个误判:联系人字段被人工改过、手机端 companion 缓存还是旧状态、gateway 进程仍在读取旧配置快照。至少留下问题键名、进程启动时间、一次干净重启结果,再把它归类为 OpenClaw 注入无效字段回归。

这对搜索入口很关键,因为恢复动作完全不同。schema 注入回归应该删除无效生成字段,并阻止写入方再次生成;BlueBubbles 缓存陈旧则应该先刷新消息侧状态,而不是直接重写 OpenClaw gateway 配置。

来源

© 2025 OpenClawNews.org
保留所有权利。
这是一个独立的资讯网站。与 OpenClaw 官方没有任何关联、认可或连接。OpenClaw 是其各自所有者的商标。
加入等候名单:

OC NEWS