🧭 节点分类与四轴职责模型
更新:2026-10-04
📌 结论摘要
AgentMeshOS 的节点分类已经统一为四轴模型:primary_role 表示唯一主职责,service_roles 表示节点当前运行的服务,capabilities 表示节点可提供的能力,operational_state 表示纳管、健康、Edge 和 Exit Node 等运行状态。四轴不能互相冒充,也不能根据在线状态、端口开放或某次部署结果临时改变。
四轴必须分开读取,能力不能冒充主职责。
当前机器权威登记源是 tools/node-registry/registry.json。节点管理、网络态势、Status、API Gateway、System Operations Bridge、Headscale 相关生成器和发布 bundle 都从这一份文件读取或映射;node.role 与 node.node_type 只保留给旧客户端兼容,不能再作为主职责判断依据。
这次收口确认当前分类整体正确:RR 为生产控制面,101 为项目交付与发布协调,102 为计算节点,MM、d02、dog-public 为公网边缘,DD 为主职责存储但具备 Edge 和中继能力,Home 为管理入口,nas-sz 为 NAS,移动端为客户端。DD 具备 Edge 能力不等于它是 Edge 主机,MM 运行 derper 也不等于 derp 是主职责。
📚 目录
🧩 权威来源与更新路径
分类权威只允许存在于版本化登记源,禁止在 Console、Status、拓扑脚本或部署脚本里重新硬编码一份节点角色表。旧字段兼容只解决滚动发布期间的接口读取,不产生第二份事实。
| 层级 | 当前对象 | 作用 | 约束 |
|---|---|---|---|
| 权威登记 | tools/node-registry/registry.json |
定义节点、别名、四轴事实、拓扑位置和指标身份 | 任何分类变更必须先改这里 |
| 拓扑生成 | scripts/maintenance/agentmeshos-network-topology.py |
将 Registry 事实与实时 Tailscale、DERP、Peer Relay、Exit Node 状态合并 | 不能新增独立主职责映射 |
| API 投影 | tools/api-gateway/src/main.py、network_topology.py |
对公开状态和拓扑做严格脱敏、校验和标签补充 | 未知名称为待分类,不能猜测 |
| 节点管理 | tools/system-operations-bridge/src/node_management.py |
将 Registry 事实合并到可管理节点清单 | 部署画像不能覆盖主职责 |
| Console | tools/console-site/src/app.js |
展示四轴并执行链路、主职责、能力三组 AND 筛选 | 不再用 node_type/role 推断主职责 |
| Status | tools/status-site/src/app.js |
展示主职责、服务职责、能力与运行状态统计 | 主职责必须直接读取 primary_role |
| 发布 | scripts/ci/create-release-bundle.sh、部署脚本 |
将 Registry 随 API Gateway bundle 和生产镜像发布 | 缺失或非法时失败关闭 |
Registry 中节点地址有两层权威来源:已配置资源遥测的节点使用 metrics.address,只有拓扑身份的管理终端使用 topology.tailnet_ipv4;API 身份索引必须同时覆盖两者,并纳入 aliases 与 topology.tailnet_aliases,不能因为缺少 metrics 就把已登记节点降级为“待分类”。
更新顺序固定为:先改 Registry,再跑 Registry 与下游契约测试,随后检查拓扑、API、Console、Status 和文档是否一致,最后提交 GitHub、等待 Actions、执行 RR 发布并通过公网回读。只改页面文字不改 Registry 属于漂移;只改 Registry 不跑下游测试属于未完成。
🧱 四轴模型
四轴的设计目的是把“这台机器是什么”“它运行什么”“它能提供什么”“它现在是什么状态”拆开。这样同一台 DD 可以主职责为存储、运行 Cloudreve 和 DERP、具备 Edge 能力,同时保持 edge_role=candidate,不会因为多个身份混在一起而失去唯一主职责。
| 轴 | 字段 | 含义 | 取值规则 |
|---|---|---|---|
| 主职责 | primary_role |
节点在系统中唯一的首位职责 | 每台主机只能有一个值;能力、在线状态和临时服务不能覆盖 |
| 服务职责 | service_roles |
当前实际运行的正式服务 | 可多个;使用 derper、peer-relay、edge-proxy 等服务名 |
| 能力 | capabilities |
节点具备提供的可配置能力 | 可多个;使用 edge、derp、peer_relay、exit_node、batch-worker、auto-deploy |
| 运行状态 | operational_state |
纳管、生产、系统管理、批量、自动部署、Edge 角色、Nomad 画像及实时健康 | 必须区分静态声明与实时状态,不能把 active 直接写成可用结论 |
当前合法主职责为 control、delivery、management、edge、compute、storage、nas、client、unclassified。当前合法服务职责包括 ai-runtime、headscale、headplane、nomad-server、nomad-client、control-api、control-plane-standby、ci-runner、release-coordinator、node-inventory、node-exporter、omniroute、edge-proxy、derper、peer-relay、cloudreve、threedogs、ssh-management、windows-management、codex-bridge、nas-storage 和 android-probe。
| 易混项 | 正确口径 | 错误口径 |
|---|---|---|
derp 与 derper |
derp 是公网 DERP 能力,derper 是节点上的服务职责 |
把 derp 当成服务名或主职责 |
peer_relay 与 peer-relay |
下划线形式是能力,连字符形式是服务 | 在 Headscale ACL 与 UI 能力筛选中混用 |
| Edge 与 DERP | Edge 负责 Nginx/TLS 公网入口,DERP 负责 Tailnet 中继 | 认为 Edge 在线就等于 Tailnet 中继可用 |
| Exit Node 能力与使用 | 能力表示可被选择,使用状态必须是客户端显式选择 | 把“可提供出口”写成“当前正在使用出口” |
📊 当前节点分类矩阵
下表以 2026-10-05 的 Registry 为静态事实,并参考最近一次 Tailnet、拓扑和发布回读。离线状态只改变 operational_state,不改变 primary_role。
| 节点 | 主职责 | 服务职责 | 能力 | 运行状态要点 | 分类结论 |
|---|---|---|---|---|---|
rr |
生产控制面 | AI Runtime、Headscale、Headplane、Nomad Server、控制面 API、节点清单 | Exit Node | 已纳管、生产节点、系统管理机;不承担 Edge | 控制面唯一写权威 |
101 |
项目交付与发布协调 | CI Runner、发布协调、节点清单 | 无额外能力 | 已纳管、系统管理机;不承载生产 Runtime | 交付与发布协调,不是生产控制面 |
102 |
计算节点 | OmniRoute、Nomad Client、节点遥测、只读备用控制面 | 批量计算、自动部署 | 已纳管;当前唯一生产 OmniRoute 权威 | 计算与模型访问节点 |
mm |
公网边缘 | 公网边缘代理、DERP、Peer Relay、节点遥测 | Edge、DERP、Peer Relay、Exit Node | 当前活动 Edge;region 900 | 当前生产公网入口 |
d02 |
公网边缘 | 公网边缘代理、DERP、Peer Relay、Nomad Client、节点遥测 | Edge、DERP、Peer Relay、Exit Node | Edge 候选;region 902 | 可替换边缘与中继候选 |
dog-public |
公网边缘 | 公网边缘代理、DERP、Peer Relay、ThreeDogs、Nomad Client、节点遥测 | Edge、DERP、Peer Relay、Exit Node | Edge 候选;region 903 | 独立站与备用边缘节点 |
dd |
存储节点 | Cloudreve、DERP、Peer Relay、节点遥测 | Edge、DERP、Peer Relay、Exit Node | Edge 候选;region 901 | 主职责存储,能力可与 Edge 并存 |
home |
管理入口 | SSH 管理、Windows 管理、Codex Host Bridge | 无额外能力 | 已纳管、系统管理机 | Windows 同级管理入口 |
nas-sz |
NAS | NAS 存储、节点遥测 | 无额外能力 | 已纳管 | 用户存储资源,不承担计算或系统云盘后端 |
little-s20 |
客户端 | Android 探针、SSH 管理 | 无额外能力 | 已纳管、在线;地址 100.64.0.8;2026-10-04 17:41:52 CST 受控重启后 Tailscale 于 18:17:50 自动恢复,资源遥测于 18:18:17 恢复;19:14 CST 再次重启后 Tailnet-only 入站 sshd 约 204 秒恢复 |
安卓移动管理与观测节点,支持 RR/101/Home 反向管理;现场名 Little 的 S20+,Tailnet DNS 名为 andriod-s20 |
honor-magic2 |
客户端 | Android 探针、SSH 管理 | 无额外能力 | 已纳管、在线;地址 100.64.0.13;实时 Tailnet 节点名 andriod-magic2;整机重启后 Tailscale、sshd、supervisor 和 push-loop 自动恢复;资源快照为 degraded,仅因 Android 10 隐藏网络元数据 |
Honor Magic2 移动管理与观测节点,支持 RR/101/Home 反向管理;Termux、Termius、TermRover 已配置九个出站目标,TermRover 完成 RR/101 真机登录 |
mac-mini |
管理入口 | 无 | 无额外能力 | 当前离线;不列为当前管理员来源 | 历史管理终端 |
windows-summer |
管理入口 | 无 | 无额外能力 | 当前离线 | Windows 管理终端 |
benson-nb |
管理入口 | 无 | 无额外能力 | 当前离线 | Windows 管理终端 |
officesummer |
管理入口 | 无 | 无额外能力 | 当前离线 | Windows 管理终端 |
分类正确性的关键判断有两类。第一类是唯一主职责:RR 与 101 都有管理或发布能力,但 RR 是控制面、101 是交付协调;DD 具备 Edge 能力,但主职责仍是存储,避免把“可以承担”写成“当前就是”。第二类是服务与能力分离:MM、d02、dog-public 和 DD 可以同时运行 derper 与 Peer Relay,但 Edge、DERP、Peer Relay 是正交能力,不能合并为一种角色。
🌐 网络态势分类
#topology 现在使用三组可组合筛选。三组条件之间是 AND 关系,组内是单选;逻辑入口 edge.yohan.fun 作为链路锚点保留,不会被错误当成真实 Edge 主机。
| 筛选组 | 当前选项 | 数据来源 | 说明 |
|---|---|---|---|
| 链路类型 | 公网 HTTPS、Tailnet 直连、DERP 中继、Peer Relay、SSH 管理、公网数据面 | links[].path_type |
只决定链路是否显示 |
| 主职责 | 控制面、交付、管理、边缘、计算、存储、NAS、客户端、逻辑入口 | nodes[].primary_role |
只按唯一主职责收窄主机节点 |
| 能力 / 出口 | Edge、DERP、Peer Relay、Exit Node 可选、正在使用 Exit Node | nodes[].capabilities、exit_node_available、exit_node_in_use |
能力与使用状态分开显示 |
节点圆圈和详情均显示主职责、服务职责、能力与运行状态。Exit Node 提供者使用能力徽标和虚线环,正在使用 Exit Node 的客户端使用独立使用环与标记;默认直连不会显示成“已使用”。这使“谁可以提供出口”和“谁正在使用出口”成为两个可独立验证的事实。
🧪 一致性验证
本次收口需要用以下门禁证明 Registry、API、Bridge、Console、Status 和发布包使用同一套四轴语义。任何一项失败都不得用页面截图、单个 Action 成功或手工替换生产文件来替代。
| 验证对象 | 命令 | 通过标准 |
|---|---|---|
| Registry 结构与唯一主职责 | python3 tools/node-registry/test_node_registry.py |
node_registry=passed |
| 拓扑生成与实时合并 | python3 scripts/maintenance/tests/network-topology-test.py |
network_topology_canary=passed |
| API 拓扑脱敏与四轴契约 | python3 tools/api-gateway/tests/test_network_topology.py |
gateway_network_topology=passed |
| 公开状态边界 | .venv/bin/python tools/api-gateway/tests/test_public_status.py |
public_status_boundary=passed |
| Bridge 节点目录 | .venv/bin/python -m pytest -q tools/system-operations-bridge/tests |
全部通过 |
| Status 展示契约 | bash tools/status-site/tests/display-contract.sh |
PASS status display contract |
| Console 浏览器契约 | bash tools/console-site/tests/browser-contract.sh |
全部通过 |
| 发布 bundle | bash scripts/ci/tests/create-release-bundle-test.sh |
manifest 包含 node-registry.json 且校验通过 |
生产发布还必须经过 bash scripts/ci/post-push-verify.sh,确认远端提交、Actions、101 Runner、RR 镜像和公网回读全部一致。只有输出 post_push_verify=pass 才能报告发布成功。
🔁 迁移、防复发与回退
防复发的核心是禁止旧字段回流。Console 与 Status 的主职责函数只接受 primary_role;API 的兼容字段 role、node_type 必须由 primary_role_label 生成;拓扑和 Bridge 必须拒绝未知主职责、未知能力以及把 derp 写成服务职责的输入。
迁移期间可能出现旧浏览器缓存继续显示旧字段,处理方式是发布新版静态资源并回读构建哈希,不能回写旧字段来适配。若新分类造成生产页面异常,回退方式是撤销本次提交对应的镜像与静态资源,Registry 恢复上一版已验证 JSON;不得在 Console 中临时硬编码节点名称。
⚠️ 未决项 / 需要用户决策
| 事项 | 当前事实 | 需要用户决定的边界 |
|---|---|---|
| 移动管理客户端的稳定性 | little-s20 与 honor-magic2 均已获授权并完成 Tailnet-only 入站管理;RR、101、Home 分别可在 100.64.0.8:8022、100.64.0.13:8022 反向登录。Magic2 已完成整机重启恢复、Registry 稳定身份统一、探针 v0.3.8 上报、TermRover 9 saved 与 RR/101 登录、Exit Node 和 Gemini 真机对话。2026-10-05 晚又发现 Termux 进程曾停止,需经 USB ADB 重新启动 Termux 并执行两个 boot 脚本恢复,因此后台长期驻留仍需观察 |
是否扩展协议、长期保持三套发起端私钥与 Android 入站服务;Termux 再次停止时按进程、Doze、内存回收和 logcat 做根因排查 |
| Edge 与中继能力启用顺序 | 能力矩阵已登记,生产切流仍按维护窗口执行 | 何时启用某台候选 Edge 或 DERP region |
| DD 的多能力组合 | 主职责保持存储,具备 Edge、DERP、Peer Relay 和 Exit Node 能力 | 是否允许 DD 承担某次生产切流或中继演练 |