跳转至

阶段十一:AgentMeshOS 网络可替换、告警治理与节点纳管

计划 ID:phase-11-requirement-review

阶段状态:已冻结归档

计划状态:已完成

当前工作包:无;P11 已冻结归档

冻结归档说明(2026-10-01): 本页保留 P11 的历史过程和现场证据,不再代表当前计划,也不再承接任何新任务。ThreeDogs、DERP、Claude、微信 ClawBot 等旧事项已由用户确认暂停、收尾、归档和冻结;真实微信往返不再阻塞 P11 或 102。与 102 相关的后续工作统一进入 P12,完整归档见 completed-phase-11-agentmeshos-network-governance.md。

📌 结论与根因

本阶段不是重新设计 AgentMeshOS,而是在 P10 已完成的稳定边缘身份基础上,收口三类会反复引发故障的漂移源:硬编码公网地址、告警投递目标分散、控制台网络态势只看一部分链路。依据是 P10 完成归档、docs/plans/state.json、101 告警脚本现场配置和 2026-09-26 控制台代码复核。影响是后续更换 MM 公网 IP 或边缘主机时,只需维护 edge.yohan.fun 的权威 A/AAAA,业务域名继续跟随 CNAME;控制面、SSH、DERP、遥测和告警各自读取受控来源或执行明确失败关闭。

“金丝雀”在这里指早期预警探针:定期用全新冷连接尝试关键网络入口,连续失败达到阈值后告警,恢复后回报恢复。名称来自矿井用金丝雀先于人员感知危险气体;它不替代业务监控,也不把既有长连接的成功当成整个网络健康。

rev.2 的现场增量是:dog-public 已完成 edge-gateway 画像纳管,Tailnet、Nomad Client、Docker 和 9100 遥测均在线;ThreeDogs 正式迁移仍未执行,必须等待 72 小时观察和单独切换窗口。依据是 Bridge 审计 00d216b3edb6271729848fe41a6005cd、Nomad 节点 1e9b8e89-481e-d8dd-ae54-9b55b7c9bda3 和双路径 SSH 回读。

🧾 计划状态

项目 当前值 依据
当前阶段 P12 docs/plans/state.json
阶段状态 已冻结归档 用户明确确认 P11 收尾,ThreeDogs、DERP、Claude、微信暂停归档
计划状态 已完成 P11 不再承接新工作,未完成事项冻结或转入 P12
当前工作包 无 P11 已归档,不再执行 P11-6
权威记录 P11 完成归档 本页保留历史过程和证据

P10 已完成并归档,本阶段只做兼容性复核,不重新打开 P10。P11 继续沿用 Headscale + Tailscale、Nomad + Docker、FastAPI、SQLite、Vanilla JavaScript、GitHub Actions 和自托管 Runner,不新增第二调度器、第二执行网关或前端框架。

🧩 实施工作包

P11-0 文档、网络与计划基线复核

目标:把当前有效配置、历史事实、关闭项和残余风险分类,原地形成 P11 rev.1。

实施范围:

  • 回读 docs/**、计划导航、state.json、DNS、端口、SSH、网络拓扑和服务映射。
  • 复核 docs/plans/cloudcli-public-entry.md、.playwright-mcp/ 和 CloudCLI 补丁文件的归属;仍有效的纳入正式提交,无效的明确标记。
  • 保持 Mac mini 登录公钥作为未来可能恢复的管理员身份,本轮不删除。
  • P10 剩余验收按现状归入 P11,不假称 P10 仍未关闭。
  • 文档按“当前事实、历史事实、关闭项、未决项”分类,并同步计划看板、架构路线图和文档索引。

验收:计划、架构状态、导航、文档清单和 state.json 一致;旧 IP 只允许存在于带“历史值,不得用于恢复”标记的迁移记录中。

P11-1 拓扑语义与告警分级

目标:修正“逻辑边缘身份”和“当前承载主机”混淆,避免单区域 DERP 直接把整网标成 critical。

实施范围:

  • edge 是逻辑边缘身份,不是 MM 主机名。唯一权威地址继续使用 edge.yohan.fun,不使用绑定 MM 的 mm-edge 名称。
  • single_region 只显示风险,不触发整网 critical;真实 DERP 连接失败才升级告警。
  • 拓扑节点以 Tailscale 在线节点为动态发现源;登记表只补稳定别名、角色和层级,未知在线节点进入“待分类节点”,不在代码里新增固定数组。
  • OS 主机名与 Tailnet 节点名分开处理:Linux 节点优先从 9100/metrics 的 node_uname_info{nodename=...} 自动读取,主机名尚未上报时显示“未上报”,不得把 Tailnet 名称冒充 OS 主机名。
  • 管理节点分别显示 Tailnet 路径与公网 SSH 路径;公网 SSH 只做 TCP 可达性探测,不执行登录、不读取私钥内容。
  • 101 与 Home 的节点路径在 Full Cone 后在现场重新复测,包含 Home;不沿用旧的 DERP 结论。
  • Home 的 SSH 默认交互改为 PowerShell;路由器继续使用已经验证的 C 固件,不再比较 A、B、E。
  • DDNS、vlmcsd 等路由器附加能力只做用途和适用性评估,不在本阶段改动。

验收:拓扑快照和 Gateway 均携带受控 risk_level;MM 不再因 single_region 被误报为黄色;真实 DERP 故障仍可告警。

P11-2 网络态势整页交互

目标:在首页保留摘要,同时提供可独立操作的整页拓扑。

实施范围:

  • 新增 #topology 整页视图,首页只保留状态摘要和入口。
  • 节点可独立拖动,连线实时跟随;布局写入浏览器本地键 agentmeshos.topology.layout.v1,不进入服务端持久化。
  • 支持自动布局恢复;节点布局按层分行并在超过五行时增加列,同一节点的多条链路使用固定分道,断链在线上标注“断链 · 路径类型”,移动端保持整页查看。
  • edge 节点明确显示为逻辑公网入口,圆形标记使用 GW 而不是容易被误认为主机缩写的 ED;业务断链的红色连线表示“逻辑边缘入口到实际后端”的探测失败,不代表标题中的两个主机发生了物理直连故障。
  • www.threedogs.vip 的正式探测目标是当前实际承接流量的 dog-public,不能再固定显示为 rr;状态为红色时表示该公网业务入口到实际后端失败,与 Tailnet 管理链路是否正常分开判断。
  • 保留筛选、缩放、详情、数据流动画和 reduced-motion 行为。
  • 数据继续复用 P10 只读链路快照,只扩展状态语义、风险级别和显示字段,不新增第二套调度器或执行网关。

2026-09-28 的生产基线曾回读为 8 个节点、17 条链路、25 项健康、0 项降级、0 项断链、0 项未知;edge/GW 为 healthy。RR 到 dog-public、DD、MM 等节点之间,以及同一对节点内的多条业务路径,已按固定分道曲率绘制,不再共享同一条 SVG 路径。最终复核时,RR → 101 Tailnet 又走回 DERP(agentmeshos-mm),因此当前是 23 项 healthy、2 项 degraded;这两项分别来自该链路和 101 节点,不能反过来把 GW 公网入口误标成红色。依据是 RR /run/agentmeshos/network-topology/topology-v1.json、生产 Console 容器 sha-251b005 和 network-topology-browser-contract.cjs 的浏览器契约。

最终发布复核由提交 14ea30bcbe882415fcf575015a12d95ab65bf21d 覆盖:Repository Guardrails Run 36356054184 成功,Docs Run 36356054205 的构建、不可变 Release 包、RR 部署和健康验证全部成功;RR 容器回读为 ghcr.io/agentmeshos/agentmeshos-docs:sha-14ea30bcbe882415fcf575015a12d95ab65bf21d 且 healthy,公网 Docs 健康端点返回 HTTP 200。

验收:在 1440x900 和 390x844 下验证拖动、边界限制、刷新后位置恢复、自动布局重置、连线跟随和横向无溢出。

P11-3 微信 ClawBot

目标:在 RR 安装满足版本要求的 Node.js、OpenClaw 宿主和腾讯微信插件,并让状态可验证。

实施范围:

  • 不能只安装插件;宿主、依赖、插件和账号绑定分别验证。
  • 状态生成器读取 openclaw channels status --probe --json,区分 not_installed、unbound、connected、probe_failed 和 stale。
  • Provider 页展示依赖、绑定状态、最近收发、错误和配置教程。
  • 控制台提供管理员专属绑定页:二维码只作为短期内存会话返回,页面轮询绑定状态;二维码、Token、Cookie、登录凭据和消息正文不得写入仓库、日志、普通审计或持久化快照。
  • 绑定完成后,状态生成器重新读取 openclaw channels status --probe --json,页面自动切到 connected;失败或过期时显示明确状态并允许重新生成。
  • 不把 systemd timer active 误写成微信已绑定。

现场结果:

  • RR 已安装 Node v22.23.0、OpenClaw 2026.7.35 (aa94808) 和腾讯微信插件 @tencent-weixin/openclaw-weixin@2.4.9;openclaw config validate 与插件加载检查通过,Gateway 只监听 127.0.0.1:18789。
  • 当前宿主 RPC web.login.start/wait 因插件未声明 gatewayMethods 返回 INVALID_REQUEST。实现不修改官方插件或宿主源码,改用固定官方 CLI 命令 openclaw --log-level silent channels login --channel openclaw-weixin --account <binding_id>。
  • System Operations Bridge 新增固定来源、HMAC 校验的内存绑定接口;PTY reader 只提取并渲染微信二维码,返回 data:image/png;base64,不返回登录 URL、Cookie、Token 或原始日志。
  • Runtime 新增管理员专属 /boss/v1/clawbot/binding/start、状态和取消路由;Console Provider 页新增绑定入口、二维码短期展示、轮询、取消和绑定成功后的状态回读。
  • 状态生成器已改为先读取 openclaw plugins list --json 的 status=loaded,再读取 channels.openclaw-weixin.configured;这修正了全局插件安装不在 plugins.installs 时被误报为 weixin_plugin_not_installed 的假阴性。负向测试同时覆盖插件缺失和插件探针失败。
  • OpenClaw 默认模型原本为不可用的 openai/gpt-5.5,Gateway 日志返回 ProviderAuthError: No API key found for provider "openai"。根因不是微信插件,而是 ClawBot 没有可用的模型 Provider;已改为官方自定义 OpenAI-compatible Provider agentmeshos,Base URL 为 http://127.0.0.1:39180/v1。Boss Combo 仍保留 agentmeshos-free-quality-first,但该 Combo 当前会命中 Pollinations 余额错误;ClawBot 默认模型改用连续三次真实 smoke 均返回 MODEL_ROUTE_OK 的 Worker Combo agentmeshos/agentmeshos-free-capacity-pool。
  • 普通模型 Key 原先只放行两个 Combo 名称,OmniRoute 会逐个检查 Combo 内部目标模型权限,导致模型路径被预先跳过。部署脚本现根据 Boss/Worker Combo 的实际目标模型自动生成受控白名单;RR 已应用 194 个去重目标模型,Combo 调用返回 HTTP 200,非法模型仍返回 403。
  • 已新增并强化 scripts/maintenance/agentmeshos-clawbot-model-provider.sh 和 scripts/maintenance/tests/clawbot-model-provider-test.sh,将 OpenClaw 自定义 Provider、默认模型、SecretRef、loopback-only Gateway 和真实正文 smoke 纳入可重复部署与回退。旧 smoke 只检查 .ok=true,会把 Pollinations 余额错误正文判为成功;新 smoke 要求正文精确为 MODEL_ROUTE_OK。
  • 绑定链路已在 RR 真实执行到 waiting_scan,确认二维码在内存中生成;随后执行取消,状态返回 cancelled、错误码为 binding_cancelled。该验证没有扫码、没有保存二维码,也没有输出二维码内容。
  • 生产部署已完成:API Gateway 工作流 36266659853 的 deploy-production 成功,Docs Site 工作流 36266659808 与 36266727087 的 deploy-production 也均成功;RR 容器镜像分别回读为 ghcr.io/agentmeshos/agentmeshos-api-gateway:sha-76aee455bd50366112a38f134f85db00f089498f 和 ghcr.io/agentmeshos/agentmeshos-docs:sha-cf6c69f85c51c21a7a3492437b7008d37d13bd66。
  • 生产回读进一步确认 /usr/local/lib/agentmeshos/agentmeshos-clawbot-model-provider.sh health 与 smoke 均通过;RR 当前脚本 SHA256 为 ef436359a20be8c3427a9a40420fb813e0de409be402ef9993a0144dd3844372,状态生成器 SHA256 为 a5cf4476fb524ac296b34ec0ff37fb1d2760fea59235315217f2fc17348ceb2b,状态快照为 state=connected、binding_status=bound、last_error_code=null。
  • 旧版状态生成器误报 vendor_plugin_not_installed 的根因是只读取 plugins.installs,而全局 npm 插件不写在该字段;修正版先读取 openclaw plugins list --json 的 loaded,再读取 channels status --probe --json,生产已回读为 connected/bound。
  • 受控重启恢复已于 2026-09-28 05:58:59 CST 完成:openclaw-gateway.service 在 systemctl --user restart 后仍为 enabled/active/running,重启后的状态生成器返回 state=connected、binding_status=bound、last_error_code=null,模型 smoke 返回 clawbot_model_provider_smoke=pass;重启前后生产脚本 SHA256 分别为 a5cf4476fb524ac296b34ec0ff37fb1d2760fea59235315217f2fc17348ceb2b 和 ef436359a20be8c3427a9a40420fb813e0de409be402ef9993a0144dd3844372,未发生漂移。
  • 当前剩余工作只有一类需要外部动作:用微信发送一次真实消息并确认模型回复写入 last_received_at / last_sent_at;在完成该真实往返前不得宣称 P11-3 或 P11 已完成。

验收:覆盖宿主缺失、Node 版本不满足、插件缺失、未扫码、探针失败、绑定成功和重启恢复测试。

P11-3A RR Gemini 自建服务退场与官方边界复位

目标:彻底移除为 Gemini Web 图片能力自行创建的常驻 Chrome、出口代理和服务,恢复 OmniRoute 官方 Provider/VNC 路径,并保留控制台现有连接、Combo 和 API Key 配置不变。

现场根因:

  • 2026-09-27 04:14:54 CST,RR 发生全局 OOM;当时 1 分钟负载约 68、内存 2.8 GiB / 3.8 GiB、Swap 3.4 GiB / 6.0 GiB,OmniRoute 被内核杀死并自动重启。
  • 两个 Chrome 同时使用 /root/.gemini-login-profile:历史自建 transient Chrome 已运行约 3 天,累计 CPU 约 1 天 1 小时、峰值内存约 1.8 GiB;另一个自建 gemini-web-session.service 又尝试启动第二个实例,日志出现 profile 锁和 9333 端口冲突。
  • 控制台、API 和 OmniRoute 状态超时是 RR 全局资源耗尽后的结果,不是单独的前端轮询缺陷。
  • 更深层根因是 Gemini Web 只用官方 Provider 时不需要常驻 Chrome;为绕过官方 headless 会话限制而增加的自建 profile、CDP、SOCKS/Privoxy 和 systemd 服务引入了重复生命周期,违反“不得自己再写一套”的边界。

修复与退场:

  • 删除 RR 自建 gemini-web-session.service、gemini-egress-mm.service、gemini-egress-dd.service、Gemini guard、VNC/转发 transient 单元、gemini-web-egress/vnc-gemini-egress drop-in、自建 Privoxy 配置和独立 profile。
  • 撤销 edge endpoint renderer 生成 edge-ssh-socks.sh、gemini-egress-mm.service 的代码路径;残留渲染文件会在下一次官方端点刷新时被移除,并在 --check 中视为漂移。
  • 使用 Omni 官方 /api/vnc-session/{connectionId}/start 触发官方容器回收,再通过官方 DELETE 结束临时会话;最终 sessions=0 且不存在 com.omniroute.browser-login=true 容器。
  • RR 当前仍为官方 omniroute@3.8.50,未改源码、未重编译、未替换包文件;控制台 Provider、连接、Combo、API Key 和代理注册表数据保持不变。

验收:

  • RR 不存在 gemini-web-session、gemini-egress、glogin 等自定义单元或进程,9333、11080、8118 无监听,/root/.gemini-login-profile 不在活动路径。
  • Omni /healthz 为 ok,官方 VNC 管理 API 可读,清理后 sessions=0 且无官方浏览器登录容器。
  • 后续图片或搜索只能通过 Omni 官方 Provider、控制台和官方 API 处理;若官方能力不足,明确记录为上游能力缺口,不以自建服务补齐。

P11-4 中心告警路由

目标:所有 101 系统告警发到当前协调对话线程,不再各自硬编码生产线程 ID。

实施范围:

  • 增加 root-only 配置 /root/.codex/state/codex-alert-route.json,字段固定为 version、coordinator_thread_id、updated_at,当前值指向 01a0d8a7-811a-7162-a902-9f80c736dc44。
  • 增加 codex-alert-route show|set 命令。
  • 配置缺失、损坏或线程 ID 非法时禁止通知并明确失败,不得回退到旧硬编码。
  • 旧线程 01a0b281-ec7f-7731-83c4-7451f89028df 不再作为任何生产默认目标,只保留历史记录身份。
  • --notify-thread 仅保留给隔离测试。

验收:执行正常、缺失、非法 ID、旧线程残留四类回归;合成告警真实到达当前协调线程。

P11-5 dog-public 节点纳管

目标:登记 dog-public,评估其作为 ThreeDogs 独立站、资源遥测节点和边缘备用候选。

固定事实:

项目 值
SSH 173.249.205.221:36406,用户 root
作用 ThreeDogs 独立站候选、资源遥测、边缘或 DERP 备用评估
画像 edge-gateway
批量任务 batch_allowed=false
Tailnet 策略 accept-dns=false、accept-routes=false
实测主机名 dog
实测 Tailnet 100.64.0.3
主机密钥 SHA256:7suv5NIWh7ePDIoZz5tYR4jWmXNONqeYWEyvC3xHfY4

实施范围:

  • 保留现有宝塔、Nginx、Shadowsocks Rust 和防火墙配置,不抢占现有端口。
  • 增量接入 Tailscale、Nomad、Docker 和资源遥测。
  • 使用公网与节点双路径 SSH,核验主机身份和端口不变。
  • 连续观察 72 小时后再评估边缘或 DERP 备用资格。
  • ThreeDogs 正式迁移和 dog-public 正式接管必须另行确认切换窗口,不能自动执行。

现场结果:

  • 101 的 dog-public 和 dog-public-tailnet 两个 SSH 别名均在严格主机校验下返回 dog。
  • Tailscale 状态为 Running、Health=[],RouteAll=false、Exit Node 为空、CorpDNS=false。
  • Nomad 节点 dog-public 状态为 ready,NodeClass 为 edge-gateway,Docker 与 exec 驱动健康。
  • 100.64.0.3:9100/metrics 返回 200;宝塔 16973、Nginx 80/888、Shadowsocks Rust 61158 和 SSH 36406 保持原监听。
  • 2026-10-01 72 小时观察窗现场复核发现 dog-public 继承且持续失败的 postfix-mta-sts-resolver.service,但本机没有 Postfix 消费者;已停止并取消开机启动该单元,现场复读为 disabled/inactive、failed_units=0,原有宝塔、Nginx、Shadowsocks、SSH 和 9100 监听未变化。
  • 现场首次部署曾因 Headscale 预授权密钥过期和错误使用 global-cli-nomad 证书失败;签发新的一次性授权并补齐共享 client.global.nomad 证书后成功。Bridge 代码已收紧为只接受 global-client-nomad,防止再次误用 CLI 证书。

验收:SSH 双路径、Tailnet 恢复、Nomad/Docker 健康、9100/metrics 返回 200、现有服务端口不变、重启后配置持久。当前 72 小时观察从 2026-09-27 00:09 CST 开始,重启持久性仍需在观察窗口内复核。

P11-6 发布与验收

目标:完成本地测试、严格 Docs 构建、GitHub Actions、101 Runner、RR 生产部署、管理员会话回读和回退验证。

实施范围:

  • 本地运行 Python、Node、Console 浏览器契约、计划导航、文档清单和 MkDocs 严格构建。
  • 提交并推送 GitHub,监控对应 Actions 和 101 Runner 直到成功或形成可复核的外部阻塞证据。
  • 通过正式发布链部署 RR Console、Gateway、ClawBot 状态生成器和网络拓扑生成器。
  • 使用短期管理员凭据完成浏览器回读;验收后立即撤销,不持久化。
  • 公网页面、生产状态、关键哈希和回退点全部核验后才关闭工作包。

验收:代码、文档、远端提交、工作流、生产状态和公网页面全部一致;失败时停止下一批并回退,不把本地成功报告为生产完成。

P11-5A d02-dedirock 公网边缘节点纳管

目标:把具有独立公网 IPv4 的 d02 主机纳入节点网络,同时保留其公网恢复入口和现有托管服务边界。

固定事实:

项目 值
公网 SSH 107.172.186.4:10202,用户 root
Tailnet SSH 100.64.0.5:10202,用户 root
主机名 d02-dedirock
管理别名 d02
Tailnet 节点名 agentmeshos-edge-d02-dedirock
主机密钥 SHA256:2UKmsj2gJMg6uTHoxUvWwQY5+xQ3UYMfE8Dg2OOwj80
画像 edge-gateway,batch_allowed=false
Tailnet 策略 accept-dns=false、accept-routes=false

现场结果:

  • 密码登录已关闭,sshd -T 为 PasswordAuthentication no 且 AuthenticationMethods publickey。
  • SSH socket 只监听 10202,UFW 保留公网与 Tailnet 10202/tcp,删除旧 22/tcp 无效放行。
  • 公网和 Tailnet 两个入口均从 RR、101、Home 的真实登录路径回读 d02-dedirock。
  • Tailscale 1.102.4 为 Running,Health=[],默认路由保持 eth0,无 Exit Node。
  • Docker 29.8.1、Nomad 2.0.4 和 edge-gateway 注册已就绪,Docker/exec 驱动健康。
  • 100.64.0.5:9100 已由 RR 成功采集;节点遥测脚本新增 ts-input 前置来源守卫,101 实测被阻断。
  • 最终受控整机重启后约 18 秒双入口恢复,Tailscale、Docker、Nomad 和来源守卫均自动恢复;Nomad 节点仍为 ready/eligible,9100 容器重启计数为 0,systemctl --failed 为空。
  • 重启巡检发现 d02 未安装 Postfix,但继承的 postfix-mta-sts-resolver 在 Python 3.14 下持续失败;该无消费者单元已 disable。NetworkManager 为实际网络管理者时,systemd-networkd-wait-online 仍被 network-online.target 拉起并超时;该无效单元已 mask。两项均已通过再次重启验证不再失败。

验收:主机名、双路径 SSH、公钥专用、Tailnet 偏好、Docker、Nomad、遥测来源限制和现有服务端口保持全部回读后成立。宝塔、Nginx、Shadowsocks 等现有服务未被迁移或接管。

P11-5B 102 节点遥测基线收敛

目标:消除 102 同时存在宿主 apt exporter 和正式容器基线造成的实现漂移,使所有 Linux Worker 使用同一套受限遥测入口。

现场结果:

  • 迁移前正式脚本因 100.64.0.4:9100 被宿主 prometheus-node-exporter 1.10.2 占用而拒绝覆盖,未发生容器与宿主双监听。
  • 宿主 unit 已执行 disable --now,保留原 /etc/default/prometheus-node-exporter 和 systemd drop-in 作为短期回退点,但不再监听端口。
  • 旧 UFW 来源规则已删除,正式脚本重新部署 quay.io/prometheus/node-exporter:v1.9.1 容器,重启策略为 always。
  • RR 对 100.64.0.4:9100/metrics 的正向读取通过;101 作为未授权 Tailnet 来源访问超时。
  • 容器、UFW 规则和 ts-input 前置守卫在 102 当前运行状态中一致。

验收:端口只由正式容器监听,宿主 unit 为 disabled/inactive,RR 来源可读,未授权 Tailnet 来源被阻断。

🔌 接口与数据契约

  • 拓扑接口继续复用 P10 已有只读链路数据,只扩展状态语义、风险级别和显示所需字段。
  • #topology 使用浏览器本地布局,不保存到服务端,不包含敏感数据。
  • 告警生产脚本统一读取 codex-alert-route,不再各自保存生产线程 ID。
  • ClawBot 状态字段只包含版本、依赖版本、绑定状态、最近收发时间、错误码和回复窗口;不包含二维码、Token、Cookie 或消息正文。
  • dog-public 使用 edge-gateway 画像,batch_allowed=false;Tailnet 只承载控制面、SSH、遥测和小于 1 MiB 的受控文件。
  • 公网承载业务大流量,Tailnet 不承载业务数据面。

🧱 技术栈与架构选型

本阶段不引入新框架。节点管理继续使用现有 System Operations Bridge,网络数据继续由只读拓扑快照聚合,ClawBot 状态继续由 RR 本机生成脱敏快照,Gateway 只做严格白名单投影。选择这一路径的原因是现有栈已经有指纹、哈希、服务单元、浏览器契约和回退机制;新建第二套控制面会增加漂移面,不符合本阶段目标。

🎯 目标、成果与验收契约

  • 目标:消除 MM 公网 IP 更换后因硬编码、告警投错线程、拓扑语义不清和节点纳管缺口导致的重复故障。
  • 预期成果:可替换边缘模型、统一告警路由、整页网络态势、真实 ClawBot 状态、dog-public 纳管画像、同步文档与发布证据。
  • 自动检查器:Python 单元测试、Node 契约测试、Console 浏览器契约、计划导航检查、文档清单检查、MkDocs 严格构建。
  • AI 审核:不得把 systemd active、timer active、本地测试通过或旧快照新鲜误报为业务已经恢复。
  • Benson 决定条件:正式切换 ThreeDogs、启用第二 DERP region、修改 DNS、重启关键生产服务或扩大管理员权限时必须明确确认。
  • 风险:远程生产状态与本地仓库可能漂移;旧凭据、旧线程 ID、旧 IP 或旧设备密钥可能以历史资料形式残留。
  • 回退:优先停止本阶段新增服务,恢复上一版脚本、配置和镜像;网络切换先恢复可用性,再做文件回退,不能跳过连通性验证。
  • Token 预算:本阶段不新增隐藏预算;需要模型调用时沿用当前工作台策略。

🧩 分布式底座接入声明

接入结论:接入。

  • 使用层:Network、Compute、Storage、Observability 均使用;Nomad 仅用于已登记节点与资源遥测链路。
  • Adapter 归属:沿用现有 Gateway、System Operations Bridge 和 Console 只读链路,不新增执行网关。
  • 执行映射:101 负责文档、代码、测试、发布协调和告警路由;RR 负责生产 Gateway、Console、ClawBot 宿主和网络拓扑生成;dog-public 只作为 edge-gateway 候选。
  • 数据路径:公网承载业务数据和用户流量;Tailnet 只承载 SSH、Nomad、遥测和小于 1 MiB 的受控文件。
  • 凭据路径:GitHub Token 只进入批准的 root-only 凭据位置或 GitHub Secret;不写入仓库、日志、文档或普通回复。
  • 生命周期:只允许一次性凭据和安全凭据按边界撤销;普通状态、长期配置和日志不设置人为过期时间。
  • 验收证据:本地测试输出、Git commit、GitHub Actions、101 Runner、RR 服务状态、公网 API/页面、浏览器截图、SSH 和遥测回读。

✅ 已完成前置

前置 完成事实 依据
P10 稳定边缘 edge.yohan.fun 作为稳定逻辑身份,业务域名通过 CNAME 跟随 P10-2 与最终 CI 门禁
P10 管理恢复 RR、101、Home 保留公网与 Tailnet 双通道,DD、MM 不扩大反向管理权限 P10-3 节点登记与负向验证
P10 路径观测 直连优先、DERP 为辅;控制台拓扑与网络控制路径金丝雀区分业务链路故障和整网故障 P10-4 至 P10-6
P10 切换回退 隔离环境已验证候选地址、非法地址拒绝、last-known-good 和回滚 P10-7 演练证据
文档治理 P10 已归档,P11 当前状态和文档分类已纳入文档治理检查 计划导航、文档清单与严格 Docs 构建

⚠️ 假设、边界与未决项

项目 当前事实 下一步
Mac mini 登录公钥 仍存在于 101、RR、Home、MM 和 DD 的授权列表 本轮保留,作为未来可能恢复的管理员身份
Mac mini 上线 当前不上线 后续重新评审管理员边界,不因本轮保留公钥自动上线
路由器 Full Cone C 固件已验证可用,部分界面可能没有菜单 仅按现场 UI 与已验证配置记录,不比较 A/B/E
IPv6 掩码 用户书面 /118,现场为 /64 另行确认正式网段,不按 /118 重写现有配置
第二 DERP region DD region 901 缺独立 DNS 与可信证书 条件具备后再启用,不自动切换
ThreeDogs 迁移 dog-public 已完成节点纳管,但尚未接管独立站流量 72 小时观察通过后另行确认切换窗口,不自动接管
dog-public 72 小时观察 纳管已完成,观察起点为 2026-09-27 00:09 CST 观察期内完成重启恢复和遥测连续性复核,再评估边缘或 DERP 备用资格
ThreeDogs 公网入口 当前拓扑探测 https://www.threedogs.vip/ 为 healthy,目标已归到 dog-public;正式迁移、接管和回滚记录仍需单独验收 保留 72 小时观察;切换窗口明确后补齐 MM、RR、dog-public 三路回读和 rollback
RR 资源故障观察 自建 Gemini Chrome、出口代理和常驻服务已全部退场,官方 VNC 会话为空;当前已解除全局 OOM 即时故障,但尚未经过 24 小时稳态和整机重启验证 观察 OmniRoute、Swap 和内核 OOM 计数;完成受控重启后复核官方 VNC、控制台、ClawBot 和无自建单元状态
控制台临时 API Key 已完成撤销 后续验收只使用短期凭据并立即撤销
Runtime MCP 普通 Key 官方 3.8.50 已现场复测,普通模型 Key访问 /api/mcp/tools 与 /api/mcp/stream 仍返回 403 AUTH_001 上游提供新的最小权限 scope 后再切换;当前继续使用受控管理 Key兼容
RR → 101 Tailnet 直连 最终拓扑仍显示经 DERP(agentmeshos-mm);101 到 RR 的 tailscale ping 和 RR 到 101 的复核都未建立直连,360T7 的 firewall.@defaults[0].fullcone=1 已现场核验 保留直连优先、DERP 兜底;继续排查运营商 NAT、101 双网卡和物理链路,恢复后以 tailnet-rr-101=healthy 关闭
旧迁移文档 docs/mm公网入口迁移.md 等保留历史 IP 明确标记“历史值,不可用于恢复”,不纳入恢复链
mTLS 已在讨论中明确不做 本阶段不新增 mTLS 门禁

📋 修订记录

版本 日期 类型 内容
rev.1 2026-09-26 原地升级 将 P11 占位页升级为网络可替换、告警治理与节点纳管计划;不创建平行计划
rev.1 2026-09-26 基线补充 固定 edge.yohan.fun、告警协调线程、整页拓扑、ClawBot 真实探针和 dog-public edge-gateway 画像
rev.1 2026-09-26 边界补充 保留 Mac mini 公钥、继续使用 C 固件、不启用 mTLS、ThreeDogs 不自动迁移
rev.2 2026-09-27 现场更新 完成 dog-public 双路径 SSH、Tailscale、Nomad、Docker 和遥测纳管;修正 Headscale 过期授权与 Nomad Client 证书契约,启动 72 小时观察
rev.3 2026-09-27 拓扑修正 在线 Tailnet 节点改为动态发现;dog-public 和 OS 主机名分别显示;管理节点增加公网 SSH 与 Tailnet 双路径;多条链路分道并为断链增加文字标注
rev.4 2026-09-27 现场纠偏 OS 主机名改为通过 Node Exporter 自动读取;RR 补齐 dog-public 公网与 Tailnet SSH 别名;逻辑边缘标记改为 GW;ThreeDogs 断链改指向实际上游 dog-public;同对节点链路固定分道,自动布局增加多列防重叠
rev.5 2026-09-27 P11-3 实现 RR 完成宿主与插件安装;Bridge 增加短期内存 PTY 二维码会话;Runtime 与 Console 增加管理员绑定链路;状态生成器适配 configured 字段;真实扫码和部署回读仍待完成
rev.6 2026-09-27 ClawBot 模型链路修复 修正普通模型 Key 只放行 Combo 名称导致的权限预检失败;新增 OpenClaw 自定义 Provider 可重复部署、回退和真实 smoke;RR 绑定链路实测到 waiting_scan 并成功取消
rev.7 2026-09-27 ClawBot 生产部署 API Gateway 与 Docs Site 发布工作流及 RR 部署均成功;Provider health 和公网脚本哈希通过;状态保持 unbound,仅待管理员会话回读与真实微信扫码
rev.8 2026-09-27 RR 自建 Gemini 服务退场 定位两个自建 Gemini Chrome 与出口链路重复占用资源,导致 RR 全局 OOM;删除全部自建单元、profile、代理生成逻辑和旧 VNC 容器,恢复官方 Provider/VNC 数据库不变的应用边界
rev.9 2026-09-27 ClawBot 真实状态纠正 官方探针确认微信已配置、账号运行且收到真实消息;修正全局插件被误报为未安装的状态逻辑;增加余额错误正文的 Combo 响应质量门禁和精确模型 smoke
rev.10 2026-09-28 拓扑与 ClawBot 生产收口 edge/GW 生产回读为 healthy,同一对节点多条链路按曲率分道;ClawBot 状态生成器、默认模型和 API Gateway 已发布为 connected/bound + MODEL_ROUTE_OK;Home Bridge 拉取改为编码 JSON 并增加双重哈希校验;剩余为真实微信出站、受控重启和观察期验收
rev.11 2026-09-28 ClawBot 重启闭环与当前工作包切换 RR 受控重启后 Gateway 为 enabled/active/running,状态仍为 connected/bound,模型 smoke 为 pass;当前工作包切换到 P11-6 发布与验收,真实微信出入站保留为唯一外部动作验收
rev.12 2026-09-28 101 Runner OOM 隔离与恢复 Docs Run 36353513155 被 101 全局 OOM 打断,根因是同一时刻膨胀至约 7.2 GiB 的 grep;已清理孤儿监听器、禁用旧 Runner,并给活动 Runner 增加 4 GiB 硬上限、整组回收和故障重启;生产 Docs 仍需重跑复核
rev.13 2026-09-28 Runner OOM 正向复验完成 提交 04645791f55f4b751d5e974325b0ea1097d6d6a2 的 Docs Run 36354537606 已完成 build、Release bundle 和 RR deploy,Guardrails Run 36354537307 同步成功;Runner OOM 整改由真实工作流覆盖,生产 Docs 容器已回读同一提交 SHA
rev.14 2026-09-28 上游 Runner 丢失 Job 恢复边界 第二次 Docs Run 36355038100 命中 actions/runner #4728 的 runner_id=0、零步骤丢失 Job;手动重跑成功后,新增只匹配该明确注解的 GitHub 托管 Runner 恢复器,普通失败和重复尝试不自动重跑
rev.15 2026-09-28 网络态势与发布最终复核 生产拓扑回读 edge/GW 为 healthy,RR 到 dog-public、DD、MM 的多条路径均独立分道;提交 7b46e77 的 Guardrails 36355662477 与 Docs 36355662676 全成功,RR Docs 容器已切到同一 SHA;剩余只保留真实微信往返、72 小时观察和需用户决策的外部切换项
rev.16 2026-09-28 Runtime MCP 权限复核 官方 OmniRoute 3.8.50 在 RR 上以普通模型 Key 复测 /api/mcp/tools 与 /api/mcp/stream,两者仍返回 403 AUTH_001;确认是上游管理权限缺口,Runtime 继续使用受控管理 Key兼容,普通模型 Key不扩大权限
rev.17 2026-09-28 最终发布与 DERP 残余复核 提交 14ea30b 的 Guardrails 36356054184 与 Docs 36356054205 全成功,RR Docs 容器回读同一 SHA;GW 与公网业务路径 healthy,RR → 101 仍走 DERP,记录为运营商 NAT 穿透残余并保留自动兜底
rev.18 2026-09-30 d02 纳管与 Linux 遥测基线收敛 d02 完成三管理入口双路径、密码关闭、公钥专用、Tailnet/Docker/Nomad/遥测纳管和多次受控重启;清理无 Postfix 消费者的 MTA-STS 残留并 mask 无效 networkd 等待单元,最终开机 failed=0;节点遥测脚本升级为 v0.2.2,102 与 d02 均收敛到官方 node_exporter:v1.9.1 容器与 ts-input 前置来源守卫
rev.19 2026-10-01 Runner 悬挂防复发与 dog-public 残留清理 新增只匹配“服务 active、无 Worker、Busy 取消后未恢复、确有 queued Job 且冷却期已过”的 Runner watchdog,完成负向回归和现场安全实跑;dog-public 停止无 Postfix 消费者的 MTA-STS failed 单元并回读 failed_units=0

🧪 测试与验收

  • DNS、SSH、端点快照和告警路由执行正常、缺失、非法 ID、旧线程残留四类回归。
  • 拓扑在桌面和移动端验证拖动、越界、重叠、刷新后位置恢复、自动布局重置和连线跟随。
  • ClawBot 覆盖宿主缺失、插件缺失、未扫码、探针失败、绑定成功和重启恢复。
  • Gemini 官方边界覆盖:自定义单元/进程/端口为空、官方 VNC 会话可创建并删除、渲染器拒绝重新生成已退役出口服务。
  • dog-public 验证现有服务端口不变、SSH 双路径、Tailnet 恢复、Nomad/Docker 健康、9100/metrics 返回 200 和重启后配置持久。
  • 发布验证覆盖严格 Docs、计划导航检查、Action、101 Runner、RR 镜像一致性、公网回读和 rollback。

🔁 回退与重新验证

任一情况发生时,本阶段验收自动失效并必须重新检查:

  • MM 或 dog-public 公网 IPv4/IPv6 再变化。
  • Headscale、Tailscale、Nginx、OpenClaw 或 Node 版本变化。
  • Nginx 配置重载失败、MM 或 DERP 节点重启、SSH Host 配置被覆盖。
  • 恢复脚本重新执行、云厂商网络切换、DNS CNAME 或 edge.yohan.fun A/AAAA 被修改。
  • 告警路由配置缺失、损坏或协调线程变化。

回退顺序:先停止新增脚本或状态生成器,保留现场证据;再恢复上一版配置和镜像;最后按 DNS、TLS、SSH、Tailscale、DERP、Gateway、Console、ClawBot 和业务入口逐项复核。旧 IP 和旧线程 ID 只允许作为历史记录,不得写回生产配置。