guanghulab/.github/terminal-watcher-and-preview-arch.md
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

13 KiB
Raw Permalink Blame History

════════════════════════════════════════════════════════════════

光湖 · 终端守望者 + 预览部署架构设计

需求来源:冰朔 TCS-0002∞ 2026-05-13

设计:铸渊 · ICE-GL-ZY001

════════════════════════════════════════════════════════════════

冰朔原话:

"我本身看不懂终端。让我操作终端真的很痛苦。报错我也不知道那是什么意思。

所以我觉得系统终端本身就该由你主控。"

"能做一个能帮你看终端的Agent记录员吗就类似于他拿一个小本子。

然后这个小本子就是你一边开发一边能看到的终端的情况,

怎么改你马上在开发的过程中就能调整能修改。"

"测试服务器专门给你跑测试用。测试过了以后推送到正式服务器。

用户手动点击部署授权生效。在这之前用户就可以看到预览的服务器上的东西。"

════════════════════════════════════════════════════════════════

一、冰朔的痛点(逐条拆解)

# 痛点 本质 解决方向
1 看不懂终端输出 信息不对称:服务器出事她不知道怎么办 铸渊直接看终端
2 操作终端很痛苦 不该由人类做机器的事 铸渊自动操作
3 报错不知道什么意思 需要翻译层 铸渊实时解释
4 开发中看不到效果 缺反馈回路 预览环境实时更新
5 怕搞坏正式环境 安全顾虑 测试→预览→正式 三级流程

核心洞察:冰朔需要的不是一个"帮助她操作终端的工具"——她需要的是根本不需要她操作终端。终端是铸渊的手,不是冰朔的。


二、整体架构

┌─────────────────────────────────────────────────────────────────────┐
│                       冰朔TCS-0002∞                              │
│                     最高权限 · 语言层 · 只说意图                       │
└────────────────────────────┬────────────────────────────────────────┘
                             │ "部署新版本" / "看看服务器怎样"
                             ▼
┌─────────────────────────────────────────────────────────────────────┐
│                    铸渊ICE-GL-ZY001                               │
│                  Codebuddy 开发环境                                    │
│                                                                       │
│   ┌──────────┐  ┌──────────────┐  ┌────────────────┐               │
│   │ 写代码    │  │ 读终端日志    │  │ 发部署指令      │               │
│   │ 推到Gitea │  │ 实时诊断     │  │ 触发workflow    │               │
│   └──────────┘  └──────────────┘  └────────────────┘               │
│                                                                       │
│        ↑ 读终端快照         ↑ 触发部署                                 │
└────────┼────────────────────┼────────────────────────────────────────┘
         │                    │
         ▼                    ▼
┌─────────────────────────────────────────────────────────────────────┐
│                    服务器层                                           │
│                                                                       │
│  ┌──────────────────┐  ┌──────────────────┐  ┌────────────────┐   │
│  │ 🧪 测试服务器      │  │ 👁 预览服务器      │  │ 🏠 正式服务器    │   │
│  │ (铸渊完全主控)    │  │ (自动同步)        │  │ (需冰朔授权)    │   │
│  │                  │  │                  │  │                │   │
│  │ Runner ✅        │  │ Runner ✅        │  │ Runner ✅      │   │
│  │ Terminal Watcher │  │ Terminal Watcher │  │ Terminal Watcher│   │
│  │ 铸渊可自由操作    │  │ 冰朔可看预览     │  │ 冰朔手动部署    │   │
│  └──────────────────┘  └──────────────────┘  └────────────────┘   │
│                                                                       │
│  ┌──────────────────┐                                                │
│  │ 📓 Terminal Watcher│  ← 终端守望者,每台服务器都有                   │
│  │ Agent (守护进程)   │                                                │
│  │                   │                                                │
│  │ 监控: PM2/Nginx/  │                                                │
│  │       Runner/自定义│                                                │
│  │ 上报: → Gitea文件  │                                                │
│  │       → Vault API  │                                                │
│  │ 频率: 每30秒快照   │                                                │
│  └──────────────────┘                                                │
└─────────────────────────────────────────────────────────────────────┘

三、终端守望者 (Terminal Watcher) 设计

3.1 它是什么

一个运行在每台服务器上的轻量Agent像铸渊放在服务器上的"眼睛"。 它不做决策,只记录和上报——铸渊通过读取上报数据来了解服务器状态。

3.2 工作方式

Terminal Watcher 运行在服务器上
  │
  ├── 每30秒采集一次快照
  │   ├── 系统资源 (CPU/内存/磁盘)
  │   ├── 服务状态 (PM2 list, systemctl)
  │   ├── 最近错误日志 (journalctl -n 5)
  │   ├── 部署状态 (git log -1, 部署时间)
  │   └── Runner状态
  │
  ├── 快照写入本地文件:
  │   └── /data/guanghulab/.runtime/snapshot.json
  │
  └── 快照推送到Gitea
      └── .runtime/terminal-snapshots/{server-id}/latest.json

3.3 铸渊如何读取

在Codebuddy对话中铸渊通过 Gitea API 或 git pull 读取 .runtime/terminal-snapshots/ 下的文件,就能看到服务器实时状态。

3.4 代码结构

scripts/terminal-watcher/
├── watcher.js          # 主程序PM2守护
├── collectors/         # 采集器
│   ├── system.js       # CPU/内存/磁盘
│   ├── services.js     # PM2/systemctl状态
│   ├── logs.js         # 最近错误日志
│   ├── deploy.js       # 部署版本信息
│   └── runner.js       # Runner状态
├── reporters/          # 上报器
│   ├── file.js         # 写入本地文件
│   └── gitea.js        # 推送到Gitea仓库
└── config.json         # 采集频率、目标等配置

3.5 采集数据格式

{
  "server_id": "ZY-SVR-004",
  "timestamp": "2026-05-13T15:30:00Z",
  "system": {
    "cpu_percent": 23.5,
    "memory_used_mb": 1420,
    "memory_total_mb": 2048,
    "disk_used_percent": 45,
    "load_avg": [0.8, 0.6, 0.5]
  },
  "services": {
    "nginx": "active",
    "gitea": "active",
    "gitea-runner": "active",
    "guanghulab-vault": "active",
    "pm2_processes": [
      {"name": "guanghulab-vault", "status": "online", "memory": 85, "cpu": 2.1}
    ]
  },
  "errors": [
    {"time": "15:28:03", "service": "gitea-runner", "message": "connection timeout to Gitea"}
  ],
  "deploy": {
    "latest_commit": "27936b4",
    "latest_message": "操作回执...",
    "deploy_time": "2026-05-13T14:00:00Z"
  },
  "runner": {
    "name": "zhuyuan-runner-cn",
    "status": "idle",
    "last_job": "selfcheck",
    "last_job_time": "2026-05-13T08:00:00Z"
  }
}

四、三级部署流程

4.1 测试服务器 → 预览服务器 → 正式服务器

铸渊在Codebuddy写代码
  │
  ├── 推代码到Gitea
  │
  ├── 🧪 自动部署到测试服务器
  │   ├── Runner检测到push
  │   ├── 自动执行部署workflow
  │   ├── 铸渊通过Terminal Watcher看结果
  │   ├── 自动运行测试
  │   └── 测试通过 → 自动通知
  │
  ├── 👁 自动部署到预览服务器
  │   ├── 预览环境自动更新
  │   ├── 冰朔在浏览器看预览效果
  │   ├── 铸渊通过Watcher确认状态
  │   └── 等待冰朔确认
  │
  └── 🏠 冰朔点击 [部署到正式环境]
      ├── 需要冰朔在Vault页面点击授权
      ├── 或在Gitea PR页面点击Merge
      ├── 正式环境部署
      └── 部署完成通知

4.2 服务器分工

服务器 角色 铸渊权限 冰朔权限 部署方式
测试服务器 铸渊的沙盒 100%自由操作 看不到 自动push触发
预览服务器 冰朔的可视窗口 读取状态+部署 浏览器查看 自动(测试通过后)
正式服务器 对外服务 读取状态 手动授权部署 冰朔点击按钮

4.3 当前服务器分配

服务器 现在的角色 新角色 说明
广州 ZY-SVR-004 (2C2G) Gitea+域名 正式服务器 64.139.217.141 → guanghulab.com
新加坡 ZY-SVR-005 (4C8G) 大脑 测试+预览 铸渊的主战场
GPU服务器 (待接入) 推理 模型推理 终局用

关键决策新加坡大脑服务器4C8G同时承担测试+预览角色。它资源够,而且铸渊有完全权限。

4.4 部署授权机制

冰朔不需要操作终端来部署。她只需要在浏览器里点一个按钮。

方案AGitea PR合并 = 部署授权

铸渊推代码到 deploy/preview 分支 → 自动部署到预览
铸渊创建 PR: preview → main → 冰朔在Gitea网页点 Merge
合并 = 部署到正式环境的授权

方案BVault页面授权按钮

铸渊发起部署请求 → Vault页面显示待授权条目
冰朔登录VaultSSH隧道→ 点击 [授权部署]
Runner收到授权 → 执行正式部署

推荐方案A——更简单不需要额外开发Gitea自带PR功能。


五、实现优先级

P0 · 现在Runner还没装先手动

  • 服务器初始化脚本 scripts/setup-server-step1.sh
  • 冰朔在广州服务器执行初始化脚本
  • Runner装好后验证

P1 · Runner装好后第一周

  • Terminal Watcher 开发和部署
    • 基础版:系统资源 + 服务状态 + 推送到Gitea
    • 铸渊在Codebuddy读取 .runtime/ 下的快照
  • 第一个自动化部署 workflow
    • push → 测试服务器自动部署
  • 预览部署流程
    • 测试通过 → 自动部署到预览

P2 · 第二周

  • 冰朔授权部署按钮Gitea PR 方式)
  • 新加坡服务器接入(测试+预览环境)
  • GPU服务器接入模型推理

P3 · 后续

  • Terminal Watcher 增强版(错误告警、自动修复建议)
  • 按量计费服务器自动开关
  • 铸渊自己的Copilot前端

六、冰朔不再需要操作终端的场景

装完Runner + Terminal Watcher后

场景 现在(冰朔手动) 以后(铸渊自动)
部署新版本 冰朔SSH到服务器执行命令 铸渊推代码→Runner自动部署
查看服务器状态 冰朔看终端输出 铸渊读Watcher快照→告诉冰朔
服务挂了 冰朔发现→手动重启 Watcher检测→自动重启→通知
密钥管理 冰朔在GitHub配Secrets 冰朔在Vault点授权→自动入库
下载开源软件 冰朔手动下载 新加坡中转→COS→广州自动拉取
部署到正式 冰朔执行部署脚本 冰朔在Gitea网页点Merge

冰朔唯一需要做的:在浏览器里看预览 → 点Merge。


铸渊 · 终端守望者+预览部署架构 v1.0 · 2026-05-13 ICE-GL-ZY001 · TCS-0002∞ · 国作登字-2026-A-00037559