OpenClaw 多节点运维:Token 持久化、Gateway 冲突排障

2026年3月20日 | Ruichen Zhou | 约 9 分钟阅读

系列文章:本文是「OpenClaw + 基础设施」系列的第 3 篇。

  1. OpenClaw (Clawdbot) 多端部署:Gateway + Tailscale Serve + Node 配对
  2. OpenClaw Cron 监控实战:QQ Bot 通知链路排障与 Prompt 调优
  3. OpenClaw 多节点运维:Token 持久化、Gateway 冲突排障(本文)
  4. Tailscale + ZeroTier + FRP:11 台跨国设备的三层 Overlay 分工
  5. 1C1G VPS 服务编排:MetAPI 网关 + Nanobot + DERP 的资源取舍

本文记录 OpenClaw 多节点部署后的运维排障,重点包括 Gateway token 持久化、token_mismatch 导致的 Node 集体掉线、同机双 Gateway 冲突,以及 Clash Verge 截断 Tailscale 流量。当前拓扑为 Gateway Mac mini + Node Linux 工作站 + VPS;运行环境由 OpenClaw、ZeroClaw 和 Tailscale 组成,其中 Mac mini 同时也是 AI 助手 Jarvis 的核心入口。

当前需要稳定的运行态要素主要有四项:

  • 谁负责生成和持久化 token
  • 同一台机器上是否只保留一个 Gateway
  • Tailscale 流量是否被本机代理改道
  • 记忆文件中的拓扑描述是否仍然和真实环境一致

拓扑长什么样

我现在这套 OpenClaw 拓扑很简单:

  • Mac mini,Tailscale IP 是 100.100.1.3,跑 OpenClaw Gateway,也是 AI 助手 Jarvis 的核心入口
  • Linux 工作站,100.100.1.5,一台 Dell Precision 7920,作为主要 Node
  • 香港 1C1G VPS,跑 ZeroClaw,也一度接成 OpenClaw 的 Node
  • 所有设备通过 Tailscale 在同一个 Tailnet 里通信

之前还有一台 Vision,IP 是 100.100.1.6。后来这台机器退役了,但 OpenClaw 和 ZeroClaw 的记忆 markdown 里还留着它,后面专门清了一次。

Node 集体掉线

Gateway 重启后,Linux 工作站和 VPS 两台 Node 同时离线。这个现象很容易先怀疑 Tailscale 或 VPS 本身,但两个 Node 在 Gateway 重启后同时失联,时间点过于一致,更像是 Gateway 侧的统一问题,而不是链路抖动。

翻 Gateway 日志以后,关键信息其实很直接:

reason=token_mismatch
unauthorized: gateway token mismatch (provide gateway auth token)

这里的问题不在链路,而在鉴权。表面上看像是 Node 一起掉线,实际上是 Gateway 重启后重新生成了 token,而 Node 端仍然拿着旧 token,因此全部认证失败。

这类故障很容易误判成“Node 自己挂了”或者“Tailnet 不稳定”。其实都不是。它只是所有 Node 都在很一致地拿着过期凭证连接新的 Gateway。

一台机器两个 Gateway

Mac mini 上随后又出现了另一个问题:OpenClaw 一直报告检测到了别的 gateway-like service。关键日志如下:

Other gateway-like services detected (best effort):
- ai.openclaw.mac (user, plist: /Users/ruichen/Library/LaunchAgents/ai.openclaw.mac.plist)
Recommendation: run a single gateway per machine for most setups.

排查后确认,/Applications/OpenClaw.app 不只是桌面管理界面,它还会自动注册一个 LaunchAgent。结果同一台机器上同时存在两个 Gateway:

  • 我手动安装和管理的 ai.openclaw.gateway
  • OpenClaw.app 自己带起来的 ai.openclaw.mac

两个实例都会尝试接管端口、状态和服务生命周期,最终表现为端口和状态竞争、日志反复告警,以及 Gateway 行为不稳定。

这类问题的处理关键不是判断“哪个进程更对”,而是只保留一个监管者。我的处理方式是保留手动配置的 Gateway,把桌面应用自动注册出来的 LaunchAgent 清掉。对大多数个人部署来说,一台机器上跑一个 Gateway 已经够了。

Tailscale 流量被代理截断

另一次故障的表象是 Linux 工作站连不到香港 VPS。因为对端在香港,第一反应很容易放在出口质量或者 VPS 本身状态上;但继续测试后可以很快排除这一点,因为别的设备可以访问,只有这台 Linux 工作站不通,说明问题只在本机。

最后定位到 Clash Verge。它接管了本机流量,但规则里没有对白名单放行 Tailscale 的 overlay 流量,结果发往 Tailnet 的连接也被代理截断了。表面现象是“Linux 到香港 VPS 不通”,真实原因却是“本机代理把内网叠加层一起拦了”。

把 Tailscale 流量加入 Clash Verge 白名单之后,连接立刻恢复。这件事的经验很直接:只要机器上跑了透明代理,排查 Tailnet 时就不能只看 tailscale status,还得看流量有没有在本机被改道。

Token 怎么固定

为了避免每次重启 Gateway 都让 Node 配置失效,后面需要把 Gateway token 固定下来。

这一步一开始也容易走错。我先在 shell 里试了:

OPENCLAW_GATEWAY_TOKEN=
openclaw config get gateway.auth.token

结果当然没用。前一行只是把当前 shell 变量设空,不等于持久化配置;后一行返回的又是 __OPENCLAW_REDACTED__,根本看不到明文。这里需要区分两件事:一个是“当前 token 是什么”,另一个是“配置里怎么引用它”。

后来正确的做法是:

  1. 先用 openclaw dashboard --no-open 拿到当前 Gateway URL,从里面的 #token= 取出明文 token
  2. 把这个 token 写进 ~/.openclaw/.env
  3. 在 Gateway 侧把 gateway.auth.token 设成 ${OPENCLAW_GATEWAY_TOKEN},让服务重启后继续从环境变量读取
  4. 在各台 Node 侧也统一写同一个 OPENCLAW_GATEWAY_TOKEN,然后重启 Node 服务

这样之后,token 的唯一来源就收敛到了 .env,而不是每次由 Gateway 启动时临时生成。config get 继续返回 redacted 其实没问题,因为那只是出于安全考虑不显示明文,不代表配置没生效。固定完之后,dashboard 也不一定再把 token 直接拼进 URL,这反而是正常现象。

清理废弃节点的记忆

这个问题不直接导致服务故障,但会持续污染判断。Vision 这台设备早就下线了,IP 是 100.100.1.6,可 OpenClaw 和 ZeroClaw 的记忆 markdown 里还留着它的设备信息。

后果是 AI 助手在回答拓扑、节点数量和设备分工时,会把一台已经不存在的机器也算进去。系统本身没坏,但它对系统的“认知”已经过时了。

我最后做了两件事:

  • 把活跃工作区里的 Vision 相关记忆清掉
  • 单独整理一个 TOPOLOGY.md 作为拓扑的单一事实源,别再让 USER.mdMEMORY.md、维护日志各写一套

这种清理看起来不像传统运维,但对 AI 驱动的工具链来说其实很必要。过时的记忆文件,本质上也是一种配置漂移。

多节点 OpenClaw 的稳定性,核心取决于单一 Gateway、可持久化的 token,以及不会截断 Tailnet 的本机代理。把这三项固定下来之后,Gateway 重启、Node 重连和跨节点访问都会回到可预测状态。

评论