AGENT

Server Operation & Maintenance Manual

2026/04/24 338 min read AGENT 类 系统运维 项目 多服务器智能体 形态 手册 多服务器 智能体协同

Server Operation & Maintenance Manual

  • 适用范围:云端控制机 / Windows 本机工作区执行 / 备用运行机 fallback / Golutra 技术吸纳分析
  • 版本标识:Naikaku Manual Series / Rev. 4.1

第 0 章 区域导航与资料入口

0.1 这本手册现在兼任 服务器体系 总入口

这本总手册现在不仅负责技术说明,也兼任 服务器体系 的主导航文档。

边界说明:本文只承担服务器体系专题的总入口,不承担项目总体 current-state 三件套职责;若要判断项目现在的总体状态,优先看 PROJECT-CONTEXT.mdSESSION-HANDOFF.mdplan.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.md

0.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_only
      • prefer_local
      • cloud_ok
    • 5.3 工作区注册字段
  • 第 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 按字母序索引
  • 第 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 章 机器结构与角色分工

Naikaku 多服务器部署结构图

_ 图 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

  • 位置:121111
  • 含义:不依赖本机真实文件的任务目录
  • 优先级:第三

5.2 任务工作区策略

local_only

  • 仅允许在主工作区执行
  • 本机离线时,任务状态进入 waiting_local
  • 不允许 fallback

prefer_local

  • 优先主工作区
  • 主工作区离线时可自动切到 mirror
  • 再失败时可按策略尝试 shared

cloud_ok

  • 可直接在 mirrorshared 工作区执行
  • 适用于分析、文档、扫描、脚本和低耦合编码任务

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 任务状态机

标准状态建议为:

  • queued
  • assigned
  • running
  • streaming
  • waiting_local
  • fallback_pending
  • succeeded
  • failed
  • cancelled
  • blocked

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 codexclaudegeminishell
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 至少包含:taskIdrunnerIdworkspaceIdacceptedAtleaseSec

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 类型:

  • patch
  • diff-summary
  • test-report
  • build-log
  • screenshot
  • notes

字段至少包含:typenamepathsizechecksum

8.7 fallback 规则

  • local_only 不允许 fallback
  • prefer_local 优先主工作区,失败后可依次退到 mirrorshared
  • fallback 前必须释放旧锁
  • fallback 后必须重新 ACK
  • traceId 不变

8.8 标准错误码

  • WORKSPACE_NOT_FOUND
  • WORKSPACE_UNHEALTHY
  • EXECUTOR_MISSING
  • TASK_TIMEOUT
  • GIT_DIRTY_BLOCKED
  • LOCK_CONFLICT
  • LOCAL_ONLY_OFFLINE
  • RUNNER_DRAINING
  • RUNNER_OFFLINE
  • ARTIFACT_UPLOAD_FAILED
  • LOG_STREAM_BROKEN
  • AUTH_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 注册时序

Runner 注册与工作区同步时序图

_ 图 10-2 Runner 注册、租约确认与工作区同步时序 _

10.3 心跳时序

Runner 心跳与拉任务时序图

_ 图 10-3 心跳刷新可用性,并在拉任务阶段完成任务 ACK _

10.4 派单时序

10.5 回传时序

状态、日志与终态回传时序图

_ 图 10-4 状态分片、日志分片与终态结果的审计式回传链路 _

10.6 fallback 时序

Windows 主执行机掉线后的 fallback 时序图

_ 图 10-5 Windows 主执行机掉线后,控制机切换到 121 mirror runner 的 fallback 链路 _

第 11 章 模块调用关系图

11.1 总体调用结构

Golutra 原版前后端模块调用关系图

_ 图 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 启动前检查

  1. runner 进程未重复启动
  2. E:\My Project 存在且可访问
  3. codexclaudegeminiqwengit 等可调用
  4. 临时目录与日志目录可写
  5. 系统时间正常

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 工作区路径不存在 标记 blockedfallback_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 正确流程

  1. 编写和更新 Markdown 源文件
  2. 准备样式文件 CSS
  3. 用 Pandoc 生成 HTML
  4. 确认 HTML 文件真实存在且可打开
  5. 用浏览器 headless 打印成 PDF
  6. 人工抽查 PDF 是否正常
  7. 仅在确认成功后清理中间文件
  8. 最终至少保留 MD + PDF 两份

17.3 禁止事项

  • 不允许只留 PDF,不留 Markdown
  • 不允许在未验证 PDF 正常前删掉 HTML
  • 不允许在图示报错时硬导出成最终版
  • 不允许文件名仍沿用旧项目名造成混淆

第 18 章 结论

Naikaku 不是简单换名,而是把 Golutra 的核心技术吸纳进你自己的控制机、多服务器 SSH 协同和本机工作区执行体系后,形成一个更适合你长期演进的开源项目。

后续这本手册必须同时保留:

  • Server Operation & Maintenance Manual.md
  • Server Operation & Maintenance Manual.pdf

原独立文档《服务器体系教学手册》《多服务器智能体接口与字段速查手册》《多服务器智能体体系技术拆解报告》《多服务器智能体体系逐章批注版》《服务器资产与角色规划总表》现已全部吸收进本手册附录,不再作为并行真源继续维护。

附录 A 名词表

  • Naikaku:你基于 Golutra 技术吸纳与扩展形成的开源项目
  • Golutra:上游参考技术项目
  • runner:常驻执行桥
  • primary:主工作区
  • mirror:镜像工作区
  • shared:公共工作区
  • fallback:主路径不可用时自动切换到备用路径
  • traceId:贯穿一次任务调用链的追踪 ID
  • ACK:执行机确认接单

附录 B 服务器体系教学导读(整合自《服务器体系教学手册》)

注:上面的 Cloudflare 是干什么的.md 仅为被吸收源文件的历史记录;该薄索引页已于 2026-04-19 删除,相关正文现统一保留在本手册第 3 章。


第一章:先建立整体世界观

1. 你现在这套体系到底是什么

你现在不是只有“一台服务器”或者“一个网站”,而是在逐步搭一套完整的运行体系,里面至少包含这几层:

  • 你的 Windows 本机:开发、审核、人工接管、本地资源入口;
  • 主控制机:负责控制台、调度、统一 API、状态中心;
  • 主运行机:负责 worker、长任务、批处理、模型调用执行;
  • 弹性算力机:负责按需扩容、临时高负载任务;
  • 备用实验机:负责试验、跳板、低优先级备援;
  • 外层网络入口:负责域名、流量、安全、访问控制;
  • 基础连接能力:SSH、密钥、隧道、systemd、数据库接入。

所以这整套体系,本质上不是“几台机器”,而是:

一套分层的控制、执行、连接、安全、部署系统。

2. 这份手册的学习顺序

这份手册建议按这个顺序看:

  1. 先搞懂机器分工;
  2. 再搞懂 Cloudflare 和内网反代;
  3. 再搞懂 SSH 和密钥信任;
  4. 再搞懂 Linux 上的 systemd;
  5. 最后回到你的实际机器架构和部署思路。

如果跳着看,也建议至少先看完:

  • 第二章:你的机器结构
  • 第三章: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" -Force

6. SSH 服务和 SSH 隧道不是一回事

这个点特别容易混。

SSH 服务

指的是:

  • sshd
  • 服务器上真正提供 SSH 登录能力的系统服务

SSH 隧道 / 穿透工具

指的是:

  • frp
  • ngrok
  • cloudflared
  • 反向隧道命令

这些是额外用来“打洞”或“做通道”的工具。

所以:

  • 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-webai-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:199
    • E:\My Project\Atramenti-Console\codex\mcps\core\database\manager.ts:29
    • E:\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 的服务管家;
  • 数据库接入也是服务器体系的一部分。

如果以后你继续扩这份手册,最值得补的下一章通常是:

  1. 部署链路教学
  2. 节点调度与回传协议
  3. 控制机 / 运行机标准目录规范
  4. Cloudflare Tunnel 实战部署
  5. SSH 双向免密实战
  6. systemd 服务模板大全

附录 C 接口与字段速查(整合自《多服务器智能体接口与字段速查手册》)

一、速查总览

1.1 核心对象

对象 作用 关键字段
Runner 执行节点 runnerIdmachineRolecapabilitiesstatus
Workspace 执行目录视图 workspaceIdpathkindhealthy
Task 任务载体 taskIdtraceIdinstructionworkspacePolicy
Log 过程日志 sequencestreamcontent
Result 最终结果 finalStatussummaryartifactsstats

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 时序

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 首次可同时上报工作区

建议响应关注点

  • accepted
  • leaseSec
  • nextHeartbeatAfterSec
  • 若失败,返回原因与重试建议

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 为真实绝对路径
  • kindprimary / mirror / shared
  • healthy / 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 -> runningrunning -> fallback_pending 等。

建议字段

  • taskId
  • traceId
  • runnerId
  • status
  • reason
  • emittedAt

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
任务应该在哪个工作区优先执行 workspacePolicypreferredWorkspaceId
任务目前在哪台 runner 上 preferredRunnerIdrunnerId
当前节点能不能再接活 statusqueueDepthactiveTaskCount
工作区能不能写 writable
工作区现在是否健康 healthy
日志有没有丢片 sequence
结果有没有正式产物 artifacts

六、错误码 Reference

6.1 错误码总表

错误码 触发条件 控制机动作 Runner 动作 是否允许 fallback
WORKSPACE_NOT_FOUND 工作区不存在 标记 blockedfallback_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_UNHEALTHY
  • EXECUTOR_MISSING
  • RUNNER_DRAINING
  • RUNNER_OFFLINE

常见不可 fallback

  • LOCK_CONFLICT
  • LOCAL_ONLY_OFFLINE
  • AUTH_INVALID

取决于策略

  • WORKSPACE_NOT_FOUND
  • TASK_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 件事

  1. traceId 是全链路锚点
  2. ack 才是正式接单
  3. workspacePolicy 决定任务去哪执行
  4. primary / mirror / shared 是不同语义,不只是不同目录
  5. sequence 决定日志补传与去重能力
  6. finalize 不只是结束,还要带摘要、产物、统计
  7. fallback 要保留原 trace,不要生成平行幽灵任务
  8. RUNNER_OFFLINERUNNER_DRAINING 是调度事件,不只是机器状态
  9. GIT_DIRTY_BLOCKED 体现真实工作区保护
  10. 文档维护必须保留 MD + PDF

8.2 一句话定位

这份速查手册的作用,是把《Server Operation & Maintenance Manual》中最容易在实现、联调、排障时反复翻找的 API、字段、样例 JSON、状态图和错误码集中压缩成一份 reference 文档。


附录 D 技术拆解与研判(整合自《多服务器智能体体系技术拆解报告》)

一、先给结论

1.1 这份手册描述的到底是什么系统

这不是一个“单纯网页 + 聊天框”的项目说明,而是一套明显的 多服务器控制面 + Runner 执行面 + 本机工作区优先 + fallback 回退 的智能体协同体系。它继承了 Golutra 的成员协作、终端编排与工作区语义,又把这些能力重新组织成 Naikaku 的多机执行架构。

1.2 这份手册里最关键的技术结论

  • 前端技术栈明确写出:Vue 3TypeScriptPiniaVite
  • 桌面宿主与后端明确写出:RustTauri
  • 执行层明确出现:PTY、进程 runtime、终端会话、快照、状态事件
  • 协同层明确出现:控制机、Runner 注册、心跳、拉任务、ACK、日志回传、最终结果回传、fallback
  • 文档工具链明确出现:Markdown 源文件、CSSPandoc、浏览器 headless 打印 PDF
  • 图示资产经文件头可确认:示例图是 PlantUML 导出的 SVG

1.3 关于 MCP / Skill 的一句话判断

这份手册的运行时架构本身不是 MCP 原生架构,它描述的是 CLI / Runner / 控制面 体系;但它的文档生产链路与当前环境中的 plantuml-diagramsmd-to-officemarkdown-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 / sharedlocal_only / prefer_local / cloud_ok 第 5 章直接写明
AI 岗位与执行器 dispatcherreviewerdeployercodex-engineerclaude-researchergemini-toolingshell-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 3
  • TypeScript
  • Pinia
  • Vite

这说明前端不是传统服务端模板页,而是一个带状态管理和构建工具链的现代前端壳层。

3.3 桌面宿主与后端技术

手册明确指出它不是单一网页项目,而是:

  • Rust
  • Tauri

也就是说,这个系统更接近 桌面应用外壳 + 本地/宿主端运行能力,而不是仅靠浏览器页面跑逻辑。

3.4 终端与执行运行时技术

运行时层出现的核心技术要素包括:

  • PTY
  • process 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 原版总模块关系图

Golutra 模块调用关系图

_ 示例图 B:Golutra 原版模块调用关系图 _

5.2 从图中可见的核心模块

图中直接出现的模块有:

  • Frontend
  • Bridge / Store
  • ui_gateway
  • message_service
  • orchestration
  • terminal_engine
  • runtime
  • project 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”这么简单:

  1. ChatInput 只是入口
  2. chatBridge 负责桥接
  3. ui_gateway 把调用送到宿主层
  4. message_service 负责消息与会话数据
  5. orchestration 负责决定派给谁
  6. terminal_engine 负责确保终端会话与状态采集
  7. 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 回退时序

fallback 时序图

_ 示例图 H:Windows 主执行机掉线后切换到 mirror runner 的 fallback 链路 _

6.6 这套协议层到底定义了什么

手册实际上定义了四类核心对象:

Runner 模块

  • 执行机身份:runnerIdrunnerNamemachineRole
  • 机器状态:statusqueueDepthactiveTaskCount
  • 执行能力:capabilitiesmaxConcurrentTasks

Workspace 模块

  • 工作区身份:workspaceIdname
  • 工作区定位:pathkind
  • 路由信息:hostRunnerIdpriority
  • 可执行性:writablehealthy

Task 模块

  • 唯一性与追踪:taskIdtraceId
  • 派发目标:preferredWorkspaceIdpreferredRunnerId
  • 执行意图:titleinstructionroleHintexecutorHint
  • 约束与策略:prioritytimeoutSecfallbackAllowed

Result / Log 模块

  • 日志序列:sequencestreamcontent
  • 结果闭环:finalStatussummary
  • 产物与统计:artifactsstats

七、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 里还明确提到启动前检查需要:

  • codex
  • claude
  • gemini
  • qwen
  • git

也就是说,这套体系默认就把多个 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.md
  • Server Operation & Maintenance Manual.pdf
  • Server Operation & Maintenance Manual.images/*.svg

这说明它本身就是按“Markdown 源 + 图集 + PDF 成品”的方式维护的。

11.2 图示技术证据

图集中的 SVG 文件头带有:

<?plantuml 1.2026.1?>

这可以高置信证明:

  • 图示不是截图拼贴
  • 图示是文本可维护的 SVG
  • 图示工具链是 PlantUML 方向

11.3 导出技术证据

第 17.2 节明确给了导出流程:

  1. 编写和更新 Markdown 源文件
  2. 准备样式文件 CSS
  3. 用 Pandoc 生成 HTML
  4. 确认 HTML 文件真实存在且可打开
  5. 用浏览器 headless 打印成 PDF
  6. 人工抽查 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-office
  • markdown-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 + Vite
  • Rust + Tauri
  • PTY / process runtime
  • 控制机 API
  • 多服务器 SSH 协同
  • Runner 协议
  • fallback 与错误恢复
  • 审计式结果回传

14.2 模块层面

这份手册明确覆盖了:

  • 前端模块:src/appworkspacechatterminalsharedstores
  • 后端模块:ui_gatewaymessage_serviceorchestrationterminal_engineruntimeplatformcontracts/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 是控制面契约,不是后补内容
  • 术语索引意味着 runnerfallbacktraceIdorchestration 这些词必须统一语义

实施提示:如果你后续继续扩写该体系,优先维护索引页,因为索引页是把手册从“文章”提升为“参考系统”的关键步骤。

三、第 1 章 项目定义:批注

3.1 原章作用

这一章负责定边界:Naikaku 到底是什么,不是什么,和 Golutra 的关系又是什么。没有这一章,后面所有技术细节都会失焦。

3.2 1.1 Naikaku 是什么:批注

  • 这里把 Naikaku 定义成 多服务器协同、云端控制、本机优先执行 的 AI 员工平台
  • 关键词不是“聊天”,而是“协同、控制、本机优先、自动回退”
  • 也就是说,它的目标是 执行系统,不是单纯会话系统

3.3 1.2 一句话目标:批注

这句“一句话目标”实际上把系统核心策略讲完了:

  1. 云端控制机常驻
  2. 优先修改 E:\My Project 的真实代码
  3. 本机不在线时切换到备用工作区
  4. 所有状态、日志、结果统一回传到面板

这 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 工作区注册字段:批注

工作区字段其实回答了四个问题:

  • 你是谁:workspaceIdname
  • 你在哪:path
  • 你属于谁:hostRunnerId
  • 你能不能用:writablehealthy

实施提示:如果后续真落库,workspaceId 不要用临时路径字符串代替,应保持稳定 ID,与目录地址解耦。

八、第 6 章 AI 员工岗位设计:批注

8.1 原章作用

这一章把“模型”变成“岗位”,把“CLI”变成“执行器”。这是系统人格化与工程化结合的地方。

8.2 6.1 岗位与执行器映射:批注

  • dispatcher 不是执行器,而是决策角色
  • reviewer 负责兜风险,不一定直接改代码
  • deployer 负责发布与回滚
  • codex-engineerclaude-researchergemini-tooling 分别承担不同风格的工作
  • shell-worker 负责最底层的脚本与系统动作

这说明系统希望把“谁擅长什么”内建到协议里,而不是每次靠 prompt 临时猜。

8.3 6.2 岗位设计原则:批注

这一节实际是在说三条组织原则:

  1. 决策层和执行层分离
  2. 执行层尽量绑定到明确 CLI 能力
  3. 高风险动作要有 reviewer / deployer 这类控制环节

8.4 本章的实施重点

  • roleHintexecutorHint 必须同时存在,前者代表业务角色,后者代表技术载体
  • 不能把所有工作都压给一个“万能 agent”,那会破坏本章设计初衷

九、第 7 章 任务对象规范:批注

9.1 原章作用

这一章是整本手册的核心之一,因为系统最终是围绕 Task 来流转的。

9.2 7.1 核心字段:批注

任务字段可以分成五组:

  • 追踪组:taskIdtraceId
  • 目标组:projectIdrepoReftargetPath
  • 路由组:workspacePolicypreferredWorkspaceIdpreferredRunnerId
  • 执行组:titleinstructionroleHintexecutorHint
  • 控制组:prioritytimeoutSecfallbackAllowedrequiresApproval

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 是工程闭环的一部分,而不是附件。之所以列 patchtest-reportbuild-logscreenshotnotes,是在告诉你:执行结果不只是一句“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 拉任务响应:批注

拉任务返回的数据已经把执行意图编码得很完整:

  • 做什么:titleinstruction
  • 谁来做:roleHintexecutorHint
  • 在哪做:preferredWorkspaceIdpreferredRunnerId
  • 如何退:fallbackAllowed

11.5 9.4 ACK / 日志 / 最终结果:批注

这一组样例等于把执行链拆成三段:

  1. ACK 锁定归属
  2. 日志持续上报过程
  3. 最终结果提交摘要与 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 时序:批注

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/syncpull
  • 锁定类:ack
  • 回传类:statuslogsfinalize
  • 控制类:cancel
  • 查询类:GET task/runner

14.3 12.2 API 原则:批注

  • traceId 解决链路追踪
  • 幂等写接口解决重试安全
  • UTC 时间解决跨机一致性
  • 审计式终态解决事后追溯

实施提示:如果要先做 MVP,也不要跳过 traceId、幂等和终态审计,这三项属于最难补的基础约束。

十五、第 13 章 Windows 主执行机 SOP:批注

15.1 原章作用

这一章是把“架构设计”压到“运维动作”层。它非常像值班手册。

15.2 13.1 启动前检查:批注

启动前检查之所以把 codexclaudegeminiqwengit 都列出来,是因为这台机器不是普通 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/terminalsrc/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 正确流程:批注

这套流程对应的是非常稳的导出链:

  1. 写 Markdown
  2. 准备 CSS
  3. Pandoc 生成 HTML
  4. 确认 HTML 真能打开
  5. 浏览器 headless 打印 PDF
  6. 抽查 PDF
  7. 再清理中间文件
  8. 至少保留 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;111221 已进入 servers.json,但尚未写入当前 execution-routing 规则。


二、当前环境总表

层级 实体 定位 当前状态
人工控制层 Windows 工作站 NEVERLETMEGO 开发、调试、人工接管 本地 ssh-autoconnect / key-guard-local-bridge / desktop-session-heartbeat 真值已收口,local-filelocal-configdesktop-bound 当前都可派发
主控制层 124.220.233.126 控制台、调度、统一入口、状态汇总 已验证可登录、可访问
美西边缘层 170.106.179.226 新购腾讯云 Lighthouse 边缘机,预留 API 网关 / 反向代理外网承载 云侧实例 lhins-nd7hu039 当前 RUNNING22/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 被正式写成部署目标;170121221111、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=activeFragmentPath=/home/ubuntu/.config/systemd/user/atramenti-console.service。同机还新增 multica-daemon.service(系统级 unit,User=ubuntuFragmentPath=/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.serviceatramenti-dispatcher.serviceatramenti-node-registry.service 仍只是已登记的协同服务名,未在本轮被实证为 active。
同机独立栈(2026-04-21 14:56 +08:00 复核) 另有一套未纳入当前 Atramenti Console control-plane 的 Multica 独立栈,现已按私人单用户品牌版收口为 Mortis:源码/运行目录在 /srv/multicadocker 容器当前为 multica-frontend-1127.0.0.1:3300)、multica-backend-1127.0.0.1:8088)、multica-postgres-1127.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.shmake 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-qq1napcat-qq2napcat-qq3,对应宿主端口分别为 qq-1=127.0.0.1:3600/3601/16099qq-2=127.0.0.1:3610/3611/16109qq-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/agentsNapCat Group Operator 设置页会成功请求 /api/agents/:id/napcat-accounts 并返回 qq-1/qq-2/qq-3 三个账号槽,且当前该 agent 已绑定 qq-1。但目前只有 qq-1 存在已登录 qq_uin=2264869713qq-2qq-3 仍是预留槽,尚未完成扫码登录,因此“两个不同智能体分别经不同 QQ 身份成功外发”的最终联调仍未完成。
外网访问(2026-04-19 17:56 +08:00 复核) 当前正式外网入口已确认收敛为 https://console.tengokukk.com/:当前工作站 curl -I -L 复核为 200 OKhttp://console.tengokukk.com/301 跳转到 HTTPS;同轮 https://console.tengokukk.com/api/console/summary/api/novel/health 也都返回 200http://124.220.233.126:5101 现保留为直连探测入口,而不再作为对外主入口口径。
当前进程形态(2026-04-19 14:39 +08:00 复核) *:5101 监听 PID 与 atramenti-console.serviceMainPID 一致;主命令仍是 node --experimental-strip-types server.mjs --port 5101,其内部继续拉起 pnpm run start / next start 作为控制台前端子进程
repo 静态真源状态 已写入 control-plane/registry/servers.jsonhostname=VM-0-12-ubuntusshUser=ubuntusshPort=22ports.console=5101services.console/api/dispatcher/nodeRegistry,并新增 domains.console=console.tengokukk.comhealth.publicConsoleRoot=https://console.tengokukk.com/health.publicConsoleSummary=https://console.tengokukk.com/api/console/summaryhealth.publicConsoleSummaryDirect=http://124.220.233.126:5101/api/console/summary;同条 server 记录现还带 cloud.provider=tencent-lighthousecloud.region=ap-shanghaicloud.instanceId=lhins-jqpgc12ecloud.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 状态文件现除实例状态外,还会记录 likelyHanghangSignals、各探针结果与 recoveryAction。当前实测可直接读出 lhins-jqpgc12eInstanceState=RUNNINGLatestOperation=RebootInstancesLatestOperationState=SUCCESS,且 latest status 为 observedStatus=healthylikelyHang=false
deploy target(repo 真源) 已写入 control-plane/policy/deploy-targets.jsonconsole-dev -> cloud-shanghai-01serviceName=atramenti-console.servicepaths.srcRoot=/home/ubuntu/atramenti-console-srcpaths.runtimeRoot=/srv/atramenti-consolehealth.publicBaseUrl=https://console.tengokukk.com/health.publicUrl=https://console.tengokukk.com/api/console/summaryhealth.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-consolehttps://github.com/emptyinkpot/my-project-root 仅作为私有工作区根备份仓,不再作为该站点的公开仓口径。
角色判断 适合承载控制台、统一 API、调度器、状态中心、日志汇总
124 控制机整机卡死快速恢复 SOP(2026-04-22 新增)

适用症状:

  • mortis.tengokukk.comconsole.tengokukk.comhttp://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
  • 同步出现时,优先按 124 的实例级卡死或宿主挂起处理,而不是先归因为某个前端页面、try_files、SPA fallback 或单一路由 404。

不要先下的结论:

  • 在 HTTP 首字节都没回来前,不要先判断是 /mortis/* 路由、rewritelocation、Next.js 页面或前端构建问题。
  • 在 SSH 只完成 TCP 建连、但 banner 不返回时,不要先把问题归为单纯 nginx 配置漂移。

推荐恢复顺序:

  1. 先做分层确认,保留证据:
    • Resolve-DnsName mortis.tengokukk.com -Type A
    • curl -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
  2. 立即查询云侧真值,不再只围着 SSH 打转:
    • control-plane/scripts/observe-lighthouse-instance.ps1 -ServerId cloud-shanghai-01
    • tccli lighthouse DescribeInstances --region ap-shanghai
  3. 如果命中“TCP 通,但 SSH banner / TLS / HTTP 都卡死”的组合,且 cloud.instanceId=lhins-jqpgc12e 未变,就直接走云侧重启:
    • tccli lighthouse RebootInstances --region ap-shanghai --cli-unfold-argument --InstanceIds lhins-jqpgc12e
  4. 轮询到实例恢复 RUNNINGLatestOperationState=SUCCESS 后,再恢复 SSH/站点验证:
    • 先看 SSH banner 是否恢复
    • 再看 https://mortis.tengokukk.com/ 是否恢复 307 -> /mortis/issues
    • 再看 https://mortis.tengokukk.com/mortis/issues/mortis/autopilots 是否返回 200
  5. SSH 恢复后补运行态确认:
    • systemctl is-active nginx
    • systemctl is-active docker
    • systemctl is-active multica-daemon.service
    • cd /srv/multica && sudo docker compose -f docker-compose.selfhost.yml ps

恢复判定:

  • 云侧:InstanceState=RUNNINGLatestOperationState=SUCCESS
  • SSH:能重新拿到 SSH-2.0-OpenSSH_... banner
  • Mortis:根路径 307/mortis/issues,目标页面返回 200
  • 浏览器:/mortis/issues/mortis/autopilots 实际可渲染

额外说明:

  • 本次 2026-04-22 恢复中,atramenti-console.service 可以是 inactive,但只要 nginxdockermultica-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 会检查 publicConsoleRootpublicConsoleSummarypublicConsoleSummaryDirect
    • 探针会区分“TCP 已通但无 HTTP 响应”和“真的拿到 status code”;前者才计入 hang signal。
  • likely hang 判定:
    • 当前实现不是单探针触发自动重启,而是至少命中 2 条 hang signal 才把 likelyHang=true
    • 这条阈值是故意保守的:此前出现过单个 summary 端点偶发 timeout,但其它入口健康的情况;不能因为一个 probe 抖动就自动重启整机。
  • 自动恢复入口:
    • 当 observer 运行在 -AutoRecoverOnHang 模式下,且实例当前仍处于 RUNNING 且最近云侧操作不是进行中时,会直接调用:
      • tccli lighthouse RebootInstances --region ap-shanghai --cli-unfold-argument --InstanceIds lhins-jqpgc12e
    • 默认带 -RecoveryCooldownMinutes 45,避免短时间重复重启;处于 cooldown 时,状态文件会写出 recoveryAction.skippedBecause=cooldown-active
  • 演练 / 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 ...
  • .cmd wrapper:已退场;Atramenti-CloudShanghai-01-LighthouseObserver 不再经过 %LOCALAPPDATA%\Atramenti-Console\scheduled-tasks\*.cmdcmd.exe /c

验收口径:

  • 正常态:.runtime/control-plane/cloud-observer/cloud-shanghai-01.status.json 应显示 observedStatus=healthylikelyHang=false,并能看到 SSH banner 与 3 个 health probe 成功返回。
  • 异常态:若再次出现“TCP 通但 SSH banner / HTTP 首字节都不回来”的组合,observer 应先把 hangSignals 写清楚,再决定是否进入 recoveryAction
  • 自动恢复态:一旦真实触发 RebootInstances,状态文件与 mortis-ops 告警应同时留下 requestIdsignals,便于回溯是否误判。

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-storedatabase-ops-mcp(旧 db-readonly 兼容链路)、log-diagnoseoutput-guardprompt-compressorrepo-inspectorripgrep-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-02books-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/markdownoutput/artifacts
外网端口(2026-04-20 实时复核) 22 可达;当前未承诺对外 Web 入口,也不以 5101 作为该机健康契约
repo 静态真源状态 已写入 control-plane/registry/servers.jsonhostnamesshUser=rootsshPort=22、关键目录,以及 runtimeContract.mode=ssh-on-demand-mcpruntimeContract.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.cn2026-04-21 当前 404
镜像 harbor.smoothcloud.com.cn/smoothcloud/torch210_cuda131_conda:v1
用户目录 /root/workspace
已知应用根目录 /root/workspace/ai-office
已知服务记录 office-webai-office-worker
repo 静态真源状态 已写入 control-plane/registry/servers.json:当前以 enabled=false 停放保留,继续记录 sshUser=rootsshPort=10043paths.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.jsonhostnamesshPort=22、SSH aliases jd-lavm-beijing / jd-lavm-yp7m9xmd5lservices.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.226root@170.106.179.226 均返回 Permission denied (publickey,password),说明入口在线但当前工作站没有可用凭据
当前防火墙(云侧实查) 已放行 22/tcp80/tcpICMP0.0.0.0/0443/tcp 尚未在当前规则中开放
repo 静态真源状态 已写入 control-plane/registry/servers.jsonid=cloud-siliconvalley-01roles=gateway-host/edge-proxy/standbycloud.provider=tencent-lighthousecloud.region=na-siliconvalleycloud.instanceId=lhins-nd7hu039health.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 作为 disabledsession-host 条目;只用于资产映射,不参与当前 execution-routing 或长期业务拓扑
角色判断 不建议纳入长期业务主拓扑
原因 更像当前代理/会话宿主,而不是已固定部署链路的业务机器

7. Windows 工作站:NEVERLETMEGO

属性
主机名 NEVERLETMEGO
用户 ASUS-KL
访问方式 反向隧道 / 本地 SSH 监听 127.0.0.1:22222;控制面 live 健康改以反向 bridge 127.0.0.1:18765 为准
OpenClaw 工具 winpswincmd 可用
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.jsonsshUser=ASUS-KLsshPort=22222ports.keyGuardBridge=18765paths.codexRoot/openclawRoot/runtimeRoothealth.localSshListenerhealth.reverseBridgeHealthhealth.reverseBridgeWorkstationhealth.reverseTunnelSupervisor
本地调度状态(2026-04-20 15:38 +08:00 实时复核) .runtime/deploy/local-tools/ssh-autoconnect.status.json 当前为 connectedwatcher=truetunnelActive=truebridgeListening=truekey-guard-local-bridge.status.json 当前为 idledesktop-session-heartbeat.status.json=active,并已带 watcherPidguardianPidwatchIntervalSeconds=10guardianStaleAfterSeconds=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(本机实际执行者)
          -> 本机文件、命令、工作目录
              -> 执行结果回传 Mortis
6.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-bced2519e97a
    • Openclaw (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 侧因默认 profile C:\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
6.1.6 后续优先看的三边证据

以后如果要确认“这条链到底有没有真跑起来”,优先按下面三边证据看,不要只看页面上是否显示 online:

  1. Mortis 页面
    • 项目 Runtime 扩编
    • issue MOR-2 本机 codex 最小写文件 proof(重试)
    • issue 状态 in_review / 待审核
  2. daemon 日志
    • C:\Users\ASUS-KL\.multica\daemon.log
    • 关键字:picked taskexec_commandcodex finishedstatus=completed
  3. 本机真实文件
    • 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
  • 121221111 尽量不直接暴露为主业务入口。
  • 控制机负责下发任务,运行机/弹性机负责执行并回传状态。
  • 重要状态、审计和结果索引尽量汇总回控制机。

六、建议目录与服务规范

控制机目录建议

/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.bundleRootservers.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.iomain@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 OKhttp://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 OKhttp://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=0Pragma: no-cacheExpires: 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.comblog.tengokukk.com 都有新鲜可用证据。
  • 之前出现过的一轮 124:5101 / mortis 请求层超时,目前更应视为同日中间波动;更晚复核已经恢复,不能再把那一轮中间态当成最终口径。

按当前工作站的最新实测结果:

  • https://console.tengokukk.com/ 当前返回 200 OKhttp://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 404
    • http://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 认证链与交互桌面心跳都已恢复;后续重点是持续保持状态文件自动发布,不要再回退到手动同步。
  • 目前各机资料来源不完全一致,后续最好统一成固定资产台账模板。

下一步建议

  1. 继续把 121.196.202.114 的“可派发”口径固定为 on-demand MCP wrapper,并仅在确有需要时再补非 root 运维账户;不要重新发明一套并不存在的常驻 worker service 契约。
  2. 124.220.233.126systemctl --user 托管事实继续同步到更多静态/审计口径,避免后续再把 user service 误读成系统级 inactive
  3. 若未来需要重新启用 221.5.60.2:10043,先补齐平台认证方式与可重复的健康检查,再把它从“停放资产”恢复为 active 执行层。
  4. 维持 Windows 工作站状态文件的自动镜像链,确保 desktop-session-heartbeat.status.json 与 SSH/bridge 状态一起持续发布到 124,且 guardian/watcher 字段能反映本机守护是否仍在。
  5. 给每台机器建立统一的“资产卡片模板”,后续直接增量维护。

八、补充说明

关于“当前情况”的统一解释

实体 位置 状态
当前 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:0717:16 的中间过程记录;但更晚复核里,https://console.tengokukk.com/ 已重新确认 200 OKhttp://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/summary200 OK17: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 5101pnpm run startnext start
    • 进一步复核后已确认真正的托管方式是 ubuntu 用户级 systemd:systemctl --user show atramenti-console.service 返回 ActiveState=active,且 *:5101 监听 PID 与 MainPID 一致
    • 因此这里的关键差异不再是“systemd 未托管”,而是“不能用系统级 systemctl 去读这个服务”;当前应把它视为已收回 systemd,只是托管层级为 user service
    • 同日 17:16 曾出现一轮 HTTPSSH 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.serviceatramenti-publisher.serviceatramenti-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 工作负载
  • 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 工作站

也就是说:

  • 111221 虽然已经进入 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. 当前最需要收敛的角色问题

  1. 124ubuntu 用户级 systemd 托管事实已经成立,而且本轮已把正式域名 console.tengokukk.com、对外健康检查 URL 与直连探测 URL 同步回 repo 真源、远端 source tree 与 runtime tree;同日中间出现过的请求层超时目前已被更晚复核覆盖为“已恢复”。
  2. 121 的“主运行机定位”已经成立,但“worker 服务上线”还没成立。
  3. Windows 工作站在策略上仍是本地任务目标节点,而且当前运行态 dispatchable 已收口:local-file / local-configssh-autoconnect + key-guard-local-bridge 真值决定,desktop-bounddesktop-session-heartbeat 新鲜度决定;如果桌面心跳超过 45s 未刷新,控制面应自动降为 stale/degraded 而不是静默继续视作可派发。
  4. 221 的“弹性算力资产定位”仍成立,但当前已按停放资产处理:它既没进入 execution-routing,也不应再写成 active 执行节点。
  5. 111 已进入静态真源并保持 SSH 可用,但当前也还没进入 execution-routing,仍主要是备用实验 / 跳板资产。

十一、服务器配置映射表 / 真源表

1. 映射规则

  • Server Operation & Maintenance Manual.md 不是单纯说明稿,而是当前服务器体系的运维映射面。
  • 以下变更默认视为必须同轮同步本手册:control-plane/registry/servers.jsoncontrol-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.com170 当前作为美西 Lighthouse 边缘资产登记,SSH 入口在线但凭据未核通,140disabled 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;111221 已登记为服务器资产,但尚未进入 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 serviceNamehealthUrlremoteHealthUrl 的解析优先级 改解析优先级或脚本默认值时,必须同步手册“真源表”备注,避免“JSON 一套、脚本又一套” 当前优先级是 target -> server -> fallback config
Windows 反向隧道、本地 bridge 与交互桌面心跳状态 codex/mcps/deploy-center/scripts/local-tools/ssh-autoconnect.ps1codex/mcps/deploy-center/scripts/local-tools/key-guard-local-bridge.ps1codex/mcps/deploy-center/scripts/local-tools/desktop-session-heartbeat.ps1codex/mcps/deploy-center/scripts/local-tools/register-desktop-session-heartbeat-task.ps1codex/mcps/deploy-center/scripts/local-tools/publish-workstation-status.ps1 生成并发布 .runtime/deploy/local-tools/*.status.json ssh-autoconnect.status.jsonkey-guard-local-bridge.status.jsondesktop-session-heartbeat.status.json 改本地 SSH 入口、桥接端口、目标主机、交互桌面探测逻辑、guardian/watcher 自愈逻辑、登录启动任务、自动发布逻辑或这些状态文件字段时,必须同步手册 Windows 工作站档案 这部分是运行态真值,非 repo 静态 JSON;当前 ssh-autoconnect.status.json=connectedtunnelActive=truebridgeListening=truekey-guard-local-bridge.status.json=idledesktop-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.publicJupyterservers[].sshPortservers[].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.consoleservers[].health.publicConsole*targets[].health.public* 改控制台、API、调度派发、节点注册服务名,或改正式域名 / 对外健康 URL 时,必须同步手册、registry、deploy target 与运行时审计记录 atramenti-console.serviceatramenti-api.serviceatramenti-dispatcher.serviceatramenti-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 originmain、deploy key /home/ubuntu/.ssh/mortis_multica_source_ed25519、同步脚本中的 SOURCE=/srv/multicaREPO=$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: mysql
  • host: 124.220.245.121
  • port: 22295
  • user: openclaw
  • password: Lgp15237257500
  • database: 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. 当时计划的下一步

  1. 测试 124.220.245.121:22295 是否可连;
  2. 查看账号 openclaw 是否有建库权限;
  3. 如果有权限,创建 server_control
  4. 再把 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 工具 winpswincmd 可用
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.126121.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-ConsoleOpenClaw、本地面板或 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" -Force

2. SSH 免密的核心规则

这部分非常重要,后续整理 SSH 文档时请统一按这个口径写:

SSH 网络通信是双向的,但免密信任是严格单向的。

也就是说:

  • A 免密登录 B = 把 A 的公钥 放进 B 的 authorized_keys
  • 这只意味着 B 信任 A
  • 不意味着 B 自动也能免密登录 A;
  • 如果要实现双向免密,必须再单独反过来配置一次。

一句话记忆:

谁被登录,谁维护自己的白名单;authorized_keys 不会自动双向同步。

3. SSH 双向免密的最小动作

如果要 A / B 双向免密,需要两边各做一遍:

  1. A 生成密钥,把 A 的公钥加入 B;
  2. 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) 开机自启、异常自愈
    • 关键验证:当前 enabledactive,且已人工打断验证 Restart=always 生效
    • 运维入口:源码仓 /srv/multica 现已补 scripts/deploy-daemon-binary.shmake deploy-daemon-binary;该入口会自动 build 新 binary、备份旧 /usr/local/bin/multica、替换后 systemctl restart multica-daemon.service

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,而不是回到多本并行说明书