Server Operation & Maintenance Manual
- 适用范围:云端控制机 / Windows 本机工作区执行 / 备用运行机 fallback / Golutra 技术吸纳分析
- 版本标识:
Naikaku Manual Series / Rev. 4.1
第 0 章 区域导航与资料入口
0.1 这本手册现在兼任 服务器体系 总入口
这本总手册现在不仅负责技术说明,也兼任 服务器体系 的主导航文档。
边界说明:本文只承担服务器体系专题的总入口,不承担项目总体 current-state 三件套职责;若要判断项目现在的总体状态,优先看 PROJECT-CONTEXT.md、SESSION-HANDOFF.md、plan.md。
这样做的原因是:
- 导航要和高信息量文档合一
- 不再单独制造薄弱的
首页.md/目录.md - 进入这个区域后,直接落到真正有内容的总文档,而不是再跳一层空页
0.2 当前推荐阅读入口
- 想看当前 live 运维口径、机器角色、前端入口、真源映射 -> 优先看后文“服务器资产与角色规划总表”中的
一、结论速览到十一、服务器配置映射表 / 真源表 - 想看这轮最新的前端 / 域名 / API 映射与漂移判断 -> 优先看
五、已部署网页前端 / 域名清单与十一、服务器配置映射表 / 真源表 - 想看完整体系定义、角色分工、协议、状态机、示例 -> 再看正文第 0~18 章与附录吸收材料
- 想快速定位接口、字段、JSON、错误码 -> 见附录 C
- 想从基础概念和机器分工开始补课 -> 见附录 B
- 想看技术研判、模块拆解与 MCP / Skill 分析 -> 见附录 D
- 想逐章对照原体系设计并看实施提醒 -> 见附录 E
- 想看服务器资产、机器档案、数据库接入与原始记录 -> 见附录 F
- 想按服务器 / 模块 / 真源入口快速跳转 ->
服务器手册伴随仪表盘.md - 想看 MCP 清单与安装记录 ->
MCP 清单总表.md - 想看 Atramenti-Console 相关补充说明 ->
..\codex-knowledge\60-reference\atramenti-console-doc-index.md
0.3 当前区域结构
agent/
├─ Server Operation & Maintenance Manual.md <- 唯一主文档 / Markdown 真源
├─ 服务器手册伴随仪表盘.md <- 浏览层 / 快速入口 / 嵌入 Bases
├─ 服务器手册伴随视图.base <- Bases 交互视图
├─ MCP 清单总表.md
└─ ../codex-knowledge/60-reference/atramenti-console-doc-index.md0.4 放置原则
这个区域以后按下面规则持续维护:
- 总手册作为唯一主文档持续吸收同主题衍生稿
- 伴随仪表盘只做浏览层与聚合入口,不复制服务器事实,不替代主手册或 repo 真源
- 被主文档吸收的教学稿、速查稿、拆解稿、批注稿不再独立并行维护
md / pdf / images / html / css仍按导出链路管理,但 Markdown 真源统一收敛到主文档- MCP 管理方法与清单单独收敛到
MCP 清单总表.md,不要再把 MCP 教程/安装记录塞回本手册正文 - 不再额外保留重复解释用的根目录首页、分叉手册或平行版本
0.5 本次整合后的组成方式
- 当前运维说明书主干:后文“服务器资产与角色规划总表”中的
一、结论速览、二、当前环境总表、三、机器详细档案、五、已部署网页前端 / 域名清单、十一、服务器配置映射表 / 真源表 - 正文第 0~18 章:体系定义、角色分工、协议、状态机、API、SOP、源码解析(偏体系/教学/吸收材料)
- 附录 A:名词表
- 附录 B:服务器体系教学导读
- 附录 C:接口与字段速查
- 附录 D:技术拆解与研判
- 附录 E:逐章批注与实施说明
- 附录 F:服务器资产与角色规划总表
- 伴随仪表盘:按服务器、按业务模块、按真源入口浏览主手册与相关配套文档
目录
- 第 0 章 使用索引与阅读导航
- 0.1 阅读方式
- 0.2 检索索引页
- 0.3 图表索引
- 0.4 接口索引
- 0.5 关键术语索引
- 第 1 章 项目定义
- 1.1 Naikaku 是什么
- 1.2 一句话目标
- 1.3 与 Golutra 的关系
- 1.4 非目标
- 第 2 章 来源、作者与项目说明
- 2.1 上游项目来源
- 2.2 上游作者信息
- 2.3 建议的项目来源声明模板
- 第 3 章 Naikaku 相对 Golutra 的创新点
- 3.1 继承点
- 3.2 创新点
- 控制机中心化
- SSH 多服务器协同体系
- 本机工作区优先执行
- 离线自动回退
- 任务对象化
- Runner 协议化
- 可审计工程闭环
- 第 4 章 机器结构与角色分工
- 4.1 控制机:124.220.233.126
- 4.2 主执行机:Windows 本机
- 4.3 备用执行机:121.196.202.114
- 4.4 补位机:111.228.6.224
- 第 5 章 工作区模型
- 5.1 工作区类型
- 主工作区
primary - 镜像工作区
mirror - 公共工作区
shared
- 主工作区
- 5.2 任务工作区策略
local_onlyprefer_localcloud_ok
- 5.3 工作区注册字段
- 5.1 工作区类型
- 第 6 章 AI 员工岗位设计
- 6.1 岗位与执行器映射
- 6.2 岗位设计原则
- 第 7 章 任务对象规范
- 7.1 核心字段
- 7.2 任务状态机
- 7.3 状态转换原则
- 第 8 章 Runner 协议手册
- 8.1 Runner 核心标识
- 8.2 注册协议
- 注册时机
- 注册请求体
- 注册响应体
- 8.3 心跳协议
- 心跳字段
- 心跳频率建议
- 8.4 拉任务与 ACK
- 8.5 日志流协议
- 8.6 Artifact 规范
- 8.7 fallback 规则
- 8.8 标准错误码
- 第 9 章 完整 JSON 示例
- 9.1 Runner 注册请求
- 9.2 心跳请求
- 9.3 拉任务响应
- 9.4 ACK / 日志 / 最终结果
- 9.5 fallback 重新分配示例
- 第 10 章 状态机与接口时序索引页
- 10.1 任务状态机
- 10.2 注册时序
- 10.3 心跳时序
- 10.4 派单时序
- 10.5 回传时序
- 10.6 fallback 时序
- 第 11 章 模块调用关系图
- 11.1 总体调用结构
- 11.2 聊天到终端执行链路
- 第 12 章 124 控制机 API 规范
- 12.1 推荐接口清单
- 12.2 API 原则
- 第 13 章 Windows 主执行机 SOP
- 13.1 启动前检查
- 13.2 任务执行流程
- 13.3 停机流程
- 13.4 本机异常处理
- 第 14 章 Golutra 源码解析摘要
- 14.1 技术栈总览
- 14.2 顶层目录职责
- 14.3 前端主模块
- 14.4 后端主模块
- 14.5 关键执行链路
- 14.6 对 Naikaku 的启示
- 第 15 章 字段字典表
- 15.1 按模块归类
- Runner 模块
- Workspace 模块
- Task 模块
- Result / Log 模块
- 15.2 按字母序索引
- 15.1 按模块归类
- 第 16 章 错误码与恢复动作对照表
- 第 17 章 如何正确输出文档
- 17.1 输出原则
- 17.2 正确流程
- 17.3 禁止事项
- 第 18 章 结论
- 附录 A 名词表
- 附录 B 服务器体系教学导读
- 附录 C 接口与字段速查
- 附录 D 技术拆解与研判
- 附录 E 逐章批注与实施说明
- 附录 F 服务器资产与角色规划总表
第 0 章 使用索引与阅读导航
0.1 阅读方式
本手册当前分成两层阅读方式:
- 如果你要做当前部署、排障、服务映射、域名/端口核对,优先读后文“服务器资产与角色规划总表”中的当前运维章节;
- 如果你要补体系背景、协议定义、教学材料、历史吸收内容,再按正文第 0~18 章与附录顺序阅读。
0.2 检索索引页
0.3 图表索引
| 图号 | 图名 | 定位 |
|---|---|---|
| 图 4-1 | Naikaku 多服务器控制 / 执行 / fallback 部署结构图 | 第 4 章 |
| 图 10-1 | 任务对象状态机 | 第 10.1 节 |
| 图 10-2 | Runner 注册、租约确认与工作区同步时序 | 第 10.2 节 |
| 图 10-3 | 心跳刷新可用性与任务 ACK 连续链路 | 第 10.3 节 |
| 图 10-4 | 状态 / 日志 / 终态审计式回传链路 | 第 10.5 节 |
| 图 10-5 | Windows 主执行机掉线后的 fallback 时序 | 第 10.6 节 |
| 图 11-1 | Golutra 原版模块调用关系图 | 第 11.1 节 |
| 图 11-2 | 聊天消息到终端执行链路图 | 第 11.2 节 |
0.4 接口索引
| 类别 | 接口 / 报文 | 作用 | 定位 |
|---|---|---|---|
| Runner 注册 | POST /api/runners/register |
注册 runner 与租约建立 | 第 8 章 / 第 12 章 |
| 工作区同步 | POST /api/runners/workspaces/sync |
上传并刷新工作区视图 | 第 8 章 / 第 12 章 |
| 心跳上报 | POST /api/runners/heartbeat |
更新在线状态、执行器能力、负载快照 | 第 8 章 / 第 12 章 |
| 拉取任务 | GET /api/tasks/pull |
拉取当前可执行任务 | 第 8 章 / 第 12 章 |
| 接单确认 | POST /api/tasks/ack |
锁定任务归属 runner | 第 8 章 / 第 12 章 |
| 状态回传 | POST /api/tasks/status |
回传执行阶段状态 | 第 8 章 / 第 12 章 |
| 日志回传 | POST /api/tasks/logs |
按分片推送日志 | 第 8 章 / 第 12 章 |
| 终态回传 | POST /api/tasks/finalize |
回传结果、摘要与 artifact | 第 8 章 / 第 12 章 |
| 取消任务 | POST /api/tasks/cancel |
控制面中断任务 | 第 12 章 |
| 查询详情 | GET /api/tasks/{taskId} |
获取任务详情 | 第 12 章 |
| Runner 状态 | GET /api/runners/{runnerId} |
查询 runner 在线态与工作区 | 第 12 章 |
| JSON 示例 | 注册 / 心跳 / 拉任务 / ACK / 状态 / finalize / fallback | 直接照着实现的报文模板 | 第 9 章 |
0.5 关键术语索引
第 1 章 项目定义
1.1 Naikaku 是什么
Naikaku 是一个面向多服务器协同、云端控制、本机优先执行的 AI 员工平台。它继承 Golutra 在多成员协作、工作区组织与终端执行方面的优势,并把这些能力吸纳进你自己的服务器体系中,形成更适合 SSH 多机协同、本机代码优先修改、离线自动回退和长期运维的开源项目。
1.2 一句话目标
让云端 AI 员工常驻在 124,接到任务后优先修改本机 E:\My Project 的真实代码;若本机不在线,则自动切换到备用工作区继续执行,并把状态、日志、结果统一回传到 Naikaku 面板。
1.3 与 Golutra 的关系
Naikaku 不是凭空重新发明,而是:
- 吸纳 Golutra 的核心技术思路
- 解析 Golutra 的源码结构与执行链路
- 保留其有价值的协作壳、成员语义、终端引擎思想
- 在此基础上加入你自己的服务器体系、任务对象、runner 协议、主工作区优先策略和 fallback 机制
Naikaku 可以明确表述为:
一个基于 Golutra 技术吸纳与扩展而产生的开源项目。
1.4 非目标
当前阶段的 Naikaku 不是:
- 完全脱离 Golutra 思想的全新范式产品
- 纯 provider-native 的托管式大模型平台
- 只做聊天 UI 的网页壳
- 用聊天消息取代任务系统本身
第 2 章 来源、作者与项目说明
2.1 上游项目来源
Naikaku 当前吸纳的核心上游项目为:
- 项目名:
golutra - 仓库地址:
https://github.com/golutra/golutra - 官方站点:
https://www.golutra.com/ - 仓库定位:多成员协作 + CLI 终端编排 + 项目工作区桌面应用
2.2 上游作者信息
根据仓库 README,目前公开说明的作者为:
- 作者:
seekskyworld - GitHub:
https://github.com/seekskyworld
2.3 建议的项目来源声明模板
建议在 Naikaku 的公开 README 或文档前言中使用类似表述:
Naikaku is an open-source project developed by absorbing and extending technical ideas from Golutra. It preserves valuable concepts such as workspace-oriented collaboration, member-driven execution, and terminal-based orchestration, while introducing a new control-plane architecture, runner protocol, multi-server SSH coordination, and local-workspace-first execution strategy.
中文建议:
Naikaku 是一个基于 Golutra 技术吸纳与扩展而形成的开源项目。它保留了工作区协作、成员驱动执行、终端编排等有价值的设计理念,并在此基础上加入了控制面架构、runner 协议、多服务器 SSH 协同和本机工作区优先执行策略。
第 3 章 Naikaku 相对 Golutra 的创新点
3.1 继承点
Naikaku 直接吸纳了 Golutra 的以下核心思路:
- workspace 作为核心组织单位
- member 作为执行身份载体
- conversation 作为任务触发入口
- terminal session 作为执行器承载方式
- 多 CLI 的统一协作壳设计
3.2 创新点
控制机中心化
把 124.220.233.126 明确设为控制机,而不是仅作为部署宿主,形成稳定控制面。
SSH 多服务器协同体系
将 Naikaku 纳入你的 SSH 多服务器协同体系,允许控制机调度本机、运行机和备用机。
本机工作区优先执行
引入主工作区优先策略,使系统优先修改 E:\My Project 的真实代码,而不是随意在云端镜像目录工作。
离线自动回退
当本机不在线时,自动切换到备用工作区继续执行,而不是让任务丢失。
任务对象化
从“聊天驱动执行”升级到“任务对象驱动执行”,便于审计、重试、排队与生命周期管理。
Runner 协议化
把执行机抽象为 runner,并定义注册、心跳、拉任务、ACK、日志回传、终态回传与 fallback 规则。
可审计工程闭环
不只显示聊天结果,还记录日志、产物、状态变更、错误码和 fallback 轨迹。
第 4 章 机器结构与角色分工
_ 图 4-1 Naikaku 多服务器控制 / 执行 / fallback 部署结构图 _
4.1 控制机:124.220.233.126
职责:
- Naikaku 云端入口
- 成员与任务管理
- runner 注册与心跳管理
- 调度决策
- 日志与结果汇总
4.2 主执行机:Windows 本机
职责:
- 挂载真实工作区
E:\My Project - 执行高优先级代码任务
- 回传日志、结果与差异
4.3 备用执行机:121.196.202.114
职责:
- 挂载镜像工作区
- 接管本机离线时的任务
- 跑长任务、批量任务与脚本任务
4.4 补位机:111.228.6.224
职责:
- 提供补位执行能力
- 托管公共工作区
- 作为兜底执行位
第 5 章 工作区模型
5.1 工作区类型
主工作区 primary
- 位置:Windows 本机
E:\My Project - 含义:最真实、最权威的开发目录
- 优先级:最高
镜像工作区 mirror
- 位置:
121 - 含义:当本机不可用时承接任务的备用目录
- 优先级:第二
公共工作区 shared
- 位置:
121或111 - 含义:不依赖本机真实文件的任务目录
- 优先级:第三
5.2 任务工作区策略
local_only
- 仅允许在主工作区执行
- 本机离线时,任务状态进入
waiting_local - 不允许 fallback
prefer_local
- 优先主工作区
- 主工作区离线时可自动切到
mirror - 再失败时可按策略尝试
shared
cloud_ok
- 可直接在
mirror或shared工作区执行 - 适用于分析、文档、扫描、脚本和低耦合编码任务
5.3 工作区注册字段
| 字段 | 类型 | 说明 |
|---|---|---|
workspaceId |
string | 全局稳定唯一 ID |
name |
string | 展示名称 |
path |
string | 绝对路径 |
kind |
enum | primary / mirror / shared |
hostRunnerId |
string | 所属 runner |
priority |
number | 同类工作区内优先级 |
repoHints |
array | 仓库或项目标识 |
writable |
boolean | 是否允许写入 |
healthy |
boolean | 当前健康状态 |
lastSeenAt |
datetime | 最近心跳时间 |
第 6 章 AI 员工岗位设计
6.1 岗位与执行器映射
| 岗位 | 默认执行器 | 主要职责 |
|---|---|---|
dispatcher |
控制逻辑 | 任务接入、调度决策、回退控制 |
reviewer |
Claude / 人工 | 审查 diff、判断风险 |
deployer |
Shell | 部署、回滚、发布编排 |
codex-engineer |
Codex | 实现、重构、修 bug |
claude-researcher |
Claude | 方案分析、复杂梳理 |
gemini-tooling |
Gemini | 检索、资料整理、辅助草拟 |
shell-worker |
Shell | 构建、测试、脚本和系统操作 |
6.2 岗位设计原则
- 控制层岗位负责决策,不直接承担所有执行
- 执行层岗位尽量与具体 CLI 能力绑定
- 高风险动作可通过 reviewer / deployer 增加控制环节
第 7 章 任务对象规范
7.1 核心字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskId |
string | 是 | 全局唯一任务 ID |
traceId |
string | 是 | 调用链追踪 ID |
projectId |
string | 是 | 项目 ID |
workspacePolicy |
enum | 是 | local_only / prefer_local / cloud_ok |
preferredWorkspaceId |
string | 否 | 首选工作区 ID |
preferredRunnerId |
string | 否 | 首选 runner ID |
title |
string | 是 | 任务标题 |
instruction |
string | 是 | 详细任务说明 |
roleHint |
string | 否 | 岗位提示 |
executorHint |
string | 否 | 执行器提示 |
priority |
enum | 是 | low / normal / high / urgent |
timeoutSec |
number | 否 | 最大执行时长 |
fallbackAllowed |
boolean | 是 | 是否允许 fallback |
repoRef |
string | 否 | 仓库标识 |
targetPath |
string | 否 | 子目录或相对路径 |
requiresApproval |
boolean | 否 | 是否需要人工确认 |
createdBy |
string | 是 | 创建者 |
createdAt |
datetime | 是 | 创建时间 |
metadata |
object | 否 | 扩展字段 |
7.2 任务状态机
标准状态建议为:
queuedassignedrunningstreamingwaiting_localfallback_pendingsucceededfailedcancelledblocked
7.3 状态转换原则
- 所有状态更新必须幂等
- 已终态任务不允许被低优先级状态覆盖
running -> fallback_pending -> assigned -> running是合法回退链路local_only任务在本机离线时只能进入waiting_local
第 8 章 Runner 协议手册
8.1 Runner 核心标识
| 字段 | 类型 | 说明 |
|---|---|---|
runnerId |
string | 全局唯一 ID |
runnerName |
string | 展示名称 |
machineRole |
enum | primary-executor / backup-executor / utility-executor |
os |
string | 操作系统标识 |
host |
string | 主机名 |
version |
string | runner 版本 |
capabilities |
array | codex、claude、gemini、shell 等 |
maxConcurrentTasks |
number | 最大并发数 |
status |
enum | online / busy / draining / offline |
8.2 注册协议
注册时机
- 首次启动
- 版本更新后首次启动
- 机器重启后恢复运行
- 控制机显式要求重新注册
注册请求体
{
"runnerId": "win-main-001",
"runnerName": "Windows Main Runner",
"machineRole": "primary-executor",
"host": "NEVERLETMEGO",
"os": "windows-11",
"version": "0.1.0",
"capabilities": ["codex", "claude", "gemini", "shell"],
"maxConcurrentTasks": 2,
"workspaces": [
{
"workspaceId": "ws-my-project-primary",
"name": "My Project",
"path": "E:\\My Project",
"kind": "primary",
"priority": 100,
"writable": true,
"healthy": true
}
]
}注册响应体
{
"accepted": true,
"runnerLeaseSec": 60,
"heartbeatIntervalSec": 15,
"serverTime": "2026-04-17T10:00:00Z"
}8.3 心跳协议
心跳字段
| 字段 | 类型 | 说明 |
|---|---|---|
runnerId |
string | runner 标识 |
sentAt |
datetime | 心跳时间 |
status |
enum | 当前 runner 状态 |
activeTaskCount |
number | 当前运行任务数 |
queueDepth |
number | 本地等待队列深度 |
workspaceHealth |
array | 工作区健康快照 |
systemLoad |
object | CPU/内存/磁盘摘要 |
currentTaskIds |
array | 当前任务列表 |
心跳频率建议
- 正常:15 秒
- 高负载:10 秒
- draining:10 秒
- 连续 3 次心跳缺失视为离线
8.4 拉任务与 ACK
- 推荐模式:长轮询拉取,后续可切换到 SSE / WS
- 接单后必须先 ACK,再正式进入执行
- ACK 至少包含:
taskId、runnerId、workspaceId、acceptedAt、leaseSec
8.5 日志流协议
| 字段 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务 ID |
runnerId |
string | runner ID |
sequence |
number | 递增序号 |
stream |
enum | stdout / stderr / system |
content |
string | 日志内容 |
emittedAt |
datetime | 发送时间 |
规则:
sequence必须单调递增- 控制机按
taskId + sequence去重 - 单条日志过大时必须拆片
8.6 Artifact 规范
建议 artifact 类型:
patchdiff-summarytest-reportbuild-logscreenshotnotes
字段至少包含:type、name、path、size、checksum
8.7 fallback 规则
local_only不允许 fallbackprefer_local优先主工作区,失败后可依次退到mirror、shared- fallback 前必须释放旧锁
- fallback 后必须重新 ACK
traceId不变
8.8 标准错误码
WORKSPACE_NOT_FOUNDWORKSPACE_UNHEALTHYEXECUTOR_MISSINGTASK_TIMEOUTGIT_DIRTY_BLOCKEDLOCK_CONFLICTLOCAL_ONLY_OFFLINERUNNER_DRAININGRUNNER_OFFLINEARTIFACT_UPLOAD_FAILEDLOG_STREAM_BROKENAUTH_INVALID
第 9 章 完整 JSON 示例
9.1 Runner 注册请求
{
"traceId": "trace_register_win_main_001",
"runnerId": "win-main-001",
"runnerName": "Windows Main Runner",
"machineRole": "primary-executor",
"host": "NEVERLETMEGO",
"os": "windows-11-23h2",
"version": "0.1.0",
"capabilities": ["codex", "claude", "gemini", "shell"],
"maxConcurrentTasks": 2,
"workspaces": [
{
"workspaceId": "ws-my-project-primary",
"name": "My Project",
"path": "E:\\My Project",
"kind": "primary",
"priority": 100,
"repoHints": ["Atramenti box", "Atramenti-Console", "MyBlog"],
"writable": true,
"healthy": true
}
]
}9.2 心跳请求
{
"traceId": "trace_heartbeat_win_main_001_100015",
"runnerId": "win-main-001",
"sentAt": "2026-04-17T10:00:15Z",
"status": "online",
"activeTaskCount": 1,
"queueDepth": 0,
"currentTaskIds": ["task_20260417_001"],
"workspaceHealth": [
{
"workspaceId": "ws-my-project-primary",
"healthy": true,
"writable": true,
"freeDiskGb": 128.4,
"gitAccessible": true
}
],
"systemLoad": {
"cpuPercent": 22,
"memoryPercent": 61,
"diskPercent": 48
}
}9.3 拉任务响应
{
"traceId": "trace_pull_win_main_001_100020",
"tasks": [
{
"taskId": "task_20260417_001",
"traceId": "trace_task_20260417_001",
"projectId": "proj_naikaku_cloud",
"workspacePolicy": "prefer_local",
"preferredWorkspaceId": "ws-my-project-primary",
"preferredRunnerId": "win-main-001",
"title": "修复 runner 心跳重连问题",
"instruction": "定位 runner 在网络抖动后无法恢复心跳的原因,修复并补充重试退避。",
"roleHint": "codex-engineer",
"executorHint": "codex",
"priority": "high",
"timeoutSec": 1800,
"fallbackAllowed": true,
"repoRef": "Atramenti box",
"targetPath": "golutra",
"requiresApproval": false,
"createdBy": "dispatcher-124",
"createdAt": "2026-04-17T10:00:18Z",
"metadata": {
"branch": "main",
"allowDirtyWorkspace": false
}
}
]
}9.4 ACK / 日志 / 最终结果
{
"traceId": "trace_ack_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"workspaceId": "ws-my-project-primary",
"acceptedAt": "2026-04-17T10:00:21Z",
"leaseSec": 1800,
"executor": "codex"
}{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"sequence": 17,
"stream": "stdout",
"content": "[step] retry policy patched, running local verification...",
"emittedAt": "2026-04-17T10:03:18Z"
}{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"finalStatus": "succeeded",
"summary": "已修复心跳重连逻辑,加入指数退避和状态恢复保护。",
"startedAt": "2026-04-17T10:01:00Z",
"finishedAt": "2026-04-17T10:12:00Z",
"artifacts": [
{
"type": "patch",
"name": "runner-heartbeat.patch",
"path": "artifacts/task_20260417_001/runner-heartbeat.patch",
"size": 18244,
"checksum": "sha256:abc123"
},
{
"type": "test-report",
"name": "runner-heartbeat-test.txt",
"path": "artifacts/task_20260417_001/runner-heartbeat-test.txt",
"size": 4210,
"checksum": "sha256:def456"
}
],
"stats": {
"logLines": 320,
"filesChanged": 3,
"durationSec": 660
}
}9.5 fallback 重新分配示例
{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"fromRunnerId": "win-main-001",
"toRunnerId": "aliyun-backup-001",
"fromWorkspaceId": "ws-my-project-primary",
"toWorkspaceId": "ws-my-project-mirror-121",
"reason": "RUNNER_OFFLINE",
"fallbackAt": "2026-04-17T10:06:30Z",
"attempt": 1
}第 10 章 状态机与接口时序索引页
10.1 任务状态机
_ 图 10-1 任务对象状态机:从排队、执行到 fallback 与终态闭环 _
10.2 注册时序
_ 图 10-2 Runner 注册、租约确认与工作区同步时序 _
10.3 心跳时序
_ 图 10-3 心跳刷新可用性,并在拉任务阶段完成任务 ACK _
10.4 派单时序
10.5 回传时序
_ 图 10-4 状态分片、日志分片与终态结果的审计式回传链路 _
10.6 fallback 时序
_ 图 10-5 Windows 主执行机掉线后,控制机切换到 121 mirror runner 的 fallback 链路 _
第 11 章 模块调用关系图
11.1 总体调用结构
_ 图 11-1 Golutra 原版的前端、ui_gateway、message_service、orchestration、terminal_engine、runtime 调用关系图 _
11.2 聊天到终端执行链路
_ 图 11-2 聊天消息从 UI 进入桥接层、编排层并最终落到 PTY runtime 的执行链路 _
第 12 章 124 控制机 API 规范
12.1 推荐接口清单
| 方法 | 路径 | 作用 |
|---|---|---|
POST |
/api/runners/register |
runner 注册 |
POST |
/api/runners/heartbeat |
心跳上报 |
POST |
/api/runners/workspaces/sync |
工作区同步 |
GET |
/api/tasks/pull |
拉取任务 |
POST |
/api/tasks/ack |
接单确认 |
POST |
/api/tasks/status |
状态回传 |
POST |
/api/tasks/logs |
日志分片回传 |
POST |
/api/tasks/finalize |
最终结果回传 |
POST |
/api/tasks/cancel |
取消任务 |
GET |
/api/tasks/{taskId} |
查询任务详情 |
GET |
/api/runners/{runnerId} |
查询 runner 状态 |
12.2 API 原则
- 所有请求带
traceId - 所有写接口幂等
- 所有时间字段统一 UTC ISO8601
- 所有回调支持重试
- 所有终态写入必须审计
第 13 章 Windows 主执行机 SOP
13.1 启动前检查
- runner 进程未重复启动
E:\My Project存在且可访问codex、claude、gemini、qwen、git等可调用- 临时目录与日志目录可写
- 系统时间正常
13.2 任务执行流程
拉取任务 -> 判断本机可执行 -> 申请执行锁 -> 切换工作区 -> 检查 git 状态 -> 启动执行器 -> 回传日志与状态 -> 生成 artifact -> 回传终态 -> 释放锁
13.3 停机流程
draining -> 停止接单 -> 等待当前任务完成或迁移 -> 回传最终心跳 -> 安全退出
13.4 本机异常处理
- 工作区不存在:回传
WORKSPACE_NOT_FOUND - git 脏状态不允许:回传
GIT_DIRTY_BLOCKED - 执行器缺失:回传
EXECUTOR_MISSING - 本机即将关机:先进入
draining
第 14 章 Golutra 源码解析摘要
14.1 技术栈总览
仓库是 Vue 3 + TypeScript + Pinia + Vite 前端,叠加 Rust + Tauri 后端宿主的桌面应用,不是单一网页项目,而是“前端壳 + Tauri 网关 + 终端引擎 + 消息存储 + 编排层”的组合体。
14.2 顶层目录职责
| 目录 | 职责 |
|---|---|
src |
前端 UI、状态管理、交互逻辑、Tauri 调用桥 |
src-tauri/src |
Rust 后端、终端会话、编排、消息服务、平台能力 |
docs |
说明资料 |
scripts |
辅助脚本 |
dist |
构建产物 |
14.3 前端主模块
| 模块 | 作用 |
|---|---|
src/app |
应用壳层、窗口视图分发、启动 bootstrap |
src/features/workspace |
工作区选择、当前工作区与项目状态 |
src/features/chat |
聊天界面、消息列表、成员侧栏、邀请成员 |
src/features/terminal |
终端窗口、终端成员会话管理、终端桥接 |
src/shared |
类型、常量、组件、Tauri 封装、键盘、监控 |
src/stores |
orchestrator 与跨模块业务状态 |
14.4 后端主模块
| 模块 | 作用 |
|---|---|
ui_gateway |
Tauri 命令出口层 |
message_service |
项目数据、成员、聊天数据库、消息管线 |
orchestration |
目标成员分发、聊天到终端的编排层 |
terminal_engine |
终端模板、会话生命周期、轮询、快照、过滤 |
runtime |
PTY、进程、状态与底层运行时 |
platform |
路径、监控、激活、更新器 |
contracts/ports |
契约与接口边界 |
14.5 关键执行链路
- 邀请成员链路:邀请弹窗 -> 写入
terminalType/terminalCommand-> 保存项目成员 -> 可选自动拉起终端 - 派单链路:聊天输入 ->
chatBridge->ui_gateway->message_service/orchestration->terminal_engine->runtime-> 输出事件回流前端 - 会话链路:
terminal_create-> PTY -> poller / snapshot / status -> 事件回流 UI
14.6 对 Naikaku 的启示
Golutra 的协作层和成员语义可以继续沿用;Naikaku 真正需要补的是 runner 注册、任务对象、工作区路由和 fallback 机制,而不是继续魔改首页。
第 15 章 字段字典表
15.1 按模块归类
Runner 模块
| 字段 | 类型 | 说明 |
|---|---|---|
runnerId |
string | 执行机稳定唯一标识 |
runnerName |
string | 执行机展示名 |
machineRole |
enum | 执行机角色 |
host |
string | 主机名 |
os |
string | 操作系统标识 |
version |
string | runner 版本 |
capabilities |
array | 支持的执行器能力 |
maxConcurrentTasks |
number | 最大并发任务数 |
status |
enum | runner 当前状态 |
queueDepth |
number | 本地待处理深度 |
activeTaskCount |
number | 当前执行任务数 |
currentTaskIds |
array | 当前任务 ID 列表 |
Workspace 模块
| 字段 | 类型 | 说明 |
|---|---|---|
workspaceId |
string | 工作区唯一 ID |
name |
string | 工作区名称 |
path |
string | 绝对路径 |
kind |
enum | primary / mirror / shared |
hostRunnerId |
string | 所属执行机 |
priority |
number | 调度优先级 |
repoHints |
array | 仓库提示 |
writable |
boolean | 是否可写 |
healthy |
boolean | 当前是否健康 |
lastSeenAt |
datetime | 最近更新时间 |
Task 模块
| 字段 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务唯一 ID |
traceId |
string | 调用链跟踪 ID |
projectId |
string | 项目 ID |
workspacePolicy |
enum | 工作区策略 |
preferredWorkspaceId |
string | 首选工作区 |
preferredRunnerId |
string | 首选执行机 |
title |
string | 任务标题 |
instruction |
string | 任务正文 |
roleHint |
string | 岗位提示 |
executorHint |
string | 执行器提示 |
priority |
enum | 优先级 |
timeoutSec |
number | 超时秒数 |
fallbackAllowed |
boolean | 是否允许回退 |
repoRef |
string | 仓库标识 |
targetPath |
string | 目标子目录 |
createdBy |
string | 创建者 |
createdAt |
datetime | 创建时间 |
metadata |
object | 扩展字段 |
Result / Log 模块
| 字段 | 类型 | 说明 |
|---|---|---|
sequence |
number | 日志序号 |
stream |
enum | 输出流类型 |
content |
string | 日志正文 |
emittedAt |
datetime | 发送时间 |
finalStatus |
enum | 最终状态 |
summary |
string | 结果摘要 |
startedAt |
datetime | 开始时间 |
finishedAt |
datetime | 完成时间 |
artifacts |
array | 产物列表 |
stats |
object | 统计对象 |
15.2 按字母序索引
| 字段 | 模块 | 说明 |
|---|---|---|
activeTaskCount |
Runner | 当前执行任务数 |
artifacts |
Result | 产物集合 |
capabilities |
Runner | 支持的执行器能力 |
content |
Log | 日志正文 |
createdAt |
Task | 创建时间 |
createdBy |
Task | 创建者 |
currentTaskIds |
Runner | 当前任务列表 |
emittedAt |
Log | 发出时间 |
executorHint |
Task | 执行器提示 |
fallbackAllowed |
Task | 是否允许回退 |
finalStatus |
Result | 最终状态 |
finishedAt |
Result | 完成时间 |
healthy |
Workspace | 健康状态 |
host |
Runner | 主机名 |
hostRunnerId |
Workspace | 所属执行机 |
instruction |
Task | 任务说明 |
kind |
Workspace | 工作区类型 |
lastSeenAt |
Workspace | 最近更新时间 |
machineRole |
Runner | 执行机角色 |
maxConcurrentTasks |
Runner | 最大并发 |
metadata |
Task | 扩展字段 |
path |
Workspace | 路径 |
preferredRunnerId |
Task | 首选执行机 |
preferredWorkspaceId |
Task | 首选工作区 |
priority |
Task / Workspace | 优先级 |
projectId |
Task | 项目 ID |
queueDepth |
Runner | 队列深度 |
repoHints |
Workspace | 仓库提示 |
repoRef |
Task | 仓库标识 |
roleHint |
Task | 岗位提示 |
runnerId |
Runner | 执行机 ID |
runnerName |
Runner | 执行机展示名 |
sequence |
Log | 日志序号 |
startedAt |
Result | 开始时间 |
stats |
Result | 统计对象 |
status |
Runner / Task | 状态字段 |
stream |
Log | 日志流类型 |
summary |
Result | 结果摘要 |
targetPath |
Task | 目标子目录 |
taskId |
Task | 任务 ID |
timeoutSec |
Task | 超时秒数 |
title |
Task | 标题 |
traceId |
Cross | 调用链 ID |
version |
Runner | 版本号 |
workspaceId |
Workspace / Task | 工作区 ID |
workspacePolicy |
Task | 工作区策略 |
writable |
Workspace | 是否可写 |
第 16 章 错误码与恢复动作对照表
| 错误码 | 触发条件 | 控制机动作 | Runner 动作 | 是否允许 fallback |
|---|---|---|---|---|
WORKSPACE_NOT_FOUND |
工作区路径不存在 | 标记 blocked 或 fallback_pending |
记录错误并终止执行 | 视策略而定 |
WORKSPACE_UNHEALTHY |
健康检查失败 | 尝试切到 mirror/shared |
回传健康快照 | 是 |
EXECUTOR_MISSING |
所需 CLI 不存在 | 改派兼容 runner | 回传缺失执行器详情 | 是 |
TASK_TIMEOUT |
超过 timeoutSec |
允许则 fallback,否则 failed |
停止执行并回传日志 | 视策略而定 |
GIT_DIRTY_BLOCKED |
工作区脏状态且策略不允许 | 进入 blocked |
保留现场并回传摘要 | 通常否 |
LOCK_CONFLICT |
工作区写锁冲突 | 重新排队或延迟重试 | 不得强抢锁 | 否 |
LOCAL_ONLY_OFFLINE |
local_only 但主机离线 |
状态转 waiting_local |
无 | 否 |
RUNNER_DRAINING |
runner 停止接单 | 改派其他 runner | 回传 draining 状态 | 是 |
RUNNER_OFFLINE |
连续心跳失联 | 标记 fallback_pending 并重新分配 |
控制机兜底 | 是 |
ARTIFACT_UPLOAD_FAILED |
产物上传失败 | 重试上传或补传 | 本地缓存待续传 | 否 |
LOG_STREAM_BROKEN |
日志回传失败 | 记录缺口并允许补传 | 本地缓存并重试 | 否 |
AUTH_INVALID |
token 失效或签名失败 | 拒绝写入并告警 | 重新注册或刷新凭证 | 否 |
第 17 章 如何正确输出文档
17.1 输出原则
- 永远保留 Markdown 源文件
- 先生成完整可访问的 HTML,再打印 PDF
- 在 PDF 成功打印前,不删除 HTML、CSS 和其他中间资源
- 图示优先使用稳定的静态文本图或已验证可导出的图形格式
- 文档标题、封面标题、文件名必须保持一致
17.2 正确流程
- 编写和更新 Markdown 源文件
- 准备样式文件 CSS
- 用 Pandoc 生成 HTML
- 确认 HTML 文件真实存在且可打开
- 用浏览器 headless 打印成 PDF
- 人工抽查 PDF 是否正常
- 仅在确认成功后清理中间文件
- 最终至少保留
MD + PDF两份
17.3 禁止事项
- 不允许只留 PDF,不留 Markdown
- 不允许在未验证 PDF 正常前删掉 HTML
- 不允许在图示报错时硬导出成最终版
- 不允许文件名仍沿用旧项目名造成混淆
第 18 章 结论
Naikaku 不是简单换名,而是把 Golutra 的核心技术吸纳进你自己的控制机、多服务器 SSH 协同和本机工作区执行体系后,形成一个更适合你长期演进的开源项目。
后续这本手册必须同时保留:
Server Operation & Maintenance Manual.mdServer Operation & Maintenance Manual.pdf
原独立文档《服务器体系教学手册》《多服务器智能体接口与字段速查手册》《多服务器智能体体系技术拆解报告》《多服务器智能体体系逐章批注版》《服务器资产与角色规划总表》现已全部吸收进本手册附录,不再作为并行真源继续维护。
附录 A 名词表
Naikaku:你基于 Golutra 技术吸纳与扩展形成的开源项目Golutra:上游参考技术项目runner:常驻执行桥primary:主工作区mirror:镜像工作区shared:公共工作区fallback:主路径不可用时自动切换到备用路径traceId:贯穿一次任务调用链的追踪 IDACK:执行机确认接单
附录 B 服务器体系教学导读(整合自《服务器体系教学手册》)
注:上面的
Cloudflare 是干什么的.md仅为被吸收源文件的历史记录;该薄索引页已于2026-04-19删除,相关正文现统一保留在本手册第 3 章。
第一章:先建立整体世界观
1. 你现在这套体系到底是什么
你现在不是只有“一台服务器”或者“一个网站”,而是在逐步搭一套完整的运行体系,里面至少包含这几层:
- 你的 Windows 本机:开发、审核、人工接管、本地资源入口;
- 主控制机:负责控制台、调度、统一 API、状态中心;
- 主运行机:负责 worker、长任务、批处理、模型调用执行;
- 弹性算力机:负责按需扩容、临时高负载任务;
- 备用实验机:负责试验、跳板、低优先级备援;
- 外层网络入口:负责域名、流量、安全、访问控制;
- 基础连接能力:SSH、密钥、隧道、systemd、数据库接入。
所以这整套体系,本质上不是“几台机器”,而是:
一套分层的控制、执行、连接、安全、部署系统。
2. 这份手册的学习顺序
这份手册建议按这个顺序看:
- 先搞懂机器分工;
- 再搞懂 Cloudflare 和内网反代;
- 再搞懂 SSH 和密钥信任;
- 再搞懂 Linux 上的 systemd;
- 最后回到你的实际机器架构和部署思路。
如果跳着看,也建议至少先看完:
- 第二章:你的机器结构
- 第三章:Cloudflare / 内网反代
- 第四章:SSH / 免密
- 第五章:systemd
第二章:你的服务器和机器是怎么分工的
1. 当前最合理的三层结构
Windows 工作站 NEVERLETMEGO
|
v
124.220.233.126(主控制机)
| | |
v v v
121.196.202.114(主运行机) 221.5.60.2:10043(弹性算力机) 111.228.6.224(备用实验机)这张图非常重要,因为它决定了以后你整理文档、部署服务、分配任务时的思路。
2. 每台机器的角色
Windows 工作站
定位:
- 开发
- 审核
- 手动接管
- 本地文件/浏览器/IDE 入口
特点:
- 人在这里干预;
- 适合做操作台;
- 不适合长期承载核心常驻服务。
主控制机:124.220.233.126
定位:
- 控制台
- 调度入口
- 统一 API
- 状态中心
- 日志汇总
- 审计与面板入口
这台机器更像你的“总控大脑”。
主运行机:121.196.202.114
定位:
- worker
- 长任务
- 队列消费
- 批处理
- 爬虫/抓取
- 模型执行
这台机器更像你的“主执行手臂”。
弹性算力机:221.5.60.2:10043
定位:
- 按需扩容
- 临时重任务
- 高峰期算力补位
- 可开可停的执行位
它适合做临时增援,不适合做唯一控制中心。
备用实验机:111.228.6.224
定位:
- 实验
- 跳板
- 灾备辅助
- 低优先级备援
它更像“实验室和备用点”。
3. 为什么要这样分层
因为如果不分层,你后面会很快进入混乱:
- 控制和执行混在一起;
- 哪台机器是入口说不清;
- 日志、状态、数据库、部署都散掉;
- 故障时不知道该查哪台。
所以你后续的一切文档、部署、自动化,都应遵守一个基本原则:
控制机负责指挥,运行机负责干活,弹性机负责补位,实验机负责试错,本机负责人工接管。
第三章:Cloudflare、内网反代、云服务器到底是什么关系
1. 先纠正常见误解
很多人会把这些词混在一起:
- Cloudflare
- 内网反代
- 云服务器
- 远程控制
- 外网访问
但这几个东西不是一回事。
云服务器是什么
云服务器是真正运行程序的机器。
比如:
- 阿里云 ECS
- 腾讯云 CVM
- 你的控制机 / 运行机 / 弹性算力机
这些才是真正“跑代码、跑服务、跑数据库、跑 worker”的地方。
内网反代是什么
内网反代本质上是:
让外部能够访问你本地内网里的服务,但不直接暴露你的真实内网地址。
最简单理解:
- 你本地电脑上跑着服务;
- 外面本来访问不到;
- 通过隧道 / 反代,你给它接出一个公网入口;
- 外面访问这个入口,实际流量被送回你本地。
Cloudflare 是什么
Cloudflare 不是你的服务器。
它更准确的定位是:
域名与服务器之间的流量中转层、安全层、DNS 管理层、Tunnel 层。
它能做:
- 域名解析;
- 免费 HTTPS;
- 隐藏源站真实 IP;
- 防火墙和访问规则;
- CDN 和流量中转;
- Cloudflare Tunnel。
2. 一句话讲清三者关系
最简单的关系是:
域名 / 外部访问
-> Cloudflare
-> Tunnel / 反代入口
-> 本地电脑或云服务器上的真实服务也可以换一种更通俗的话:
- 服务器:房子本体;
- Cloudflare:门卫 + 门禁 + 快递转发台;
- 内网反代:从外面通到你家里的隐形通道。
3. 内网反代到底有什么用
内网反代最常见、最真实的用途是:
- 让你在外面访问家里的面板;
- 让云端程序调用你本地服务;
- 给本地 API 提供一个公网入口;
- 不用直接暴露家庭公网 IP;
- 不用路由器手工开一堆端口。
它能做什么
- 让外部访问本地
Atramenti-Console; - 让云端 AI 调用本地
OpenClaw; - 做 webhook 回调;
- 做轻量远程控制入口。
它不能做什么
- 不能让已经关机的电脑继续工作;
- 不能替代云服务器;
- 不能代替真正的远程开机。
一句话记忆:
内网反代只是搭桥,不是把机器搬到云上。
4. Cloudflare 能不能控制你的服务器
不能。
Cloudflare 只能控制它那一层的规则,比如:
- 哪些 IP 能访问;
- 哪些地区能访问;
- 某些路径要不要拦;
- 是否启用缓存和 HTTPS;
- Tunnel 是否启用。
它不能:
- 登录你的服务器;
- 修改你服务器文件;
- 修改系统防火墙;
- 控制你电脑;
- 执行你的命令。
一句话:
Cloudflare 管门和流量,不管房子内部。
第四章:SSH、免密、密钥信任到底是怎么回事
1. SSH 是做什么的
SSH 就是远程登录和远程执行命令的基础通道。
你平时说“连服务器”,本质上通常就是:
- 用 SSH 登录到 Linux 服务器;
- 远程执行命令;
- 看日志;
- 部署代码;
- 改配置;
- 复制文件。
2. SSH 为什么总让人觉得绕
因为大家经常把这几个概念混起来:
- SSH 本身的连接;
- SSH 密钥;
- 免密登录;
- authorized_keys;
- 双向信任;
- 隧道和 SSH 服务本身。
要学明白 SSH,最重要的是抓住一句话:
SSH 网络连接可以双向通信,但免密信任是严格单向的。
3. 什么叫单向信任
假设有两台机器:A 和 B。
A 免密登录 B
本质操作是:
- 把 A 的公钥,写入 B 的
authorized_keys
这意味着:
- B 信任 A;
- A 可以免密登录 B;
- 但不代表 B 自动也能登录 A。
如果 B 也想免密登录 A
还必须反过来再做一遍:
- 把 B 的公钥,写入 A 的
authorized_keys
所以:
双向免密 = 两次独立配置,不存在一次配置自动双向互通。
4. 最通俗的比喻
- 公钥 = 门禁卡
authorized_keys= 门禁白名单
如果你把 A 的门禁卡登记在 B 的白名单里,表示:
- A 能进 B
- 不表示 B 也能进 A
如果你要 B 也能进 A,A 也得登记 B 的门禁卡。
5. Windows 这边记录过的授权信息
当时已经记录过一条要写入 Windows authorized_keys 的公钥:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILKMAnYszLx27pSOhju9jg0FhPW4lFn3mClOEAu2ApSz ubuntu@VM-0-12-ubuntu目标路径:
C:\Users\ASUS-KL\.ssh\authorized_keys
如果目录不存在,可先建立:
New-Item -ItemType Directory -Path "$env:USERPROFILE\.ssh" -Force
New-Item -ItemType File -Path "$env:USERPROFILE\.ssh\authorized_keys" -Force6. SSH 服务和 SSH 隧道不是一回事
这个点特别容易混。
SSH 服务
指的是:
sshd- 服务器上真正提供 SSH 登录能力的系统服务
SSH 隧道 / 穿透工具
指的是:
frpngrokcloudflared- 反向隧道命令
这些是额外用来“打洞”或“做通道”的工具。
所以:
sshd自启,不代表隧道自动自启;- 隧道要不要自启,需要单独配置。
第五章:systemd 是什么,为什么它这么重要
1. systemd 的定位
在 Linux 里,systemd 可以简单理解成:
系统服务管理器 + 开机自启管理器 + 进程守护器。
它相当于 Windows 这几样东西的组合:
- 服务管理器;
- 计划任务;
- 进程保活工具。
2. 对你有什么现实意义
在你的服务器体系里,systemd 非常适合托管这些东西:
- 控制台服务;
- API 服务;
- worker;
- 调度器;
- Tunnel 进程;
- 常驻脚本。
它能帮你做:
- 开机自启;
- 崩溃自动拉起;
- 统一启停;
- 查看状态;
- 跟系统日志打通。
3. 最常用的 systemctl 命令
systemctl start <service>
systemctl stop <service>
systemctl restart <service>
systemctl status <service>
systemctl enable <service>
systemctl disable <service>4. sshd 开机后要不要手动再启动
通常不需要。
只要 sshd 已配置为开机自启,服务器启动后它就会自动运行。
常用检查:
systemctl is-enabled sshd常用设置:
sudo systemctl start sshd
sudo systemctl enable sshd如果你只是改了配置文件,比如 sshd_config,那才需要额外 restart 一次服务使配置生效。
5. systemd 和 supervisor 怎么选
统一口径建议是:
- Windows:计划任务 + supervisor 更常见;
- Linux:优先 systemd 原生托管;
- 除非有明确理由,否则 Linux 端不必再额外叠一层 supervisor。
一句话:
Windows 常靠计划任务 + supervisor,Linux 通常直接靠 systemd。
第六章:把前面的概念落回你的实际机器
1. 当前机器总表
主控制机:124.220.233.126
已知信息:
- 主机名:
VM-0-12-ubuntu - 内网 IP:
10.0.0.12 - 系统:
Ubuntu 24.04.4 LTS - CPU:
4 核 - 内存:约
3.6 GiB - 远端目录:
/srv/atramenti-console - 服务:
atramenti-console.service - 外网入口:
https://console.tengokukk.com/(直连探测入口仍可用:http://124.220.233.126:5101)
角色:
- 控制台
- 统一 API
- 调度器
- 状态中心
- 审计入口
主运行机:121.196.202.114
已知信息:
- 云归属高概率为阿里云 ECS;
- 在
known_hosts里有历史连接痕迹; - 当前 SSH 超时;
- 系统、用户、目录、服务仍待补齐。
角色:
- worker
- 长任务
- 批处理
- 队列消费
- 模型执行
弹性算力机:221.5.60.2:10043
已知信息:
- 实例标识:
wummlp - GPU:
Virtual 高性能推理卡 - 24GB - CPU:
18 核 - 内存:
32 GB - 用户目录:
/root/workspace - 应用目录:
/root/workspace/ai-office - 已知服务:
office-web、ai-office-worker
角色:
- 按需算力
- 高峰补位
- 临时重任务
备用实验机:111.228.6.224
已知信息:
- SSH 别名:
jd-lavm-beijing/jd-lavm-yp7m9xmd5l - 系统:
Ubuntu 24.04.2 LTS - CPU:
2 核 - 内存:约
1.9 GiB - 角色偏实验、跳板、备援
2. 推荐职责分工
推荐以后统一按这个思路写文档和部署:
124.220.233.126:总控大脑121.196.202.114:主执行手臂221.5.60.2:10043:按需增援部队111.228.6.224:实验室和备用点- Windows:人工驾驶舱
3. 推荐调用链
Windows 工作站
-> 124.220.233.126(控制机)
-> 121.196.202.114(主运行机)
-> 221.5.60.2:10043(弹性算力机)
-> 111.228.6.224(备用实验机)原则:
- 外部统一入口尽量收敛到控制机;
- 状态真源尽量收敛到控制机;
- 重执行尽量放运行机;
- 峰值任务尽量放弹性机;
- 试验任务放备用机;
- 本机只做人类操作入口和资源源头。
第七章:数据库和数据底座也属于服务器体系
这部分不能因为它“不是硬件”就忽略。
1. 当前记录过的 MySQL 接入信息
在当前资料里,已经确认过:
E:\My Project\Atramenti-Console\codex\mcps\database-api复用了共享配置;- 配置来源包括:
E:\My Project\Atramenti-Console\codex\mcps\core\config.ts:199E:\My Project\Atramenti-Console\codex\mcps\core\database\manager.ts:29E:\My Project\Atramenti-Console\codex\mcps\database-api\README.md:33
默认连接信息曾记录为:
- host:
124.220.245.121 - port:
22295 - user:
openclaw - database:
cloudbase-4glvyyq9f61b19cd
2. 为什么这也要写进服务器体系
因为在真实运维里,服务器体系不只是:
- IP
- CPU
- 内存
- 磁盘
还包括:
- 数据库入口
- 配置来源
- 默认连接目标
- 服务依赖
- 权限和建库计划
如果这些不记进体系文档,后面交接和排查会断线。
第八章:以后整理这类文档时应该怎么做
1. 核心原则
以后整理这种“服务器体系”文档,目标不是把材料删薄,而是把材料分层。
也就是说:
- 要有正式版;
- 要有原始记录;
- 要有概念讲解;
- 要有待核实信息;
- 要有下一步动作;
- 要能作为教学材料继续往下扩展。
2. 哪些内容不能因为看起来重复就删掉
不能随手删的包括:
- 历史版本的机器信息;
- 待确认项;
- 不同时间点的判断差异;
- SSH、隧道、systemd、服务、日志、数据库这些基础设施信息;
- 原始探测过程;
- 得出结论的依据。
3. 推荐的文档结构
后续继续扩展时,建议采用:
- 教学主文档:讲概念和结构;
- 资产总表:讲当前统一口径;
- 原始记录归档:留现场痕迹;
- 数据库接入文档:讲数据层;
- 部署规范文档:讲怎么部署;
- 节点调度文档:讲怎么互相调用。
第九章:一句话总复盘
如果用最短的话总结你现在这套东西:
- 你的本机是人工驾驶舱;
- 控制机是总控大脑;
- 运行机是主执行手臂;
- 弹性机是按需增援部队;
- 备用机是实验室;
- Cloudflare 是门卫和流量入口;
- 内网反代是把本地服务接到外面的桥;
- SSH 是远程连接通道;
- 密钥信任是单向白名单;
- systemd 是 Linux 的服务管家;
- 数据库接入也是服务器体系的一部分。
如果以后你继续扩这份手册,最值得补的下一章通常是:
部署链路教学节点调度与回传协议控制机 / 运行机标准目录规范Cloudflare Tunnel 实战部署SSH 双向免密实战systemd 服务模板大全
附录 C 接口与字段速查(整合自《多服务器智能体接口与字段速查手册》)
一、速查总览
1.1 核心对象
| 对象 | 作用 | 关键字段 |
|---|---|---|
| Runner | 执行节点 | runnerId、machineRole、capabilities、status |
| Workspace | 执行目录视图 | workspaceId、path、kind、healthy |
| Task | 任务载体 | taskId、traceId、instruction、workspacePolicy |
| Log | 过程日志 | sequence、stream、content |
| Result | 最终结果 | finalStatus、summary、artifacts、stats |
1.2 接口索引
| 方法 | 路径 | 类别 | 一句话说明 |
|---|---|---|---|
POST |
/api/runners/register |
Runner | 注册执行节点 |
POST |
/api/runners/heartbeat |
Runner | 刷新在线与负载状态 |
POST |
/api/runners/workspaces/sync |
Workspace | 同步工作区视图 |
GET |
/api/tasks/pull |
Task | 拉取可执行任务 |
POST |
/api/tasks/ack |
Task | 确认接单并锁定 |
POST |
/api/tasks/status |
Task | 回传状态转移 |
POST |
/api/tasks/logs |
Log | 追加日志分片 |
POST |
/api/tasks/finalize |
Result | 提交终态和产物 |
POST |
/api/tasks/cancel |
Control | 控制机发起取消 |
GET |
/api/tasks/{taskId} |
Query | 查询任务详情 |
GET |
/api/runners/{runnerId} |
Query | 查询 runner 状态 |
1.3 工作区策略索引
| 策略 | 含义 | 是否允许 fallback | 适用场景 |
|---|---|---|---|
local_only |
仅主工作区执行 | 否 | 必须依赖真实本地环境 |
prefer_local |
优先主工作区,失败再退 | 是 | 默认开发任务 |
cloud_ok |
允许 mirror/shared 执行 | 是 | 分析、脚本、文档、低耦合任务 |
二、状态与时序速查
2.1 任务状态机
_ 速查图 1:任务对象状态机 _
2.2 注册时序
_ 速查图 2:Runner 注册与工作区同步时序 _
2.3 心跳 / 派单 / ACK 时序
_ 速查图 3:心跳刷新、拉任务与 ACK 连续链路 _
2.4 状态 / 日志 / finalize 回传时序
_ 速查图 4:状态、日志、终态结果回传链路 _
2.5 fallback 时序
_ 速查图 5:主执行机掉线后的 fallback 迁移链路 _
三、API Reference
3.1 全局原则
- 所有请求必须带
traceId - 所有写接口按幂等设计
- 所有时间字段统一 UTC ISO8601
- 所有终态写入必须审计
- 所有需要重试的接口必须可安全重复提交
3.2 POST /api/runners/register
作用
注册 runner 身份、能力与初始工作区视图,并建立租约。
建议请求核心字段
| 字段 | 必填 | 说明 |
|---|---|---|
traceId |
是 | 调用链追踪 ID |
runnerId |
是 | 执行机稳定唯一标识 |
runnerName |
是 | 展示名 |
machineRole |
是 | 节点角色 |
host |
是 | 主机名 |
os |
是 | 操作系统标识 |
version |
是 | runner 版本 |
capabilities |
是 | 支持执行器能力 |
maxConcurrentTasks |
是 | 最大并发 |
workspaces |
否 | 首次可同时上报工作区 |
建议响应关注点
acceptedleaseSecnextHeartbeatAfterSec- 若失败,返回原因与重试建议
3.3 POST /api/runners/heartbeat
作用
刷新 runner 在线状态、系统负载、任务占用和工作区健康视图。
建议请求核心字段
| 字段 | 必填 | 说明 |
|---|---|---|
traceId |
是 | 调用链 ID |
runnerId |
是 | 节点 ID |
sentAt |
是 | 心跳发送时间 |
status |
是 | online / draining / offline 等 |
activeTaskCount |
否 | 当前执行数 |
queueDepth |
否 | 待处理深度 |
currentTaskIds |
否 | 当前任务列表 |
workspaceHealth |
否 | 工作区健康视图 |
systemLoad |
否 | 负载信息 |
3.4 POST /api/runners/workspaces/sync
作用
对工作区注册信息做补充或刷新,控制机据此维护调度可见性。
关注点
workspaceId稳定path为真实绝对路径kind为primary/mirror/sharedhealthy/writable作为调度约束
3.5 GET /api/tasks/pull
作用
给 runner 拉取当前可执行任务列表。
关注点
- 控制机应考虑 runner 能力、工作区、锁状态和策略
- 返回可为 0 个任务,不等同于错误
- 建议返回任务时附带必要的执行约束,避免 runner 二次猜测
3.6 POST /api/tasks/ack
作用
runner 对拉到的任务进行正式确认,锁定任务归属。
关键字段
| 字段 | 说明 |
|---|---|
taskId |
任务 ID |
runnerId |
接单 runner |
workspaceId |
实际执行工作区 |
acceptedAt |
接单时间 |
leaseSec |
本次租约 |
executor |
实际执行器,例如 codex |
3.7 POST /api/tasks/status
作用
回传任务状态转移,例如 queued -> running、running -> fallback_pending 等。
建议字段
taskIdtraceIdrunnerIdstatusreasonemittedAt
3.8 POST /api/tasks/logs
作用
以分片方式追加过程日志。
关键规则
sequence单调递增- 按
taskId + sequence去重 - 大日志必须拆分
stream支持stdout/stderr/system
3.9 POST /api/tasks/finalize
作用
提交最终状态、摘要、产物和统计信息。
关键字段
| 字段 | 说明 |
|---|---|
finalStatus |
succeeded / failed / cancelled 等 |
summary |
结果摘要 |
startedAt |
开始时间 |
finishedAt |
完成时间 |
artifacts |
产物列表 |
stats |
日志行数、耗时、文件变更数等 |
3.10 POST /api/tasks/cancel
作用
由控制面主动要求停止任务。实现时要区分:
- 取消请求已发出
- 任务是否已响应取消
- 是否需要清理锁与终态审计
3.11 查询接口
GET /api/tasks/{taskId}
适合用来查看:
- 当前状态
- 所属 runner / workspace
- 过程日志摘要
- 最终结果
- fallback 历史
GET /api/runners/{runnerId}
适合用来查看:
- 在线状态
- 当前负载
- 当前任务列表
- 工作区视图与健康状态
四、JSON 样例速查
4.1 Runner 注册请求
{
"traceId": "trace_register_win_main_001",
"runnerId": "win-main-001",
"runnerName": "Windows Main Runner",
"machineRole": "primary-executor",
"host": "NEVERLETMEGO",
"os": "windows-11-23h2",
"version": "0.1.0",
"capabilities": ["codex", "claude", "gemini", "shell"],
"maxConcurrentTasks": 2,
"workspaces": [
{
"workspaceId": "ws-my-project-primary",
"name": "My Project",
"path": "E:\\My Project",
"kind": "primary",
"priority": 100,
"writable": true,
"healthy": true
}
]
}4.2 心跳请求
{
"traceId": "trace_heartbeat_win_main_001_100015",
"runnerId": "win-main-001",
"sentAt": "2026-04-17T10:00:15Z",
"status": "online",
"activeTaskCount": 1,
"queueDepth": 0,
"currentTaskIds": ["task_20260417_001"],
"workspaceHealth": [
{
"workspaceId": "ws-my-project-primary",
"healthy": true,
"writable": true,
"freeDiskGb": 128.4,
"gitAccessible": true
}
],
"systemLoad": {
"cpuPercent": 22,
"memoryPercent": 61,
"diskPercent": 48
}
}4.3 拉任务响应
{
"traceId": "trace_pull_win_main_001_100020",
"tasks": [
{
"taskId": "task_20260417_001",
"traceId": "trace_task_20260417_001",
"projectId": "proj_naikaku_cloud",
"workspacePolicy": "prefer_local",
"preferredWorkspaceId": "ws-my-project-primary",
"preferredRunnerId": "win-main-001",
"title": "修复 runner 心跳重连问题",
"instruction": "定位 runner 在网络抖动后无法恢复心跳的原因,修复并补充重试退避。",
"roleHint": "codex-engineer",
"executorHint": "codex",
"priority": "high",
"timeoutSec": 1800,
"fallbackAllowed": true,
"repoRef": "Atramenti box",
"targetPath": "golutra"
}
]
}4.4 ACK 请求
{
"traceId": "trace_ack_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"workspaceId": "ws-my-project-primary",
"acceptedAt": "2026-04-17T10:00:21Z",
"leaseSec": 1800,
"executor": "codex"
}4.5 日志分片请求
{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"sequence": 17,
"stream": "stdout",
"content": "[step] retry policy patched, running local verification...",
"emittedAt": "2026-04-17T10:03:18Z"
}4.6 最终结果请求
{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"finalStatus": "succeeded",
"summary": "已修复心跳重连逻辑,加入指数退避和状态恢复保护。",
"startedAt": "2026-04-17T10:01:00Z",
"finishedAt": "2026-04-17T10:12:00Z",
"artifacts": [
{
"type": "patch",
"name": "runner-heartbeat.patch",
"path": "artifacts/task_20260417_001/runner-heartbeat.patch",
"size": 18244,
"checksum": "sha256:abc123"
},
{
"type": "test-report",
"name": "runner-heartbeat-test.txt",
"path": "artifacts/task_20260417_001/runner-heartbeat-test.txt",
"size": 4210,
"checksum": "sha256:def456"
}
],
"stats": {
"logLines": 320,
"filesChanged": 3,
"durationSec": 660
}
}4.7 fallback 重分配请求
{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"fromRunnerId": "win-main-001",
"toRunnerId": "aliyun-backup-001",
"fromWorkspaceId": "ws-my-project-primary",
"toWorkspaceId": "ws-my-project-mirror-121",
"reason": "RUNNER_OFFLINE",
"fallbackAt": "2026-04-17T10:06:30Z",
"attempt": 1
}五、字段 Reference
5.1 Runner 字段
| 字段 | 类型 | 说明 |
|---|---|---|
runnerId |
string | 执行机稳定唯一标识 |
runnerName |
string | 展示名 |
machineRole |
enum | 节点角色 |
host |
string | 主机名 |
os |
string | 操作系统标识 |
version |
string | 版本号 |
capabilities |
array | 支持执行器能力 |
maxConcurrentTasks |
number | 最大并发 |
status |
enum | 当前状态 |
queueDepth |
number | 待处理深度 |
activeTaskCount |
number | 当前执行数 |
currentTaskIds |
array | 当前任务列表 |
5.2 Workspace 字段
| 字段 | 类型 | 说明 |
|---|---|---|
workspaceId |
string | 工作区稳定 ID |
name |
string | 名称 |
path |
string | 绝对路径 |
kind |
enum | primary / mirror / shared |
hostRunnerId |
string | 所属 runner |
priority |
number | 调度优先级 |
repoHints |
array | 仓库提示 |
writable |
boolean | 是否允许写入 |
healthy |
boolean | 健康状态 |
lastSeenAt |
datetime | 最近更新 |
5.3 Task 字段
| 字段 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务唯一 ID |
traceId |
string | 调用链 ID |
projectId |
string | 项目 ID |
workspacePolicy |
enum | 工作区策略 |
preferredWorkspaceId |
string | 首选工作区 |
preferredRunnerId |
string | 首选 runner |
title |
string | 标题 |
instruction |
string | 任务正文 |
roleHint |
string | 岗位提示 |
executorHint |
string | 执行器提示 |
priority |
enum | 优先级 |
timeoutSec |
number | 超时秒数 |
fallbackAllowed |
boolean | 是否允许回退 |
repoRef |
string | 仓库标识 |
targetPath |
string | 目标子目录 |
requiresApproval |
boolean | 是否需要人工确认 |
createdBy |
string | 创建者 |
createdAt |
datetime | 创建时间 |
metadata |
object | 扩展字段 |
5.4 Log / Result 字段
| 字段 | 类型 | 模块 | 说明 |
|---|---|---|---|
sequence |
number | Log | 日志序号 |
stream |
enum | Log | stdout / stderr / system |
content |
string | Log | 日志正文 |
emittedAt |
datetime | Log | 发出时间 |
finalStatus |
enum | Result | 最终状态 |
summary |
string | Result | 摘要 |
startedAt |
datetime | Result | 开始时间 |
finishedAt |
datetime | Result | 完成时间 |
artifacts |
array | Result | 产物列表 |
stats |
object | Result | 统计对象 |
5.5 按问题反查字段
| 你想知道什么 | 先看哪个字段 |
|---|---|
| 任务是谁创建的 | createdBy |
| 任务应该在哪个工作区优先执行 | workspacePolicy、preferredWorkspaceId |
| 任务目前在哪台 runner 上 | preferredRunnerId、runnerId |
| 当前节点能不能再接活 | status、queueDepth、activeTaskCount |
| 工作区能不能写 | writable |
| 工作区现在是否健康 | healthy |
| 日志有没有丢片 | sequence |
| 结果有没有正式产物 | artifacts |
六、错误码 Reference
6.1 错误码总表
| 错误码 | 触发条件 | 控制机动作 | Runner 动作 | 是否允许 fallback |
|---|---|---|---|---|
WORKSPACE_NOT_FOUND |
工作区不存在 | 标记 blocked 或 fallback_pending |
记录错误并终止执行 | 视策略而定 |
WORKSPACE_UNHEALTHY |
健康检查失败 | 尝试切到 mirror / shared |
回传健康快照 | 是 |
EXECUTOR_MISSING |
所需 CLI 不存在 | 改派兼容 runner | 回传缺失执行器详情 | 是 |
TASK_TIMEOUT |
超过 timeoutSec |
允许则 fallback,否则 failed | 停止执行并回传日志 | 视策略而定 |
GIT_DIRTY_BLOCKED |
工作区脏状态且策略不允许 | 进入 blocked |
保留现场并回传摘要 | 通常否 |
LOCK_CONFLICT |
工作区写锁冲突 | 重新排队或延迟重试 | 不得强抢锁 | 否 |
LOCAL_ONLY_OFFLINE |
local_only 但主机离线 |
状态转 waiting_local |
无 | 否 |
RUNNER_DRAINING |
runner 停止接单 | 改派其他 runner | 回传 draining 状态 | 是 |
RUNNER_OFFLINE |
连续心跳失联 | 标记 fallback_pending 并重新分配 |
控制机兜底 | 是 |
ARTIFACT_UPLOAD_FAILED |
产物上传失败 | 重试上传或补传 | 本地缓存待续传 | 否 |
LOG_STREAM_BROKEN |
日志回传失败 | 记录缺口并允许补传 | 本地缓存并重试 | 否 |
AUTH_INVALID |
token 失效或签名失败 | 拒绝写入并告警 | 重新注册或刷新凭证 | 否 |
6.2 按恢复策略归类
常见可 fallback
WORKSPACE_UNHEALTHYEXECUTOR_MISSINGRUNNER_DRAININGRUNNER_OFFLINE
常见不可 fallback
LOCK_CONFLICTLOCAL_ONLY_OFFLINEAUTH_INVALID
取决于策略
WORKSPACE_NOT_FOUNDTASK_TIMEOUT
七、实现检查清单
7.1 控制机实现检查
- 是否有 runner 注册租约
- 是否按工作区健康与策略做调度
- 是否区分 pull 和 ack
- 是否对 status/logs/finalize 做幂等处理
- 是否记录 fallback 迁移链
- 是否能审计终态与 artifacts
7.2 Runner 实现检查
- 是否启动前校验执行器可用性
- 是否按固定频率 heartbeat
- 是否 pull 后先 ack 再执行
- 是否日志分片带
sequence - 是否 finalize 带摘要、产物和统计
- 是否在 fallback 前释放旧锁
7.3 文档与联调检查
- 是否保留 JSON 示例的真实版本
- 是否保留字段字典与错误码表
- 是否对关键时序图持续更新
- 是否保留 Markdown 源和 PDF 成品
八、一页式总结
8.1 如果你只记 10 件事
traceId是全链路锚点ack才是正式接单workspacePolicy决定任务去哪执行primary / mirror / shared是不同语义,不只是不同目录sequence决定日志补传与去重能力finalize不只是结束,还要带摘要、产物、统计fallback要保留原 trace,不要生成平行幽灵任务RUNNER_OFFLINE与RUNNER_DRAINING是调度事件,不只是机器状态GIT_DIRTY_BLOCKED体现真实工作区保护- 文档维护必须保留
MD + PDF
8.2 一句话定位
这份速查手册的作用,是把《Server Operation & Maintenance Manual》中最容易在实现、联调、排障时反复翻找的 API、字段、样例 JSON、状态图和错误码集中压缩成一份 reference 文档。
附录 D 技术拆解与研判(整合自《多服务器智能体体系技术拆解报告》)
一、先给结论
1.1 这份手册描述的到底是什么系统
这不是一个“单纯网页 + 聊天框”的项目说明,而是一套明显的 多服务器控制面 + Runner 执行面 + 本机工作区优先 + fallback 回退 的智能体协同体系。它继承了 Golutra 的成员协作、终端编排与工作区语义,又把这些能力重新组织成 Naikaku 的多机执行架构。
1.2 这份手册里最关键的技术结论
- 前端技术栈明确写出:
Vue 3、TypeScript、Pinia、Vite - 桌面宿主与后端明确写出:
Rust、Tauri - 执行层明确出现:
PTY、进程 runtime、终端会话、快照、状态事件 - 协同层明确出现:控制机、Runner 注册、心跳、拉任务、ACK、日志回传、最终结果回传、fallback
- 文档工具链明确出现:
Markdown源文件、CSS、Pandoc、浏览器headless打印 PDF - 图示资产经文件头可确认:示例图是 PlantUML 导出的 SVG
1.3 关于 MCP / Skill 的一句话判断
这份手册的运行时架构本身不是 MCP 原生架构,它描述的是 CLI / Runner / 控制面 体系;但它的文档生产链路与当前环境中的 plantuml-diagrams、md-to-office、markdown-to-pdf 非常匹配。
二、证据矩阵:哪些是手册明写的,哪些是可推断的
| 判断项 | 结论 | 证据 | 置信度 |
|---|---|---|---|
| 前端栈 | Vue 3 + TypeScript + Pinia + Vite |
第 14.1 节直接写明 | 高 |
| 后端宿主 | Rust + Tauri |
第 14.1 节直接写明 | 高 |
| 运行时执行内核 | PTY / process runtime |
第 11.1、14.4 节直接写明 | 高 |
| 控制面协议 | Runner 注册 / 心跳 / 拉任务 / ACK / 状态 / 日志 / finalize / cancel | 第 8 章、第 12 章 | 高 |
| 多服务器调度策略 | primary / mirror / shared、local_only / prefer_local / cloud_ok |
第 5 章直接写明 | 高 |
| AI 岗位与执行器 | dispatcher、reviewer、deployer、codex-engineer、claude-researcher、gemini-tooling、shell-worker |
第 6.1 节直接写明 | 高 |
| 文档源文件机制 | Markdown + PDF 双保留 |
第 17 章、第 18 章 | 高 |
| 文档导出流程 | Pandoc -> HTML -> headless 浏览器打印 PDF |
第 17.2 节直接写明 | 高 |
| 图示引擎 | PlantUML SVG | 图文件头 <?plantuml ...?> |
高 |
plantuml-diagrams 适配度 |
可直接复刻这类图 | 图资产均为 PlantUML SVG | 高 |
md-to-office / markdown-to-pdf 适配度 |
可直接承接导出流程 | 手册明确要求 Markdown 转 HTML 再转 PDF | 高 |
drawio-diagrams 已被本手册使用 |
未见直接证据 | 图资产不是 draw.io XML 导出痕迹 | 低 |
fetch-mcp / markitdown-mcp 已被本手册使用 |
未见直接证据 | 手册内容是体系设计,不是资料抓取型文稿 | 低 |
三、这份手册里明确使用了什么技术
3.1 产品架构层技术
手册中反复出现的系统级技术思想包括:
- 控制机中心化:把
124作为统一 control plane - SSH 多服务器协同:执行机不止一台,而是主执行机、备用机、补位机协同
- 本机工作区优先:真实代码目录优先于云端镜像目录
- 任务对象化:不只靠聊天消息,而是显式 task object 驱动执行
- Runner 协议化:执行节点被抽象为 runner,并有独立协议
- 可审计闭环:不仅有结果,还有状态、日志、错误码、artifact 与 fallback 轨迹
3.2 前端技术栈
第 14.1 节把前端技术栈写得很清楚:
Vue 3TypeScriptPiniaVite
这说明前端不是传统服务端模板页,而是一个带状态管理和构建工具链的现代前端壳层。
3.3 桌面宿主与后端技术
手册明确指出它不是单一网页项目,而是:
RustTauri
也就是说,这个系统更接近 桌面应用外壳 + 本地/宿主端运行能力,而不是仅靠浏览器页面跑逻辑。
3.4 终端与执行运行时技术
运行时层出现的核心技术要素包括:
PTYprocess runtime- terminal session
- snapshot
- status event
- log stream
这类关键词说明它不是单纯调用 HTTP API 的 agent,而是把真实终端会话作为执行载体。
3.5 协议与工程治理技术
手册还明确用了这些工程协议与治理要素:
traceId贯穿调用链- UTC ISO8601 时间格式
- 写接口幂等
- 审计式终态写入
- 错误码体系
- artifact 元数据
- fallback 重新分配链路
这些内容已经非常像一套完整的控制平面协议,而不是口头规则。
四、部署结构与多服务器协同模型
4.1 部署示例图
_ 示例图 A:源手册中的多服务器控制 / 执行 / fallback 部署结构图 _
4.2 这张图说明了什么
从这张图里可以直接读出:
- 有一个明确的 124 控制机 负责控制面
- 有一个 Windows 主执行机 负责真实工作区代码修改
- 有一个 121 mirror runner 负责备用镜像工作区执行
- 还有 111 shared runner 作为补位执行位
- 所有任务、日志、结果、产物都会回流控制面做统一审计
4.3 这里体现的核心技术点
- control plane / data plane 分离
- 执行位分层:primary / mirror / shared
- 本机代码优先
- 掉线后的 fallback 派发
- 任务产物闭环
五、模块结构:这套系统有哪些核心模块
5.1 Golutra 原版总模块关系图
_ 示例图 B:Golutra 原版模块调用关系图 _
5.2 从图中可见的核心模块
图中直接出现的模块有:
FrontendBridge / Storeui_gatewaymessage_serviceorchestrationterminal_engineruntimeproject storage
这说明它不是单体模块,而是一条非常清晰的“UI -> 网关 -> 消息/编排 -> 终端引擎 -> 运行时”的链路。
5.3 前端主模块
| 模块 | 职责 | 技术含义 |
|---|---|---|
src/app |
应用壳层、窗口视图分发、启动 bootstrap | 前端入口与壳层协调 |
src/features/workspace |
工作区选择、当前工作区与项目状态 | 工作区是一级业务对象 |
src/features/chat |
聊天界面、消息列表、成员侧栏、邀请成员 | 对话仍然是任务入口之一 |
src/features/terminal |
终端窗口、终端成员会话管理、终端桥接 | 终端不是附属组件,而是主界面能力 |
src/shared |
类型、常量、组件、Tauri 封装、键盘、监控 | 共用基础设施层 |
src/stores |
orchestrator 与跨模块业务状态 | Pinia 状态中枢 |
5.4 后端主模块
| 模块 | 职责 | 技术角色 |
|---|---|---|
ui_gateway |
Tauri 命令出口层 | 前端到宿主端的命令桥 |
message_service |
项目数据、成员、聊天数据库、消息管线 | 持久化与消息组织中心 |
orchestration |
目标成员分发、聊天到终端的编排层 | 调度与目标解析层 |
terminal_engine |
终端模板、会话生命周期、轮询、快照、过滤 | 终端控制与状态汇聚层 |
runtime |
PTY、进程、状态与底层运行时 | 真正执行命令的底层层 |
platform |
路径、监控、激活、更新器 | 平台适配与宿主能力 |
contracts/ports |
契约与接口边界 | 模块间边界治理 |
5.5 聊天到终端执行链路图
_ 示例图 C:聊天消息到终端执行的链路图 _
5.6 这条链路的意义
这张图解释了为什么手册里的系统不是“聊天 UI”这么简单:
ChatInput只是入口chatBridge负责桥接ui_gateway把调用送到宿主层message_service负责消息与会话数据orchestration负责决定派给谁terminal_engine负责确保终端会话与状态采集runtime才是真正的 PTY / 进程执行层
六、协议层:Runner、Task、Workspace、Result/Log
6.1 任务状态机图
_ 示例图 D:任务对象状态机图 _
6.2 注册与工作区同步时序
_ 示例图 E:Runner 注册、租约确认与工作区同步时序 _
6.3 心跳、拉任务、ACK 连续链路
_ 示例图 F:心跳刷新可用性,并在拉任务阶段完成任务 ACK _
6.4 状态 / 日志 / 终态回传链路
_ 示例图 G:状态分片、日志分片与终态结果的审计式回传链路 _
6.5 fallback 回退时序
_ 示例图 H:Windows 主执行机掉线后切换到 mirror runner 的 fallback 链路 _
6.6 这套协议层到底定义了什么
手册实际上定义了四类核心对象:
Runner 模块
- 执行机身份:
runnerId、runnerName、machineRole - 机器状态:
status、queueDepth、activeTaskCount - 执行能力:
capabilities、maxConcurrentTasks
Workspace 模块
- 工作区身份:
workspaceId、name - 工作区定位:
path、kind - 路由信息:
hostRunnerId、priority - 可执行性:
writable、healthy
Task 模块
- 唯一性与追踪:
taskId、traceId - 派发目标:
preferredWorkspaceId、preferredRunnerId - 执行意图:
title、instruction、roleHint、executorHint - 约束与策略:
priority、timeoutSec、fallbackAllowed
Result / Log 模块
- 日志序列:
sequence、stream、content - 结果闭环:
finalStatus、summary - 产物与统计:
artifacts、stats
七、API:控制面真正暴露了什么接口
7.1 接口清单
| 方法 | 路径 | 用途 |
|---|---|---|
POST |
/api/runners/register |
runner 注册 |
POST |
/api/runners/heartbeat |
心跳上报 |
POST |
/api/runners/workspaces/sync |
工作区同步 |
GET |
/api/tasks/pull |
拉取任务 |
POST |
/api/tasks/ack |
接单确认 |
POST |
/api/tasks/status |
状态回传 |
POST |
/api/tasks/logs |
日志分片回传 |
POST |
/api/tasks/finalize |
最终结果回传 |
POST |
/api/tasks/cancel |
取消任务 |
GET |
/api/tasks/{taskId} |
查询任务详情 |
GET |
/api/runners/{runnerId} |
查询 runner 状态 |
7.2 API 原则
手册对接口风格也定了明确规则:
- 所有请求带
traceId - 所有写接口幂等
- 所有时间字段统一 UTC ISO8601
- 所有回调支持重试
- 所有终态写入必须审计
这说明它不是“能跑就行”的内部接口,而是按可重试、可审计、可追踪来设计的。
八、AI 岗位、执行器与工具入口
8.1 岗位与执行器映射
| 岗位 | 默认执行器 | 含义 |
|---|---|---|
dispatcher |
控制逻辑 | 任务接入、调度决策、回退控制 |
reviewer |
Claude / 人工 | 审查 diff、判断风险 |
deployer |
Shell | 部署、回滚、发布编排 |
codex-engineer |
Codex | 实现、重构、修 bug |
claude-researcher |
Claude | 方案分析、复杂梳理 |
gemini-tooling |
Gemini | 检索、资料整理、辅助草拟 |
shell-worker |
Shell | 构建、测试、脚本和系统操作 |
8.2 这说明它更像什么系统
这说明该体系本质上是:
- 一个有 岗位语义 的智能体平台
- 一个能把不同 CLI / 模型能力接到统一任务协议上的系统
- 一个把 模型能力 和 执行器能力 分开的架构
8.3 手册里直接出现的可调用工具线索
Windows 主执行机 SOP 里还明确提到启动前检查需要:
codexclaudegeminiqwengit
也就是说,这套体系默认就把多个 CLI 工具视作运行时依赖,而不只是单模型单入口。
九、JSON 示例:手册本身给了哪些可落地样例
9.1 Runner 注册请求示例
{
"traceId": "trace_register_win_main_001",
"runnerId": "win-main-001",
"runnerName": "Windows Main Runner",
"machineRole": "primary-executor",
"host": "NEVERLETMEGO",
"os": "windows-11-23h2",
"version": "0.1.0",
"capabilities": ["codex", "claude", "gemini", "shell"],
"maxConcurrentTasks": 2
}这个示例说明:Runner 不是匿名 worker,而是有版本、主机、角色、能力集合的正式注册对象。
9.2 心跳请求示例
{
"traceId": "trace_heartbeat_win_main_001_100015",
"runnerId": "win-main-001",
"sentAt": "2026-04-17T10:00:15Z",
"status": "online",
"activeTaskCount": 1,
"queueDepth": 0,
"currentTaskIds": ["task_20260417_001"],
"systemLoad": {
"cpuPercent": 22,
"memoryPercent": 61,
"diskPercent": 48
}
}这个示例说明:心跳不是只报“我还活着”,而是附带负载、任务占用和工作区健康信息。
9.3 拉任务响应示例
{
"traceId": "trace_pull_win_main_001_100020",
"tasks": [
{
"taskId": "task_20260417_001",
"workspacePolicy": "prefer_local",
"preferredWorkspaceId": "ws-my-project-primary",
"preferredRunnerId": "win-main-001",
"roleHint": "codex-engineer",
"executorHint": "codex",
"priority": "high",
"fallbackAllowed": true,
"repoRef": "Atramenti box"
}
]
}这个示例说明:任务里已经把“岗位”、“执行器”、“工作区策略”、“回退权限”编码进协议了。
9.4 ACK 与最终结果示例
{
"traceId": "trace_ack_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"workspaceId": "ws-my-project-primary",
"acceptedAt": "2026-04-17T10:00:21Z",
"leaseSec": 1800,
"executor": "codex"
}{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"runnerId": "win-main-001",
"finalStatus": "succeeded",
"summary": "已修复心跳重连逻辑,加入指数退避和状态恢复保护。",
"artifacts": [
{ "type": "patch", "name": "runner-heartbeat.patch" },
{ "type": "test-report", "name": "runner-heartbeat-test.txt" }
]
}这说明系统把结果输出拆成了“接单确认、过程日志、终态摘要、产物列表”几个层次。
9.5 fallback 重分配示例
{
"traceId": "trace_task_20260417_001",
"taskId": "task_20260417_001",
"fromRunnerId": "win-main-001",
"toRunnerId": "aliyun-backup-001",
"fromWorkspaceId": "ws-my-project-primary",
"toWorkspaceId": "ws-my-project-mirror-121",
"reason": "RUNNER_OFFLINE",
"fallbackAt": "2026-04-17T10:06:30Z",
"attempt": 1
}这说明 fallback 并不是口头补救,而是协议内一等公民。
十、错误码体系:它已经具备工程运行手册的味道
10.1 典型错误码示例
| 错误码 | 说明 | 是否允许 fallback |
|---|---|---|
WORKSPACE_NOT_FOUND |
工作区不存在 | 视策略而定 |
WORKSPACE_UNHEALTHY |
工作区健康失败 | 是 |
EXECUTOR_MISSING |
缺少 CLI 执行器 | 是 |
TASK_TIMEOUT |
执行超时 | 视策略而定 |
GIT_DIRTY_BLOCKED |
工作区脏状态阻塞 | 通常否 |
LOCK_CONFLICT |
工作区写锁冲突 | 否 |
LOCAL_ONLY_OFFLINE |
本地限定任务但主机离线 | 否 |
RUNNER_DRAINING |
Runner 停止接单 | 是 |
RUNNER_OFFLINE |
Runner 失联 | 是 |
AUTH_INVALID |
鉴权失效 | 否 |
10.2 这说明了什么
一份架构手册能把错误码、控制机动作、Runner 动作、fallback 许可写到这种粒度,说明这已经不是概念 PPT,而是接近可执行的系统手册。
十一、这份文档本身用了什么“文档技术”
11.1 源文件结构证据
分析对象同目录下同时存在:
Server Operation & Maintenance Manual.mdServer Operation & Maintenance Manual.pdfServer Operation & Maintenance Manual.images/*.svg
这说明它本身就是按“Markdown 源 + 图集 + PDF 成品”的方式维护的。
11.2 图示技术证据
图集中的 SVG 文件头带有:
<?plantuml 1.2026.1?>这可以高置信证明:
- 图示不是截图拼贴
- 图示是文本可维护的 SVG
- 图示工具链是 PlantUML 方向
11.3 导出技术证据
第 17.2 节明确给了导出流程:
- 编写和更新 Markdown 源文件
- 准备样式文件 CSS
- 用 Pandoc 生成 HTML
- 确认 HTML 文件真实存在且可打开
- 用浏览器 headless 打印成 PDF
- 人工抽查 PDF 是否正常
这说明该手册的文档生产不是“一键黑盒导出”,而是 Markdown -> HTML -> 浏览器打印 PDF 的受控链路。
十二、MCP / Skill 研判:哪些是能确认的,哪些只是适配建议
12.1 可以确认的结论
可以确认 1:图示工具链与 plantuml-diagrams 高度匹配
因为图资产就是 PlantUML SVG,所以在当前环境里,最匹配的能力是:
plantuml-diagrams
它适合继续维护:
- 模块调用关系图
- 时序图
- 状态机图
- 协议链路图
可以确认 2:导出工具链与 md-to-office / markdown-to-pdf 高度匹配
手册要求:
- 保留 Markdown
- 用 Pandoc 生成 HTML
- 再 headless 打印 PDF
所以在当前环境里,对应最匹配的 Skill 是:
md-to-officemarkdown-to-pdf
其中:
md-to-office更偏 Pandoc 通用导出markdown-to-pdf更偏 Markdown 到 PDF 的稳定打印链路
12.2 不能直接下结论的部分
不能确认 1:运行时用了 MCP 作为主架构
手册的运行时关键词是:
- runner
- CLI
- Shell
- Codex
- Claude
- Gemini
- qwen
- PTY
- Tauri
而不是:
- MCP server mesh
- tool registry
- MCP transport orchestration
所以更准确的说法是:
这套系统是 多执行器 / 多 CLI / Runner 控制面 架构,不是“以 MCP 为第一公民”的运行时架构。
不能确认 2:drawio-diagrams 被用来生成这些图
因为现有图资产明显是 PlantUML SVG,不是 draw.io 导出风格,所以不能把 drawio-diagrams 算作这份手册的已确认工具。
不能确认 3:fetch-mcp / markitdown-mcp 被源手册直接使用
这两类 MCP 更适合:
- 网页资料抓取
- PDF / Word / PPT 转 Markdown
而当前这份手册本身更像从架构设计和代码理解直接写出来的手册,不像“外部文档汇编稿”。
12.3 如果要继续维护这类手册,推荐的 MCP / Skill 组合
| 类别 | 推荐项 | 用途 |
|---|---|---|
| 图示 | plantuml-diagrams |
维护时序图、状态机图、模块图 |
| 导出 | md-to-office |
Pandoc 导出 Word / PDF / HTML |
| 导出 | markdown-to-pdf |
稳定打印 PDF |
| 代码理解 | repo-inspector |
从仓库结构抽模块职责 |
| 检索 | ripgrep-search |
快速定位模块名、字段名、接口名 |
| 资料输入 | fetch-mcp |
抓取网页资料做附录 |
| 资料转换 | markitdown-mcp |
外部 PDF / Office 文档并入 Markdown |
| 图示备选 | drawio-diagrams |
当图需要更自由版式时再使用 |
十三、这份手册体现出的“系统本质”
综合全文,这份手册描述的是一套:
- 以 工作区 为中心组织执行上下文
- 以 任务对象 为中心组织执行生命周期
- 以 Runner 协议 为中心组织多机协同
- 以 CLI 执行器 为中心组织模型与工具能力
- 以 审计闭环 为中心组织结果、日志、产物与错误恢复
因此,如果只把它理解成“一个聊天壳”或者“一个简单 AI 面板”,会严重低估它。
十四、最终判断
14.1 技术层面
这份手册明确覆盖了:
Vue 3 + TypeScript + Pinia + ViteRust + TauriPTY / process runtime- 控制机 API
- 多服务器 SSH 协同
- Runner 协议
- fallback 与错误恢复
- 审计式结果回传
14.2 模块层面
这份手册明确覆盖了:
- 前端模块:
src/app、workspace、chat、terminal、shared、stores - 后端模块:
ui_gateway、message_service、orchestration、terminal_engine、runtime、platform、contracts/ports - 数据模块:Runner、Workspace、Task、Result / Log
- 岗位模块:dispatcher、reviewer、deployer、codex-engineer、claude-researcher、gemini-tooling、shell-worker
14.3 MCP / Skill 层面
最准确的结论是:
- 运行时架构:不是 MCP-first,而是 Runner + CLI-first
- 图示维护:高度匹配
plantuml-diagrams - 文档导出:高度匹配
md-to-office/markdown-to-pdf - 资料扩展:后续可再叠加
fetch-mcp/markitdown-mcp
14.4 一句话总结
这份《Server Operation & Maintenance Manual》本质上是在描述一套“桌面壳 + Tauri 网关 + PTY 终端运行时 + 多 Runner 控制面 + 工作区优先策略 + fallback 协议 + 审计闭环”的多服务器智能体系统;其文档生产方式则是“Markdown + PlantUML SVG + Pandoc + headless PDF 打印”的工程化文档链路。
附录 E 逐章批注与实施说明(整合自《多服务器智能体体系逐章批注版》)
一、怎么使用这份批注版
1.1 阅读建议
- 如果你第一次接触这个体系,先看第 0~4 章,理解系统目标、角色和部署结构
- 如果你要开始实现 Runner 或控制机,重点看第 5~12 章
- 如果你要对接 CLI 执行器或本机工作区,重点看第 6、8、13、16 章
- 如果你要做二次开发或继承 Golutra,重点看第 11、14 章
- 如果你要继续维护文档本身,重点看第 17 章
1.2 本版的批注结构
每章默认包含四类说明:
- 原章作用:原章在整本手册中的任务
- 逐条解释:按原章节逐项解释它在说什么
- 实施提示:如果你真要做实现,应优先抓什么
- 边界提醒:哪些地方不能过度解读
二、第 0 章 使用索引与阅读导航:批注
2.1 原章作用
第 0 章不是“可有可无的目录页”,而是告诉你:这本手册是按 概念 -> 结构 -> 协议 -> 示例 -> 图示 -> API -> SOP -> 源码解析 -> 索引 组织的。它决定了整本手册的阅读路径。
2.2 0.1 阅读方式:批注
- 原文强调顺序阅读,说明这本手册不是松散条目,而是带推导关系的
- 先讲“定义”,再讲“角色、协议、JSON、时序”,说明作者希望先统一词汇,再谈实现
- 对实施人员来说,这一章相当于“路线图”;对排障人员来说,它相当于“定位入口”
2.3 0.2 检索索引页:批注
- 这一节把问题分成“部署与角色”“Runner 协议”“Golutra 解析”“实施与排障”四类
- 这说明作者已经把读者分成不同任务角色:架构理解者、协议实现者、源码阅读者、运维排障者
- 也说明这本手册设计时考虑了“查阅型使用场景”,不是纯展示型文档
2.4 0.3 图表索引 / 0.4 接口索引 / 0.5 术语索引:批注
- 图表索引意味着图不是装饰,而是核心信息载体
- 接口索引意味着 API 是控制面契约,不是后补内容
- 术语索引意味着
runner、fallback、traceId、orchestration这些词必须统一语义
实施提示:如果你后续继续扩写该体系,优先维护索引页,因为索引页是把手册从“文章”提升为“参考系统”的关键步骤。
三、第 1 章 项目定义:批注
3.1 原章作用
这一章负责定边界:Naikaku 到底是什么,不是什么,和 Golutra 的关系又是什么。没有这一章,后面所有技术细节都会失焦。
3.2 1.1 Naikaku 是什么:批注
- 这里把 Naikaku 定义成 多服务器协同、云端控制、本机优先执行 的 AI 员工平台
- 关键词不是“聊天”,而是“协同、控制、本机优先、自动回退”
- 也就是说,它的目标是 执行系统,不是单纯会话系统
3.3 1.2 一句话目标:批注
这句“一句话目标”实际上把系统核心策略讲完了:
- 云端控制机常驻
- 优先修改
E:\My Project的真实代码 - 本机不在线时切换到备用工作区
- 所有状态、日志、结果统一回传到面板
这 4 点可以视作整个 Naikaku 的产品铁律。
3.4 1.3 与 Golutra 的关系:批注
- 原手册没有把 Naikaku 说成“完全原创”,而是明确说是 技术吸纳与扩展
- 这是一个很重要的项目定位:继承思想,但不局限于原实现
- 文档上这么写,既减少历史割裂,也避免对外叙述失真
3.5 1.4 非目标:批注
“非目标”比“目标”更能防止系统漂移。这一节其实是在防三种误读:
- 把它误会成单页面聊天工具
- 把它误会成完全 provider-native 的托管模型平台
- 把它误会成只要 UI 改漂亮就行的壳层项目
四、第 2 章 来源、作者与项目说明:批注
4.1 原章作用
这一章解决的是合法性、来源说明和对外叙述问题。对于一个从上游技术吸纳演化出来的项目,这是必须有的。
4.2 2.1 上游项目来源:批注
- 写明
golutra仓库和官网,意味着技术血缘被显式保留 - 这对内部维护也有好处:以后可以回溯概念出处和模块原型
4.3 2.2 上游作者信息:批注
- 作者信息不是八卦信息,而是知识来源锚点
- 后续如果要继续比对设计语义,可以直接回到原作者公开材料
4.4 2.3 来源声明模板:批注
这段模板非常关键,因为它把继承点和创新点一起写进去了:
- 保留 workspace-oriented collaboration
- 保留 member-driven execution
- 保留 terminal-based orchestration
- 新增 control-plane architecture
- 新增 runner protocol
- 新增 multi-server SSH coordination
- 新增 local-workspace-first strategy
这几项几乎就是 Naikaku 的“项目说明书摘要”。
五、第 3 章 Naikaku 相对 Golutra 的创新点:批注
5.1 原章作用
这一章是整本手册的“价值主张”。如果第 1 章回答“它是什么”,第 3 章回答的就是“它为什么值得单独存在”。
5.2 3.1 继承点:批注
继承点列出的其实是 Golutra 最有价值的几个抽象:
- workspace 作为组织单元
- member 作为执行身份
- conversation 作为任务入口
- terminal session 作为执行承载
- 多 CLI 统一协作壳
这些抽象说明原项目真正有价值的不是视觉界面,而是“协作组织方式”。
5.3 3.2 创新点逐条解释
控制机中心化:批注
把 124 提升为控制面,意味着系统第一次明确区分:谁负责管理,谁负责执行。这样能把调度、注册、审计、展示集中到一个稳定位置。
SSH 多服务器协同体系:批注
这一步是把单机/单桌面壳思路,升级为多机可调度体系。执行节点从“本地终端”变成“多台可调度 runner”。
本机工作区优先执行:批注
这是 Naikaku 最有个性的设计之一:优先改真实代码目录,而不是优先云端副本。这样做更符合你现在的实际开发习惯。
离线自动回退:批注
这说明系统把“本机不在线”视为常见场景,而不是异常边角。fallback 是主流程的分支,不是事后补救。
任务对象化:批注
从聊天驱动升级到任务对象驱动以后,系统才有了:
- 队列
- 超时
- 重试
- 审计
- 回退
- 产物
这一步是工程化分水岭。
Runner 协议化:批注
Runner 被抽象成正式节点后,控制机和执行机之间才有稳定契约,而不是“某台机器上正好有个脚本在跑”。
可审计工程闭环:批注
这一点意味着系统真正关心的是:不仅做了什么,还要知道是谁做的、在哪做的、做到了什么程度、失败时怎么恢复。
_ 批注示例图 1:第 3 章的创新点最终都落在这张部署结构图里 _
六、第 4 章 机器结构与角色分工:批注
6.1 原章作用
这一章把“概念”变成“机器角色”。从这里开始,手册开始进入可部署层。
6.2 4.1 控制机:124.220.233.126:批注
控制机的职责包含:
- 云端入口
- 成员与任务管理
- runner 注册与心跳管理
- 调度决策
- 日志与结果汇总
这说明控制机更像 control plane / scheduler / audit hub 的组合。
6.3 4.2 主执行机:Windows 本机:批注
主执行机承担的是“真实代码改动”的责任,因此它的关键不是算力,而是:
- 挂载真实工作区
- 可调用 Codex / Claude / Gemini / Shell 等执行器
- 可写、可验证、可回传结果
6.4 4.3 备用执行机:121.196.202.114:批注
备用机的真正价值在于“连续性”,不是“同样重要的主开发机”。它是为了保证:
- 本机掉线时任务不断
- 长任务不压主执行机
- 脚本型任务可以并行消化
6.5 4.4 补位机:111.228.6.224:批注
补位机更偏 shared runner,用来承接:
- 公共工作区任务
- 非本地依赖型任务
- 高峰期补位执行
6.6 本章的实施重点
- 机器分工必须稳定,不要让每台机器都既是 control plane 又是 fallback 又是 artifact store
- 主执行机、备用机、补位机的职责不能混写,否则 fallback 策略会变得不可预测
七、第 5 章 工作区模型:批注
7.1 原章作用
这一章定义的是“任务到底在哪个目录执行”,这比“在哪台机器执行”还关键。
7.2 5.1 工作区类型:批注
主工作区 primary
- 代表真实开发目录
- 优先级最高
- 适合高耦合修改、真实验证和正式改动
镜像工作区 mirror
- 代表备用目录
- 用于本机离线或需要转移负载时承接执行
- 要求和主工作区保持足够近似
公共工作区 shared
- 代表不依赖本机真实代码状态的工作目录
- 适合扫描、文档、分析、脚本和低耦合任务
7.3 5.2 任务工作区策略:批注
local_only
- 最严格
- 没有本机就不能干
- 适合必须依赖真实本地环境的任务
prefer_local
- 最平衡
- 有本机就优先本机,没有再 fallback
- 这是实际开发里最实用的默认策略
cloud_ok
- 最灵活
- 可以直接在 mirror/shared 执行
- 适合资料整理、批处理、脚本分析、非核心改动
7.4 5.3 工作区注册字段:批注
工作区字段其实回答了四个问题:
- 你是谁:
workspaceId、name - 你在哪:
path - 你属于谁:
hostRunnerId - 你能不能用:
writable、healthy
实施提示:如果后续真落库,
workspaceId不要用临时路径字符串代替,应保持稳定 ID,与目录地址解耦。
八、第 6 章 AI 员工岗位设计:批注
8.1 原章作用
这一章把“模型”变成“岗位”,把“CLI”变成“执行器”。这是系统人格化与工程化结合的地方。
8.2 6.1 岗位与执行器映射:批注
dispatcher不是执行器,而是决策角色reviewer负责兜风险,不一定直接改代码deployer负责发布与回滚codex-engineer、claude-researcher、gemini-tooling分别承担不同风格的工作shell-worker负责最底层的脚本与系统动作
这说明系统希望把“谁擅长什么”内建到协议里,而不是每次靠 prompt 临时猜。
8.3 6.2 岗位设计原则:批注
这一节实际是在说三条组织原则:
- 决策层和执行层分离
- 执行层尽量绑定到明确 CLI 能力
- 高风险动作要有 reviewer / deployer 这类控制环节
8.4 本章的实施重点
roleHint和executorHint必须同时存在,前者代表业务角色,后者代表技术载体- 不能把所有工作都压给一个“万能 agent”,那会破坏本章设计初衷
九、第 7 章 任务对象规范:批注
9.1 原章作用
这一章是整本手册的核心之一,因为系统最终是围绕 Task 来流转的。
9.2 7.1 核心字段:批注
任务字段可以分成五组:
- 追踪组:
taskId、traceId - 目标组:
projectId、repoRef、targetPath - 路由组:
workspacePolicy、preferredWorkspaceId、preferredRunnerId - 执行组:
title、instruction、roleHint、executorHint - 控制组:
priority、timeoutSec、fallbackAllowed、requiresApproval
9.3 7.2 任务状态机:批注
_ 批注示例图 2:任务状态机说明任务从排队到终态的闭环 _
- 状态机的意义不是画图好看,而是确保每种状态都有语义
- 一旦有 fallback,状态图就不能只用 queued / running / done 三段式糊弄过去
- 任务状态应该能解释“为什么失败”“是否还能重试”“是否已经切换执行位”
9.4 7.3 状态转换原则:批注
这部分虽然原文不长,但非常关键:
- 状态变化必须可追踪
- 终态必须可审计
- fallback 后要保留原 trace
- 锁和归属不能混乱
十、第 8 章 Runner 协议手册:批注
10.1 原章作用
第 8 章把控制机和执行机之间的契约讲清楚,是整个控制面的协议总章。
10.2 8.1 Runner 核心标识:批注
Runner 不是“哪台机器的一次临时启动”,而是稳定节点,因此需要:
- 稳定 ID
- 展示名
- 主机信息
- 版本信息
- 能力列表
- 并发能力
10.3 8.2 注册协议:批注
注册时机
注册时机决定控制机何时信任某 runner 可用;如果没有注册租约,后续的 heartbeat/pull/ack 都没有基础。
注册请求体
注册请求体里最重要的不是机器名,而是:
- runner 能力集
- 并发上限
- 附带的工作区视图
注册响应体
响应里最重要的不是“成功”两个字,而是:
- 是否 accepted
- lease 期限
- 下一次心跳间隔建议
10.4 8.3 心跳协议:批注
心跳除了告诉控制机“我还活着”,还应该告诉它:
- 我现在忙不忙
- 我手上有哪些 task
- 工作区健康不健康
- 机器负载是否还能接活
10.5 8.4 拉任务与 ACK:批注
pull是领取候选任务ack才是锁定任务归属- 这两个动作分离,能避免“看见任务就算接单”的竞态问题
10.6 8.5 日志流协议:批注
日志流的关键设计点有三个:
sequence必须递增- 大日志必须拆片
- 控制机按
taskId + sequence去重
这意味着日志协议已经具备最基本的“可补传”能力。
10.7 8.6 Artifact 规范:批注
Artifact 是工程闭环的一部分,而不是附件。之所以列 patch、test-report、build-log、screenshot、notes,是在告诉你:执行结果不只是一句“done”。
10.8 8.7 fallback 规则:批注
fallback 前必须释放旧锁、fallback 后必须重新 ACK、traceId 保持不变——这三条就是防止任务在多 runner 之间“幽灵执行”的关键规则。
10.9 8.8 标准错误码:批注
错误码单独列在 Runner 协议章结尾,说明作者的思路很清楚:错误恢复是协议的一部分,不是运维附录。
十一、第 9 章 完整 JSON 示例:批注
11.1 原章作用
第 8 章告诉你规则,第 9 章给你样例。它的功能是让协议从“概念”进入“可以照着写”。
11.2 9.1 Runner 注册请求:批注
这个 JSON 样例说明注册时不仅要报 runner 身份,还要把工作区视图一起上交控制机。
11.3 9.2 心跳请求:批注
心跳里包含:
- 在线状态
- 正在执行的任务列表
- 系统负载
- 工作区健康信息
这使得调度器可以做更细粒度决策,而不是盲目 round-robin。
11.4 9.3 拉任务响应:批注
拉任务返回的数据已经把执行意图编码得很完整:
- 做什么:
title、instruction - 谁来做:
roleHint、executorHint - 在哪做:
preferredWorkspaceId、preferredRunnerId - 如何退:
fallbackAllowed
11.5 9.4 ACK / 日志 / 最终结果:批注
这一组样例等于把执行链拆成三段:
- ACK 锁定归属
- 日志持续上报过程
- 最终结果提交摘要与 artifacts
11.6 9.5 fallback 重新分配示例:批注
这个样例最重要的是:fallback 不是把 task 复制一份,而是记录 from -> to 的明确迁移链。
十二、第 10 章 状态机与接口时序索引页:批注
12.1 原章作用
第 10 章让“协议文字”变成“执行流图”。对于多机协同系统,图往往比文字更能暴露时序问题。
12.2 10.1 任务状态机:批注
状态机图相当于整套 task lifecycle 的地图,没有它就很难统一“何时失败”“何时可 fallback”“何时算终态”。
12.3 10.2 注册时序:批注
_ 批注示例图 3:注册、租约确认与工作区同步时序 _
这张图说明:注册和工作区同步不是同一步,但属于一个连续初始化过程。
12.4 10.3 心跳时序 / 10.4 派单时序:批注
_ 批注示例图 4:心跳、拉任务、ACK 连续链路 _
把 heartbeat、pull、ack 合在一张图里,其实是一种很好的文档决策,因为这三者在真实系统里就是连续发生的。
12.5 10.5 回传时序:批注
_ 批注示例图 5:状态、日志与终态回传链路 _
这张图强调:状态、日志、终态不是一个接口,而是三段式回传机制。
12.6 10.6 fallback 时序:批注
_ 批注示例图 6:主执行机掉线后的 fallback 链路 _
fallback 时序图的价值在于把“主机掉线后应该谁先做什么”说清楚,避免大家只会说“那就切换一下”。
十三、第 11 章 模块调用关系图:批注
13.1 原章作用
这一章解释 Golutra 现有模块是怎么连起来的,它是你继承上游设计时最重要的源码结构入口。
13.2 11.1 总体调用结构:批注
_ 批注示例图 7:原版模块调用关系图 _
这张图告诉你:
- 前端并不直接调用 runtime
- 中间要经过 bridge/store、ui_gateway、message_service、orchestration、terminal_engine
- 数据与事件在前后端之间是有层次地流动的
13.3 11.2 聊天到终端执行链路:批注
_ 批注示例图 8:聊天消息到终端执行链路 _
这条链路说明:聊天只是输入源,真正的执行路径要经过桥接、编排、终端引擎和 PTY runtime。
十四、第 12 章 124 控制机 API 规范:批注
14.1 原章作用
这章是“控制面外部契约”总表,任何 runner、调度器、控制端页面都要尊重这里的接口定义。
14.2 12.1 推荐接口清单:批注
这组接口其实就是控制面的最小 API 面:
- 注册类:
register - 维持类:
heartbeat - 路由类:
workspaces/sync、pull - 锁定类:
ack - 回传类:
status、logs、finalize - 控制类:
cancel - 查询类:
GET task/runner
14.3 12.2 API 原则:批注
traceId解决链路追踪- 幂等写接口解决重试安全
- UTC 时间解决跨机一致性
- 审计式终态解决事后追溯
实施提示:如果要先做 MVP,也不要跳过
traceId、幂等和终态审计,这三项属于最难补的基础约束。
十五、第 13 章 Windows 主执行机 SOP:批注
15.1 原章作用
这一章是把“架构设计”压到“运维动作”层。它非常像值班手册。
15.2 13.1 启动前检查:批注
启动前检查之所以把 codex、claude、gemini、qwen、git 都列出来,是因为这台机器不是普通 CI worker,而是 多执行器统一入口。
15.3 13.2 任务执行流程:批注
这条流程最值得注意的是中间几步:
- 判断本机可执行
- 申请执行锁
- 切换工作区
- 检查 git 状态
- 生成 artifact
这些步骤说明系统非常强调“现场一致性”和“执行痕迹保留”。
15.4 13.3 停机流程:批注
draining 是一个很成熟的概念,它意味着停机前先停止接新活,再处理迁移/完成现有任务,而不是直接杀进程。
15.5 13.4 本机异常处理:批注
这些异常覆盖得很实用:
- 工作区不存在
- git 脏状态
- 执行器缺失
- 即将关机
这说明作者知道真问题都发生在这些地方,而不是只写理论 happy path。
十六、第 14 章 Golutra 源码解析摘要:批注
16.1 原章作用
这是从体系设计回到源码落位的一章,用来告诉你“这些概念在原项目里大概对应哪里”。
16.2 14.1 技术栈总览:批注
手册明确写出:
- 前端:
Vue 3 + TypeScript + Pinia + Vite - 后端宿主:
Rust + Tauri
这说明它不是纯 Web App,而是桌面壳 + 本地宿主能力的组合。
16.3 14.2 顶层目录职责:批注
src:前端 UI 和交互src-tauri/src:Rust 后端与平台能力docs:说明资料scripts:辅助脚本dist:构建产物
这是一个相当清晰的目录切分,适合二次演化。
16.4 14.3 前端主模块:批注
这里最值得注意的是 src/features/terminal 和 src/stores:
- 前者说明终端不是外挂,是主功能区
- 后者说明 orchestrator 状态会跨多个模块流动
16.5 14.4 后端主模块:批注
ui_gateway -> message_service / orchestration -> terminal_engine -> runtime 这条链路几乎就是系统的后端骨架。
16.6 14.5 关键执行链路:批注
这一节把“邀请成员”“派单”“会话”三条主线说出来了,对应的是:
- 成员配置入口
- 聊天到执行的业务主线
- 终端会话生命周期主线
16.7 14.6 对 Naikaku 的启示:批注
这句“真正需要补的是 runner 注册、任务对象、工作区路由和 fallback 机制,而不是继续魔改首页”可以看作整本手册最重要的工程判断之一。
十七、第 15 章 字段字典表:批注
17.1 原章作用
这一章让协议从“样例 JSON”变成“字段参考体系”。它是后续 reference 手册的基础材料。
17.2 15.1 按模块归类:批注
Runner 模块
Runner 字段解决的是“节点身份 + 节点能力 + 节点负载”。
Workspace 模块
Workspace 字段解决的是“执行目录身份 + 所属 runner + 健康可写性”。
Task 模块
Task 字段解决的是“执行意图 + 路由约束 + 生命周期控制”。
Result / Log 模块
Result / Log 字段解决的是“过程留痕 + 终态闭环 + 产物汇总”。
17.3 15.2 按字母序索引:批注
按字母序索引的价值在于:当你只记得一个字段名,而忘了它属于哪个对象时,可以快速回溯。
十八、第 16 章 错误码与恢复动作对照表:批注
18.1 原章作用
这章是运行手册的核心之一,因为它定义了“错误发生后控制机和 runner 各做什么”。
18.2 逐类错误的批注
WORKSPACE_NOT_FOUND:说明路由对了,但目录现场不存在WORKSPACE_UNHEALTHY:说明目录还在,但状态不可靠EXECUTOR_MISSING:说明任务能派到这里,但执行器不匹配TASK_TIMEOUT:说明不是路由问题,是执行时长控制问题GIT_DIRTY_BLOCKED:说明系统显式保护脏工作区,不允许乱写LOCK_CONFLICT:说明已经考虑到并发写冲突RUNNER_OFFLINE/RUNNER_DRAINING:说明 runner 生命周期被纳入调度决策ARTIFACT_UPLOAD_FAILED/LOG_STREAM_BROKEN:说明结果与日志被当成正式数据通道维护
18.3 本章实施重点
错误码不应该只做成字符串常量,还应当绑定:
- 是否允许 fallback
- 控制机默认动作
- runner 默认动作
- 是否需要人工介入
十九、第 17 章 如何正确输出文档:批注
19.1 原章作用
这一章其实是在讲“如何长期维护工程型文档”。对这本手册自身来说,它是一条元规则。
19.2 17.1 输出原则:批注
- 永远保留 Markdown,意味着源文件优先
- 先 HTML 再 PDF,意味着把浏览器排版视为打印前验证层
- 不提前删中间产物,意味着文档链路本身也需要可回退
19.3 17.2 正确流程:批注
这套流程对应的是非常稳的导出链:
- 写 Markdown
- 准备 CSS
- Pandoc 生成 HTML
- 确认 HTML 真能打开
- 浏览器 headless 打印 PDF
- 抽查 PDF
- 再清理中间文件
- 至少保留 MD + PDF
19.4 17.3 禁止事项:批注
禁止事项比流程更值钱,因为它们定义了失败模式:
- 只留 PDF 不留 Markdown -> 以后不可维护
- 未验证 PDF 就删 HTML -> 以后不可复盘
- 图示报错还硬导出 -> 以后信息会失真
- 文件名仍沿旧项目名 -> 以后资产会混淆
二十、第 18 章 结论:批注
20.1 原章作用
这一章把全书判断压缩成一句话:Naikaku 不是简单换名,而是把 Golutra 的核心技术吸纳进新的多服务器执行体系。
20.2 结论批注
这句话有三层含义:
- 它承认上游技术来源
- 它强调你做的是控制面与执行体系重构,不是 UI 换皮
- 它要求后续继续以工程手册方式维护
二十一、附录 A 名词表:批注
21.1 原章作用
附录虽然短,但它负责把词汇冻结下来。对多角色协作系统来说,这非常重要。
21.2 关键词批注
runner:不是脚本,不是模型,而是正式执行节点primary / mirror / shared:不是路径别名,而是不同执行优先级语义fallback:不是人工手动切换,而是协议内定义的回退机制traceId:不是日志字段点缀,而是全链路关联键ACK:不是普通回执,而是任务归属确认动作
二十二、整本手册的总评
22.1 这本手册最强的地方
- 有清晰的控制面思维
- 有多服务器执行语义
- 有任务对象和 Runner 协议
- 有错误码与恢复动作
- 有图、表、JSON、SOP、源码解析的完整组合
22.2 这本手册还可以继续增强的地方
- 可以把控制机内部的 Scheduler / Audit Store 再展开一章
- 可以把 artifact 存储与上传协议单列一章
- 可以把鉴权与 token 机制单列一章
- 可以把 Runner 实现侧状态机补成更细的 reference 图
22.3 一句话评价
这不是一份“介绍型手册”,而是一份已经接近“可落地控制面规范 + 执行节点协议 + 工程运维说明”的体系化文档;逐章批注后,它更适合作为后续实施和扩写的长期母本。
附录 F 服务器资产与角色规划总表(整合自《服务器资产与角色规划总表》)
一、结论速览
当前最合理的三层结构:
Windows 工作站 NEVERLETMEGO
|
v
124.220.233.126(主控制机)
| | |
v v v
121.196.202.114(主运行机) 221.5.60.2:10043(弹性算力机) 111.228.6.224(备用实验机)角色结论:
124.220.233.126:主控制机,适合放控制台、调度、统一 API、状态中心。121.196.202.114:主运行机,适合放 worker、批处理、长任务执行。221.5.60.2:10043:Smoothcloud 弹性算力机,适合按需启停的高负载任务。111.228.6.224:备用实验机/跳板机,适合测试、实验、低优先级备援。140.143.229.144:当前对话承载机,不建议纳入长期业务主拓扑。Windows 工作站:开发、审核、手动接管、本地资源入口。
注:上面是“资产 / 角色定位”视图,不等于当前
control-plane/policy/execution-routing.json的实际调度路由。按当前 control-plane 真源,dispatcher 在124,默认执行仍是121,全局 fallback 只有 Windows;111与221已进入servers.json,但尚未写入当前 execution-routing 规则。
二、当前环境总表
| 层级 | 实体 | 定位 | 当前状态 |
|---|---|---|---|
| 人工控制层 | Windows 工作站 NEVERLETMEGO |
开发、调试、人工接管 | 本地 ssh-autoconnect / key-guard-local-bridge / desktop-session-heartbeat 真值已收口,local-file、local-config、desktop-bound 当前都可派发 |
| 主控制层 | 124.220.233.126 |
控制台、调度、统一入口、状态汇总 | 已验证可登录、可访问 |
| 美西边缘层 | 170.106.179.226 |
新购腾讯云 Lighthouse 边缘机,预留 API 网关 / 反向代理外网承载 | 云侧实例 lhins-nd7hu039 当前 RUNNING,22/tcp SSH banner 可达,但工作站尚无可用密码 / 授权密钥,系统内部署暂被凭据阻塞 |
| 主执行层 | 121.196.202.114 |
Worker、长任务、批处理、重执行 | root SSH 与 on-demand MCP 契约已验证;books-original-to-md 已在该机跑通 submit/status/fetch 闭环,当前可作为 runtime-offload 默认批处理层 |
| 停放弹性资产 | 221.5.60.2:10043 |
预留临时算力、峰值任务、可按需恢复 | 2026-04-21 复核显示工作站直连 SSH 超时、平台域名 404;当前仅保留为已登记资产,不纳入 active inventory 或 execution-routing |
| 备用辅助层 | 111.228.6.224 |
实验、跳板、灾备辅助 | 已验证可登录,但当前未纳入 execution-routing |
| 会话承载层 | 140.143.229.144 |
当前 OpenClaw 对话宿主 | 不纳入长期业务拓扑 |
当前 deploy target 覆盖结论:
control-plane/policy/deploy-targets.json当前只有一个正式 deploy target:console-dev -> cloud-shanghai-01- 也就是说,当前只有
124被正式写成部署目标;170、121、221、111、Windows 工作站与140目前都没有独立 deploy target 条目
三、机器详细档案
1. 主控制机:124.220.233.126
| 属性 | 值 |
|---|---|
| 公网 IP | 124.220.233.126 |
| 建议角色 | 主控制机 |
| 主机名(实查) | VM-0-12-ubuntu |
| 内网 IP(实查) | 10.0.0.12 |
| 操作系统(实查) | Ubuntu 24.04.4 LTS |
| CPU(实查) | 4 核 |
| 内存(实查) | 约 3.6 GiB |
| 磁盘(实查) | 40G,可用约 14G |
| SSH 登录结果 | ✅ 可直接登录 |
| SSH 用户(实查) | ubuntu |
| IP 归属(实查) | AS45090 Shenzhen Tencent Computer Systems Company Limited |
| 云归属判断 | 高概率腾讯云 CVM |
| 远端目录(已知) | /srv/atramenti-console |
| 当前服务(2026-04-20 13:55 +08:00 复核) | atramenti-console.service 当前已确认由 ubuntu 用户级 systemd 托管,需用 systemctl --user 查看;复核时 ActiveState=active、FragmentPath=/home/ubuntu/.config/systemd/user/atramenti-console.service。同机还新增 multica-daemon.service(系统级 unit,User=ubuntu,FragmentPath=/etc/systemd/system/multica-daemon.service),负责把 Mortis 的本机 agent runtime 常驻托管为 systemd 服务,已确认 enabled + active,并通过一次 systemctl kill -s TERM multica-daemon.service 人工打断验证 NRestarts=1 后能自动拉起;后续 CLI 二进制更新也已收口到 repo 内入口 make deploy-daemon-binary,不再依赖手工 stop/cp/restart。atramenti-api.service、atramenti-dispatcher.service、atramenti-node-registry.service 仍只是已登记的协同服务名,未在本轮被实证为 active。 |
| 同机独立栈(2026-04-21 14:56 +08:00 复核) | 另有一套未纳入当前 Atramenti Console control-plane 的 Multica 独立栈,现已按私人单用户品牌版收口为 Mortis:源码/运行目录在 /srv/multica,docker 容器当前为 multica-frontend-1(127.0.0.1:3300)、multica-backend-1(127.0.0.1:8088)、multica-postgres-1(127.0.0.1:55432);当前主域为 https://mortis.tengokukk.com,旧 https://golutra.tengokukk.com 已降级为 301 跳转入口;/ 与 /login 会直接进入默认工作区 mortis,后端会自动认领 emptyinkpot@users.noreply.github.com(name=emptyinkpot)并确保默认 workspace / member 存在。2026-04-20 已完成源码真源收口:/srv/multica 现已初始化为真实 git repo,origin=git@github.com:emptyinkpot/mortis-multica-source.git;2026-04-21 已继续推进到 d97a7ff mortis: load napcat accounts from shared mysql,/home/ubuntu/multica-public-watch/repo 继续只是由 /home/ubuntu/multica-public-watch/control/sync.sh 从 /srv/multica rsync 出来的公开镜像,不再视为 owning repo。为避免私有真源仓 .git 污染公开镜像仓本地 git 元数据,sync.sh 现已显式使用 source-side --exclude='.git/'。Mortis 的 OpenClaw runtime 现由 multica-daemon.service 前台托管到 Openclaw (Mortis Control 124),配置目录为 /home/ubuntu/.multica;/srv/multica/scripts/deploy-daemon-binary.sh 与 make deploy-daemon-binary 会在更新 /usr/local/bin/multica 后自动 systemctl restart multica-daemon.service。/api/runtimes/.../ping 已从完整 agent bootstrap 改为优先走 openclaw health --json --timeout 10000。同机本地绑定的个人 QQ 通知桥现已从单实例推进为三槽位多实例:/home/ubuntu/napcat/docker-compose.yml 当前定义 napcat-qq1、napcat-qq2、napcat-qq3,对应宿主端口分别为 qq-1=127.0.0.1:3600/3601/16099、qq-2=127.0.0.1:3610/3611/16109、qq-3=127.0.0.1:3620/3621/16119。共享 MySQL 124.220.245.121:22295/cloudbase-4glvyyq9f61b19cd 中已新增 mortis_napcat_accounts 作为账号池真源,当前已写入 3 个槽位;/srv/multica/.env 已切到 MORTIS_NAPCAT_ACCOUNTS_MYSQL_DSN + MORTIS_NAPCAT_ACCOUNTS_MYSQL_TABLE=mortis_napcat_accounts 单真源配置,不再使用 MORTIS_NAPCAT_ACCOUNTS_JSON 作为 live 真源。浏览器复核已确认 https://mortis.tengokukk.com/mortis/agents 的 NapCat Group Operator 设置页会成功请求 /api/agents/:id/napcat-accounts 并返回 qq-1/qq-2/qq-3 三个账号槽,且当前该 agent 已绑定 qq-1。但目前只有 qq-1 存在已登录 qq_uin=2264869713;qq-2、qq-3 仍是预留槽,尚未完成扫码登录,因此“两个不同智能体分别经不同 QQ 身份成功外发”的最终联调仍未完成。 |
| 外网访问(2026-04-19 17:56 +08:00 复核) | 当前正式外网入口已确认收敛为 https://console.tengokukk.com/:当前工作站 curl -I -L 复核为 200 OK,http://console.tengokukk.com/ 会 301 跳转到 HTTPS;同轮 https://console.tengokukk.com/api/console/summary 与 /api/novel/health 也都返回 200。http://124.220.233.126:5101 现保留为直连探测入口,而不再作为对外主入口口径。 |
| 当前进程形态(2026-04-19 14:39 +08:00 复核) | *:5101 监听 PID 与 atramenti-console.service 的 MainPID 一致;主命令仍是 node --experimental-strip-types server.mjs --port 5101,其内部继续拉起 pnpm run start / next start 作为控制台前端子进程 |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json:hostname=VM-0-12-ubuntu、sshUser=ubuntu、sshPort=22、ports.console=5101、services.console/api/dispatcher/nodeRegistry,并新增 domains.console=console.tengokukk.com、health.publicConsoleRoot=https://console.tengokukk.com/、health.publicConsoleSummary=https://console.tengokukk.com/api/console/summary、health.publicConsoleSummaryDirect=http://124.220.233.126:5101/api/console/summary;同条 server 记录现还带 cloud.provider=tencent-lighthouse、cloud.region=ap-shanghai、cloud.instanceId=lhins-jqpgc12e、cloud.zone=ap-shanghai-5,作为云侧实例观察真源。 |
| 云侧观察入口(2026-04-21 新增,2026-04-22 补自动恢复) | 工作站侧统一通过 control-plane/scripts/observe-lighthouse-instance.ps1 -ServerId cloud-shanghai-01 查询腾讯云 Lighthouse 实例状态;脚本默认把最新结果写到 .runtime/control-plane/cloud-observer/cloud-shanghai-01.status.json,并可配合 -NotifyOnStateChange 在状态切换时走 codex/apps/mortis-napcat-control/backend/send-mortis-group.ps1 发送 mortis-ops 告警。若要落成本机自动巡检,使用 control-plane/scripts/register-lighthouse-observer-task.ps1 注册 Windows 计划任务即可。当前 live 任务名已固定为 Atramenti-CloudShanghai-01-LighthouseObserver,注册参数可继续叠加 -ProbeSshBanner、-ProbeHealthEndpoints、-EnableAutoRecoverOnHang、-RecoveryCooldownMinutes 45;observer 状态文件现除实例状态外,还会记录 likelyHang、hangSignals、各探针结果与 recoveryAction。当前实测可直接读出 lhins-jqpgc12e 的 InstanceState=RUNNING、LatestOperation=RebootInstances、LatestOperationState=SUCCESS,且 latest status 为 observedStatus=healthy、likelyHang=false。 |
| deploy target(repo 真源) | 已写入 control-plane/policy/deploy-targets.json:console-dev -> cloud-shanghai-01,serviceName=atramenti-console.service,paths.srcRoot=/home/ubuntu/atramenti-console-src,paths.runtimeRoot=/srv/atramenti-console,health.publicBaseUrl=https://console.tengokukk.com/、health.publicUrl=https://console.tengokukk.com/api/console/summary、health.publicDirectUrl=http://124.220.233.126:5101/api/console/summary |
| 唯一对外 GitHub 仓(2026-04-20 收口) | https://github.com/emptyinkpot/Atramenti-Console;GitHub homepage 已对齐为 https://console.tengokukk.com/,README 顶部已显式标注站点、服务器 124.220.233.126、/home/ubuntu/atramenti-console-src 与 /srv/atramenti-console。https://github.com/emptyinkpot/my-project-root 仅作为私有工作区根备份仓,不再作为该站点的公开仓口径。 |
| 角色判断 | 适合承载控制台、统一 API、调度器、状态中心、日志汇总 |
124 控制机整机卡死快速恢复 SOP(2026-04-22 新增)
适用症状:
mortis.tengokukk.com、console.tengokukk.com、http://124.220.233.126:5101同时超时或长期无首字节。Resolve-DnsName正常,22/80/443的 TCP 仍能建立,但:- SSH 卡在 banner exchange,拿不到
SSH-2.0-... curl -vk https://...卡在 TLS 握手前后curl -I http://...已发出请求但0 bytes received
- SSH 卡在 banner exchange,拿不到
- 同步出现时,优先按
124的实例级卡死或宿主挂起处理,而不是先归因为某个前端页面、try_files、SPA fallback 或单一路由 404。
不要先下的结论:
- 在 HTTP 首字节都没回来前,不要先判断是
/mortis/*路由、rewrite、location、Next.js 页面或前端构建问题。 - 在 SSH 只完成 TCP 建连、但 banner 不返回时,不要先把问题归为单纯
nginx配置漂移。
推荐恢复顺序:
- 先做分层确认,保留证据:
Resolve-DnsName mortis.tengokukk.com -Type Acurl -vkI --connect-timeout 8 --max-time 20 https://mortis.tengokukk.com/curl -vI --connect-timeout 8 --max-time 20 http://mortis.tengokukk.com/ssh -vv -o ConnectTimeout=8 ubuntu@124.220.233.126
- 立即查询云侧真值,不再只围着 SSH 打转:
control-plane/scripts/observe-lighthouse-instance.ps1 -ServerId cloud-shanghai-01- 或
tccli lighthouse DescribeInstances --region ap-shanghai
- 如果命中“TCP 通,但 SSH banner / TLS / HTTP 都卡死”的组合,且
cloud.instanceId=lhins-jqpgc12e未变,就直接走云侧重启:tccli lighthouse RebootInstances --region ap-shanghai --cli-unfold-argument --InstanceIds lhins-jqpgc12e
- 轮询到实例恢复
RUNNING且LatestOperationState=SUCCESS后,再恢复 SSH/站点验证:- 先看 SSH banner 是否恢复
- 再看
https://mortis.tengokukk.com/是否恢复307 -> /mortis/issues - 再看
https://mortis.tengokukk.com/mortis/issues、/mortis/autopilots是否返回200
- SSH 恢复后补运行态确认:
systemctl is-active nginxsystemctl is-active dockersystemctl is-active multica-daemon.servicecd /srv/multica && sudo docker compose -f docker-compose.selfhost.yml ps
恢复判定:
- 云侧:
InstanceState=RUNNING、LatestOperationState=SUCCESS - SSH:能重新拿到
SSH-2.0-OpenSSH_...banner - Mortis:根路径
307到/mortis/issues,目标页面返回200 - 浏览器:
/mortis/issues与/mortis/autopilots实际可渲染
额外说明:
- 本次 2026-04-22 恢复中,
atramenti-console.service可以是inactive,但只要nginx、docker、multica-daemon.service与/srv/multica栈正常,Mortis 站点仍可恢复对外服务;不要把该 service 的 inactive 误判成 Mortis 恢复失败。 - 若
RebootInstances长时间停在REBOOTING / OPERATING,继续保存RequestId、轮询实例状态;一旦恢复到RUNNING / SUCCESS,优先立即验证 SSH banner 与公开站点,而不是先深入应用日志。
124 控制机整机卡死 observer 自动恢复补强(2026-04-22 新增)
当前这条 SOP 不再只停留在“人工观察后手动重启”。control-plane/scripts/observe-lighthouse-instance.ps1 已补成可探测“实例表面仍是 RUNNING,但宿主机级别已基本挂死”的 observer:
- SSH 探针:
-ProbeSshBanner会先测22/TCP,再判断是否真的读到SSH-2.0-*banner。- 若 TCP 已连通但 banner 迟迟不返回,记为一条 hang signal,而不是误判成“SSH 端口正常”。
- HTTP/TLS 探针:
-ProbeHealthEndpoints会检查publicConsoleRoot、publicConsoleSummary、publicConsoleSummaryDirect。- 探针会区分“TCP 已通但无 HTTP 响应”和“真的拿到 status code”;前者才计入 hang signal。
- likely hang 判定:
- 当前实现不是单探针触发自动重启,而是至少命中 2 条 hang signal 才把
likelyHang=true。 - 这条阈值是故意保守的:此前出现过单个 summary 端点偶发 timeout,但其它入口健康的情况;不能因为一个 probe 抖动就自动重启整机。
- 当前实现不是单探针触发自动重启,而是至少命中 2 条 hang signal 才把
- 自动恢复入口:
- 当 observer 运行在
-AutoRecoverOnHang模式下,且实例当前仍处于RUNNING且最近云侧操作不是进行中时,会直接调用:tccli lighthouse RebootInstances --region ap-shanghai --cli-unfold-argument --InstanceIds lhins-jqpgc12e
- 默认带
-RecoveryCooldownMinutes 45,避免短时间重复重启;处于 cooldown 时,状态文件会写出recoveryAction.skippedBecause=cooldown-active。
- 当 observer 运行在
- 演练 / dry-run 入口:
- 可用
-WhatIfRecovery只记录“本来会触发恢复”,但不真正发起RebootInstances。 - 这适合在改阈值、加新探针或首次部署 observer 后做烟雾验证。
- 可用
当前 canonical 执行入口:
& 'E:\My Project\Atramenti-Console\control-plane\scripts\observe-lighthouse-instance.ps1' `
-RepoRoot 'E:\My Project\Atramenti-Console' `
-ServerId cloud-shanghai-01 `
-ProbeSshBanner `
-ProbeHealthEndpoints `
-AutoRecoverOnHang `
-RecoveryCooldownMinutes 45当前 canonical 计划任务入口:
- 注册脚本:
control-plane/scripts/register-lighthouse-observer-task.ps1 - 计划任务名:
Atramenti-CloudShanghai-01-LighthouseObserver - 当前 live 注册参数:
-NotifyOnStateChange -ProbeSshBanner -ProbeHealthEndpoints -AutoRecoverOnHang -RecoveryCooldownMinutes 45 - 当前 live task action:direct
pwsh.exe -NoProfile -ExecutionPolicy Bypass -File control-plane/scripts/observe-lighthouse-instance.ps1 ... .cmdwrapper:已退场;Atramenti-CloudShanghai-01-LighthouseObserver不再经过%LOCALAPPDATA%\Atramenti-Console\scheduled-tasks\*.cmd或cmd.exe /c
验收口径:
- 正常态:
.runtime/control-plane/cloud-observer/cloud-shanghai-01.status.json应显示observedStatus=healthy、likelyHang=false,并能看到 SSH banner 与 3 个 health probe 成功返回。 - 异常态:若再次出现“TCP 通但 SSH banner / HTTP 首字节都不回来”的组合,observer 应先把
hangSignals写清楚,再决定是否进入recoveryAction。 - 自动恢复态:一旦真实触发
RebootInstances,状态文件与mortis-ops告警应同时留下requestId与signals,便于回溯是否误判。
2. 主运行机:121.196.202.114
| 属性 | 值 |
|---|---|
| 公网 IP | 121.196.202.114 |
| 建议角色 | 主运行机 |
| IP 归属(实查) | AS37963 Hangzhou Alibaba Advertising Co.,Ltd. |
| 云归属判断 | 高概率阿里云 ECS |
| SSH 登录结果(2026-04-20 实时复核) | ✅ root@121.196.202.114 可登录;当前派发不再以恢复 ubuntu 账户为前提 |
| 主机名(2026-04-20 实时复核) | iZbp1e1lcototdd38ss8q2Z |
| 操作系统(2026-04-20 实时复核) | SSH Banner 为 OpenSSH_8.9p1 Ubuntu-3ubuntu0.14 |
| 目录(2026-04-20 实时复核) | /srv/mcp-runtime、/srv/mcp-runtime/apps/codex-portable-mcps、/srv/mcp-runtime/work 均存在 |
| 当前运行契约(2026-04-20 实时复核) | 该机当前不是常驻 atramenti-worker.service / atramenti-publisher.service / atramenti-queue-consumer.service 模式,而是 on-demand MCP execution only:由 124.220.233.126 通过 SSH 调用 /srv/mcp-runtime/bin/runtime-mcp-ondemand.sh 按次启动 MCP |
| 运行证据(2026-04-20 实时复核) | /srv/mcp-runtime/OPERATING-MODE.md 已明确写明 on-demand 模式;/srv/mcp-runtime/logs/on-demand/launch.log 持续记录近期 context-store、database-ops-mcp(旧 db-readonly 兼容链路)、log-diagnose、output-guard、prompt-compressor、repo-inspector、ripgrep-search 等启动 |
| 最新批处理验证(2026-04-21 实测) | control-plane/scripts/offload-books-original-to-md.ps1 已按 runtime-offload -> cloud-hangzhou-01 路由把 books-original-to-md 批处理提交到该机;books-original-to-md-smoke-20260421-02 与 books-original-to-md-smoke-20260421-03 两轮 smoke 都已完成,远端任务根为 /srv/mcp-runtime/work/jobs/books-original-to-md/<jobId>,其中 smoke-03 已验证 submit -> status -> fetch 全链路,产物成功回收至本机 codex/_artifacts/books-original-to-md-20260421/offload-jobs/<jobId>/fetched。同日 control-plane/scripts/offload-markitdown-batch.ps1 也已跑通 markitdown-batch-smoke-20260421-01,当前 markitdown-batch 批处理同样可由本机提交到 /srv/mcp-runtime/work/jobs/markitdown-batch/<jobId> 后再回收 output/markdown 与 output/artifacts。 |
| 外网端口(2026-04-20 实时复核) | 22 可达;当前未承诺对外 Web 入口,也不以 5101 作为该机健康契约 |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json:hostname、sshUser=root、sshPort=22、关键目录,以及 runtimeContract.mode=ssh-on-demand-mcp、runtimeContract.wrapper/bundleRoot/workRoot/launchLog/controlNode;旧 atramenti-worker.service / atramenti-publisher.service / atramenti-queue-consumer.service 已从静态真源移除 |
| 当前缺口 | 当前已不再阻塞派发;books-original-to-md 这类重批处理也已收口到该机执行。剩余待收口项只是是否补专用非 root 运维账户,而不是先恢复三个常驻 worker systemd 服务 |
| 角色判断 | 适合承载 mirrored workspaces、portable MCP on-demand offload、批处理、长任务执行与重计算 |
3. 弹性算力机:221.5.60.2:10043(Smoothcloud / wummlp)
| 属性 | 值 |
|---|---|
| 公网入口 | 221.5.60.2:10043 |
| 实例标识 | wummlp |
| 实例类型 | 推理实例 |
| GPU | Virtual 高性能推理卡 - 24GB |
| CPU | 18 核 |
| 内存 | 32 GB |
| 存储空间 | 100GB |
| SSH 登录结果(2026-04-21 当前复核) | Windows 工作站直连 root@221.5.60.2 -p 10043 超时;Mortis 容器侧同端口 TCP 探测报 ECONNREFUSED,已不再按“入口在线”口径记录 |
| Jupyter 入口 | http://wummlp-sc15226177014.smoothcloud.com.cn(2026-04-21 当前 404) |
| 镜像 | harbor.smoothcloud.com.cn/smoothcloud/torch210_cuda131_conda:v1 |
| 用户目录 | /root/workspace |
| 已知应用根目录 | /root/workspace/ai-office |
| 已知服务记录 | office-web、ai-office-worker |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json:当前以 enabled=false 停放保留,继续记录 sshUser=root、sshPort=10043、paths.workspaceRoot / paths.appRoot 与已知服务名;2026-04-21 起不再把 health.publicJupyter / sshProbe 作为 active 健康检查真源 |
| 当前缺口 | 若未来要重新启用,需先恢复平台侧认证/入口,再重新实查 SSH、平台域名与实际服务后才能改回 active 节点 |
| 角色判断 | 当前应按“停放的弹性资产 / 预留平台实例”理解,而不是已接入的弹性执行层 |
4. 备用实验机:111.228.6.224
| 属性 | 值 |
|---|---|
| 公网 IP | 111.228.6.224 |
| SSH 别名 | jd-lavm-beijing / jd-lavm-yp7m9xmd5l |
| 当前登录结果 | ✅ 可通过现有 SSH 配置登录 |
| 主机名(实查) | lavm-yp7m9xmd5l |
| 操作系统(实查) | Ubuntu 24.04.2 LTS |
| CPU(实查) | 2 核 |
| 内存(实查) | 约 1.9 GiB |
| 磁盘(实查) | 约 39G,可用约 31G |
| IP 归属(实查) | AS141679 China Telecom Beijing Tianjin Hebei Big Data Industry Park Branch |
| 当前服务(2026-04-19 实时复核) | atramenti-lab.service 当前 inactive |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json:hostname、sshPort=22、SSH aliases jd-lavm-beijing / jd-lavm-yp7m9xmd5l、services.lab=atramenti-lab.service |
| 云归属判断 | SSH 命名像京东云/LAVM,但不能仅凭 IP 归属坐实 |
| 角色判断 | 适合做实验机、跳板机、备用节点、轻量备援 |
5. 美西边缘机:170.106.179.226(Tencent Lighthouse / Silicon Valley)
| 属性 | 值 |
|---|---|
| 公网 IP | 170.106.179.226 |
| 实例 ID(云侧实查) | lhins-nd7hu039 |
| 实例名(云侧实查) | Ubuntu-3Su1 |
| 地域 / 可用区(云侧实查) | na-siliconvalley / na-siliconvalley-1 |
| 云归属判断 | 腾讯云 Lighthouse(美西购买区;控制面地域字面值为 Silicon Valley) |
| 规格(云侧实查) | 2C / 4G,系统盘 60GB CLOUD_SSD |
| 操作系统(云侧实查) | Ubuntu Server 24.04 LTS 64bit |
| 当前实例状态 | RUNNING |
| SSH 登录结果(2026-04-22 当前复核) | ⚠️ 22/tcp 与 SSH host key 可达;ssh -o BatchMode=yes ubuntu@170.106.179.226 与 root@170.106.179.226 均返回 Permission denied (publickey,password),说明入口在线但当前工作站没有可用凭据 |
| 当前防火墙(云侧实查) | 已放行 22/tcp、80/tcp、ICMP 到 0.0.0.0/0;443/tcp 尚未在当前规则中开放 |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json:id=cloud-siliconvalley-01、roles=gateway-host/edge-proxy/standby、cloud.provider=tencent-lighthouse、cloud.region=na-siliconvalley、cloud.instanceId=lhins-nd7hu039、health.sshProbe=170.106.179.226:22 |
| 当前缺口 | 还没有可信 SSH 密码或已授权公钥,因此无法继续完成系统内目录创建、Docker/Compose 安装、Nginx/证书签发与 API 网关迁移;当前 blocker 不在腾讯云 API,而在实例登录凭据 |
| 角色判断 | 适合承载对外 API key 中转 / 反向代理的美西边缘入口,但当前只完成了云侧接管与资产入表,尚未完成系统内部署 |
6. 当前对话服务器:140.143.229.144
| 属性 | 值 |
|---|---|
| 公网 IP | 140.143.229.144 |
| 主机名(你提供) | VM-52-211-ubuntu |
| 当前用途 | 当前 OpenClaw 对话承载机 |
| 当前可达性(2026-04-19 实时复核) | 22 端口不可达;http://140.143.229.144:5101/ 请求超时 |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json 作为 disabled 的 session-host 条目;只用于资产映射,不参与当前 execution-routing 或长期业务拓扑 |
| 角色判断 | 不建议纳入长期业务主拓扑 |
| 原因 | 更像当前代理/会话宿主,而不是已固定部署链路的业务机器 |
7. Windows 工作站:NEVERLETMEGO
| 属性 | 值 |
|---|---|
| 主机名 | NEVERLETMEGO |
| 用户 | ASUS-KL |
| 访问方式 | 反向隧道 / 本地 SSH 监听 127.0.0.1:22222;控制面 live 健康改以反向 bridge 127.0.0.1:18765 为准 |
| OpenClaw 工具 | winps、wincmd 可用 |
| Mortis runtime(2026-04-19 19:32 +08:00) | 已安装 C:\Users\ASUS-KL\bin\multica.exe,配置文件为 C:\Users\ASUS-KL\.multica\config.json,本机 daemon 019da583-05f2-7927-95b6-5798e1e0dd77 已在线注册 Codex (NEVERLETMEGO) 与 Openclaw (NEVERLETMEGO) 两个 runtime 到 https://mortis.tengokukk.com |
| SSH 服务(2026-04-19 实时复核) | 22222 端口可达,SSH Banner 为 OpenSSH_for_Windows_9.8;存在 sshd 进程,但 Get-Service sshd 返回 missing |
| 当前认证状态(2026-04-20 实时复核) | ssh -o BatchMode=yes -p 22222 ASUS-KL@127.0.0.1 "echo ok-local-22222" 已成功返回 ok-local-22222,本地 SSH 公钥认证链已恢复 |
| repo 静态真源状态 | 已写入 control-plane/registry/servers.json:sshUser=ASUS-KL、sshPort=22222、ports.keyGuardBridge=18765、paths.codexRoot/openclawRoot/runtimeRoot、health.localSshListener、health.reverseBridgeHealth、health.reverseBridgeWorkstation、health.reverseTunnelSupervisor |
| 本地调度状态(2026-04-20 15:38 +08:00 实时复核) | .runtime/deploy/local-tools/ssh-autoconnect.status.json 当前为 connected,watcher=true、tunnelActive=true、bridgeListening=true;key-guard-local-bridge.status.json 当前为 idle;desktop-session-heartbeat.status.json=active,并已带 watcherPid、guardianPid、watchIntervalSeconds=10、guardianStaleAfterSeconds=35 等字段,表示活动控制台会话、explorer.exe 与本机显示器仍被持续观测;控制面消费侧应只在桌面心跳新鲜时把工作站视为 desktop-bound 可派发 |
| 推荐角色 | 开发、审核、手动接管、本地文件/浏览器/IDE 入口,以及 Mortis 的补充本机 runtime 宿主 |
| 注意事项 | 不适合长期承载核心常驻服务;当前 local-file / local-config / desktop-bound 的可信度都依赖 .runtime/deploy/local-tools/*.status.json;其中 desktop-bound 现在不再只赌 ssh-autoconnect 顺带刷新,而是由 desktop-session-heartbeat.ps1 自己的 watcher + guardian 双层守护持续刷新,并通过 publish-workstation-status.ps1 自动镜像到 124 的 source/runtime 状态目录;控制面会把超过 45s 未更新的桌面心跳视为 stale,自动撤销 desktop-bound 派发能力,而不是沿用旧的 active 假象 |
6.1 Mortis / multica daemon / codex / openclaw 的本机链路说明
6.1.1 角色分工
在 NEVERLETMEGO 这条链上,推荐统一按下面口径理解:
Mortis:控制面。负责展示项目、issue、run、runtime,以及把任务派发给在线 runtime。multica daemon:本机接单层。持续连接https://mortis.tengokukk.com,认领任务、拉起 provider、回传状态/消息/结果。codex:本机 coding provider,适合文件修改、命令执行、最小 proof 之类任务。openclaw:本机另一条 provider 通道,适合复用 OpenClaw 本地能力与插件链。
可以把这条链简化记成:
Mortis 页面/控制台
-> multica daemon(本机常驻接单进程)
-> codex / openclaw(本机实际执行者)
-> 本机文件、命令、工作目录
-> 执行结果回传 Mortis6.1.2 本机当前关键路径
当前 NEVERLETMEGO 上与这条链直接相关的关键路径如下:
| 项目 | 当前路径 / 值 | 说明 |
|---|---|---|
multica 二进制 |
C:\Users\ASUS-KL\bin\multica.exe |
本机 daemon / CLI 可执行文件 |
multica 配置 |
C:\Users\ASUS-KL\.multica\config.json |
指向 https://mortis.tengokukk.com 的本机客户端配置 |
| daemon 日志 | C:\Users\ASUS-KL\.multica\daemon.log |
查接单、provider 启动、报错、完成状态的第一现场 |
| 默认 Codex profile | C:\Users\ASUS-KL\.codex |
默认共享 profile;本轮已实证会触发 API key 并发问题 |
| 当前成功重试 profile | C:\Users\ASUS-KL\.codex-apikey |
MOR-2 成功时 daemon 实际使用的 CODEX_HOME |
| 本机 proof 文件 | E:\My Project\.atramenti-demo\codex-local-proof.json |
用来证明本机 codex runtime 已真实写文件 |
6.1.3 当前 live 运行状态(2026-04-19)
本轮已验证:
- 本机 daemon 正在运行,状态可通过
multica daemon status --output json看到; - 当前挂到 Mortis 的本机 runtime 为:
Codex (NEVERLETMEGO):a33ec2ef-6d85-4d34-9be9-bced2519e97aOpenclaw (NEVERLETMEGO):288d44e6-05aa-489b-9ea1-3a6c6c451246
- 本机 daemon id 为
019da583-05f2-7927-95b6-5798e1e0dd77 - 当前已验证成功的一次本机 codex 实跑,是通过 daemon 以
CODEX_HOME=C:\Users\ASUS-KL\.codex-apikey启动后完成的
6.1.4 最小排查命令
后续如果你怀疑“Mortis 页面有任务,但本机没动”,先看下面三类检查:
multica daemon status --output json看 daemon 是否 running,以及是否仍挂着 codex / openclaw 两个 provider。
Get-Content 'C:\Users\ASUS-KL\.multica\daemon.log' -Tail 200看 daemon 是否真正 picked task、provider 是否启动、是否有 status=completed 或错误。
Get-Content 'E:\My Project\.atramenti-demo\codex-local-proof.json'看本机 proof 文件是否真实存在、内容是否更新。
6.1.5 本轮实证:MOR-1 失败,MOR-2 成功
这一轮已经把“本机 runtime 在线”与“本机 runtime 真的执行过任务”区分开,并补了闭环证据:
MOR-1/23f12d73-4a3b-4cb5-8e6c-f406d8bb69ba- daemon 已成功 claim 任务;
- 但
codex侧因默认 profileC:\Users\ASUS-KL\.codex命中 API key 并发上限而失败; - 这说明“runtime online”不等于“任务一定能执行成功”。
MOR-2/cea49965-243e-45cb-8a97-af134b12343e- 把 daemon 切到
CODEX_HOME=C:\Users\ASUS-KL\.codex-apikey后重试成功; - run id:
75d951b1-65d3-4807-9808-bb5884665f8a - 结果:成功写入
E:\My Project\.atramenti-demo\codex-local-proof.json
- 把 daemon 切到
6.1.6 后续优先看的三边证据
以后如果要确认“这条链到底有没有真跑起来”,优先按下面三边证据看,不要只看页面上是否显示 online:
- Mortis 页面
- 项目
Runtime 扩编 - issue
MOR-2 本机 codex 最小写文件 proof(重试) - issue 状态
in_review / 待审核
- 项目
- daemon 日志
C:\Users\ASUS-KL\.multica\daemon.log- 关键字:
picked task、exec_command、codex finished、status=completed
- 本机真实文件
E:\My Project\.atramenti-demo\codex-local-proof.json
6.1.7 当前注意事项
multica daemon只是本机接单与回传层,不是网页、不是模型、也不是 provider 本身;- 如果 daemon 后续重启时又退回默认
C:\Users\ASUS-KL\.codex,同类 API key 并发问题可能再次出现; - 因此当前关于 Codex lane 的最关键运维注意事项,不是“runtime 是否在线”,而是“daemon 启动时到底用了哪个
CODEX_HOME”; - 这条链当前已经证明确实能落地到本机文件系统,但是否要把
.codex-apikey固化成长期 daemon profile,仍属于后续运维决策项。
四、推荐职责分工
1. 控制层:124.220.233.126
负责:
- Web 控制台
- 统一 API 入口
- 任务调度与派发
- 节点注册与心跳
- 状态真源
- 审计日志与告警汇总
- 面板与审批入口
不建议放:
- 重型模型推理
- 长时间占满 CPU 的批任务
- 高并发爬虫或大规模离线处理
2. 执行层:121.196.202.114
负责:
- Worker 执行
- 长任务处理
- 队列消费
- 爬虫/抓取
- 发布流水线
- 批处理
- 模型任务执行
不建议放:
- 主控制台
- 唯一状态存储入口
- 对人交互的主面板
3. 弹性层:221.5.60.2:10043
负责:
- 峰值任务卸载
- 临时高算力任务
- 按需模型推理
- 可停可开的弹性执行位
不建议放:
- 唯一真源状态
- 核心控制入口
- 必须长期在线的关键服务
4. 备用层:111.228.6.224
负责:
- 实验环境
- 新版本试跑
- 跳板/中继
- 低优先级备援
- 灾备辅助
五、推荐拓扑
Windows 工作站
-> 124.220.233.126(控制机)
-> 121.196.202.114(主运行机)
-> 221.5.60.2:10043(弹性算力机)
-> 111.228.6.224(备用实验机)调用原则:
- 对外统一入口尽量只保留在
124.220.233.126。 121、221、111尽量不直接暴露为主业务入口。- 控制机负责下发任务,运行机/弹性机负责执行并回传状态。
- 重要状态、审计和结果索引尽量汇总回控制机。
六、建议目录与服务规范
控制机目录建议
/srv/atramenti-console/
apps/
control/
runtime/
state/
logs/
artifacts/
scripts/运行机目录建议
/srv/atramenti-runner/
workers/
jobs/
queue/
cache/
logs/
artifacts/
scripts/弹性机目录建议
/root/workspace/ai-office/
apps/
runtime/
tmp/
logs/推荐服务 / 运行契约划分
| 机器 | 服务 | 职责 | 真源状态 |
|---|---|---|---|
124 |
atramenti-console.service |
控制台主入口 | 已入 servers.json |
124 |
atramenti-api.service |
API 层 | 已入 servers.json |
124 |
atramenti-dispatcher.service |
调度派发 / 智能体协同控制面 | 已入 servers.json |
124 |
atramenti-node-registry.service |
节点注册 / 心跳 | 已入 servers.json |
121 |
/srv/mcp-runtime/bin/runtime-mcp-ondemand.sh |
由 124 通过 SSH 按次拉起 MCP 的统一 dispatch wrapper |
已入 servers.json.runtimeContract.wrapper |
121 |
/srv/mcp-runtime/apps/codex-portable-mcps |
便携 MCP bundle 真源 | 已入 servers.json.paths.bundleRoot 与 servers.json.runtimeContract.bundleRoot |
121 |
/srv/mcp-runtime/logs/on-demand/launch.log |
on-demand 启动审计账本 | 已入 servers.json.runtimeContract.launchLog |
221 |
ai-office-worker |
弹性执行 worker | 已入 servers.json |
221 |
smoothcloud-controller |
实例控制 | 当前仅手册推荐 / 规划项,未进入静态真源 |
111 |
atramenti-lab.service |
实验/备援服务 | 已入 servers.json |
当前已部署网页前端 / 域名清单
以下清单只收录两类入口:
- 有 repo 静态配置、模块真源或现有手册/审计证据支持的网页前端;
- 2026-04-19 从当前工作站实际发起 HTTP 探测时,能够明确看到当前状态的公网入口。
A. 当前可访问的控制台前端(正式域名 console.tengokukk.com,反代到 124.220.233.126:5101)
| 前端 / 页面 | 公网入口 | 最后已验证状态 | 证据来源 |
|---|---|---|---|
| Atramenti Console Shell | https://console.tengokukk.com/ |
2026-04-19 17:56 +08:00 当前工作站复核 200 OK,且 http://console.tengokukk.com/ 已确认 301 -> HTTPS |
control-plane/registry/servers.json + control-plane/policy/deploy-targets.json + codex/_artifacts/server-live-status-20260419.md + codex/_artifacts/console-domain-home-20260419.png |
| 小说管理 | https://console.tengokukk.com/novel |
同日 200 OK,且已完成页面加载闭环复核 |
codex/mcps/novel-manager/module.json + codex/_artifacts/novel-page-loaded-20260419.png + 同日 HTTP 证据 |
| 部署中心 | https://console.tengokukk.com/deploy-center/ |
同日 200 OK |
codex/mcps/deploy-center/module.json + 同日 HTTP 证据 |
| 自我调试闭环 | https://console.tengokukk.com/self-debug-closed-loop |
同日 200 OK |
codex/mcps/self-debug-closed-loop/module.json + 同日 HTTP 证据 |
| 系统总览 | https://console.tengokukk.com/system-overview/ |
同日 200 OK |
codex/mcps/system-overview/module.json + 同日 HTTP 证据 |
| 运维观测中心 | https://console.tengokukk.com/ops-observer |
同日 200 OK |
codex/mcps/ops-observer/module.json + 同日 HTTP 证据 |
| AI Gateway Control | https://console.tengokukk.com/vscode-key-guard/ |
同日 200 OK |
codex/mcps/vscode-key-guard/module.json + 同日 HTTP 证据 |
| 数据库 API 页面 | https://console.tengokukk.com/database-api/ |
同日 200 OK |
codex/mcps/database-api/module.json + 同日 HTTP 证据 |
| 文件管理 | https://console.tengokukk.com/file-manager |
同日 200 OK |
codex/mcps/file-manager/module.json + 同日 HTTP 证据 |
| 经验中心 | https://console.tengokukk.com/experience |
同日 200 OK |
codex/mcps/experience/module.json + 同日 HTTP 证据 |
| 飞书中心 | https://console.tengokukk.com/feishu |
同日 200 OK |
codex/mcps/feishu-center/module.json + 同日 HTTP 证据 |
| 自动化中心 | https://console.tengokukk.com/automation |
同日 200 OK,且已做过浏览器加载闭环 |
codex/mcps/automation/module.json + 同日浏览器 / HTTP 证据 |
| 模型中心 | https://console.tengokukk.com/ai-hub |
同日 200 OK |
codex/mcps/ai-model-hub/module.json + 同日 HTTP 证据 |
| Qwen3 TTS | https://console.tengokukk.com/qwen3-tts |
同日 200 OK |
codex/mcps/qwen3-tts/module.json + 同日 HTTP 证据 |
| Superset BI | https://console.tengokukk.com/superset |
同日 200 OK |
codex/mcps/superset-bridge/module.json + 同日 HTTP 证据 |
| AGHub | https://console.tengokukk.com/aghub |
同日 200 OK |
codex/mcps/aghub-bridge/module.json + 同日 HTTP 证据 |
A2. 当前可访问的独立站点(不属于 Atramenti Console 5101 模块树)
| 前端 / 页面 | 公网入口 | 最后已验证状态 | 证据来源 |
|---|---|---|---|
| Mortis(基于 Multica 私有化收口) | https://mortis.tengokukk.com/ |
同日已确认 / 返回 307 -> /mortis/issues、/about 返回 200 OK;旧 https://golutra.tengokukk.com/ 已改为 301 -> https://mortis.tengokukk.com/... |
/srv/multica/.env + /srv/multica/apps/web/lib/site-url.ts + /srv/multica/apps/web/features/landing/* + /srv/multica/packages/views/auth/login-page.tsx + /srv/multica/server/internal/service/email.go + /etc/nginx/sites-available/mortis.tengokukk.com.conf + /etc/nginx/sites-available/golutra.tengokukk.com.conf + docker-compose.selfhost.yml + codex/_artifacts/mortis-root-cn-20260419.png + codex/_artifacts/mortis-about-cn-20260419.png |
| MyBlog(当前唯一 live 首页为紫色 workbench) | https://blog.tengokukk.com/ |
2026-04-21 12:20 +08:00 已复核首页返回 200 OK,并确认可见 GitHub 热力图、语言占比、近 6 个月 与 GITHUB SIGNALS / 团队信号;服务器侧源码副本 /srv/myblog/repo 已删除,当前只保留 GitHub 单一源码真源 + 运行目录 /srv/myblog/site |
https://github.com/emptyinkpot/emptyinkpot.github.io(main@52b8c4f) + /etc/nginx/sites-available/myblog.conf + C:\Users\ASUS-KL\AppData\Local\Temp\myblog-live-deploy-20260421.png |
| AIClient-2-API Gateway(独立模型网关) | https://gateway.tengokukk.com/ |
2026-04-22 07:34 +08:00 已复核公网首屏跳转到 /login.html,标题为 登录 - AIClient2API,且 https://gateway.tengokukk.com 返回 200 OK |
/srv/aiclient2api/docker-compose.yml + /srv/aiclient2api/configs/pwd + /etc/nginx/sites-available/gateway.tengokukk.com.conf + codex/_artifacts/task-packs/20260422-aiclient2api-deploy/evidence/gateway-home-20260422.png |
B. 已登记但当前不算“在线前端”的网页入口
| 入口 | 当前状态 | 归类说明 | 证据来源 |
|---|---|---|---|
http://wummlp-sc15226177014.smoothcloud.com.cn |
404 |
221 的平台侧网页入口 / Jupyter 域名记录,当前不计入在线前端清单 |
control-plane/registry/servers.json + server-live-status-20260419.md + 当轮 HTTP 实测 |
C. 明确不纳入“前端域名清单”的网页相关入口
| 入口 | 原因 |
|---|---|
https://api.tengokukk.com/api/health |
当前只看到 API 健康检查证据,没有前端页面证据,因此不作为“网页前端域名”入表 |
http://127.0.0.1:5101/* |
这是本地回环访问地址,用于开发 / 说明,不是公网部署域名 |
D. 双视图一:按服务器分组
| 服务器 | 已确认网页前端 / 域名 | 最后已验证状态 | 备注 |
|---|---|---|---|
124.220.233.126 |
https://console.tengokukk.com/ |
2026-04-19 17:56 +08:00 当前工作站复核 200 OK;http://console.tengokukk.com/ 正常 301 -> HTTPS |
当前正式控制台前端入口;repo 真源与远端 runtime 已同步写入该域名 |
124.220.233.126 |
https://console.tengokukk.com/novel、/experience、/automation、/system-overview/ |
同日逐页验证为 200 OK |
Core 业务分组 |
124.220.233.126 |
https://console.tengokukk.com/feishu、/vscode-key-guard/、/ops-observer、/deploy-center/、/self-debug-closed-loop |
同日逐页验证为 200 OK |
Operations 分组 |
124.220.233.126 |
https://console.tengokukk.com/ai-hub、/file-manager、/qwen3-tts |
同日逐页验证为 200 OK |
Workspace 分组 |
124.220.233.126 |
https://console.tengokukk.com/aghub、/superset |
同日逐页验证为 200 OK |
Bridges 分组 |
124.220.233.126 |
https://console.tengokukk.com/database-api/ |
同日逐页验证为 200 OK |
已部署页面,但当前不在控制台首页模块卡片中,属于可直达隐藏页 |
124.220.233.126 |
https://mortis.tengokukk.com/ |
同日已确认 / 返回 307 -> /mortis/issues,/about 返回 200 OK |
同机独立站点;nginx mortis.tengokukk.com -> 127.0.0.1:3300,旧 golutra.tengokukk.com 现为跳转层;后端为 127.0.0.1:8088,不属于当前 Atramenti Console deploy target |
124.220.233.126 |
https://blog.tengokukk.com/ |
2026-04-21 12:20 +08:00 已确认首页返回 200 OK,且当前首页为紫色 workbench 结构 |
同机独立站点;nginx blog.tengokukk.com -> /srv/myblog/site,HTML 响应已显式下发 Cache-Control: no-store, no-cache, must-revalidate, max-age=0 等头以避免继续看到旧首页缓存;服务器不再保留 /srv/myblog/repo 常驻源码仓 |
124.220.233.126 |
https://gateway.tengokukk.com/ |
2026-04-22 07:34 +08:00 已确认公网返回 200 OK,首屏为 AIClient2API 登录页 |
同机独立站点;nginx gateway.tengokukk.com -> 127.0.0.1:3001,运行目录 /srv/aiclient2api,当前作为独立模型网关入口 |
221.5.60.2 / Smoothcloud |
http://wummlp-sc15226177014.smoothcloud.com.cn |
当前 404 |
已登记平台网页入口,但当前不算在线前端 |
140.143.229.144 |
http://140.143.229.144:5101/ |
当前超时 | 这是会话宿主探测结果,不视为稳定业务前端 |
E. 双视图二:按业务模块分组
| 分组 | 模块 / 页面 | 当前公网入口 | 最后已验证状态 |
|---|---|---|---|
| Shell | Atramenti Console Shell | https://console.tengokukk.com/ |
2026-04-19 17:56 +08:00 复核 200 OK;http://console.tengokukk.com/ 正常 301 -> HTTPS |
| Core | 小说管理、经验中心、自动化中心、系统总览 | https://console.tengokukk.com/novel、/experience、/automation、/system-overview/ |
同日逐页验证为 200 OK |
| Operations | 飞书中心、AI Gateway Control、运维观测中心、部署中心、自我调试闭环 | https://console.tengokukk.com/feishu、/vscode-key-guard/、/ops-observer、/deploy-center/、/self-debug-closed-loop |
同日逐页验证为 200 OK |
| Workspace | 模型中心、文件管理、Qwen3 TTS | https://console.tengokukk.com/ai-hub、/file-manager、/qwen3-tts |
同日逐页验证为 200 OK |
| Bridges | AGHub、Superset BI | https://console.tengokukk.com/aghub、/superset |
同日逐页验证为 200 OK |
| Hidden / Direct | 数据库 API 页面 | https://console.tengokukk.com/database-api/ |
同日逐页验证为 200 OK,但当前不在首页模块卡片中 |
| Independent Site | Mortis(Multica 私有版) | https://mortis.tengokukk.com/ |
同日已确认 / 返回 307 -> /mortis/issues、/about 返回 200 OK;旧 golutra 子域仅保留为跳转入口 |
| Independent Site | MyBlog(紫色 workbench 首页) | https://blog.tengokukk.com/ |
2026-04-21 12:20 +08:00 已确认首页 live 前端为紫色 workbench;GitHub 热力图、语言占比、近 6 个月折线与团队信号都在线;旧首页已废除,服务器仅保留运行目录 |
| Platform-side Web | Smoothcloud Jupyter 入口 | http://wummlp-sc15226177014.smoothcloud.com.cn |
404,仅保留为已登记平台网页入口 |
F. 前端入口 ↔ API 前缀 ↔ 真源文件对照表
| 模块 | 前端入口 | API 前缀 | 页面真源 | 模块真源 |
|---|---|---|---|---|
| Atramenti Console Shell | https://console.tengokukk.com/ |
https://console.tengokukk.com/api/* |
codex/apps/console-web |
control-plane/policy/deploy-targets.json + control-plane/registry/servers.json + README.md |
| 小说管理 | https://console.tengokukk.com/novel |
https://console.tengokukk.com/api/novel |
codex/mcps/novel-manager/frontend/pages/novel/index.html |
codex/mcps/novel-manager/module.json |
| 经验中心 | https://console.tengokukk.com/experience |
https://console.tengokukk.com/api/experience |
codex/mcps/experience/frontend/pages/experience/index.html |
codex/mcps/experience/module.json |
| 自动化中心 | https://console.tengokukk.com/automation |
https://console.tengokukk.com/api/automation |
codex/mcps/automation/frontend/pages/automation/index.html |
codex/mcps/automation/module.json |
| 系统总览 | https://console.tengokukk.com/system-overview/ |
https://console.tengokukk.com/api/system-overview |
codex/mcps/system-overview/frontend/pages/system-overview/index.html |
codex/mcps/system-overview/module.json |
| 飞书中心 | https://console.tengokukk.com/feishu |
https://console.tengokukk.com/api/feishu |
codex/mcps/feishu-center/frontend/pages/feishu/index.html |
codex/mcps/feishu-center/module.json |
| AI Gateway Control | https://console.tengokukk.com/vscode-key-guard/ |
https://console.tengokukk.com/api/key-guard |
codex/mcps/vscode-key-guard/frontend/pages/vscode-key-guard/index.html |
codex/mcps/vscode-key-guard/module.json |
| 运维观测中心 | https://console.tengokukk.com/ops-observer |
https://console.tengokukk.com/api/ops-observer |
codex/mcps/ops-observer/frontend/pages/ops-observer/index.html |
codex/mcps/ops-observer/module.json |
| 部署中心 | https://console.tengokukk.com/deploy-center/ |
https://console.tengokukk.com/api/deploy-center |
codex/mcps/deploy-center/frontend/pages/deploy-center/index.html |
codex/mcps/deploy-center/module.json |
| 自我调试闭环 | https://console.tengokukk.com/self-debug-closed-loop |
https://console.tengokukk.com/api/self-debug-closed-loop |
codex/mcps/self-debug-closed-loop/frontend/pages/self-debug-closed-loop/index.html |
codex/mcps/self-debug-closed-loop/module.json |
| 模型中心 | https://console.tengokukk.com/ai-hub |
https://console.tengokukk.com/api/ai-hub |
codex/mcps/ai-model-hub/frontend/pages/ai-hub/index.html |
codex/mcps/ai-model-hub/module.json |
| 文件管理 | https://console.tengokukk.com/file-manager |
https://console.tengokukk.com/api/file-manager |
codex/mcps/file-manager/frontend/pages/file-manager/index.html |
codex/mcps/file-manager/module.json |
| Qwen3 TTS | https://console.tengokukk.com/qwen3-tts |
https://console.tengokukk.com/api/qwen3-tts |
codex/mcps/qwen3-tts/frontend/pages/qwen3-tts/index.html |
codex/mcps/qwen3-tts/module.json |
| AGHub | https://console.tengokukk.com/aghub |
https://console.tengokukk.com/api/aghub-bridge |
codex/mcps/aghub-bridge/frontend/pages/aghub/index.html |
codex/mcps/aghub-bridge/module.json |
| Superset BI | https://console.tengokukk.com/superset |
https://console.tengokukk.com/api/superset-bridge |
codex/mcps/superset-bridge/frontend/pages/superset/index.html |
codex/mcps/superset-bridge/module.json |
| 数据库 API 页面 | https://console.tengokukk.com/database-api/ |
https://console.tengokukk.com/api/database-api |
codex/mcps/database-api/frontend/pages/database-api/index.html |
codex/mcps/database-api/module.json |
Mortis(运行目录仍为 /srv/multica) |
https://mortis.tengokukk.com/ |
前端通过 Next.js rewrite 代理同域 /api/* 与 /ws 到本机后端;当前后端本地监听 127.0.0.1:8088,并已启用 MULTICA_AUTO_LOGIN_* 私人单用户自动进入模式,默认身份为 emptyinkpot@users.noreply.github.com,默认工作区为 mortis;旧 golutra 域名已改为新域同路径跳转 |
/srv/multica/apps/web(当前 canonical private source repo:https://github.com/emptyinkpot/mortis-multica-source) |
/srv/multica/.env + /srv/multica/docker-compose.selfhost.yml + /srv/multica/server/internal/middleware/auth.go + /srv/multica/apps/web/proxy.ts + /srv/multica/apps/web/lib/site-url.ts + /etc/nginx/sites-available/mortis.tengokukk.com.conf + /etc/nginx/sites-available/golutra.tengokukk.com.conf + /home/ubuntu/multica-public-watch/control/sync.sh |
MyBlog(运行目录 /srv/myblog/site) |
https://blog.tengokukk.com/ |
当前首页不依赖单独 API 前缀;以静态构建产物直出,首页 HTML 响应已通过 nginx 明确设置 Cache-Control: no-store, no-cache, must-revalidate, max-age=0、Pragma: no-cache、Expires: 0,用于切断旧首页缓存残留;当前唯一 live 首页实现为紫色 HomeWorkbench* 体系,旧 HomeHero 一组组件已废除;本机默认不再保留 MyBlog 永久本地 clone 或本地静态副本,服务器也不再保留 /srv/myblog/repo 常驻源码仓 |
/srv/myblog/site(源码真源:https://github.com/emptyinkpot/emptyinkpot.github.io;本地 clone 仅按需临时创建) |
https://github.com/emptyinkpot/emptyinkpot.github.io + /etc/nginx/sites-available/myblog.conf |
G. 当前“很多网页和域名都挂了”吗?
结论需要分成两层看:
- 从当前最新复核看,不是“很多都挂了”;主控制台正式域名
console.tengokukk.com与同机独立站点mortis.tengokukk.com、blog.tengokukk.com都有新鲜可用证据。 - 之前出现过的一轮
124:5101/mortis请求层超时,目前更应视为同日中间波动;更晚复核已经恢复,不能再把那一轮中间态当成最终口径。
按当前工作站的最新实测结果:
https://console.tengokukk.com/当前返回200 OK,http://console.tengokukk.com/会自动301跳到 HTTPS。https://console.tengokukk.com/api/console/summary与/api/novel/health当前都返回200,而且运行时 control-plane 摘要已经能读出console.tengokukk.com作为正式外网入口。https://mortis.tengokukk.com/当前根路由会307到/mortis/issues,/about返回200 OK;旧golutra域名保留为跳转层。https://blog.tengokukk.com/当前返回200 OK,并已复核为紫色 workbench 首页;如果用户还看到旧首页,应先按“浏览器缓存残留”处理,因为 nginx 现已对首页 HTML 明确下发no-store / no-cache。- MyBlog 当前部署口径已进一步收口为:GitHub 仓
https://github.com/emptyinkpot/emptyinkpot.github.io是唯一源码真源,服务器仅保留/srv/myblog/site运行目录,不再保留/srv/myblog/repo常驻源码副本。 - 当前明确挂掉或不可算在线前端的网页入口主要还是:
http://wummlp-sc15226177014.smoothcloud.com.cn:浏览器直接显示HTTP ERROR 404http://140.143.229.144:5101/:当前超时,但它本来就不是已确认的稳定业务前端
https://api.tengokukk.com/api/health当前可达,但它是 API 健康入口,不是前端页面。http://124.220.233.126:5101现在更适合被当作直连排障入口,而不是最终对外域名口径。
七、当前缺口与下一步
当前缺口
121.196.202.114当前已经可以按 on-demand MCP 契约派发;剩余待决定项只是是否补专用非root运维账户,而不是再去恢复三个伪历史 worker systemd 服务名。124.220.233.126控制台当前已确认回到ubuntu用户级 systemd 托管;此前“systemd inactive / 手动进程漂移”的判断属于把 user service 当成系统级 unit 读取后的口径偏差。221.5.60.2:10043已在2026-04-21收口为停放资产:Windows 工作站直连 SSH 超时、平台域名仍404,当前不再计作 active 弹性执行层,也不应继续占用运维面板告警位。- Windows 工作站的本地 SSH 认证链与交互桌面心跳都已恢复;后续重点是持续保持状态文件自动发布,不要再回退到手动同步。
- 目前各机资料来源不完全一致,后续最好统一成固定资产台账模板。
下一步建议
- 继续把
121.196.202.114的“可派发”口径固定为 on-demand MCP wrapper,并仅在确有需要时再补非root运维账户;不要重新发明一套并不存在的常驻 worker service 契约。 - 把
124.220.233.126的systemctl --user托管事实继续同步到更多静态/审计口径,避免后续再把 user service 误读成系统级inactive。 - 若未来需要重新启用
221.5.60.2:10043,先补齐平台认证方式与可重复的健康检查,再把它从“停放资产”恢复为 active 执行层。 - 维持 Windows 工作站状态文件的自动镜像链,确保
desktop-session-heartbeat.status.json与 SSH/bridge 状态一起持续发布到124,且 guardian/watcher 字段能反映本机守护是否仍在。 - 给每台机器建立统一的“资产卡片模板”,后续直接增量维护。
八、补充说明
关于“当前情况”的统一解释
| 实体 | 位置 | 状态 |
|---|---|---|
| 当前 OpenClaw 实例 | 124.220.233.126 所在环境的既有链路中被多次引用 |
已有可用部署证据 |
| 当前对话承载服务器 | 140.143.229.144 |
当前会话宿主 |
| Windows 工作站 | 你的本机 | 通过隧道接入 |
这份文档的定位
这是一份“服务器资产与角色规划总表 + 运维映射手册”,目标是:
- 去重整理已有机器信息
- 明确每台机器的推荐职责
- 给后续控制层/执行层/弹性层部署提供统一参考
- 并把当前 live 入口、repo 真源、运行态证据、历史记录放在同一本手册里分层维护,而不是继续长出一串平行说明页
九、2026-04-19 实时在线状态复核
检查时间:
2026-04-19 13:07:25 +08:00探测边界:以下结论来自当前 Windows 工作站发起的 TCP / HTTP / SSH 实时探测。
- TCP 可达 = 端口层面可建立连接
- SSH 可登录 = 已实际执行远端命令
- 认证失败 = 仅代表当前账号/密钥不通,不等于端口关闭
- 未登录成功的节点,不推断其内部服务状态
2026-04-19 17:56 +08:00补充说明:本节原始表格保留13:07与17:16的中间过程记录;但更晚复核里,https://console.tengokukk.com/已重新确认200 OK,http://console.tengokukk.com/会301跳转到 HTTPS,https://console.tengokukk.com/api/console/summary与/api/novel/health也恢复200,而ssh ubuntu@124.220.233.126已重新可登录。因此当前操作判断以后文前端清单、机器档案与本节“恢复复核”口径为准。
1. 实时状态总表
| 节点 | TCP / 端口 | HTTP | SSH / 登录 | 当前结论 |
|---|---|---|---|---|
124.220.233.126 |
22 / 443 / 5101 均可达 |
13:07 直连 /、/api/console/summary 为 200 OK;17:16 曾出现一轮请求层超时;17:56 已通过正式域名复核 https://console.tengokukk.com/、/api/console/summary、/api/novel/health 均恢复 200 |
13:07 可登录;17:16 曾出现 banner timeout;本轮后续 SSH 又已恢复可登录 |
124 当前应按“服务已恢复、正式外网入口为 console.tengokukk.com、早先超时属于同日中间波动”处理,不再按整机卡死口径解读 |
121.196.202.114 |
22 可达,5101 不可达 |
未发现现成 Web 入口 | root@121 可登录,ubuntu@121 认证失败 |
运行机 SSH 已恢复,当前真实口径是 on-demand runtime / batch offload 已可用,不再按“worker 服务未起”解读 |
127.0.0.1:22222 |
22222 可达 |
不适用 | 有 SSH Banner,ASUS-KL 当前认证失败 |
本地 SSH 入口在,但服务注册/认证链不完整 |
111.228.6.224 |
22 可达 |
未探到业务 HTTP | jd-lavm-beijing 可登录 |
备用实验机在线,但未见活跃业务服务 |
221.5.60.2:10043 |
2026-04-19 曾探到端口可达;2026-04-21 工作站直连 SSH 超时,Mortis 容器侧探测报 ECONNREFUSED |
平台域名当前仍 404 |
当前未建立可重复登录 | 现阶段只应视为停放的已登记资产,不按在线业务节点或 active 执行层解读 |
140.143.229.144 |
22 不可达 |
5101 请求超时 |
未建立登录 | 当前不应视为在线业务节点 |
2. 关键差异说明
-
124.220.233.126- 远程命令确认主机仍在运行控制台进程:
node --experimental-strip-types server.mjs --port 5101、pnpm run start、next start - 进一步复核后已确认真正的托管方式是
ubuntu用户级 systemd:systemctl --user show atramenti-console.service返回ActiveState=active,且*:5101监听 PID 与MainPID一致 - 因此这里的关键差异不再是“systemd 未托管”,而是“不能用系统级
systemctl去读这个服务”;当前应把它视为已收回 systemd,只是托管层级为 user service - 同日
17:16曾出现一轮HTTP与SSH banner超时,但17:56之后的再次复核里,ssh ubuntu@124.220.233.126已恢复可登录,https://console.tengokukk.com/、/api/console/summary与/api/novel/health均已恢复200;因此这次更接近同日链路或服务瞬时波动,而不是novel-manager单独复发
- 远程命令确认主机仍在运行控制台进程:
-
121.196.202.114- 文档里原先写的是“SSH 未恢复 / worker 服务未起”;2026-04-20 复核后应改口为:当前
root账号可登录,且真实运行契约已经明确为 on-demand MCP wrapper,而不是三个常驻 worker systemd unit systemctl status atramenti-worker.service、atramenti-publisher.service、atramenti-queue-consumer.service当前返回Unit ... could not be found.,因此这些名称已不应继续作为 canonical truth- 2026-04-21 已进一步跑通
books-original-to-md的两轮 offload smoke,并新增跑通markitdown-batch-smoke-20260421-01:本机只负责提交 / 观察 / 拉回产物,真正的转换执行位于/srv/mcp-runtime/work/jobs/books-original-to-md/*与/srv/mcp-runtime/work/jobs/markitdown-batch/*;因此121现在不只是“可以派发 MCP”,也已经是受管批处理的 live 执行层 /srv/mcp-runtime、/srv/mcp-runtime/apps/codex-portable-mcps、/srv/mcp-runtime/work均存在,/srv/mcp-runtime/OPERATING-MODE.md与/srv/mcp-runtime/logs/on-demand/launch.log已足以证明该机能承接按次派发的 MCP 工作负载
- 文档里原先写的是“SSH 未恢复 / worker 服务未起”;2026-04-20 复核后应改口为:当前
-
Windows 工作站
127.0.0.1:22222现在确实在监听,且返回OpenSSH_for_Windows_9.8
-
当前密钥链已经可以让
ASUS-KL直接登录,本地ssh-autoconnect/key-guard-local-bridge/desktop-session-heartbeat三份状态文件也都已接通并自动镜像到124;其中桌面心跳已升级为 watcher + guardian 双层自愈守护
3. 详细探测结果对应审计
本轮实时探测的原始结论已写入:
E:\My Project\Atramenti-Console\codex\_artifacts\server-live-status-20260419.md
十、当前服务器角色图(2026-04-19 复核版)
1. 角色拓扑图
这张图表达“当前资产角色定位”;它不等于当前 control-plane 的实际 execution-routing 路由。
Windows 工作站 NEVERLETMEGO
- 开发 / 审核 / 浏览器 / IDE / 本地文件
- 本地 SSH 入口:127.0.0.1:22222(策略目标仍在,但当前 tunnel/bridge degraded)
|
v
124.220.233.126 主控制机
- 控制台 / 统一 API / 调度入口 / 节点状态
- 当前控制台在线,但 systemd 托管漂移
| \
| \
v v
121.196.202.114 111.228.6.224
主运行机 备用实验机 / 跳板机
- worker / MCP offload - 轻量实验 / 备援
- root SSH 已恢复 - SSH 在线
- 服务未起 - 未见活跃业务服务
|
v
221.5.60.2:10043
弹性算力机 / 平台实例
- 峰值算力 / GPU 任务
- 当前停放
- 待平台认证与入口恢复后再重启用
140.143.229.144
- 当前会话宿主
- 不纳入长期业务主拓扑1.1 当前 control-plane 调度路由真相
按 control-plane/policy/execution-routing.json,当前真正已经写进 control-plane 的调度关系是:
dispatcher: 124.220.233.126
default target: 121.196.202.114
global fallback: Windows 工作站
taskClass = local-file / local-config / desktop-bound
-> 直接路由到 Windows 工作站
taskClass = runtime-offload
-> 121.196.202.114
-> fallback: 124.220.233.126
taskClass = elastic-burst
-> 当前仍指向 121.196.202.114
-> fallback: 124.220.233.126, Windows 工作站也就是说:
111与221虽然已经进入servers.json,但当前还不是 execution-routing 里的正式目标节点;221当前已进一步收口为“已登记但停放的弹性资产”,而不是“已经接入 control-plane 派单”的弹性执行层;- Windows 工作站在策略上仍承担本地任务,但运行态是否真的可派发,还要看
.runtime/deploy/local-tools/*.status.json。
2. 角色分工表
| 角色层 | 节点 | 当前最合适职责 | 当前不适合承担 |
|---|---|---|---|
| 人工控制层 | Windows 工作站 NEVERLETMEGO |
开发、审核、手动接管、本地资源动作 | 长期核心常驻服务 |
| 主控制层 | 124.220.233.126 |
控制台、统一入口、调度、状态中心 | GPU 重负载、长时间批处理 |
| 主执行层 | 121.196.202.114 |
Worker、portable MCP、长任务、批处理 | 在服务未恢复前承担唯一执行真源 |
| 停放弹性资产 | 221.5.60.2:10043 |
保留峰值推理 / 按需扩容的资产位 | 在平台认证与入口恢复前不承担 active 执行职责 |
| 备用辅助层 | 111.228.6.224 |
实验、跳板、灾备辅助、低优先级验证 | 控制面主入口、重型业务负载 |
| 会话宿主层 | 140.143.229.144 |
当前对话承载 | 长期业务拓扑节点 |
3. 当前最需要收敛的角色问题
124的ubuntu用户级 systemd 托管事实已经成立,而且本轮已把正式域名console.tengokukk.com、对外健康检查 URL 与直连探测 URL 同步回 repo 真源、远端 source tree 与 runtime tree;同日中间出现过的请求层超时目前已被更晚复核覆盖为“已恢复”。121的“主运行机定位”已经成立,但“worker 服务上线”还没成立。- Windows 工作站在策略上仍是本地任务目标节点,而且当前运行态 dispatchable 已收口:
local-file/local-config由ssh-autoconnect + key-guard-local-bridge真值决定,desktop-bound由desktop-session-heartbeat新鲜度决定;如果桌面心跳超过45s未刷新,控制面应自动降为stale/degraded而不是静默继续视作可派发。 221的“弹性算力资产定位”仍成立,但当前已按停放资产处理:它既没进入 execution-routing,也不应再写成 active 执行节点。111已进入静态真源并保持 SSH 可用,但当前也还没进入 execution-routing,仍主要是备用实验 / 跳板资产。
十一、服务器配置映射表 / 真源表
1. 映射规则
Server Operation & Maintenance Manual.md不是单纯说明稿,而是当前服务器体系的运维映射面。- 以下变更默认视为必须同轮同步本手册:
control-plane/registry/servers.json、control-plane/policy/deploy-targets.json、SSH 入口 / 监听、systemd 服务名、端口、域名。 - 如果手册先改了这些配置口径,也必须同轮反查并更新真实配置;若暂时做不到,就在手册与配置侧同时标明“漂移 / 待收敛”,不能只改一边。
2. 当前 repo 内服务器配置真源表
| 配置面 | 当前真源文件 / 生成源 | 关键字段 / 读取点 | 手册同步要求 | 当前备注 |
|---|---|---|---|---|
| 服务器清单、主机、角色、基础路径 | control-plane/registry/servers.json |
servers[].id/name/host/hostname/sshUser/sshPort/roles/aliases/ports/paths/services/health/domains |
改任一节点、角色、路径、SSH 用户、监听地址、对外域名时,必须同步“当前环境总表”“机器详细档案”“角色图” | 当前已覆盖 124 / 170 / 121 / 111 / 221 / Windows 工作站 / 140;其中 124 已补入 domains.console=console.tengokukk.com,170 当前作为美西 Lighthouse 边缘资产登记,SSH 入口在线但凭据未核通,140 以 disabled session-host 记录,仅作资产映射,不参与当前调度;221 已在 2026-04-21 收口为 enabled=false 的停放资产 |
| 部署目标、控制台服务名、健康检查 URL | control-plane/policy/deploy-targets.json |
targets[].serverId/serviceName/paths/health.publicBaseUrl/publicUrl/publicDirectUrl/localUrl |
改 deploy target、serviceName、public/local URL 时,必须同步手册中的控制机档案、端口、访问入口 | 当前 console-dev 指向 124,服务名是 atramenti-console.service,正式公网健康入口已收敛为 https://console.tengokukk.com/api/console/summary |
| 调度拓扑、默认执行层、fallback 关系 | control-plane/policy/execution-routing.json |
dispatcherServerId/defaultTargetServerId/fallbackTargetServerIds/rules[] |
改 dispatcher、默认运行机、fallback 链时,必须同步手册“推荐职责分工”“角色图”“推荐调用链”口径 | 当前 dispatcher 在 124,默认执行在 121,全局 fallback 只有 Windows;111 与 221 已登记为服务器资产,但尚未进入 execution-routing |
| control-plane 实际消费入口 | shared/control-plane.js |
getControlPlanePaths()、loadControlPlane()、summarizeWorkstationNode() |
若 control-plane 读取路径、字段含义、工作站状态汇总逻辑变了,必须同步手册真源表与相关说明 | 这是代码层实际消费点,不是人工描述文件 |
| 部署脚本的 fallback 配置 | codex/mcps/deploy-center/scripts/openclaw-deploy.config.json |
serverRegistryPath/deployTargetsPath/serviceName/healthUrl |
改 host、SSH 用户、serviceName、healthUrl 或 fallback 配置时,必须同步手册控制机部署口径 | 这是 deploy-center 的本地 fallback,不应悄悄偏离 control-plane JSON |
| 部署脚本最终采用的服务名 / 健康检查值 | codex/mcps/deploy-center/scripts/deploy-openclaw-dev.ps1 |
serviceName、healthUrl、remoteHealthUrl 的解析优先级 |
改解析优先级或脚本默认值时,必须同步手册“真源表”备注,避免“JSON 一套、脚本又一套” | 当前优先级是 target -> server -> fallback config |
| Windows 反向隧道、本地 bridge 与交互桌面心跳状态 | codex/mcps/deploy-center/scripts/local-tools/ssh-autoconnect.ps1、codex/mcps/deploy-center/scripts/local-tools/key-guard-local-bridge.ps1、codex/mcps/deploy-center/scripts/local-tools/desktop-session-heartbeat.ps1、codex/mcps/deploy-center/scripts/local-tools/register-desktop-session-heartbeat-task.ps1、codex/mcps/deploy-center/scripts/local-tools/publish-workstation-status.ps1 生成并发布 .runtime/deploy/local-tools/*.status.json |
ssh-autoconnect.status.json、key-guard-local-bridge.status.json、desktop-session-heartbeat.status.json |
改本地 SSH 入口、桥接端口、目标主机、交互桌面探测逻辑、guardian/watcher 自愈逻辑、登录启动任务、自动发布逻辑或这些状态文件字段时,必须同步手册 Windows 工作站档案 | 这部分是运行态真值,非 repo 静态 JSON;当前 ssh-autoconnect.status.json=connected、tunnelActive=true、bridgeListening=true,key-guard-local-bridge.status.json=idle,desktop-session-heartbeat.status.json=active,且心跳记录会同时写出 watcherPid / guardianPid 并自动镜像到 124 的 source/runtime 状态目录;控制面消费侧必须按新鲜度而不是旧状态字面值判定 desktop-bound 可派发性 |
| 当前实机可达性、SSH 认证结果、systemd 实况 | codex/_artifacts/server-live-status-20260419.md |
当前工作站发起的 TCP / HTTP / SSH / 远端命令探测结果 | 只要重新实查并得出新结论,就同步手册“实时在线状态复核”与受影响档案字段 | 这是“现实世界状态”的审计产物,不替代 control-plane 静态配置 |
221 的平台域名 / 弹性入口 |
control-plane/registry/servers.json |
servers[].health.publicJupyter、servers[].sshPort、servers[].paths.appRoot |
改域名、平台入口、实例对外地址时,必须同步手册,并继续保持与平台控制面一致 | 221 的 Smoothcloud 域名、SSH 端口、应用根目录已进入静态真源,但认证是否可用仍属运行态事实 |
124 的控制面协同服务名与正式外网入口 |
control-plane/registry/servers.json + control-plane/policy/deploy-targets.json + codex/_artifacts/server-live-status-20260419.md |
servers[].services.*、servers[].domains.console、servers[].health.publicConsole*、targets[].health.public* |
改控制台、API、调度派发、节点注册服务名,或改正式域名 / 对外健康 URL 时,必须同步手册、registry、deploy target 与运行时审计记录 | atramenti-console.service、atramenti-api.service、atramenti-dispatcher.service、atramenti-node-registry.service 已进入静态真源;正式入口现已收敛为 https://console.tengokukk.com/,并在 2026-04-19 17:56 +08:00 再次复核为可用 |
121 的 on-demand MCP 运行契约 |
control-plane/registry/servers.json |
servers[].runtimeContract.*、servers[].paths.bundleRoot/workspaceRoot |
改 121 的 wrapper、bundle、工作区根或 launch log 路径时,必须同步手册,并同步任何消费这些字段的脚本或说明 |
当前 canonical truth 已收口为 ssh-on-demand-mcp;旧 atramenti-worker.service / atramenti-publisher.service / atramenti-queue-consumer.service 已退出静态真源 |
111 的已知 systemd 服务名 |
control-plane/registry/servers.json |
servers[].services.lab |
改 111 的实验/备援服务名时,必须同步手册,并同步任何消费这些字段的脚本或说明 |
atramenti-lab.service 已进入静态真源 |
| Mortis 私有源码仓与公开镜像链 | /srv/multica/.git + git@github.com:emptyinkpot/mortis-multica-source.git + /home/ubuntu/multica-public-watch/control/sync.sh + https://github.com/emptyinkpot/mortis-multica-watch |
origin、main、deploy key /home/ubuntu/.ssh/mortis_multica_source_ed25519、同步脚本中的 SOURCE=/srv/multica、REPO=$HOME/multica-public-watch/repo、以及 source-side --exclude='.git/' |
改 Mortis 私有源码仓 URL、branch、deploy key、公开镜像同步链或 sync.sh 源/目标路径时,必须同步手册与任何依赖 public watch repo 的说明 |
自 2026-04-20 起,/srv/multica 已是可直接提交的 canonical source,公开仓 mortis-multica-watch 继续只承担 sanitized public mirror 角色,不再视为真源;在 /srv/multica 已 git 化后,公开镜像链必须保留 source-side --exclude='.git/',否则会把私有真源仓元数据污染进公开镜像仓本地 .git |
3. 当前仍待收敛的真源缺口
121.196.202.114的稳定非root运维账户、正式对外运行契约,仍未冻结为单一静态真源。221.5.60.2:10043的直连 SSH 认证可用性与平台侧授权状态,仍属于运行态事实,不是 repo 静态配置能单独证明的内容。
十二、MySQL / database-api 接入记录
这部分不能删,它属于当前服务器体系里的“数据底座接入信息”。
1. 当前结论
E:\My Project\Atramenti-Console\codex\mcps\database-api 实际复用的是共享配置,不是单独维护自己的一套数据库配置。
当前看到的 MySQL 配置来源:
- 配置文件:
E:\My Project\Atramenti-Console\codex\mcps\core\config.ts:199 - 连接池:
E:\My Project\Atramenti-Console\codex\mcps\core\database\manager.ts:29 database-api说明:E:\My Project\Atramenti-Console\codex\mcps\database-api\README.md:33
2. 默认连接配置
type:mysqlhost:124.220.245.121port:22295user:openclawpassword:Lgp15237257500database:cloudbase-4glvyyq9f61b19cd
也就是说,当时确认到的 database-api 默认连接目标是:
124.220.245.121:22295- 库名:
cloudbase-4glvyyq9f61b19cd
3. 当时额外确认的信息
database-api自己没有单独的module.json/.env去覆盖这套库配置。E:\My Project\Atramenti-Console\codex\mcps\novel-manager\config\module.json当时不存在。- 因此默认判断是:除非启动时通过环境变量覆盖,否则当前走的就是
mcps/core/config.ts里的默认值。
4. 当时的操作建议
如果后续要把服务器控制、资产管理、节点状态等能力接入 MySQL,优先建议:
- 继续使用这台 MySQL 实例作为接入点;
- 但新建独立数据库,例如:
server_control; - 不要直接把新系统表混塞进
cloudbase-4glvyyq9f61b19cd的现有业务表里,除非明确要共库。
5. 当时计划的下一步
- 测试
124.220.245.121:22295是否可连; - 查看账号
openclaw是否有建库权限; - 如果有权限,创建
server_control; - 再把
E:\server-control\sql\mysql-schema.sql和导出 SQL 导进去。
6. 归类说明
这一段虽然不是“服务器硬件资产”,但它属于:
- 服务器体系中的共享数据库入口;
- 控制机/运行机/面板系统后续可能复用的数据层;
- 因此应该继续保留在这本总手册中,必要时只通过 companion layer 或附录做浏览层补充,而不是再造平行 live 真源。
十三、原始记录保留区(整理前信息归档)
这一节专门保留之前对话里已经整理过、但不适合完全删掉的原始记录。
原则:前面章节负责“统一口径”,这里负责“保留痕迹、保留差异、保留未证实信息”。2026-04-19 复核补充:如果这里的历史表格与前面的“机器详细档案”“实时在线状态复核”“当前服务器角色图”“服务器配置映射表 / 真源表”冲突,一律以后者为准。这里出现的“已双向免密”“服务已在位运行”“SSH 未恢复”等旧表述,只能当作历史痕迹,不能再直接当作当前操作依据。
1. 最早版“当前情况”记录
| 实体 | 位置 | 状态 |
|---|---|---|
| 我(这个 OpenClaw 实例) | VM-0-12-ubuntu | 124.220.233.126 |
| 你当前对话的服务器 | VM-52-211-ubuntu | 140.143.229.144 |
| Windows 工作站 | 你的电脑 | 通过隧道连接 |
2. 这台服务器(OpenClaw 所在)的信息原始记录
| 属性 | 值 |
|---|---|
| 服务器 | VM-0-12-ubuntu |
| 公网 IP | 124.220.233.126 |
| 内网 IP | 10.0.0.12 |
| 系统 | Ubuntu 24.04.4 LTS |
| 用户 | ubuntu |
| OpenClaw | ✅ 运行中 |
3. 早期“完整环境配置”原始表
两台 Ubuntu 服务器
| 属性 | 服务器 A(koze 不可外部操控)(VM-52-211-ubuntu) | 服务器 B(tcent)(VM-0-12-ubuntu) |
|---|---|---|
| 公网 IP | 140.143.229.144 | 124.220.233.126 |
| 内网 IP | 10.1.52.211 | 10.0.0.12 |
| 操作系统 | Ubuntu 24.04 LTS | Ubuntu 24.04.4 LTS |
| CPU | 2 核 | 4 核 |
| 内存 | 3.8 GB | 3.6 GB |
| 磁盘 | 40 GB | 40 GB |
| 磁盘使用 | — | 23G / 40G (61%) |
| 运行时间 | 17 小时 53 分钟 | 14 天 7 小时 |
| 负载 | 极低 (0.00) | 正常 (0.54) |
| OpenClaw | ✅ 你现在在这台 | ✅ 运行中 |
| SSH 互通 | 历史记录:当时写作“已配置双向免密”,当前 live 状态已被第九至十一章覆盖 | 历史记录:当时写作“已配置双向免密”,当前 live 状态已被第九至十一章覆盖 |
Windows 工作站(你的本机)
| 属性 | Windows 工作站(主机)(NEVERLETMEGO) |
|---|---|
| 主机名 | NEVERLETMEGO |
| 用户 | ASUS-KL |
| 访问方式 | 反向隧道 127.0.0.1:22222 |
| 本地 IP | 127.0.0.1 (隧道端口) |
| 操作系统 | Windows(版本待确认) |
| OpenClaw 工具 | ✅ winps、wincmd 可用 |
| SSH 服务 | ✅ OpenSSH 运行中 |
| SSH 端口 | 22222(通过隧道暴露为 47022) |
| 连接状态 | ⚠️ 当前通过隧道的 SSH 命令返回权限错误 |
4. 额外服务器原始记录:111.228.6.224
| 属性 | 额外服务器(SSH 别名:jd-lavm-beijing / jd-lavm-yp7m9xmd5l) |
|---|---|
| 公网 IP | 111.228.6.224 |
| SSH 别名 | jd-lavm-beijing、jd-lavm-yp7m9xmd5l |
| 当前登录结果 | ✅ 我能通过现有 SSH 配置登录 |
| 主机名(实查) | lavm-yp7m9xmd5l |
| 操作系统(实查) | Ubuntu 24.04.2 LTS |
| CPU(实查) | 2 核 |
| 内存(实查) | 约 1.9 GiB |
| 磁盘(实查) | 约 39G,可用约 31G |
| 运行时间(实查时) | 约 1 小时 44 分钟 |
| IP 归属(实查) | AS141679 China Telecom Beijing Tianjin Hebei Big Data Industry Park Branch |
| 是否能直接认定为京东云 | 不能仅凭 IP 归属直接认定 |
| 更准确的说法 | SSH 命名看起来像京东云/LAVM 体系,但当前 IP 归属查询不能直接坐实 |
5. 控制机原始记录(124)
| 属性 | 控制机(建议角色:124) |
|---|---|
| 公网 IP | 124.220.233.126 |
| SSH 别名 | 当前 ~/.ssh/config 里未发现现成别名 |
| 当前登录结果 | ✅ 我已通过 SSH 实际登录成功 |
| 主机名(实查) | VM-0-12-ubuntu |
| 操作系统(实查) | Ubuntu 24.04.4 LTS |
| CPU(实查) | 4 核 |
| 内存(实查) | 约 3.6 GiB |
| 磁盘(实查) | 约 40G,可用约 14G |
| 运行时间(实查时) | 当前服务 atramenti-console.service 已连续运行约 1 分 26 秒(检查时) |
| IP 归属(实查) | AS45090 Shenzhen Tencent Computer Systems Company Limited |
| 是否能直接认定为腾讯云 | 基本可以高概率判断为腾讯云机器 |
| 更准确的说法 | IP 归属与主机名风格都明显指向腾讯云 CVM,且当前已承载 atramenti-console 控制台服务 |
| 当前服务结构(实查) | atramenti-console.service 运行中;主入口为 node server.mjs --port 5101,内部还有 pnpm run start / next-server |
| 远端目录(已知) | /srv/atramenti-console |
| 外网访问(实查) | 当前正式外网入口为 https://console.tengokukk.com/;直连探测入口 http://124.220.233.126:5101 同日已验证可达 |
| 角色判断 | 适合做控制机:控制台、调度入口、统一 API、日志汇总、任务编排 |
6. 运行机原始记录(121)
| 属性 | 运行机(建议角色:121) |
|---|---|
| 公网 IP | 121.196.202.114 |
| SSH 别名 | 当前 ~/.ssh/config 里未发现现成别名 |
| 当前登录结果 | 历史记录:当时从当前环境 SSH 未打通;当前 live 口径已更新为 root@121 可登录、ubuntu@121 认证失败 |
| 主机名(实查) | 暂未查到 |
| 操作系统(实查) | 暂未查到 |
| CPU(实查) | 暂未查到 |
| 内存(实查) | 暂未查到 |
| 磁盘(实查) | 暂未查到 |
| 运行时间(实查时) | 暂未查到 |
| IP 归属(实查) | AS37963 Hangzhou Alibaba Advertising Co.,Ltd. |
| 是否能直接认定为阿里云 | 大概率可以判断为阿里云体系公网 IP |
| 更准确的说法 | IP 归属明显指向阿里云杭州线路;2026-04-20 已可直接通过 root SSH 进入,当前系统结构已确认是 /srv/mcp-runtime 下的 on-demand MCP 运行机 |
| SSH 痕迹(本机实查) | ✅ 这台 IP 已存在于本机 known_hosts,说明你之前确实连过 |
| 端口可达性(2026-04-20 实查) | 22 当前稳定可达;未把 80/443/5101 作为该机现行运行契约 |
| 当前服务结构(2026-04-20 实查) | 当前不是常驻 systemd worker 栈,而是 124 -> ssh -> /srv/mcp-runtime/bin/runtime-mcp-ondemand.sh 的按次启动模型 |
| 远端目录(2026-04-20 实查) | /srv/mcp-runtime、/srv/mcp-runtime/apps/codex-portable-mcps、/srv/mcp-runtime/work、/srv/mcp-runtime/logs/on-demand/launch.log |
| 外网访问(2026-04-20 实查) | 未探测到需要对外暴露的现成 Web 服务;当前健康入口就是 SSH 与 on-demand wrapper 契约 |
| 角色判断 | 适合做运行机:镜像工作区、portable MCP 按次派发、批处理、长任务执行、重计算;当前无需先恢复另一套常驻 worker 服务链 |
7. 当时的“结论版”摘要记录
| 属性 | 结论 |
|---|---|
124.220.233.126 |
已实锤可登录、可访问、已有控制台服务,适合作为控制机 |
121.196.202.114 |
历史记录里曾写“当前连不上 / worker 服务未起”;该结论已被 2026-04-20 live 复核覆盖,现行口径是 root 可登录且 on-demand MCP 派发契约已验证 |
| 当前缺口 | 当前真实缺口已收敛为:是否还要补一个稳定非 root 运维账户;不再是“SSH 未通”或“必须先恢复三个 worker systemd 服务” |
| 下一步最合理动作 | 保持 121 继续以 runtime-mcp-ondemand.sh 作为唯一 canonical contract,只有在明确需要权限分层时再补非 root 账户 |
8. 当时记录过的检查动作
- 本地文档/脚本检索:找已有部署记录、隧道脚本、远端目录。
~/.ssh/config/~/.ssh/known_hosts:确认本机确实连过124.220.233.126、121.196.202.114。- 实机探测:
ssh ubuntu@124.220.233.126 ...成功;对121.196.202.114的 SSH 当前超时。 - 公网归属查询:
ipinfo.io显示124属腾讯云,121.196属阿里云。
9. 三层拓扑设计的原始表达
[Windows 工作站 NEVERLETMEGO]
|
v
[124.220.233.126 主控制机]
| | |
v v v
[121.196.202.114 主运行机] [221.5.60.2:10043 弹性算力机] [111.228.6.224 备用实验机]10. 当时推荐的主机职能简表
124.220.233.126:总控大脑。121.196.202.114:主执行手臂。221.5.60.2:10043:按需增援部队。111.228.6.224:实验室和备用点。- Windows:人工驾驶舱。
11. 说明
后续再整理这份文档时,建议遵循:
- 前半部分写“当前统一口径”;
- 后半部分保留“原始记录保留区”;
- 对于暂未核实的信息,不要直接删,统一归到“待核实信息”或“原始记录”;
- 对于数据库、运维检查、部署痕迹这类非纯硬件信息,也应保留在“服务器体系”文档中。
十四、文档整理要求(后续整理时必须遵守)
这份文档不只是结果文档,也是一份后续继续整理服务器体系材料时的“整理规则样板”。上位方法规范以 C:\Users\ASUS-KL\.codex\AGENTS.md 中的文档规则层为准;本节只补服务器手册这一类材料的专用约束。
1. 整理目标
后续整理这类文档时,目标不是单纯“压缩字数”,而是同时做到:
- 保留可执行结论;
- 保留关键原始记录;
- 保留待核实信息;
- 保留后续追查线索;
- 让正式版与原始档案能并存。
2. 必须保留的内容类型
整理服务器体系文档时,以下内容默认不能删,只能重组、归类、标注:
- 服务器资产信息:IP、主机名、云厂商判断、系统、CPU、内存、磁盘、目录、服务名;
- 角色判断:控制机、运行机、弹性机、备用机、跳板机、会话宿主;
- 部署痕迹:服务名、进程形态、启动命令、外网入口、端口、隧道、已知路径;
- 运维检查记录:做过哪些探测、哪些命令成功、哪些失败、哪些仍未确认;
- 数据库接入信息:MySQL、Postgres、Redis、共享配置来源、默认连接目标、后续建库计划;
- 待核实信息:SSH 用户未知、服务未知、目录未知、端口不通、只能高概率判断等;
- 结论型摘要:当前最合理的角色分工、下一步建议、推荐拓扑;
- 原始记录:即使和正式版重复,也不能直接全删,应保留在归档区。
3. 不能因为“看起来重复”就删掉的内容
以下内容即使和正式版表述相近,也不能直接删除:
- 不同时期的机器信息版本;
- 对同一台机器的不同判断口径;
- “暂未查到”“待确认”“高概率判断”这类不确定性描述;
- 做过的检查动作;
- 为什么得出某个结论的依据;
- 数据库、部署、隧道、SSH、端口、日志、服务等非纯硬件信息。
原则:
对正式版冗余,不等于对档案冗余。
对总结冗余,不等于对追溯冗余。
4. 推荐的整理结构
以后整理同类文档时,优先采用双层结构:
A. 正式版区
用于保留统一口径:
- 当前结论;
- 机器总表;
- 推荐角色;
- 拓扑;
- 服务与目录规范;
- 当前缺口;
- 下一步动作。
B. 原始记录保留区
用于保留追溯材料:
- 原始机器表;
- 当时的探测结果;
- 原始判断过程;
- 历史版本差异;
- 未核实信息;
- 数据库接入原始说明;
- 部署现场信息。
5. 整理时允许做的事情
可以做:
- 去重相同句子;
- 合并同类表格;
- 统一标题层级;
- 统一术语;
- 把散乱结论收成摘要;
- 把零散原始信息集中到“原始记录保留区”;
- 给待确认内容加上“待核实”标签。
6. 整理时不允许做的事情
不允许做:
- 因为不属于“硬件信息”就删除数据库、部署、SSH、隧道、日志、服务信息;
- 因为“已经有结论”就删除原始依据;
- 因为“描述重复”就删除仍有追溯价值的旧记录;
- 把“暂未查到”改写成“没有”;
- 把“高概率判断”改写成“已实锤”;
- 未经明确确认,擅自删除密码来源、连接来源、配置来源、路径来源这类线索说明。
7. 整理输出标准
整理后的文档至少应满足:
- 能快速看懂当前机器分工;
- 能回头查到原始依据;
- 能知道哪些信息已经确认,哪些还未确认;
- 能继续作为后续部署、运维、交接的材料;
- 不因为过度精简而丢失关键上下文。
8. 对后续 AI / 人工整理者的直接要求
后续不管是 AI 还是人工整理这份材料,都应默认遵守下面这组规则:
- 先归类,再删重,不要先删再归类;
- 结论和依据必须同时保留;
- 正式版和原始档案必须并存;
- 不确定信息要显式标注,不要偷改成确定表述;
- 服务器体系文档不仅包含机器硬件,也包含数据库、部署、服务、隧道、SSH、端口、日志等基础设施信息;
- 如果要删内容,优先移动到“原始记录保留区”或单独归档文档,而不是直接删除。
9. 继续增量维护时的优先顺序
如果后续内容继续增多,优先这样收口,而不是继续拆 live 文档:
- 先把当前结论更新回本手册现有正式版区
- 再把运行态复核、截图、命令结果沉到 artifact / 原始记录区
- 需要浏览层时,优先补
服务器手册伴随仪表盘.md或服务器手册伴随视图.base - 只有出现明确独立交付物时,才按
C:\Users\ASUS-KL\.codex\AGENTS.md中的文件新建条件判断是否允许新增 companion 文件
10. 一句话原则
这类文档的整理,不是把材料“删薄”,而是把材料“分层”。
十五、网络访问与基础设施概念整理
这一节把原本散落在多个小文件里的基础概念统一收进来,后续查“这些词到底是什么意思”时,优先看这一节。
1. 内网反代是什么
内网反代 = 内网反向代理 / 内网穿透的一种实际用法。
一句话:
让外网的人、外部服务或云端程序,能够访问你内网里的服务,但不直接暴露内网地址和真实公网入口。
在你当前场景里,它最实际的意义是:
- 让外部访问你本地运行的
Atramenti-Console、OpenClaw、本地面板或 API; - 让云端 AI 或远端脚本调用你本机服务;
- 不必直接做路由器端口映射;
- 可以隐藏家庭网络或本地网络的真实地址。
流量路径可以理解成:
用户/云端程序 -> 外网代理入口 -> 加密隧道 -> 你的内网机器 -> 本地服务它能做什么
- 在外面访问家里的控制台或面板;
- 让云端程序调用本地服务;
- 做 webhook 回调;
- 给本地服务提供一个相对安全的公网入口。
它不能做什么
- 不能让已经关机的电脑继续被控制;
- 不能代替云服务器;
- 不能替代真正的远程开机。
一句话记忆:
内网反代只是“搭桥”,不是“把电脑搬到云上”。
2. Cloudflare 是干什么的
Cloudflare 的准确定位不是“托管你的服务器”,而是:
域名与服务器之间的智能中转层、DNS 管理层、安全层、流量入口层。
对你最有用的几个能力:
- DNS / 域名解析管理;
- 隐藏源站真实 IP;
- 免费 HTTPS / SSL;
- 防火墙与访问规则;
- CDN / 流量中转;
Cloudflare Tunnel(非常适合内网穿透场景)。
它能控制什么
Cloudflare 能控制它自己这一层的规则:
- 哪些 IP / 地区能访问;
- 是否启用缓存;
- 是否启用 HTTPS;
- 外部请求如何转发;
- 某些路径是否允许访问;
- 是否启用 Tunnel。
它不能控制什么
Cloudflare 不能:
- 登录你的服务器;
- 修改服务器文件;
- 修改系统防火墙;
- 控制你电脑;
- 在你机器上执行命令。
一句话记忆:
Cloudflare 管“门”和“流量”,不管“房子内部”。
在你体系里的作用
在当前服务器体系里,Cloudflare 更适合作为:
- 域名入口层;
- 公网安全层;
- Tunnel/内网穿透层;
- 访问规则控制层。
不是:
- 主控制机;
- 业务运行机;
- 数据库存储机。
3. 内网反代、Cloudflare、云服务器三者关系
你后续整理文档时,建议统一理解为:
- 云服务器:真正运行程序的地方;
- 内网反代 / Tunnel:把本地服务安全暴露给外部的通道;
- Cloudflare:管理域名、流量、安全和公网入口的外层平台。
最简关系:
域名 / 外部访问
-> Cloudflare
-> Tunnel / 反代入口
-> 本地电脑或云服务器上的真实服务十六、SSH 与密钥体系整理
1. 当前已记录的 Windows 授权信息
当时记录过一条需要写入 Windows authorized_keys 的公钥:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILKMAnYszLx27pSOhju9jg0FhPW4lFn3mClOEAu2ApSz ubuntu@VM-0-12-ubuntu对应操作是把它添加到:
C:\Users\ASUS-KL\.ssh\authorized_keys
如果 .ssh 目录不存在,当时给出的准备方式是:
New-Item -ItemType Directory -Path "$env:USERPROFILE\.ssh" -Force
New-Item -ItemType File -Path "$env:USERPROFILE\.ssh\authorized_keys" -Force2. SSH 免密的核心规则
这部分非常重要,后续整理 SSH 文档时请统一按这个口径写:
SSH 网络通信是双向的,但免密信任是严格单向的。
也就是说:
- A 免密登录 B = 把 A 的公钥 放进 B 的
authorized_keys; - 这只意味着 B 信任 A;
- 不意味着 B 自动也能免密登录 A;
- 如果要实现双向免密,必须再单独反过来配置一次。
一句话记忆:
谁被登录,谁维护自己的白名单;
authorized_keys不会自动双向同步。
3. SSH 双向免密的最小动作
如果要 A / B 双向免密,需要两边各做一遍:
- A 生成密钥,把 A 的公钥加入 B;
- B 生成密钥,把 B 的公钥加入 A。
4. sshd 开机自启的结论
当时整理出的结论是:
只要
sshd已经配置成 systemd 开机自启,服务器重启后不需要再手动启动 SSH 服务。
常用检查:
systemctl is-enabled sshd常用设置:
sudo systemctl start sshd
sudo systemctl enable sshd补充原则:
- 修改
sshd_config之后,通常需要restart sshd才会生效; - 但这属于配置变更,不属于“每次重启都要手动开 SSH”。
5. SSH 与隧道要分开看
后续写文档时要注意不要把这两个东西混成一个:
sshd:系统的 SSH 服务;frp/ngrok/cloudflared:额外的隧道或穿透工具。
sshd 自启,不代表隧道自动自启;
隧道要不要自启,需要单独配置 systemd / supervisor / 计划任务。
十七、systemd 与服务托管整理
1. systemd 的定位
在 Linux 体系下,systemd 可以统一理解成:
系统服务管理器 + 开机自启管理器 + 进程守护器。
在你后续整理时,可以把它对应到 Windows 的这组类比:
Windows 服务管理器计划任务supervisor / 进程保活
2. 对你当前体系的意义
在 Linux 服务器上,systemd 适合用来托管:
atramenti-console.service- worker 进程
- Tunnel 进程
- API 服务
- 定时或常驻后台服务
它能负责:
- 开机自启;
- 崩溃自动拉起;
- 统一启停;
- 查看状态;
- 日志接入系统服务管理。
3. 最常用命令
systemctl start <service>
systemctl stop <service>
systemctl restart <service>
systemctl status <service>
systemctl enable <service>
systemctl disable <service>3.1 当前已实证的服务托管落点(2026-04-20 复核)
atramenti-console.service- 类型:
ubuntu用户级 unit - 查看:
systemctl --user status atramenti-console.service - 作用:Atramenti Console 主控制台常驻服务
- 类型:
multica-daemon.service- 类型:系统级 unit,但以
User=ubuntu运行 - 真源:
/etc/systemd/system/multica-daemon.service ExecStart:/usr/local/bin/multica daemon start --foreground --device-name="Mortis Control 124" --runtime-name="Mortis Host Runtime"- 作用:托管 Mortis 的 OpenClaw runtime,保证
Openclaw (Mortis Control 124)开机自启、异常自愈 - 关键验证:当前
enabled、active,且已人工打断验证Restart=always生效 - 运维入口:源码仓
/srv/multica现已补scripts/deploy-daemon-binary.sh与make deploy-daemon-binary;该入口会自动 build 新 binary、备份旧/usr/local/bin/multica、替换后systemctl restart multica-daemon.service
- 类型:系统级 unit,但以
4. systemd 和 supervisor 的关系
后续整理时统一口径:
- Windows 环境常见是:计划任务 + supervisor;
- Linux 环境优先是:systemd 原生托管;
- 除非有明确理由,否则 Linux 端不必再额外套一层 supervisor。
一句话记忆:
Windows 常靠计划任务 + supervisor,Linux 通常直接靠 systemd。
十八、已吸收来源的 live 收口结论(针对本组文件)
本节不再给“继续拆成更多 live 文档”的建议,只记录这组历史材料现在的真实归宿,避免把已经删掉或已吸收的旧文件名误当成当前结构。
1. 已并入本手册、但不再作为 live 文档维护的来源
服务器资产与角色规划总表.md- 当前归宿:本手册附录 F 与前文当前运维章节
- 状态:已吸收,不再独立 live 维护
系统运维与控制面总册(2026-04-19).md- 当前归宿:本手册第十五至十七节对应的网络入口、SSH、systemd 概念与操作口径
- 状态:已吸收,不再作为单独索引页保留
cloudeflare是干啥的.md/Cloudflare 是干什么的.md- 当前归宿:本手册第十五节的网络访问与基础设施概念整理
- 状态:薄说明页已退出 live 结构;这里只保留历史归并关系说明
服务器体系教学手册.md- 当前归宿:本手册附录 B
- 状态:正文已整合,不再并行维护
2. 当前允许继续 live 维护的结构
Server Operation & Maintenance Manual.md- 角色:唯一主手册 / Markdown 真源
服务器手册伴随仪表盘.md- 角色:伴随浏览层 / Dataview 面板 / 跳转入口
服务器手册伴随视图.base- 角色:Bases 交互视图
3. 当前不应该再回退到的结构
- 不要恢复旧的概念索引薄页来解释 Cloudflare、SSH、systemd 或“控制面总册”
- 不要再把“服务器资产总表”重新拆回成与本手册并行更新的第二本 live 手册
- 如果未来需要补更多浏览能力,优先补 companion layer,而不是回到多本并行说明书