跳到主要内容

Platform API 拆分计划(ECS 控制面 + Dell 算力池)

目标(已对齐)Docker R / Python 永远在算力节点(Dell)上;ECS 只放 platform-api(+ 静态站 + nginx)。算力节点可以 一台 Dell,也可以多台(水平扩展 worker)。
完成标准:登录 / 用户 / 权限 / Copilot / 项目 CRUD → platform + RDS;执行 → Dell 上的 r-compute + worker + R 容器py-compute + worker + Python 容器;任务真相在 RDS,不靠「ECS 与 Dell 各一份 SQLite」。


1. 目标拓扑

1.1 谁在哪(核心)

逻辑服务部署位置Docker职责
platform-apiECS(杭州,同 VPC RDS)鉴权、用户、权限、CRUD、Copilot、FigCode 入队、OSS 签名、admin
r-computeDell 算力节点R 容器在本机HTTP:/api/run/api/task 入队、replot;可选瘦 API
r-worker每台有 R 的 Dell同机 docker execRDS claim 任务 → 跑 R → 写状态 / OSS
py-computeDell 算力节点Python 容器在本机HTTP:py 任务、upload、/api/run
py-worker每台有 Python 的 Dell同机RDS 消费 py 队列

不是「三台 Node 都堆在 ECS 里跑 Docker」——ECS 内存不够、也和你们现有 16TB + 大内存 Dell 投资不一致。

1.2 多台 Dell 怎么扩

RDS (tasks, tool_jobs, analyses, …)
▲ ▲ ▲
│ claim │ claim │ claim
┌──────────┴───┐ ┌─────┴─────┐ ┌───┴──────────┐
│ Dell-A │ Dell-B │ Dell-C (未来) │
│ r-worker │ r-worker │ py-worker │
│ R Docker │ R Docker │ Py Docker │
│ py-worker? │ │ │
└──────────────┘ └───────────┘ └──────────────┘
  • 每个 worker 配置 BIOF3_WORKER_ID(唯一)、同一 DATABASE_URL(RDS 内网或经 platform 所在 VPC 可达的地址)。
  • 异步任务:worker 只连 RDS,不需要每台 Dell 都暴露公网 API。
  • 同步 /api/run、replot、大文件 upload:仍需 某一扇 HTTP 入口 → nginx 可 反代到一台主 Dell(frp/专线),或后续 算力网关 按负载挑节点(M 后期优化)。

1.3 用户流量示意

用户 → biof3.com (ECS nginx)
├─ /api/platform/* → ECS :3020 platform-api → RDS / OSS
├─ /api/r/* → frp 或专线 → Dell :3011 r-compute (+ 本机 R)
└─ /api/py/* → frp 或专线 → Dell :3012 py-compute (+ 本机 Py)

Dell r-worker / py-worker ──(DATABASE_URL)──► RDS 抢任务、更新状态

C3 现状/api/r/ 在 ECS 上的是 platform 时期误留的「全量 r-server」;拆分后 ECS 不应再跑 R Docker,只保留 platform:3020


### 1.4 与「Dell 纯 Worker」旧说法的差异

| 旧 C/D 草案 | 本方案(你的对齐) |
|-------------|-------------------|
| platform 在 ECS,算力在 Dell | **platform + r-compute + py-compute 均在 ECS** |
| 家里大盘 + 96G 内存 | 算力依赖 **ECS 数据盘 / NAS 挂载到容器** + **选型大内存 ECS**(见 §6) |
| frp 穿透 API | **取消**对 3001/3002 的 frp 依赖 |

---

## 2. 现状 vs 目标(能力表)

| 能力 | 今天 | 目标 |
|------|------|------|
| 登录 / JWT / 用户 / 权限 | `biof3-r-server` | **platform-api** |
| 项目 / 数据集 / 分析 CRUD | `r-server` `/api/data/*` | **platform-api** |
| Copilot / AI / 反馈 / 埋点 | `r-server` `routes/*` | **platform-api** |
| FigCode **提交** `tool_jobs` | `r-server` `routes/tools.js` | **platform-api**(入队);**执行**在 **r-compute worker** |
| FigCode / 单细胞 **跑 R** | 混在 r-server | **r-compute**(3011 + R Docker + worker) |
| 空间 / ML **跑 Python** | py-server 全包 | **py-compute**(3012 + Python Docker + worker) |
| 元数据 DB | RDS | 不变;**platform 主写**,compute **只写任务/分析状态** |
| R 队列 `tasks` | SQLite 本机 | **必须 PG**(ECS 上 api/worker 同机也需共享表) |
| Py 队列 | `pyserver.db` 本机 | **迁 PG**(与 R 对称,见 §5) |

**兼容期**:`/api/r/auth/*` nginx 反代到 platform `:3020`,前端逐步改为 `/api/platform/auth/*`。

---

## 2. 路由归属清单(从 `r-server` 拆出)

### 2.1 → **platform-api**(控制面)

| 前缀 / 文件 | 说明 |
|-------------|------|
| `auth.js` + `/api/auth/*` | 登录、注册、me、改密 |
| `api-data.js` → `/api/data/*` | projects / datasets / analyses / quota |
| `routes/ai-*.js`, `feedback.js`, `analytics.js` | Copilot 全家桶 |
| `routes/tools.js` | **仅** 创建 job、查状态、历史、public-demo;**不**在 platform 里 `docker exec R` |
| `server.js` 片段 | `/api/health`, `/api/oss/sign`, `/api/upload`(若给 Copilot/云平台上传) |
| `server.js` admin | `/api/admin/users`, guest-permissions, impersonate, cache/backup 管理 UI |
| `/api/public/guest-permissions`, `/api/error-report`, `/api/pageview` | 公开/埋点 |
| `helpers/permissions.js`, `guest-permissions.js` | 模块权限 |
| `db.js` + `db-*-pg.js` + `db-p2-*` | **唯一** PG 访问层(worker 只读/写任务状态) |

### 2.2 → **r-compute + r-worker**(**Dell**,目录仍 `r-server/`)

| 组件 | 部署 | 说明 |
|------|------|------|
| **r-compute** HTTP | Dell(可选仅内网) | `/api/run`、`/api/task*` 入队、replot;验 JWT |
| **r-worker** | **每台** 跑 R 的 Dell | `claimPendingTask` + R Docker;**只连 RDS** |
| 代码 | `task-queue`, `task-store`, `r-pool`, `worker.js` | `task-store` **必须 PG** |
| 数据盘 | Dell 本地/NAS | 容器挂载路径保持现有(如 `/mnt/storage_16tb/...`) |

**不做**:auth、/api/data、Copilot、tools **提交逻辑**(提交在 platform)。

### 2.3 → **py-compute + py-worker**(**Dell**,目录 `py-server/`)

| 组件 | 部署 | 说明 |
|------|------|------|
| **py-compute** HTTP | Dell | `/api/task*`, `/api/run`, `/api/upload` |
| **py-worker** | 每台跑 Python 的 Dell | 消费 py 队列 + Python Docker |
| 任务表 | RDS | `pyserver.db` SQLite **废弃**(迁 PG) |

**不做**:用户表、Copilot;JWT 与 platform 相同 `JWT_SECRET`。

---

## 3. 代码组织(推荐目录)

```text
BioF3/
platform-server/ # 仅部署 ECS
server.js # 无 R/py Docker、不 drain 队列
routes/, api-data.js, auth.js, db*.js
r-server/ # 仅部署 Dell(r-compute + worker)
server.js # 瘦:run/task/replot
worker.js
py-server/ # 仅部署 Dell(py-compute + worker)

共享库(避免双份逻辑) — 二选一:

  • A(快)packages/biof3-db 私有包,platform-serverr-computerequire('@biof3/db')
  • B(更快落地):短期 git submodule / 同步脚本 只同步 db-pg.js, db-auth-pg.js, auth.js, config 片段

4. 分阶段实施(建议顺序)

Phase M0 — 文档与开关(1 天)

  • 本文件评审通过
  • ECS 端口规划:platform:3020, r-compute:3011, py-compute:3012(与 frp 3001/3002 脱钩)
  • 环境变量:JWT_SECRETDATABASE_URL 三进程一致;新增 BIOF3_INTERNAL_TOKEN

Phase M1 — 拉起 platform-api(2~3 天)

  • 新建 platform-server/,从 r-server 复制并 删除 run/task/replot/r-pool/worker 挂载
  • registerRoutes(app) + auth + api-data 可启动
  • ECS:pm2 start platform-server curl localhost:3020/api/health
  • 切 nginx

Phase M2 — nginx 双轨 + 前端灰度(2 天)

  • location /api/platform/ { proxy_pass http://127.0.0.1:3020/api/; }
  • 前端 authClient / copilotClient / scrna API base 改为 /api/platform(或统一 API_BASE 环境变量)
  • 兼容/api/r/auth/*rewrite 到 platform(旧书签、旧脚本)

Phase M3 — Dell 算力 + ECS 只留 platform(3~5 天)

  • tasks / py 任务 → PG(§5,阻塞项)
  • ECS:下线 跑 R 的 biof3-r-server:3011(或缩成仅 platform);在 ECS 装 R/Python Docker
  • Dell:biof3-r-compute + biof3-r-worker + 现有 R 容器;biof3-py-server + py-worker + Python 容器
  • nginx:/api/platform/ → ECS:3020;/api/r//api/py/frp/专线 → Dell
  • platform:tools 提交 tool_jobs;Dell r-worker 执行

Phase M4 — py 瘦身 + 多 Dell 预留(2~4 天)

  • py-compute 去掉用户/业务 CRUD;JWT 与 platform 一致
  • 文档:新增算力节点 checklist(WORKER_ID、RDS 连通、Docker、pm2)
  • 前端:/api/platform 登录与 CRUD;/api/r/api/py 算力
  • 冒烟:platform 登录 + Dell 一条 R + 一条 py

Phase M5 — 清理(1~2 天)

  • ECS 无「全量 r-server」;Dell auth/data/ai 路由(或仅内网维护口)
  • RDS 白名单:ECS + 各 Dell 公网 IP(worker 连库);或 Dell 经 VPN 进 VPC 后收紧
  • deploy.sh--platform-deploy(ECS)、--compute-deploy(Dell)
  • 更新 architecture-target.mdops-phase-cd-roadmap.md

5. 任务队列:必须 PG(ECS 入队、Dell worker 抢同一库)

队列今天拆分后
tool_jobsRDSplatform INSERT → r-compute worker UPDATE/执行
tasks(单细胞)SQLite biof3.dbmigrations/pg/005_tasks.sql + task-store-pg.js
py 任务pyserver.db SQLite006_py_tasks.sql 或统一 tasksengine

原则:凡「HTTP 入队 + worker 消费」都走 RDS,禁止 api/worker 各一份 SQLite。


6. 部署约束

ECS(仅 platform)

建议
规格2~4 vCPU、4~8GB 即可(无 Docker 算力)
进程biof3-platform :3020;不要 R/Python 容器
RDS内网 DATABASE_URL

Dell(算力节点,可多台)

建议
DockerR + Python 容器与现网一致;大盘挂载不变
pm2r-compute + r-workerpy-compute + py-worker(可按机只跑 R 或只跑 Py)
RDS每台 worker 同一 DATABASE_URL;唯一 BIOF3_WORKER_ID
公网frp/专线供 nginx 反代 /api/r/api/py;worker 不必对公网暴露
扩容新 Dell = 装 Docker + worker +(可选)compute HTTP + 注册 worker_id

7. nginx 示例(ECS biof3.conf

# 控制面
location /api/platform/ {
proxy_pass http://172.17.0.1:3020/api/;
# ... 同现有 timeout / body size ...
}

# 算力 — R(反代到 Dell,frp 映射宿主机 3001 或专线)
location /api/r/ {
proxy_pass http://172.17.0.1:3001/api/; # frps → Dell r-compute
}

# 算力 — Python(反代到 Dell :3002)
location /api/py/ {
proxy_pass http://172.17.0.1:3002/api/;
}

# 兼容旧客户端(过渡期 30 天)
location /api/r/auth/ {
proxy_pass http://172.17.0.1:3020/api/auth/;
}

7. 验收清单(「迁移完成」定义)

  • 新用户注册、登录、模块权限仅依赖 platform + RDS
  • 单细胞:建项目 → 上传 → 提交分析 → Dell r-worker 完成 → 结果在 OSS / PG 状态正确
  • FigCode:提交工具 job → 完成 → 下载结果
  • Copilot:对话、计划、Methods(无 helpers_missing
  • 空间:走 py-compute,登录 token 来自 platform
  • Dell 重启:platform 仍可用;进行中的 R 任务可失败可重试,不 502 全站
  • 无生产依赖 biof3.db SQLite(tasks 已进 PG)

8. 建议的「第一周」执行顺序

  1. M1:拷贝出 platform-server,ECS 3020 跑通 health + login + GET /api/data/projects
  2. M5 前置tasks → PG(可与 M1 并行,优先级
  3. M2:前端改 API_BASE + nginx /api/platform/
  4. M3:瘦 r-server + Dell worker 只消费 PG tasks
  5. M4:py JWT + 路由文档;nginx 保持 py 在 Dell 直至远程执行设计完成

9. 与已完成的阶段 A/B/C 关系

已完成本计划
A+B 数据在 RDSplatform 独占 PG 写;worker 写 task 状态
C3 r API 在 ECS :3011拆后 :3011 仅 compute;3020 为 platform
C5 py 未切 ECSM4 后再切;compute 可在 Dell

文档版本:2026-06-05 · 与 docs/ops-phase-cd-roadmap.md 并列维护

AI 陪学

让 AI 陪我学这一篇

AI 会读这篇文章后给你 3-5 步学习计划, 逐步陪你学完,最后出 1-3 道题验证你掌握得怎么样。 登录后 AI 才能记住你的进度。

静态文件

离线资料下载

手册 HTML / PDF 已在后台预生成,点击后直接下载网站静态资源。