阶段十二:102 节点纳管一次性最终验收
计划 ID:phase-12-pcdell-102-final-acceptance
阶段状态:已完成并归档
计划状态:已完成
当前工作包:无;P12-0 已完成并归档
权威边界:P12 只做 102 节点纳管的最终验收;必需项通过后正式关闭“102 节点纳管”。OmniRoute 迁移由后续 P13 阶段承接,不属于 P12 工作包、验收出口或关闭前置条件。本文件路径是历史稳定 URL,不再表示 P12 包含 OmniRoute 迁移。
📌 结论摘要
P11 已正式冻结归档,用户已于 2026-10-01 明确授权开始 P12-0。唯一工作包已完成现场验收和最终受控重启复核,8 项验收全部通过,“102 节点纳管”正式关闭。依据是用户授权记录、P11 完成归档、docs/plans/state.json、本页“2026-10-01 P12-0 现场验收结果”和 P12 完成归档。
P12 不再保存 OmniRoute 的目标版本、安装步骤、版本差异、数据恢复、MM 回源和切换细节。后续迁移统一进入 P13 OmniRoute latest stable 原生迁移。P12 只定义正式移交接口:P12 关闭后,才允许把机器状态切换为 P13;后续 P13-0 至 P13-4、P13-B 和 P13-C 已完成版本冻结、102 安装、隔离恢复、生产切换、公网直连和 RR omni 全量退役。
P12-0 全部验收通过,102 节点纳管已关闭。 P13 已完成并归档,P13 完成生产迁移、公网直连与 RR omni 全量退役,102 3.8.51 是唯一生产权威。
🗂️ 目录
- 计划状态
- 目标、成果与验收契约
- P12-0 唯一验收清单
- 验收规则与关闭条件
- 2026-10-01 P12-0 现场验收结果
- P12 到 P13 的正式移交契约
- 技术栈与架构选型
- 架构、数据与接口契约
- 分布式底座接入声明
- 进入执行条件
- 回退方案
- 未决项 / 需要用户决策
🧾 计划状态
| 项目 | 当前值 | 依据 |
|---|---|---|
| 当前阶段 | P12 | docs/plans/state.json |
| 阶段状态 | 已完成并归档 | P12-0 的 8 项验收全部具备现场证据 |
| 计划状态 | 已完成 | P12 的 102 验收边界和 P12→P13 移交接口已经收口 |
| 当前工作包 | 无;P12-0 已完成并归档 |
本阶段只有这一个工作包,已完成 |
| 权威记录 | 本文件 | 102 纳管关闭以本计划的 8 项验收为唯一清单 |
| 验收进度 | 8 项全部通过 | 本页“2026-10-01 P12-0 现场验收结果”和最终重启复核 |
| 后续迁移 | P13 已完成并归档 | 迁移、公网直连和 RR 全量退役均已完成;不改变 P12 关闭结论 |
P10、P11 均已完成归档。ThreeDogs、DERP、Claude 和微信 ClawBot 继续冻结,不从 P11 自动派生任务,也不进入 P12。
🎯 目标、成果与验收契约
P12 的唯一目标是一次性验证 102 纳管是否满足全部必需条件。验收只覆盖主机身份、SSH 与身份、基础服务、RR 遥测、三个管理入口、系统卫生、条件性重启持久性和 OmniRoute 边界确认;完成后只产出验收证据、残余风险和关闭结论。
| 契约项 | 内容 | 依据 |
|---|---|---|
| 阶段目标 | 一次性核对用户确认的 8 项验收要求,通过后关闭“102 节点纳管” | 用户验收清单 |
| 阶段成果 | P12-0 逐项证据、条件项状态、残余风险和最终关闭结论 | 本文件“P12-0 唯一验收清单” |
| 完成口径 | 必需项 1 至 6 和第 8 项边界确认通过;第 7 项按窗口执行或记录残余风险 | 本文件“验收规则与关闭条件” |
| 非目标 | 不迁移 OmniRoute,不新增子工作包,不触发无关网络、服务或历史阶段整改 | 用户要求迁移独立,以及 P12/P13 单阶段边界 |
P12 不把 102 纳管拆成 P12-1、P12-2 等零散工作包,不进行全系统网络整改或无关服务优化,不重新打开 ThreeDogs、DERP、Claude、微信 ClawBot 或 P11 历史事项,也不通过 Git、聊天、日志或普通回复传递 Provider、OAuth、API Key 或 SSH 私钥。
🧪 P12-0 唯一验收清单
验收项只有以下 8 项。任何新条件都必须先由用户明确修改本清单,不得在实施中自行增加子任务。
| 编号 | 验收项 | 必需或条件 | 通过证据 |
|---|---|---|---|
| 1 | 主机名、有线地址、WiFi 地址、Tailnet 地址和别名一致 | 必需 | 102 本机 hostname、链路地址和 Tailnet 地址;与 docs/node-aliases.md 登记逐项一致 |
| 2 | SSH 10222、公钥登录、root 自动化身份和 hhtbing 本地应急身份一致 |
必需 | 从允许来源使用明确 IP、端口、用户和 IdentityFile 登录;分别核对 root 自动化与 hhtbing 应急身份 |
| 3 | Tailscale、Docker、Nomad Client、node_exporter 均为 enabled、active、healthy |
必需 | 逐项 systemd/Docker/Nomad 状态、健康检查和重启策略;四项缺一不可 |
| 4 | RR 能正常采集 102 的 9100/metrics |
必需 | 从 RR 直连和回读 102 的 9100/metrics,确认 HTTP 成功、内容非空且指标归属为 102 |
| 5 | RR、101、Home 三个管理入口均能管理 102 | 必需 | 三个来源分别按登记身份直连 102 并回读主机名、用户和 Tailnet 地址 |
| 6 | 无 failed unit、无重复 exporter、无错误 UFW 来源规则 | 必需 | 102 上执行只读 systemctl --failed、exporter 实例清单和 UFW 规则核对 |
| 7 | 窗口允许时完成一次重启持久性复核 | 条件 | 窗口允许时执行受控重启,随后复核身份、SSH、四项服务、9100 遥测、三管理入口和 UFW |
| 8 | 不要求把 OmniRoute 迁移进 102,迁移仍是独立事项 | 边界确认 | P12 验收和关闭结论不得以 OmniRoute 迁移、容量、数据恢复或 P13 进度为前置条件 |
第 7 项只有在维护窗口允许时才执行。窗口不允许时不得写成“已通过”,必须明确记录“未执行重启持久性复核”的残余风险,并由用户决定是否接受该风险后关闭,或等待窗口后补做同一条验收。
🧾 2026-10-01 P12-0 现场验收结果
本轮从 pcdell-101 作为执行主机,于 2026-10-01 对 102 执行只读验收。除受控 SSH 探测和路由/服务状态读取外,没有修改 102 的主机配置、服务、数据、UFW、Nomad Job 或 OmniRoute 状态。
| 编号 | 结果 | 关键证据 | 判定与下一步 |
|---|---|---|---|
| 1 | ✅ 通过 | 102 返回 hostname=pcdell-102;有线 enp0s31f6=192.168.50.102、WiFi wlp2s0=192.168.50.202、Tailnet 100.64.0.4;360T7 DHCP 预留名称、MAC 和 IP 与节点实际值一致 |
身份、地址和别名一致,无需处理 |
| 2 | ✅ 通过 | sshd -T 返回 port 10222、pubkeyauthentication yes、passwordauthentication no;101 分别以 root 和 hhtbing 通过 Tailnet 与局域网地址登录;root 密码锁定,hhtbing 已设置本地密码并具备 sudo 权限 |
自动化与本地应急身份边界清楚,无需处理 |
| 3 | ✅ 通过 | Tailscale 1.102.4 为 enabled/active、BackendState=Running、Health=[];Docker enabled/active、NRestarts=0;Nomad enabled/active,RR 端显示 pcdell-102 为 ready/eligible,Docker/exec 驱动均为 Healthy;官方 node_exporter:v1.9.1 容器 running、restart=always,来源守卫 enabled/active |
四项服务达到验收口径;exporter 的可选 thermal_zone 日志提示列为非阻断残余风险 |
| 4 | ✅ 通过 | RR 从 100.64.0.1 直接读取 http://100.64.0.4:9100/metrics,HTTP 200、约 88,847 bytes;返回 node_cpu_seconds_total 和 node_uname_info{nodename="pcdell-102"} |
RR 采集链路与指标归属均正确,无需处理 |
| 5 | ✅ 通过 | 101 使用 agentmeshos-101-to-102、RR 使用 agentmeshos-rr-management、Home 使用 administrator@Home 对应私钥,均从各自管理入口直连 100.64.0.4:10222 并回读 pcdell-102、root、100.64.0.4 |
三个管理入口一致,无需处理 |
| 6 | ✅ 通过 | systemctl --failed 为空;exporter 容器、进程和 9100 监听均为 1 个;UFW 只允许 RR 100.64.0.1 访问 102 的 9100,从 101 访问同一端口被拒绝;10222 来源规则与 Tailnet 管理边界一致 |
无 failed unit、重复 exporter 或错误来源规则;无需处理 |
| 7 | ✅ 通过 | 用户在维护窗口先完成一次重启;现场发现并修复无 IPMI 硬件上的 openipmi 失败单元和 ts-input 旁路问题后,又完成最终受控重启。新 boot_id=bd3d4e88-5118-4805-b1d6-f8766c8a4a6b,uptime_seconds=26 时回读身份、双网地址、Tailscale、Docker、Nomad、唯一 node_exporter、RR 遥测、RR/101/Home 三入口、UFW 和 systemctl --failed 均为预期状态 |
重启持久性通过,102 纳管关闭 |
| 8 | ✅ 通过 | command -v omniroute 返回未安装,agentmeshos-omniroute.service 不存在;本轮未安装、恢复、迁移或切换 OmniRoute |
迁移仍由 P13 独立承接,不阻塞 102 纳管 |
本轮额外发现但不属于 P12 验收改写项:101 的 /root/.ssh/known_hosts 中存在一条旧的 100.64.0.4 主机记录。Tailnet 直连管理仍通过,且有线与 Tailnet 的 ED25519 指纹均为 SHA256:0E60z8bMJx1gLcgzIJLhXmnDlnt4qYtJtpf6vRQO5Sw;该旧记录未在本轮删除,以免超出 P12 只读边界。
重启后根因修复与负向回归
最终重启暴露了两个可复现的启动问题,均已在关闭 P12 前修复并做过启动回归:
| 问题 | 根因 | 修复与证据 |
|---|---|---|
openipmi.service 在 102 启动后为 failed |
Dell OptiPlex 7050 的 SMBIOS 没有 IPMI Management Controller,openipmi 包仍把无硬件消费者的 SysV 服务设为开机启动 |
记录原状态后执行 systemctl disable、systemctl mask 和 reset-failed;最终启动后为 inactive/dead/masked,systemctl --failed 为空 |
101 可绕过 UFW 读取 100.64.0.4:9100 |
v0.2.2 守卫只向 filter INPUT 插入规则,Tailscale 随后把 ts-input 重新放到链首并接受其他 Tailnet 来源 |
仓库脚本升级到 v0.2.3,将允许 RR 和拒绝其他来源的规则前置到 raw PREROUTING;102 安装哈希 13c702a781f7e424350c1ddb02bf11b14101458fecdf24bac40debcf13366f5c,最终启动后 101 超时、RR HTTP 200 |
最终重启后的服务证据为:Tailscale BackendState=Running、Health=[]、RouteAll=false、ExitNodeID=""、CorpDNS=false;Docker、Nomad、来源守卫均 enabled/active;Nomad 在 RR 端为 ready/eligible,Docker/exec 驱动为 Healthy;node_exporter:v1.9.1 容器 running、restart=always、进程和 9100 监听各 1 个;RR 采集返回 HTTP 200、87,619 bytes 和 node_uname_info{nodename="pcdell-102"}。RR、101、Home 三个入口回读到的 boot_id 与 102 本机一致。
✅ 验收规则与关闭条件
P12-0是一次性验收,不新增子工作包,不为每个验收项创建平行计划。- 必需项 1 至 6 和第 8 项边界确认全部通过后,P12-0 才具备关闭 102 纳管的条件。
- 第 7 项窗口允许时必须执行;未执行时只能记录残余风险,不能伪造通过。
- 任何验收失败都留在
P12-0内记录和收敛,不拆成新的阶段任务;超出本清单的修复必须另行获得用户授权。 - 关闭“102 节点纳管”必须同时具备逐项命令结果、关键输出、时间、节点身份和执行者信息。
- 无真实证据、只有历史记录或模型推断的结果,不得作为通过依据。
- P12 关闭和 P13 启动是两个连续状态记录,不得在同一提交中伪装成同一个已完成阶段。
🔀 P12 到 P13 的正式移交契约
P12 与 P13 的关系固定为前后阶段,不是两个并列计划。P12 负责证明 102 的纳管能力和边界;P13 负责在后续独立授权后把 RR 的 OmniRoute 生产迁入 102。两者通过 docs/plans/state.json、计划历史、完成归档和同一 Git 主线串联。
| 环节 | P12 责任 | P13 责任 | 禁止边界 |
|---|---|---|---|
| 当前阶段 | 保持 P12 为唯一当前阶段 | P12 关闭前只保存草案 | P13 不得提前取得当前阶段或生产执行授权 |
| 节点能力 | 验证 102 身份、SSH、服务、遥测和管理入口 | 复用已验证的 102 节点能力做目标环境预检 | P12 不安装 OmniRoute,不恢复 RR 数据 |
| 生产写入 | 全部验收以只读为主 | 冻结 RR 作为生产源,设计受控切换 | 任意时刻不得出现 RR 与 102 双 SQLite 写者 |
| 版本与差异 | 不保存 Omni 版本或升级细节 | 执行时重新查询官方 latest stable 并完成差异报告 | 不得把当前草案中的示例版本直接当成执行时目标 |
| 数据与配置 | 只确认 P13 有正式入口 | 使用官方备份/快照、恢复 SQLite,并单独处理包外配置 | 不得只复制 .env 就宣称迁移完成 |
| 切换与回退 | 不修改 MM 回源、RR 服务或调用方配置 | 完成最终快照、切换和全链路验收;P13-B/P13-C 再完成公网直连和 RR 退役 | P13 全链路通过前,RR 仍是权威和回退点;通过后按 P13-C 记录退役 |
| 状态切换 | P12 通过并归档后写入关闭记录 | 下一条状态记录才允许把 current_phase 切换为 13 |
P12 未关闭时不得修改当前阶段指针 |
移交产物至少包括:P12-0 的 8 项验收证据、102 节点身份与入口摘要、已确认可用的服务基线、最终重启复核结果、P13 计划链接和用户授权记录。移交记录不包含任何密钥、Provider 内容、SQLite 原文或 OmniRoute 数据。
🧱 技术栈与架构选型
102 最终验收沿用现有 Headscale/Tailscale 控制网络、systemd、Docker、Nomad Client、node_exporter 和 UFW,不引入新的服务或调度面。验收方式以只读状态核对为主,不通过一次成功 HTTP 响应替代节点身份、服务状态、指标来源和多来源管理验证。
| 候选方式 | 可维护性 | 风险 | 当前判断 |
|---|---|---|---|
| 在 P12 中同时验收 102 并迁移 OmniRoute | 低,两个目标共享失败和回退边界 | 高,节点关闭被迁移状态绑定 | 禁止 |
| P12 只验收 102,P13 独立迁移 | 高,职责和回退边界清楚 | 可控,需要正式移交记录 | 采用 |
| 放弃 102 纳管验收,直接迁移 | 低,节点能力没有统一证据 | 高,目标环境不可信 | 禁止 |
选择前后阶段串联的依据是:102 是否合格应由稳定节点验收判断,OmniRoute 是否可迁移应由版本、数据、协议和切换验收判断。把两者放在同一完成口径会导致目标漂移和互相阻塞。
🔌 架构、数据与接口契约
102 纳管验收只读取 102、RR、101 和 Home 的必要状态,不改变 Runtime、Bridge、Gateway、Nomad、Docker、UFW、MM Nginx 或网络配置。P12 不创建 Nomad Job,不修改生产数据库,不停止 RR OmniRoute,也不更换调用方地址。
节点身份统一以 docs/node-aliases.md 为核对入口。验收命令输出只保留主机名、地址、服务状态、HTTP 状态、非空指标摘要和必要错误原文;SSH 私钥、Provider、OAuth、API Key 和 Runtime Key 不进入 Git、日志或模型上下文。
🧩 分布式底座接入声明
接入结论:P12-0 只读接入 Network、Compute 和 Observability 做节点验收;Storage 不参与数据迁移;OmniRoute 迁移不接入本阶段。
| 使用层 | P12 用途 | 不适用范围 |
|---|---|---|
| Network | SSH、Tailscale、UFW、三管理入口和节点身份回读 | 不改变路由、ACL 或防火墙规则 |
| Compute | Docker、Nomad Client、systemd 服务和健康状态 | 不提交任务、不重装服务 |
| Storage | 不适用 | 不迁移 Provider、SQLite、日志或长期数据 |
| Observability | node_exporter、RR 9100 采集和 failed unit |
不新增 exporter 或告警规则 |
| Nomad | 只核对 Client 状态 | 不作为迁移执行器 |
- Adapter 归属:不新增 Adapter;P13 如启动,仍使用官方 OmniRoute CLI/API 和宿主 systemd 集成。
- 执行映射:P12-0 由当前执行主机发起,读取 102、RR、101 和 Home;不提交 Nomad Job。
- 数据路径:验收摘要进入计划证据,完整数据不经过 Tailnet;未来迁移按 P13 的数据面设计执行。
- 凭据路径:SSH 私钥和所有模型凭据保持在 root-only 环境,不进入 P12 证据。
- 生命周期:P12-0 通过后关闭 102 纳管;重启窗口未执行时保留明确残余风险。
- 验收证据:主机身份、地址、服务状态、RR metrics、三来源登录、failed unit、exporter 清单、UFW 规则和可用的重启结果。
✅ 进入执行条件
- 用户 review 并确认本计划。
- 用户明确授权开始
P12-0。 - 102 当前在线且登记入口可用;若不可达,先记录网络事实,不伪造验收。
- 重启持久性窗口可用时,提前确认窗口;不可用时明确记录条件项。
- P13 是否具备版本差异或执行条件,不影响 P12-0;P12 也不为 P13 预执行任何生产动作。
截至 2026-10-01,条件 1 至 4 均已满足;P12-0 的 8 项验收全部通过,阶段已完成并归档。
🔁 回退方案
102 最终验收以只读为主,不计划修改系统配置,因此不存在常规部署回退。若某项检查失败,P12-0 停在失败证据处,不把失败项写成通过,也不自动拆出新计划。
任何为避免验收中断而提出的配置修复都必须先说明目标、变更文件、备份、回退命令和验证方式,并获得用户授权。P13 的回退边界、RR 生产保留和 SQLite 单写者要求由 P13 迁移计划单独定义。
⚠️ 未决项 / 需要用户决策
| 事项 | 当前事实 | 下一步 |
|---|---|---|
| P12 关闭 | P12-0 的 8 项验收全部通过并已归档 | 无需继续 P12 工作;后续不得从 P12 拆出零散任务 |
| 重启持久性 | 最终受控重启后身份、SSH、服务、遥测、三入口、UFW 和 failed unit 均通过 | 已关闭,后续仅在外部版本、网络或服务发生漂移时重新验证 |
| 101 known_hosts | 存在旧 100.64.0.4 记录,但当前 Tailnet 管理可用且主机指纹已复核 |
如需清理,需要在 P12 之外单独授权并先备份 |
| P13 生产状态 | P13-4、P13-B 和 P13-C 已完成切换、公网直连、全链路验收、真实回退、再次切换和 RR omni 全量退役;102 3.8.51 是唯一生产权威 |
P13-6 完成健康观察迁移、最终验收、Git 提交和 CI 门禁 |
| P13 目标版本 | 执行版本为 Node 22.23.0 与 OmniRoute 3.8.51,RR omni 数据和回退路径已删除 |
不在 P12 内改写版本;后续上游漂移必须回到 P13 重新评审 |