阶段十一: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、OpenClaw2026.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 Provideragentmeshos,Base URL 为http://127.0.0.1:39180/v1。Boss Combo 仍保留agentmeshos-free-quality-first,但该 Combo 当前会命中 Pollinations 余额错误;ClawBot 默认模型改用连续三次真实 smoke 均返回MODEL_ROUTE_OK的 Worker Comboagentmeshos/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、Swap3.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-egressdrop-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、Nginx80/888、Shadowsocks Rust61158和 SSH36406保持原监听。- 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 保留公网与 Tailnet10202/tcp,删除旧22/tcp无效放行。 - 公网和 Tailnet 两个入口均从 RR、101、Home 的真实登录路径回读
d02-dedirock。 - Tailscale
1.102.4为 Running,Health=[],默认路由保持eth0,无 Exit Node。 - Docker
29.8.1、Nomad2.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.funA/AAAA 被修改。 - 告警路由配置缺失、损坏或协调线程变化。
回退顺序:先停止新增脚本或状态生成器,保留现场证据;再恢复上一版配置和镜像;最后按 DNS、TLS、SSH、Tailscale、DERP、Gateway、Console、ClawBot 和业务入口逐项复核。旧 IP 和旧线程 ID 只允许作为历史记录,不得写回生产配置。