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

289 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ════════════════════════════════════════════════════════════════
# 光湖 · 终端守望者 + 预览部署架构设计
# 需求来源:冰朔 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 采集数据格式
```json
{
"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还没装先手动
- [x] 服务器初始化脚本 `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*