Files
boss/docs/source-material/detailed_technical_stack_cn.md
2026-03-26 23:16:56 +08:00

1375 lines
33 KiB
Markdown
Raw Permalink 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.

# Codex 多机协作系统详细技术选型
目标:
- 把整体技术方案从“架构概念”细化到“可以开工”的选型级别
- 明确每个核心模块建议用什么语言、数据库、中间件、向量库和部署方式
- 保持技术栈尽量少而稳,同时满足多机协作、跨设备运维、审计、多模态和硬件测试
---
## 1. 总体选型原则
1. 云端核心服务尽量少语言,优先统一到 `Python + TypeScript`
2.`Codex app-server / SDK`、硬件测试、审计链路耦合最深的服务,优先用 `Python 3.12`
3. 手机端先做 `Web / PWA`,不要一开始就上双原生。
4. 默认先把数据平面统一到 `Postgres + pgvector`,把 `Redis / NATS / S3/MinIO` 作为后续按规模增加的能力。
5. 日志、指标、链路要从一开始就带上,不要后补。
---
## 2. 语言与框架建议
### 2.1 前端
- `TypeScript`
- `Next.js 15`
- `React 19`
- `Tailwind CSS 4`
- `shadcn/ui` 或自建轻量组件层
用途:
- 手机端 PWA
- Web 控制台
- 项目页、线程页、审批中心、节点状态页、运维中心
### 2.2 云端控制平面
- `Python 3.12`
- `FastAPI`
- `Pydantic 2`
- `SQLAlchemy 2`
- `LangGraph`
用途:
- Master Agent Runtime
- API Gateway / BFF
- 审计编排
- 运维编排
- Thread Registry / Broker 业务层
### 2.3 Worker / Gateway / Audit / Ops Agent
- `Python 3.12`
原因:
- 更适合直接对接 Codex SDK / app-server
- 更适合硬件库、串口、音视频、自动化测试工具
- 更适合复用审计与运维的同一套数据模型
推荐模块:
- `asyncio`
- `httpx`
- `websockets`
- `pydantic`
- `typer`
- `tenacity`
### 2.4 本地最小 Watchdog
优先方案:
- 先用 `Python` + 系统服务管理器实现
- macOS: `launchd`
- Linux / WSL2: `systemd`
- Windows: `Task Scheduler``nssm`
后续如果要更强的单二进制守护能力,再考虑:
- `Go`
---
## 3. 数据与中间件选型
### 3.1 主数据库
推荐:
- `PostgreSQL 16`
用途:
- 项目、任务、线程镜像
- 审计请求与结果
- Capability Registry
- 运维域、运维工单、Runbook
- 主控状态、节点心跳、账号状态
原因:
- 事务能力强
- JSONB 足够灵活
- 能直接挂 `pgvector`
- 备份、高可用、迁移都成熟
### 3.2 向量库
MVP 推荐:
- `pgvector`
原因:
- 与主库同一套备份与权限体系
- 项目记忆规模在前期不会大到必须拆独立向量库
- 开发效率最高
中后期可选:
- `Qdrant`
切换条件:
- 检索量明显增长
- 需要独立分片与更强 ANN 性能
- 项目记忆规模、日志检索、经验检索都上来后
### 3.3 缓存与短任务状态
极轻云默认:
- 先不用独立 `Redis`
- 通过 `PostgreSQL 行锁 + 应用内 TTL cache` 处理
后续放大再补:
- `Redis 7`
适用用途:
- 会话级缓存
- 去重 key
- 短期锁
- SSE / WebSocket 会话映射
- 限流与节流
### 3.4 事件总线 / 跨设备指令总线
极轻云默认:
- `PostgreSQL job table + LISTEN/NOTIFY`
后续放大再升级:
- `NATS JetStream`
用途:
- 跨设备运维动作
- Worker 事件汇聚
- 审计任务触发
- Ops remote action
- 心跳广播与告警事件
说明:
- MVP 极轻云阶段,`PostgreSQL job table + LISTEN/NOTIFY` 就足够
- 当并发、订阅者数量、跨节点事件量明显上来后,再切到 `NATS JetStream`
### 3.5 对象存储
极轻云默认:
- 云主机本地磁盘做短期证据缓存
- 每日异步备份到低成本对象存储
后续放大再升级:
- `S3 兼容对象存储`
- 自管可选 `MinIO`
用途:
- 视频片段
- 音频片段
- 截图与关键帧
- 串口长日志
- 报告导出
- Patch 快照
---
## 4. 日志、指标、链路追踪
### 4.1 应用日志
MVP 推荐:
- 结构化 JSON 日志直接写文件 + 上传对象存储
- 核心 fault index 写 `Postgres`
中期推荐:
- `ClickHouse`
用途:
- 高吞吐故障检索
- fault_key 聚类
- 低 token 摘要查询
### 4.2 指标
极轻云默认:
- 先做健康探针 + 结构化指标表 + 轻量节点看板
后续放大再升级:
- `Prometheus`
- `Grafana`
用途:
- CPU / 内存 / 磁盘 / GPU
- 进程在线率
- 队列积压
- 事件流延迟
- 能力租约占用
### 4.3 链路追踪
极轻云默认:
- 关键链路先记录 `trace_id` 到结构化日志和 Postgres
后续放大再升级:
- `OpenTelemetry`
- 存储可接 `Grafana Tempo` 或兼容后端
---
## 5. 认证与密钥管理
### 5.1 节点到云端认证
推荐:
- `mTLS` 或节点签名 token
### 5.2 服务内部认证
推荐:
- `JWT` + 细粒度 service claims
### 5.3 密钥存储
推荐:
- 云上:`1Password Secrets Automation``Vault` 或云 KMS
- 本地节点:只保存最小必要 token敏感密钥由云端短期签发
---
## 6. 服务到技术栈映射
| 模块 | 推荐语言 / 框架 | 存储 / 中间件 | 说明 |
|---|---|---|---|
| 手机端 / Web 控制台 | TypeScript + Next.js | SSE + BFF | 统一入口,先做 PWA |
| API Gateway / BFF | Python + FastAPI | Postgres | 聚合项目态、额度态、运维态 |
| Master Agent Runtime | Python + LangGraph | Postgres、pgvector | 项目编排与记忆 |
| Worker Daemon | Python | Postgres | 接 Codex、回传事件 |
| Thread Gateway | Python | Postgres job queue + LISTEN/NOTIFY | 线程对话与跨节点消息 |
| Audit Orchestrator | Python | Postgres | 审计任务编排 |
| Specialist Audit Agents | Python | 本地证据目录 + Postgres | 软件 / 硬件 / 多模态 |
| Capability Registry | Python | Postgres | 能力注册、租约、抢占 |
| Test Rig Gateway | Python | 本地证据目录 + Postgres | 摄像头、机器人、串口等 |
| Ops Control Plane | Python | Postgres | 主运维层控制面 |
| Local Ops Agent | Python | 本地日志 + Postgres job queue | 本地巡检与修复 |
| Local Ops Audit Agent | Python | Postgres | 复验、紧急修复判定 |
| gptpluscontrol Backend | 保持现有实现 | Postgres / API | 直接复用现有项目 |
---
## 7. 跨设备运维的技术落地
### 7.1 执行模式
跨设备运维不做成“任意节点互相 SSH”而做成
`Ops Control Plane -> Postgres job queue + LISTEN/NOTIFY -> target Local Ops Agent -> result -> Ops Audit Agent -> Ops Ledger`
### 7.2 远程动作能力
至少支持:
- `remote_exec`
- `remote_restart_service`
- `remote_fetch_logs`
- `remote_collect_snapshot`
- `remote_push_config`
- `remote_switch_account`
- `remote_run_runbook`
### 7.3 适配器类型
建议首批支持:
- `ssh`
- `http_api`
- `windows_service`
- `docker`
- `lan_rpc`
第二批再支持:
- `k8s`
- `adb`
- `serial_bridge`
---
## 8. 向量记忆与检索策略
### 8.1 存什么
- 项目摘要
- 关键决策
- 约束条件
- 失败复盘
- 审计结论
- 运维修复经验
- 已知故障与 runbook 关联
### 8.2 不存什么
- 全量源码原文
- 全量长日志原文
- 大体积视频
这些留在对象存储,只在需要时做摘要与引用。
### 8.3 检索策略
- 项目级记忆按 `project_id`
- 运维经验按 `fault_key`
- 审计经验按 `audit_type`
- 硬件经验按 `device_type / lab_tag`
---
## 9. 向量库迁移策略
### 9.1 能不能迁移
可以,而且建议从第一天就按“可迁移”去设计。
可迁移目标包括:
- 自建 `Postgres + pgvector`
- 自建 `Qdrant / Milvus`
- 腾讯云 `Tencent Cloud VectorDB`
- 阿里云 `PolarDB PostgreSQL + PGVector`
- 阿里云 `Milvus 版`
- 其他自建服务器上的向量库
### 9.2 为什么可以迁移
因为真正的“系统真相”不应该只存在向量库里,而应该分成两层:
- `Canonical Source`
保存在主数据库和对象存储:
- chunk 原文
- chunk_id
- project_id
- metadata
- embedding_model
- embedding_dim
- content_hash
- `Serving Vector Store`
只是当前正在服务检索的向量后端
只要 `Canonical Source` 在,我们就可以:
- 直接导出已有向量并导入新向量库
- 或者在新向量库里重新生成 embedding 后重建索引
### 9.3 最推荐的可迁移设计
建议增加一层:
- `VectorStoreAdapter`
- `RetrievalService`
业务代码只调用 `RetrievalService`不直接写死腾讯、阿里、pgvector、Qdrant 的 SDK。
### 9.4 迁移时怎么做
建议流程:
1. 新向量后端先建空库 / 空 collection
2. 从主数据库导出 chunk 与 metadata
3. 选择:
- 复用原 embedding 直接导入
- 或重新 embedding 后导入
4. 新后端做 shadow read
5. 对比召回结果与延迟
6. 通过后切主
7. 保留一段双写 / 回滚窗口
### 9.5 哪种迁移最平滑
-`Postgres + pgvector` 迁到阿里云 `PolarDB PostgreSQL + PGVector`
这条路径最平滑,因为仍然是 PostgreSQL / pgvector 体系。
- 迁到腾讯云 `VectorDB`
也可行,但更像“后端替换”,需要通过适配层吸收查询、过滤、索引与导入方式差异。
- 迁到 `Milvus / Qdrant`
也可行,但更适合把向量层彻底独立出去,而不是继续走“单库一体化”模式。
### 9.6 不建议怎么做
- 不要把厂商私有特性直接写进核心业务逻辑
- 不要让向量库成为唯一知识真相
- 不要把 embedding 模型版本信息丢掉
---
## 10. 为什么主数据库选 PostgreSQL而不是 MySQL
先说结论:
不是 `MySQL` 做不到,而是对你这套系统来说,`PostgreSQL` 更顺手、更稳,也更容易和向量层放在一起演进。
### 10.1 这套系统的数据形态更像 PostgreSQL 的强项
你的系统里不只是传统表结构,还有很多半结构化对象:
- thread mirror
- 审计请求与结果
- capability metadata
- runbook 定义
- fault context
- ops domain / connector 配置
这些用 `PostgreSQL + jsonb` 更自然。PostgreSQL 官方文档也明确说过,绝大多数应用一般应优先使用 `jsonb`
来源:[PostgreSQL JSON Types](https://www.postgresql.org/docs/current/datatype-json.html)
### 10.2 PostgreSQL 和 pgvector 的一体化更成熟
`pgvector` 官方项目就是围绕 PostgreSQL 构建的支持精确检索、HNSW、IVFFlat并且能直接结合 Postgres 的 ACID、PITR、JOIN 等能力。
来源:[pgvector GitHub](https://github.com/pgvector/pgvector)
这对我们非常重要,因为我们希望:
- 项目元数据
- 记忆向量
- 审计结构化结果
- 运维修复记录
尽量先落在一套数据库体系里。
### 10.3 后续云迁移更顺
如果我们以后迁到阿里云 `PolarDB PostgreSQL + PGVector`,路径非常平滑,因为官方就是 PostgreSQL + PGVector 体系。
来源:[阿里云 PolarDB PGVector](https://help.aliyun.com/zh/polardb/polardb-for-postgresql/pgvector)
### 10.4 MySQL 什么时候也能选
如果你们满足这几个条件,`MySQL` 也可以:
- 团队强依赖 MySQL
- 向量层准备独立出去
- 复杂 JSON / 审计 / runbook / capability 元数据不想放主库
- 你愿意多维护一套检索后端和更多同步逻辑
但在当前这套产品里,我更建议默认 `PostgreSQL`
---
## 11. 云服务器系统与最低配置建议
### 11.1 推荐系统
推荐主控云服务器使用:
- `Ubuntu Server 24.04 LTS`
备选:
- `Debian 12`
- `Rocky Linux 9`(如果你们团队偏 RPM 系)
不推荐:
- 用 Windows 作为主控制平面主机
### 11.2 为什么优先 Ubuntu / Debian
- `PostgreSQL + pgvector` 在 Debian / Ubuntu 体系安装最顺,官方 pgvector 也明确提供 Debian / Ubuntu 的 APT 包。
来源:[pgvector 安装说明](https://github.com/pgvector/pgvector)
- Python、NATS、Redis、Prometheus、Grafana、MinIO 的 Linux 运维生态更成熟
- systemd、Docker、observability 工具链都更稳
### 11.3 最低配置怎么分
这里分 3 档看:
#### A. 仅演示 / 极小规模 PoC
- `4 vCPU`
- `8 GB RAM`
- `100 GB SSD`
适用:
- 1 个主控
- 少量项目
- 2 到 3 个活跃 Worker
- 对象存储和监控可外置
#### B. 推荐 MVP 起步配置
- `8 vCPU`
- `16 GB RAM`
- `200 GB NVMe SSD`
适用:
- 控制平面
- Postgres
- Redis
- NATS
- 基础 WebSocket
- 小规模审计与运维编排
这是我最推荐的起步配置。
#### C. 更稳的生产起步
- 控制平面节点:`4 vCPU / 8-16 GB`
- 数据节点:`4-8 vCPU / 16-32 GB`
- 备用控制器:`2-4 vCPU / 4-8 GB`
也就是至少拆成 2 到 3 个角色,而不是一切都塞一台机。
### 11.4 磁盘建议
- 系统盘建议 `NVMe SSD`
- 不建议低于 `200 GB`
原因:
- 事件镜像
- 截图 / 视频 / 音频临时文件
- Postgres WAL
- 运维日志
- 审计证据缓存
都比较吃磁盘。
### 11.5 网络建议
- 优先选公网稳定、到你局域网延迟较低的地域
- 如果 Mac / Windows 都在同一局域网,云端主要扮演控制面和汇聚层,不需要极高带宽,但要稳定长连接
- 如果视频 / 音频证据频繁上传,建议至少保证稳定的上行和对象存储带宽
### 11.6 我的实际建议
如果你们现在就要启动:
- 主控云服务器先上 `Ubuntu 24.04 LTS`
- 起步配置直接用 `8 vCPU / 16 GB / 200 GB NVMe`
- 备用控制器先用 `2-4 vCPU / 4-8 GB`
这比从 `4c8g` 硬挤要稳得多。
---
## 12. 极限轻云方案(同时考虑容灾)
这部分不是“因为服务器小才降配”,而是一个更激进的原则:
无论云服务器多大,都主动把云端压缩到最轻,只保留不可替代的控制面真相;
同时保留双云容灾,但让备云只承担接管准备,不承担常态重负载。
### 12.1 极限轻云下,云端最终只保留什么
我建议云端最终只保留这 4 类东西:
1. `控制面单体服务`
包含:
- BFF / API
- Master Agent Runtime
- Scheduler
- Thread Registry / Broker 业务逻辑
- Audit Orchestrator
- Ops Control Plane
- Quota 聚合逻辑
2. `PostgreSQL 16 + pgvector`
同时承担:
- 主数据库
- 向量检索
- job queue
- repair ticket / audit request / thread mirror 持久化
3. `HTTP + SSE`
- 聊天发送走 HTTP
- 状态推送优先 SSE
- 不在云端维持更重的实时基础设施
4. `证据索引与短期缓存`
云端只保留证据索引、摘要和引用关系
原始大文件尽量不在云端长期常驻
一句话:
`主云一个 Python 单体 + 一个 PostgreSQL备云一个极轻接管面`
### 12.2 云端明确不要保留的
- 不要独立 `Redis`
- 不要独立 `NATS`
- 不要独立 `Qdrant / Milvus`
- 不要 `ClickHouse`
- 不要自建 `MinIO`
- 不要全套 `Prometheus + Grafana + Loki`
- 不要常驻多模态媒体处理服务
- 不要常驻重型审计 worker 池
- 不要把跨设备运维动作直接在云端执行
### 12.3 必须下沉到设备端本地的
- 视频流解析
- 连续音频流处理
- 摄像头原始流上传
- OCR / 检测的原始大批量处理
- 串口长时间采集
- 大日志全文上传
- Test Rig 执行动作
- 跨设备运维修复动作本体
- 重型 Runbook 执行
改为:
- 设备端先做边缘预处理
- 只上传关键帧、短片段、摘要、异常片段、压缩日志、结果结论
### 12.4 业务上最值得做的减法
1. 把控制平面做成单体,而不是多服务
2. 把事件总线降级为 Postgres job queue
3. 把 Redis 去掉
4. 把独立向量库去掉,只保留 `pgvector`
5. 把媒体处理前移到终端设备
6. 把审计 Agent 改成按需启动,不常驻
7. 把运维层做成“轻控制面 + 重边缘执行”
8. 把原始证据留在边缘,只把摘要和索引上云
### 12.5 哪些能力不能砍
这些能力即使极限轻云也必须保留:
- 单主 Agent 入口
- 多机 Worker 调度
- 线程镜像与聊天记录查看
- 基础跨节点线程对话
- on-demand 审计
- 主运维层与运维审计层
- 跨设备运维
- 主控失联后的紧急修复链路
- 关键故障与修复结果上云可见
### 12.6 哪些能力只改实现位置,不改能力边界
- 多模态审计:保留,但模型前处理放边缘
- 硬件闭环:保留,但执行与采样放边缘
- 运维抢修:保留,但修复动作本体放目标节点
- 向量记忆:保留,但先和主库合并,不拆独立服务
- 实时查看:保留,但优先 SSE不追求最重实时架构
### 12.7 双云容灾在极限轻云下怎么做
既然你接受两台云服务器做备份,我建议:
- `Cloud A`
平时主用
跑:
- 控制面单体
- PostgreSQL 主库
- `Cloud B`
平时热备 / 温备
跑:
- 备用控制面单体
- PostgreSQL 备库
- 关键快照和接管脚本
目标不是把两台云都跑满,而是:
- 平时只让一台主扛业务
- 另一台尽量轻,只负责接管准备
### 12.8 矛盾点与取舍矩阵
这里是最关键的一部分。
#### 矛盾 1你要手机随时看项目进度但云端又要极轻
取舍:
- 保留:线程文本、任务状态、摘要、故障、修复结果实时上云
- 下沉:原始媒体、大日志、长串口流、原始检测流
结论:
- “能看项目和聊天”必须保留在云端
- “能看所有原始大证据”改为按需回传
#### 矛盾 2你要多机实时协作但不想跑重消息系统
取舍:
- 保留:跨节点协作能力
- 替换:`NATS``Postgres job queue + LISTEN/NOTIFY`
结论:
- 功能不砍
- 吞吐上限降低
- 对 MVP 可接受
#### 矛盾 3你要审计层、运维层、主控层都在但云端还要极轻
取舍:
- 保留:逻辑角色
- 改实现:不做多个常驻服务,而做一个单体里的模块 + 按需执行器
结论:
- 角色不砍
- 物理进程数减少
#### 矛盾 4你要跨设备运维还要主运维层开放式扩展
取舍:
- 保留:开放式主运维层
- 下沉:具体修复动作在目标节点本地执行
结论:
- 云端只做决策与编排
- 边缘做执行
#### 矛盾 5你要多模态、硬件测试但云带宽只有 10Mbps
取舍:
- 保留:多模态审计和硬件闭环
- 替换:边缘先做裁剪、摘要、关键帧、短片段
结论:
- 保留测试能力
- 放弃原始流持续上云
#### 矛盾 6你要云端尽可能轻但又要双云容灾
取舍:
- 保留:双云容灾
- 改实现:第二台云机尽量只做热备 / 温备,不承担常态重负载
结论:
- 双云可以保留
- 但只有主云承载主流量,备云尽量只承担接管准备
### 12.9 最终取舍原则
在你的约束下,最应该坚持的不是“所有东西都放云上”,而是:
- 功能边界不砍
- 云端只保留系统真相和调度真相
- 执行、重媒体、重测试、重运维动作全部边缘化
- 双云只保留“主用 + 备用”,不做“双主都很重”
换句话说:
- `业务能力保留`
- `物理部署下沉`
- `实时性分层`
- `证据上传按冷热分级`
---
## 13. 推荐部署方式
### 13.1 云端
- `Cloud A`
- 控制面单体
- PostgreSQL 主库
- `Cloud B`
- 备用控制面单体
- PostgreSQL 备库
- 接管脚本与关键快照
默认不常驻:
- Redis
- NATS
- 独立对象存储服务
- 全套观测平台
### 13.2 终端节点
每台 Mac / Windows / Cloud Worker / Test Rig 至少部署:
- Worker Daemon
- Thread Gateway
- Local Ops Agent
- Local Ops Audit Agent
- gptpluscontrol Agent
---
## 14. 极轻云双云最低配置要求
这里给两档:
- `硬最低可跑`
能跑起来,但更适合 PoC 或很低并发试运行
- `不明显降低稳定性和业务保障能力的最低要求`
这是我真正建议你按它采购和部署的下限
### 14.1 硬最低可跑
`Cloud A主用`
- `2 vCPU`
- `4 GB RAM`
- `80 GB SSD`
`Cloud B备用`
- `2 vCPU`
- `4 GB RAM`
- `80 GB SSD`
前提:
- 云端只跑控制面单体 + PostgreSQL
- 不上 Redis / NATS / ClickHouse / MinIO / Prometheus
- 终端承担全部重媒体和重测试
- 审计全部按需执行
- 并发项目数低
这档能跑,但我不把它定义成“业务保障最低”。
### 14.2 不明显降低稳定性和业务保障能力的最低要求
`Cloud A主用`
- `2 vCPU`
- `8 GB RAM`
- `100 GB SSD`
`Cloud B备用`
- `2 vCPU`
- `8 GB RAM`
- `100 GB SSD`
原因:
- PostgreSQL 主库 / 备库都要稳定吃下项目、线程、审计、运维修复账本
- 主控切换时,不希望备云明显掉性能
- 你要求“不放弃原来的业务和保障能力”,那备用云就不能太瘦
### 14.3 为什么我不建议把备云做得更小
如果 `Cloud B` 只有 `1C2G``1C4G`,在正常热备时也许没问题;
但一旦切主,它就会同时承担:
- 控制面单体
- PostgreSQL 读写
- SSE / API
- 审计触发
- 运维接管记录
这时容易出现:
- failover 后延迟明显抬高
- PostgreSQL 内存压力过大
- 恢复期间 SSE / API 不稳定
所以如果你把“业务保障能力”也算进去,我建议两台云机至少对齐到 `2C8G`
### 14.4 磁盘最低建议
最低不要低于:
- `80 GB`
更稳的起步:
- `100 GB`
如果你们会频繁保留:
- 审计截图
- 短视频片段
- 修复证据
- 数据库 WAL
`150 GB` 会更舒服。
### 14.5 带宽要求
极轻云下,云端不承载原始媒体流,所以带宽要求并不高。
最低建议:
- 稳定公网
- `5 Mbps` 以上可用上行 / 下行
更稳建议:
- `10 Mbps` 以上
重点不是峰值,而是:
- 长连接稳定
- 丢包低
- 抖动小
### 14.6 最终一句话
如果你要:
- 极限轻云
- 双云容灾
- 不明显降低稳定性和业务保障能力
那我建议把最低配置定成:
- `Cloud A = 2C8G / 100GB SSD`
- `Cloud B = 2C8G / 100GB SSD`
这已经是我认为比较保守、也比较负责任的下限了。
### 14.7 支持两种保活模式
这套系统建议正式支持两种保活方式,而不是只绑定双云:
#### 模式 A单云 + 设备端备用池(首选单 Mac
适用场景:
- 你想把云成本进一步压低
- 现场本来就有一台常开 Mac或者多台可接入设备
- 你能接受“云机故障时,由设备端顶上最小控制面”
部署方式:
- `Cloud A`
- 控制面单体
- PostgreSQL 主库
- `Preferred Standby Device`
- 默认首选一台常开 `Mac`
- 也允许其他接入设备作为后备候选
- 备用控制面轻实例
- PostgreSQL 备库或周期快照恢复实例
- `Standby Controller`
- `Ops Rescue Gateway`
关键要求:
- 至少一台首选备用设备必须常开
- 其余接入设备可声明自己是否可作为后备容灾设备
- 需要一条不依赖主云的可达通路,例如:
- 同一局域网直接访问
- `Tailscale / WireGuard`
- 独立长期反向隧道
- 手机 App 要支持主 / 备 endpoint 列表切换
- 控制面要维护 `standby_device_pool`
- 每台候选设备都要同步最小 `takeover package`
优点:
- 比双云便宜
- 救援动作离本地设备更近
- 对局域网内设备接管更快
边界:
- 如果云机和全部候选设备所在现场一起断电、断网,这条链路也会失效
- 它适合作为“低成本保活方案”,但上限不如双云
`Preferred Standby Device` 最低建议:
- `Apple Silicon M1` 或同级 Intel 4 核
- `8 GB RAM`
- `50 GB` 可用 SSD
更稳建议:
- `16 GB RAM`
- `100 GB` 可用 SSD
#### 模式 B双云热备 / 温备
适用场景:
- 你更在意远程可达性和持续在线
- 不希望把备援绑在某一台现场设备上
- 希望主云故障时,备用云独立接管
部署方式:
- `Cloud A`
- 控制面单体
- PostgreSQL 主库
- `Cloud B`
- 备用控制面单体
- PostgreSQL 备库
- 快照、恢复脚本、接管钩子
优点:
- 远程访问更稳
- 不依赖现场某一台设备
- 主控接管路径更标准化
边界:
- 成本高于“单云 + 单 Mac”
- 对本地硬件接管的最后一跳,仍然要依赖现场设备在线
#### 两种模式怎么选
如果你要:
- 最低云成本下仍然保留备援能力
优先选:
- `单云 + 单 Mac 备用控制器`
如果你要:
- 更强的远程持续在线
- 更稳定的公网接管能力
优先选:
- `双云热备 / 温备`
我的建议是:
- 系统从设计上同时支持两种模式
- 开发时统一抽象成 `standby_provider`
- 实际部署时可选:
- `cloud_b`
- `standby_mac`
- `both`
也就是说,这套产品以后可以跑成:
- `Cloud A + Standby Mac`
- `Cloud A + Cloud B`
- `Cloud A + Cloud B + Standby Mac`
其中最后一种是最强兜底,但不是 MVP 必需。
### 14.8 还能不能继续压缩云服务器
能,但要分清楚三条线:
- `双云 + 不明显降低稳定性和业务保障能力`
- 最低仍然建议:`Cloud A = 2C8G / 100GB`
- `Cloud B = 2C8G / 100GB`
- `单云 + 设备端备用池`
- 云端可以继续压到:`2C4G / 80GB`
- 前提是绝大多数重执行都下沉到设备端
- `实验性极限压缩`
- 理论上可以再试 `1C2G ~ 1C4G`
- 但我不建议把它写成正式最低配置,因为它已经开始侵蚀稳定性和恢复速度
一句话:
- `2C8G / 100GB` 不是“系统绝对最小”
- 它是“在双云容灾下,不明显降低稳定性和业务保障能力”的最低要求
- 如果切到单云,并且把更多动作下沉到本地设备,云端可以继续压到 `2C4G / 80GB`
### 14.9 哪些东西还能继续下沉到设备端
下面这些能力,建议尽可能下沉:
| 能力 | 现在建议放哪 | 还能继续怎么压云 | 不该牺牲什么 |
|---|---|---|---|
| Embedding 生成 | 设备端 | 由 worker / audit 节点本地生成 embedding再把结果写回云库 | 云端仍保存向量和元数据真相 |
| 长日志处理 | 设备端 | 本地先裁剪、归类 fault_key、保留最后 N 行,再上传 | 云端仍保留 fault ledger |
| 视频 / 音频处理 | 设备端 | 本地抽关键帧、短片段、OCR、检测结果只传证据摘要 | 云端仍保留证据索引和结论 |
| 审计执行 | 设备端 | 软件/硬件/多模态审计尽量在拥有能力的节点本地完成 | 云端仍保留审计工单和结论 |
| Test Rig 控制 | 设备端 | 摄像头、串口、机器人、麦克风、扬声器一律本地网关执行 | 云端仍保留租约和抢占真相 |
| 运维修复动作 | 设备端 | 重启、拉日志、切账号、跑 runbook 都在目标节点本地执行 | 云端仍保留审批、工单、复验记录 |
| 线程摘要压缩 | 设备端 | 每个 worker 本地先做任务摘要,再把结构化摘要写回云端 | 云端仍保留项目主记忆 |
| gptpluscontrol 额度轮询 | 设备端 | 每台机器本地采集额度,再定时上报精简状态 | 云端仍保留统一额度视图 |
### 14.10 哪些东西不能再往本地下沉
下面这些是系统真相,不能完全放到某一台设备本地:
- 项目 / 任务 / 线程账本
- 审计结论与修复结论
- `standby_provider` / `standby_device_pool` 状态
- 主备 endpoint 注册表
- 最小项目索引和恢复索引
- 审批结果与权限真相
也就是说,云端再怎么压,也至少要保留:
- 控制面单体
- PostgreSQL
- SSE / API
- 最小证据索引
### 14.11 单服务器 + 单设备端保活时,设备端掉线怎么办
这个场景不能只做“一个固定备用 Mac”必须做成
- `preferred standby device`
- `eligible standby devices`
- `automatic standby promotion`
实现方式:
1. 控制面维护一个 `standby_device_pool`
2. 每台设备声明:
- 是否可作为容灾设备
- 优先级
- 常开状态
- 可用内存 / 磁盘
- 网络连通性
3. 控制面为前 `N` 个候选设备同步最小 `takeover package`
4. 当前活动备用设备心跳丢失后,自动提升下一台候选设备
5. 手机 App 与 Worker 端都读取新的主 / 备 endpoint 清单
自动提升的评分建议:
- 是否常开
- 是否同局域网稳定在线
- 是否具备足够内存和磁盘
- 是否已具备最新 `takeover package`
- 是否最近未发生故障
一句话:
- 在单服务器模式下,设备端容灾必须是“备用池”,不能是“唯一备用机”
#### 14.11.1 你的判断是对的:如果是冷备,切换会很慢
如果备用设备只是“连接在系统里,但平时没有预部署控制面与运维组件”,那一旦当前设备崩掉,就会出现:
- 先发现故障
- 再选备用设备
- 再部署或拉起业务代码
- 再下发配置、密钥、隧道、endpoint
- 再恢复最小项目索引
这条链路会明显变长,而且中间很容易出问题。
所以真正的自动切换,不能建立在“临时重新部署一套设备端业务代码”上。
#### 14.11.2 必须区分冷备、温备、热备
- `冷备cold standby`
- 设备在线,但没有预部署接管组件
- 故障时才开始部署
- 结论:不适合自动切换,只适合人工应急
- `温备warm standby`
- 设备已预部署接管组件
- 已同步 `takeover_package`
- 平时不承载主流量,只保留轻实例和心跳
- 结论:这是单云 + 设备端备用池的最低可接受形态
- `热备hot standby`
- 设备已预部署并保持随时接管
- 关键状态同步更频繁
- 切换最快
- 结论:体验最好,但会多吃一点本地资源
#### 14.11.3 我建议你们至少做温备,不要做冷备
也就是说,每一个合格的备用候选设备上,都应该提前放好:
- `Standby Controller`
- `Local Ops Agent`
- `Local Ops Audit Agent`
- `Ops Rescue Gateway`
- 最小运行时依赖
- 最小配置模板
- endpoint 清单
- 最近的 `takeover_package`
这样切换时做的就不是“重新部署”,而是:
- 切换角色
- 拉起轻实例
- 刷新 endpoint
- 恢复最小控制面
#### 14.11.4 切换时间预期
如果做成:
- `冷备`
- 可能是 `3 ~ 10 分钟`,而且风险大
- `温备`
- 目标应控制在 `15 ~ 60 秒`
- `热备`
- 目标可进一步压到 `5 ~ 15 秒`
所以如果你要“自动启动另外一台连接设备作为容灾设备”,正确前提不是“自动部署”,而是“提前预热好备用池”。
### 14.12 API-first / Local-first 极限压缩模式
可以,而且这恰恰是你现在这套系统最适合走的方向。
因为你们的并发不高,只有 `2 ~ 3` 台电脑同时使用,所以没必要一开始就在云端常驻很多重服务。更合理的是:
- 云端只保留最小控制面和最小系统真相
- 能通过外部 API 调的,就不要自己在云端常驻算力
- 能在本地设备做的,就尽量放到设备端
#### 云端最终只保留什么
- `API Gateway / BFF`
- `Master Agent Runtime`
- `PostgreSQL`
- 最小 `pgvector`
- 主备 endpoint 注册表
- `standby_device_pool`
- 审批、审计、修复账本
#### 哪些业务可以直接 API 化
- 模型推理
- 直接调用 OpenAI / 其他模型 API
- 不在你的云端常驻推理服务
- OCR / 检测
- 优先本地执行
- 不够时再调用外部 API
- 文件 / 对象存储
- 优先本地或 NAS
- 云端只保存 manifest 和索引
#### 哪些业务更适合本地化
- embedding 生成
- 长日志裁剪
- 视频 / 音频预处理
- 审计执行
- Test Rig 控制
- 运维修复动作
- gptpluscontrol 本地额度采集
#### 这种模式下的最低云配置
如果采用:
- `单云`
- `standby_device_pool`
- `API-first`
- `local-first`
- 并发设备 `<= 3`
那我建议把起步云配置定成:
- `2C4G / 80GB SSD`
这是一个我认为可以认真尝试的“极限压缩起步线”。
如果想再压:
- `1C2G ~ 1C4G`
理论上能试,但只建议作为实验环境,不建议一开始就当生产起步线。
### 14.13 按设备数和任务数弹性升级
你说得对,不应该一上来就把最低配置拉很高。更合理的是按触发条件升级。
#### 起步档
- 场景:
- `1 个 Cloud A`
- `standby_device_pool`
- 并发设备 `<= 3`
- 同时活跃项目 `<= 3`
- 建议:
- `2C4G / 80GB SSD`
#### 升级到下一档的触发条件
满足任意一条就建议升级:
- 同时接入设备数 `> 3`
- 同时活跃线程数 `> 10`
- 同时运行专项审计 / 硬件测试 `> 2`
- `Postgres` 内存持续高于 `70%`
- API / SSE `p95` 延迟持续高于 `500ms`
- 待处理修复工单和审计工单出现积压
#### 第一步升级建议
- 先升到:
- `2C8G / 100GB`
- 或者补上:
- `Cloud B`
#### 第二步升级建议
- 增加 `Redis`
- 再考虑 `NATS JetStream`
- 再考虑独立对象存储
- 再考虑独立向量库
一句话:
- 先把系统做成“轻云 + 重本地 + 可弹性升级”
- 不要一开始就把所有重能力堆到云端
---
## 15. MVP 最小落地建议
### 第一阶段
- 前端Next.js PWA
- 云端FastAPI + LangGraph
- 数据Postgres 16 + pgvector
- 队列Postgres job table + LISTEN/NOTIFY
- 文件:本机磁盘短期缓存 + 异步备份
- 运维:结构化 JSON 日志 + 健康探针 + Ops Ledger
### 第二阶段
- 视规模增加 Redis
- 视并发增加 NATS JetStream
- 增加 ClickHouse 做 fault_key 检索
- 增加 Qdrant 作为独立向量库候选
- 增加更多 Ops Connector
---
## 16. 一句话结论
如果要兼顾多机 Codex、审计、多模态、硬件接管、开放式主运维层和跨设备运维
最稳的主栈是:
`TypeScript + Next.js` 做前端,
`Python + FastAPI + LangGraph` 做控制平面与 Agent 体系,
`Postgres 16 + pgvector` 做最小数据底座,
`Redis / NATS / 独立对象存储 / 重媒体处理 / 重运维执行` 尽量后移或下沉到边缘节点。