Files
opc-backup/云超服一体化架构设计方案.md

488 lines
39 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.
# 云超服一体化平台架构设计方案
> 版本:v0.12026-08-23
> 定位:在现有全部代码资产基础上,面向「统一身份 · 统一后端 · 多端互通 · 智慧园区」的一体化架构设计。
> 阅读对象:架构 / 前后端 / 园区端 / 算力相关开发。
> 关联文档:`design/云超服平台/`(身份体系与端口权限、全量方案、架构初步设计)、`materials/培训计划/课程体系0.1/三端架构设计.md`、各代码仓库 `README.md`。
---
## 〇、设计原则
1. **一个身份**:全平台(桌面端 / Web / 小程序 / 园区大屏)共享一套账号与端口身份,数据全部归属到身份。
2. **一个后端、模块化拆分**:业务与身份收敛到后端 server(现 `server-core` 演进),内部按业务域拆模块,可演进为微服务,消除多后端多账号并存。
3. **专业服务外置**:算力引擎(`new-api`,仅服务、管理/页面自研)、Agent 运行时(智能体桌面应用内)作为专业服务,通过明确 API 与后端协作,不混业务。
4. **算力额度服务端统一管控**:架构上预留充值链路,**当前流程由服务端统一增减额度**,用户端只读展示。
5. **契约可校验**:后端出 OpenAPI → 多端前端生成 TS client,消灭手写契约漂移。
6. **迁移渐进**:先统一身份 → 再迁业务域 → 再补用户端功能 → 最后升级大屏,全程可回滚。
---
## 一、设计目标与六条要求映射
| # | 要求 | 落地主体 | 本文档章节 |
|---|------|---------|-----------|
| 1 | 全局统一身份系统 | 核心服务端七端口 RBAC(已有) + 六端登录归一 | §三 |
| 2 | 后端集成算力调度、用户管理;运营端迁移 web 课程/活动管理 | 核心服务端业务域扩展 + `new-api` 集成 | §四 |
| 3 | 多端(小程序 / web业务 / web官网 / admin管理平台 / 智能体桌面 / 大屏)数据互通 | 统一身份 + 统一后端 + 统一契约 | §四.4 |
| 4 | 用户端完整功能:算力/园区入驻/智能体/政策/财务/工商 | 核心服务端 `opc` 端口 + 各业务域 router | §五 |
| 5 | 园区端智慧大屏增强,数据由后端园区端管理可换 | `dpm` 数据源改造 + 核心服务端园区数据域 | §六 |
| 6 | 大屏真实展示人员、智能体实时消耗(token/流水) | `dpm` 对接核心服务端 + `new-api` 实时数据 | §六 |
---
## 二、总体架构(目标态)
![总体架构图](figures/01-overview.svg)
### 2.1 前端(6 端)
| 端 | 定位 | 代码资产 | 后端接入 |
|----|------|---------|---------|
| **小程序** | 移动 C 端(OPC AI:测评/政策/报名/算力) | training/miniprogram | gateway · `/auth` `/opc/*` `/tests/*` |
| **web业务** | 业务 C 端(培训/课程/活动/测评/政策) | training/website/user | gateway |
| **web官网** | 公开展示站(产品/政策/招生/案例) | web-official(原 PineAgentsWeb | gateway(公开接口 + 静态内容) |
| **admin管理平台** | 运营/政务/企业/载体/服务商/投资人管理 | console 管理端(operator/government/…端口) | gateway · `/admin/*` |
| **智能体桌面应用** | 智能体工作台(Agent OS + Tauri 壳) | agent-desktop(原 PineAgentsconsole + Tauri | gateway`/auth` `/agents`+ 算力服务 → 引擎 `/v1` |
| **大屏桌面应用** | 多园区通用大屏(园区账号登录显示本园区) | park-desktop(原 dpmTauri | gateway`/api/park/*`org_id 隔离) |
### 2.2 后端(server · 完整服务群)
> **后端是一组完整服务构成的服务群**,可整体一个进程部署(模块化单体),亦可按需拆成独立微服务(分库 + 网关路由)。模块边界即微服务拆分边界。
**应用服务(业务域)**
| 服务 | 职责 | 现状基础 |
|------|------|---------|
| **核心服务** | 统一入口(gateway+ 身份(auth+ 业务模块(business/agent/task/gov/park/notify/file | server-core 演进 + training 业务迁移 |
| **算力服务** | 封装 new-api 引擎:令牌/额度/流水聚合、用户算力自助;**仅消费 new-api 的服务(relay 与程序化管理 API),管理与页面全部自研** | compute_client → new-api |
**基础设施服务**
| 服务 | 职责 | 说明 |
|------|------|------|
| **MQTT 消息服务** | 实时消息/指令/推送总线 | EMQX;大屏(dpm)、桌面端通知、控制指令复用 |
| **缓存服务** | 会话/限流/聚合缓存 | Redis;多节点共享额度与状态 |
| **数据库服务** | 主库 + 分库 | 模块化单体用 SQLite;微服务演进用 MySQL / PostgreSQL |
**核心服务内部模块(微服务拆分边界)**
| 模块 | 职责 |
|------|------|
| gateway 网关 | 统一入口、鉴权校验、路由、契约、跨端限流 |
| auth 身份 | 七端口 RBAC、select-identity、审计、登录 |
| business 业务 | 课程/活动/报名/测评/政策申报/入驻/财务/工商 |
| agent 智能体 | 智能体定义/模板/桌面同步 |
| task 任务生态 | 任务/服务商/结算/合同/争议/信用 |
| gov 政务 | 补贴审批、政务三级数据范围 |
| park 园区 | 园区数据域 + 大屏聚合 |
| notify 通知 | 通知/消息/推送(可接 bark-notify |
| file 文件 | 上传/媒体/静态托管 |
> **new-api 定位**:只作为**算力引擎服务**被算力服务消费(`/v1` 中继 + 管理 API 程序化调用);**不使用其自带 web 管理页面/用户页面**——算力相关的管理全部在 admin管理平台(console)实现,页面风格统一。
### 2.3 专业服务(外置,不混业务)
| 服务 | 职责 | 边界 |
|------|------|------|
| **算力引擎**new-api | 模型网关 + 额度/令牌 + token 流水/计费 | 只做模型计量,不做身份;**仅服务,无页面暴露** |
| **Agent 运行时**(智能体桌面应用内) | 智能体执行引擎(决策/工具/频道/沙箱) | 算力统一走算力服务 → 引擎 `/v1` |
> **部署形态**:算力引擎随后端服务群一同部署(同机/同编排),**不做本地推理**——全部渠道均为**云厂商代理**OpenAI / DeepSeek / 通义千问 / Claude / Gemini 等),无需 GPU 主机。算力服务与引擎同机互通,网络简单、凭据不扩散。**代码**`code/compute-engine/`new-api,启动命令见其 `README.云超服.md`)。
> **退役清单**training `server`(业务迁后端后退役)、training `website/server`mock,已基本废弃)、training `website/platform` 管理端(迁入 admin管理平台)。
---
## 三、统一身份系统(要求 1
### 3.1 身份中心
沿用核心服务端已有的 **七端口 RBAC**`users` + `user_identities`(一账号多端口身份)+ `roles/permissions/role_permissions` + `select-identity` 切换 + 政务三级数据范围。该机制已成熟(含提权防护、token_version 吊销、`require_port` 隔离)。
### 3.2 六端登录归一(同一账号 = 同一身份)
| 端 | 登录方式 | 到核心服务端的映射 |
|----|---------|------------------|
| 智能体桌面应用 | 账号密码 + select-identity | `POST /auth/login`(已有) |
| admin管理平台 | 账号密码 + RBAC | `/auth/login` + 运营/政务等端口身份 |
| web业务 | 手机号 + 验证码 | 复用 `register`/`phone-login`(补手机号登录端点) |
| 小程序 | 微信 `wx.login` + `getPhoneNumber` | 新增 `wx_openid` 绑定字段(`users`/`user_identities`),登录即建 `opc_member` 身份 |
| web官网 | 公开访问(可选登录) | 仅公开接口 + 静态内容 |
| 大屏桌面应用 | 园区账号(carrier 身份) | `/auth/login` + `select-identity` → 绑定 org_id |
**新增能力(核心服务端)**
- `users` 表补 `wx_openid`(或经 `user_identities` 建立微信身份行);补 `/auth/phone-login``/auth/send-code``/auth/wx-login``/auth/wx-phone` 端点(迁移自 training `server/app/auth.py` 的短信与微信流程,合并手机号账号逻辑)。
- 原 training `accounts` 表迁移:`username/phone/wxid/name/avatar/status_label/topics/source``users` + `opc_profiles`(报名画像字段挂到 `opc_member` 身份,沿用现 `opc_profiles` 表)。
### 3.3 数据归属
**所有业务数据的唯一归属 = `user_id`+ 可选 `identity_id` 维度)**。课程报名、测评结果、算力订单、入驻申请、财务流水、政策申报一律以 `user_id` 关联,天然实现多端互通(同一人在任意端操作,数据落在同一身份上)。
![统一身份与多端互通](figures/02-identity.svg)
---
## 四、统一后端与业务域(要求 2、3)
### 4.1 核心服务端业务域扩展(数据模型)
在现有 34 张表基础上新增(继承现 `models.py` 风格):
| 新表 | 关键字段 | 对应需求 |
|------|---------|---------|
| `courses` | id/title/category/level/chapters(JSON)/syllabus/start_end/venue/quota/price/status/cover | 课程实体(迁自 website `data/*` |
| `activities` | id/type(free·salon·training·park)/title/subtitle/desc/location/host/image/link/start_at/end_at/checkin_at/duration_min/capacity/status/audit_mode/show_capacity | 通用活动(迁自 training `events` |
| `bookings` | id/user_id/target_type(course·activity·park)/target_id/status(applying·approved·attended·absent)/audit_status/note/checkin_at | 统一报名(替代 roadshow_registrations + training_enrollments + training bookings |
| `tests` + `test_results` | id/title/category/questions(JSON)/pass_scoreid/user_id/test_id/score/passed/cert_id | 测评/考核(引擎迁自 `opc_engine.py`/`policy_engine.py`/`survey_data.py` |
| `compute_accounts` + `compute_orders` | user_id/balance/token_refid/user_id/amount/type(add·deduct·freeze)/reason/operator_id/created_at | 算力额度与增减流水 |
| `park_admissions` | id/opc_id/carrier_id/area/station_count/purpose/status(apply·auditing·approved·settled)/contract_id | 园区入驻申请 |
| `business_services` + `business_orders` | id/name/fee/agency_idid/user_id/service_id/status(apply·pending·done) | 工商/政务代办 |
| `invoices` + `finance_accounts` | id/org_id/amount/type;企业/服务商对公财务 | 企业/服务商财务 |
| `park_org` + `park_companies` + `park_members` | 园区信息/企业名录/人员名单(大屏数据源) | 园区端数据管理 |
| `policy_applications` | id/user_id/policy_id/status | 政策申报(补 `subsidy_applications` 之外的普通政策申报) |
**迁移自 training 的数据**`events → activities``bookings → bookings``tests/policy_logs/plan_logs/survey_logs → tests + test_results`(测评结果)、`policy_data/plan_data/survey_data → 核心服务端 `content_items`(policy 类型) + 引擎服务。
> **多园区维度**:园区相关数据(`park_*`、园区活动、报名、播放列表)均以 **`org_id` 隔离**;园区 = `organizations(type=carrier)`。详见 §六。
### 4.2 运营端:web 课程/活动管理迁移(要求 2)
把 training `website/platform` 的管理功能整体迁入 **console 运营端(operator 端口)**,新增 router `rbac_operator` 端点(沿用现 `/admin` 前缀):
| 管理能力 | 现所在(web platform | 迁至端点 |
|---------|----------------------|---------|
| 课程管理 | `Schedule/Structures/Cards/Tools`(静态内容页) | `GET/POST/PUT/DELETE /admin/courses`、`/admin/courses/{id}/status` |
| 活动/排期管理 | `PineEvents` | `GET/POST/PUT/DELETE /admin/activities`、`/admin/activities/{id}/status` |
| 报名管理 | `PineBookings`(名单/状态/审核/导出 CSV) | `GET /admin/bookings`、`PATCH /admin/bookings/{id}`、`POST /admin/bookings/export` |
| 测评管理 | `PineTests` | `GET /admin/tests`、`POST /admin/tests`、`GET /admin/test-results`、`POST /admin/test-results/export` |
| 签到 | `checkins` | `POST /admin/checkins`(时间闸复用) |
| 运营统计 | `PineOps` | `GET /admin/stats/overview`(扩展课程/活动/测评/算力维度) |
**前端**console 新增 `Operator/Courses|Activities|Bookings|Tests` 页面(复用现有 `pineAdmin.jsx` 的 `useOps` hook 模式 + 原子组件),调上述端点。
### 4.3 算力调度与用户管理(要求 2)
**算力服务接入**(后端新增 `compute_client.py`,照抄 `server_client.py` 的 httpx 转发模式;**new-api 仅作引擎被消费,管理/页面全部自研**):
- **平台管理 token**:算力服务持有 new-api 管理令牌,作为统一入口(仅程序化调用,不暴露其管理 UI)。
- **建号发 token**:用户开通算力时 → `POST /api/user` 建 new-api 用户(`username = 云超服 uid`+ `POST /api/token` 签发 PAT,映射存 `compute_accounts`。
- **额度增减(服务端统一,无用户充值)**:运营端 `POST /admin/compute/orders`add/deduct/freeze)→ 算力服务调 new-api 调整额度 → 写 `compute_orders` 流水 → 通知用户。**当前不暴露任何用户充值接口**;架构上预留 `POST /api/user/topup` 转发能力(`new-api` 已支持),待支付渠道/合规就绪再启用。
- **用户读端**`GET /opc/compute` 聚合返回 { 余额(`/api/user/self`)、本月消耗(`/api/data/self`)、流水(`/api/log/self`}30s 缓存 + 消耗预警。
- **Agent 算力**:桌面端 `PROVIDER_PINEAGENTS.base_url` 指向算力引擎 `/v1`(环境变量化),登录/换身份时算力服务下发该用户 PAT 注入 provider`require_api_key=False` 改为用户级 token)。
**用户管理**:运营端 `POST /admin/users`(已有)+ 扩展「开通算力/分配端口/发放公益额度」一体化流程。
![算力额度管控流程](figures/03-compute.svg)
### 4.4 多端数据互通(要求 3)
统一后端 + 统一身份后,六端天然互通。前端统一契约:
- 核心服务端补全 Pydantic 模型 → `openapi.json` → 生成 TS client(小程序 / web业务 / web官网 / admin管理平台 / 智能体桌面 / 大屏共用)。
- 双端 `API_BASE` 收敛为构建期注入的单一配置。
- 数据一致性:报名/测评/算力/政策结果以 `user_id` 为键,多端读写同一后端。
---
## 五、用户端功能全集(要求 4
> 全部落在 OPC 端口(`rbac_opc` 扩展)+ 关联端口协作。前端:console `Opc/` 页面(主)+ 小程序/Web 复用同一组 API。
| 功能 | 核心服务端端点 | 数据/引擎 | 交互要点 |
|------|--------------|----------|---------|
| **算力管理** | `GET /opc/compute`、`GET /opc/compute/usage`、`GET /opc/compute/orders` | `compute_client` → new-api | 只读余额/消耗/流水;额度不足引导联系运营;**无充值** |
| **园区入驻** | `POST /opc/park-admission`、`GET /opc/park-admission` | `park_admissions` | 提交入驻申请 → 载体 `POST /carrier/admissions/{id}/approve` → 签约(复用 contracts)→ settled |
| **智能体** | `GET /opc/agent`(已有)、`POST /opc/agent/{id}/chat` | agent-desktop(智能体桌面)(算力走 new-api)+ `agents` 表 | 一键唤起本机/云端 Agent,消耗计入本用户算力 |
| **政策管理** | `GET /opc/policy`(已有)、`POST /opc/policy/{id}/match`、`POST /opc/policy/{id}/apply` | `content_items`(policy) + 匹配引擎(迁自 `policy_engine.py`+ `policy_applications` | 政策匹配 → 申报 → 政务三级审批(复用现 subsidy 链路) |
| **财务管理** | `GET /opc/finance`、`POST /opc/finance/record`(已有)、`GET /opc/invoices` | `finance_records` + `invoices` | OPC 收支 + 发票申请 |
| **工商注册/代办** | `GET /opc/affairs`(改造)、`POST /opc/business/{service}/apply`、`GET /opc/business-orders` | `business_services/business_orders` | OPC 提交代办 → 服务商 `GET/POST /provider/business-orders` 接单办结 |
| **课程/测评** | `GET /opc/courses`、`POST /opc/courses/{id}/enroll`、`GET/POST /opc/tests/{id}`、`POST /opc/tests/{id}/submit` | `courses/tests/test_results` | 培训报名 + 测评,结果入 `test_results` 可二次查看 |
**新增 `rbac_opc` 端点清单**(增量):
`/opc/courses`、`/opc/courses/{id}`、`/opc/courses/{id}/enroll`、`/opc/activities`、`/opc/activities/{id}`、`/opc/activities/{id}/signup`、`/opc/bookings`(我的报名)、`/opc/tests/{id}`、`/opc/tests/{id}/submit`、`/opc/compute`、`/opc/compute/usage`、`/opc/compute/orders`、`/opc/park-admission`、`/opc/business/{service}/apply`、`/opc/business-orders`、`/opc/policy/{id}/match`、`/opc/policy/{id}/apply`、`/opc/invoices`。
**新增权限码**seed.py):`action:course.manage`、`action:activity.manage`、`action:enrollment.manage`、`action:test.manage`、`action:compute.manage`、`action:admission.manage`、`action:business.manage`、`action:park.manage` → 挂到 `operator|op_super_admin`/`op_admin`/`op_customer_service`;用户侧 `opc_member` 只读/申请权限。
---
## 六、园区端智慧大屏(要求 5、6)
> **新定位**:dpm 是**多园区通用**的大屏客户端(一套 Tauri + React 代码,任何园区部署即用)。**园区账号(carrier 端口身份)登录后,只显示本园区的内容**——园区信息 / 企业 / 人员 / 活动 / 媒体轮播 / 真实 token 消耗与流水,全部按 `org_id` 隔离。
### 6.1 现状缺口(已核实)
dpm 现为"单园区固定大屏":数据 100% 来自 `sim_engine.py` 静态常量 + TOKEN 测算演示(`random` 波动);无数据库、无登录、无外部系统对接;`/admin` 只能管本机媒体/播放列表,不能改园区数据;`/wall` 企业墙是前端硬编码静态数组。**实现"多园区通用 + 真实数据"需三步改造:多租户数据维度 → 园区账号登录 → 真实数据源接入。**
### 6.2 多园区数据维度(org_id 隔离)
- **每个园区 = 核心服务端一个 `organizations(type=carrier)`**(园区即载体)。园区数据域 `park_org`/`park_companies`/`park_members`、活动、报名、播放列表、算力聚合**全部以 `org_id` 隔离**。
- 核心服务端 `GET /api/park/*` 用 carrier 身份 + `org_id` 数据范围只返回本园区数据(复用现有范围机制 `require_port(carrier)` + `visible_region_ids/org 范围`),跨园区越权一律 403。
- 新增表:`park_org(org_id PK)`、`park_companies(org_id, …)`、`park_members(org_id, …)`、`park_playlists(org_id, …)`(媒体轮播内容归园区)。
### 6.3 园区账号登录(统一身份)
- **园区账号 = 核心服务端 carrier 端口身份**(可含 `park_admin` 子角色)。dpm 大屏(Tauri 壳内)提供登录入口:`POST /auth/login` + `select-identity` → 取 carrier 身份 token → 绑定该园区。
- token 由 dpm 后端安全存储(复用 agent-desktop(智能体桌面) `auth_token_store` 思路),启动时校验并拉取本园区数据;失效自动跳登录。
- **一套 dpm 代码,换园区即换账号**——"所有园区通用,园区账号登录后显示园区自己的内容"。
### 6.4 园区数据管理(要求 5)
- 核心服务端扩展园区数据域端点:`GET/POST/PUT /admin/park`、`/admin/park/companies`、`/admin/park/members`。
- **运营端(operator)**:可管理所有园区;
- **载体端(carrier)**:只能维护本园区数据(`org_id` 范围)——"后端园区端实现数据的更换"落地。
- 数据来源:`materials/园区数据资料/` 定稿数据按园区导入 `park_*` 表(不再硬编码)。
### 6.5 大屏真实数据(要求 6)
dpm 后端新增数据源层,以**园区账号 token** 拉取**本园区**数据(替代 `sim_engine` 模拟部分):
| 大屏维度 | 数据源 | 接口(org_id 过滤) |
|---------|--------|------|
| 园区概况/企业/人员 | 核心服务端 | `GET /api/park/data`(园区信息 + 企业 + 人员 + 入驻统计) |
| **真实 token 消耗/流水** | **new-api** | 本园区用户经 `compute_client` 聚合 `/api/log`(按 org 分组),实时 2.2s tick + MQTT `opc/dashboard/tick` |
| 实时智能体消耗 | 核心 + new-api | `GET /api/park/agents/usage`(本园区人员 × 智能体 × token 聚合) |
| 活动/报名/测评统计 | 核心服务端 | `GET /api/park/biz`(本园区活动/报名/测评) |
| 媒体轮播 | dpm 自身 | `park_playlists`(本园区播放列表) |
**改造要点**
- `dpm/backend/app/` 新增 `data_source.py`:带园区 token 轮询核心服务端聚合端点 + 算力聚合,内存缓存,tick 推进;`sim_engine.py` 删除随机模拟 token,只保留通用布局骨架。
- 新增 REST`GET /api/agents/usage`、`GET /api/park/real`;前端 `useParkSim` 接入真实快照。
- `/wall` 企业墙改为 `GET /api/park/companies`(本园区,不再硬编码)。
- 实时链路:沿用 REST 轮询(2.2s) + MQTT `opc/dashboard/tick` + SSE 兜底;token 流水经核心代取(避免 dpm 直连 new-api 凭据扩散)。
### 6.6 大屏页面增强
`DataScreen` 增加「人员在线/智能体运行中/实时 token 消耗/分企业 token 排行/今日流水」区块;`DigitalTwin` 3D 右侧面板绑定本园区真实企业/人员数据;`/twin`、`/screen`、`/wall` 数据全部走后端且按园区隔离。
![园区大屏真实数据流](figures/04-park-screen.svg)
---
## 七、数据模型总表(核心服务端目标态)
**身份域**(已有):users、user_identities、roles、permissions、role_permissions、regions、sessions、audit_logs、organizations、organization_members
**Agent/生态**(已有):agents、opc_profiles、tasks、bids、escrows、contracts、disputes、ratings、notifications、messages、opc_tasks、service_providers、service_referrals、roadshows、roadshow_registrations、investment_intents、investor_preferences、training_enrollments
**内容/政务**(已有):content_items、system_configs、portal_dashboards、portal_pages、subsidy_applications
**新增业务域**courses、activities、bookings、tests、test_results、compute_accounts、compute_orders、park_admissions、business_services、business_orders、invoices、finance_accounts、policy_applications、park_org、park_companies、park_members
**外部数据(不落核心库)**new-api 用户/token/日志(经 compute_client 访问)、PineAgents 会话/记忆(本地)、dpm 播放列表/设置(本地 data.json
> 迁移对照:training `events→activities`、`bookings→bookings`、`tests/policy_logs/plan_logs/survey_logs→tests/test_results`、`policy_data→content_items+policy_applications`。
---
## 八、统一契约与跨服务接口
### 8.1 契约机制(OpenAPI 生成,消灭手写漂移)
- **单一事实源**:核心服务、算力服务全部 router 用 Pydantic 请求/响应模型,自动产出 `openapi.json`。
- **聚合与生成**gateway 汇总各服务 OpenAPI → 生成 TS client(小程序 / web业务 / web官网 / admin管理平台 / 智能体桌面 / 大屏共用);接口语义化版本 `/api/v1`。
- **契约治理**:CI 加「契约变更 → 重新生成 → diff」检查,双端锁版本;破坏性变更走新版本而非原地修改。
### 8.2 服务间接口矩阵
| 调用方 | 被调方 | 接口 | 协议 / 鉴权 |
|--------|--------|------|-------------|
| 小程序 / web业务 / web官网 / admin管理平台 | gateway | `/api/v1/*` | HTTPS · Bearer 用户 token |
| 大屏桌面(dpm | gateway | `/api/park/*` | HTTPS · 园区账号 tokenorg_id 只返回本园区) |
| 智能体桌面应用 | gateway | `/auth/*` `/agents/*` | HTTPS · 用户 token |
| gateway | 核心服务 | `/auth` `/opc` `/admin` `/agent` 等 | 内网 HTTP · 服务账号 token + 透传用户身份 |
| gateway | 算力服务 | `/compute/*` | 内网 HTTP · 服务账号 token |
| 核心服务 | 算力服务 | `/compute/*`(额度/聚合) | 内网 · 服务账号 |
| 算力服务 | 算力引擎(new-api) | `/v1/*` + `/api/*`(管理) | **loopback** · 管理令牌(程序化) |
| 智能体桌面应用 | 算力引擎(经算力服务代理) | `/v1/*`(模型调用) | loopback 代理 · 用户 PAT |
| 核心服务 | MQTT 消息服务 | 主题发布/订阅 | 内网 · MQTT 凭据 |
| 核心服务 | 缓存服务 | key 操作 | 内网 · 密码 |
| 核心服务 | 数据库服务 | SQL | 内网 · DSN |
### 8.3 鉴权分层
| 层 | 凭据 | 范围 |
|----|------|------|
| 用户层 | 六端统一 `Authorization: Bearer <用户token>` | gateway 校验,按身份/端口 |
| 服务层 | 服务账号 token(环境变量注入,不硬编码) | 服务间调用,按服务/权限 scope 隔离 |
| 数据层 | org_id / region 数据范围(已有机制) | 园区/政务数据越权 403 |
- **算力接口**:算力服务 ↔ new-api 走管理 API(建号/发 token/额度调整/日志);`compute_client.py` 统一封装,含超时/重试/502 兜底(照 `server_client.py`)。引擎与服务群同机部署,loopback 互通。
- **大屏数据**`dpm → 核心 /api/park/*` 经核心代取 new-api 日志(避免 dpm 直连 new-api 凭据扩散)。
### 8.4 实时通道
| 通道 | 用途 | 出口 |
|------|------|------|
| MQTT(EMQX) | 大屏/桌面实时数据、控制指令、通知 | 经 gateway WS 出口,内网不直接暴露 |
| SSE | 大屏快照回退(现 dpm 已有) | gateway |
| WebSocket | 桌面 Agent 会话、语音 | gateway |
### 8.5 通知/消息
业务事件(额度到账 / 入驻审核 / 报名结果 / 测评完成)统一走 `notifications`(现缺写入端点,补 `notifications.create` service),支持站内信 + 可接 `bark-notify` 手机推送。
---
## 九、迁移与演进路线
| 阶段 | 内容 | 退出条件 | 涉及 |
|------|------|---------|------|
| **0 · 基座** | 后端补 Pydantic 模型 + OpenAPI`compute_client` 打通 new-apiusers 补 wx_openid + 手机号/微信登录端点 | 六端能连后端登录 | server-core、new-api |
| **1 · 身份统一** | training accounts 迁移 → users/opc_profiles;六端登录全部走后端;小程序/Web 改 `API_BASE` | 同一账号六端互通 | training web/miniprogram、server-core |
| **2 · 业务域迁移** | courses/activities/bookings/tests 建表 + rbac_operator 端点 + 数据迁移;web platform 管理迁入 console 运营端 | 运营端可完整管理课程/活动/报名/测评 | server-core、console、training website |
| **3 · 用户端补全** | 算力管理/园区入驻/政策申报/财务/工商代办 + `rbac_opc` 端点 + console `Opc/*` 页面 | OPC 用户端六功能可用 | server-core、console |
| **4 · 园区大屏** | dpm 多租户化(园区账号登录 + org_id 隔离);data_source 接核心+new-api,替换 sim_engine 模拟;园区数据管理页 | 大屏真实人员 + 实时 token/流水 | dpm、server-core |
| **5 · 收尾** | 退役 training `server`、`website/server` mock、`website/platform`README/文档同步 | 单后端 + 四前端稳定运行 | 全仓 |
> 每阶段独立可交付、可回滚;阶段 1 后数据即以 `user_id` 归位,阶段 2 后运营单入口。
![迁移与演进路线](figures/05-migration.svg)
---
## 十、风险与依赖
1. **合规**:向公众提供生成式 AI 的备案/内容安全/实名/日志留存义务(new-api README 有明确提示);算力额度发放涉及收费边界,需政策/法务确认。参考 `materials/搜集资料/政策汇总.md`。
2. **迁移期双写**:阶段 1-2 需 training server 与核心服务端双写/一次性迁移脚本,避免丢数据;测评引擎移植需同一组测试用例双端验证(沿用 `小程序同步约束.md` 思路)。
3. **new-api 自研依赖**new-api 是 AGPLv3 开源(One API 的 fork),需确认许可合规与自研维护成本;额度调整用其管理 API,锁定版本。
4. **桌面端离线/断网**:**不做本地推理**,Agent 算力完全依赖云端(new-api → 云厂商渠道);断网或云厂商不可用时智能体不可用,需明确降级提示、超时与重试策略。
5. **性能**:核心服务端承载全业务,SQLite 在并发大时需评估;大屏 2.2s 轮询建议走独立只读副本或缓存(现有 dpm tick 机制可承担)。
6. **品牌未接线**PineAgents console 品牌常量未消费(storage key 仍 qwenpaw_*),统一后需一并收敛。
---
## 十一、部署拓扑(服务群编排)
![服务群部署拓扑](figures/06-deployment.svg)
### 11.1 端口清单
| 服务 | 端口 | 暴露范围 | 说明 |
|------|------|---------|------|
| gateway 网关 | `:443`HTTPS/ `:80` | 公网 | TLS 终结、统一入口;WS/WSS 供大屏/桌面 |
| 核心服务 | `:8090` | 内网 | 身份 + 业务域 + 园区聚合 |
| 算力服务 | `:8092` | 内网 | 额度/令牌/流水聚合,封装 new-api |
| 算力引擎 new-api | `:3000` | **仅内网 loopback** | 仅服务(relay /v1 + 管理 API),无页面暴露 |
| MQTT 消息服务 | `:1883` / `:8083`(WS) | 内网(大屏/桌面经网关 WS) | EMQX,实时消息/指令/推送 |
| 缓存服务 | `:6379` | 内网 | Redis,会话/限流/聚合缓存 |
| 数据库服务 | `:3306`MySQL/PG)或 SQLite 文件 | 内网 | 模块化单体用 SQLite;微服务演进用 MySQL/PostgreSQL 分库 |
### 11.2 依赖与启动顺序
```
数据库 / Redis / EMQX ──→ 核心服务 + 算力服务 ──→ 算力引擎 new-api ──→ gateway 网关
(先起基础设施) (业务就绪) (消费其服务) (最后对外)
```
- 算力引擎随后端一起部署(同一 Docker Compose),算力服务经 loopback `:3000` 调用,无跨网凭据扩散。
- 大屏/桌面端的实时通道(MQTT / SSE / WS)统一经 gateway 出口,内网不直接暴露 EMQX / new-api。
### 11.3 存储与卷
| 数据 | 存放 | 备份策略 |
|------|------|---------|
| 业务库(身份/业务/园区/算力流水) | SQLite `data/app.db` → MySQL/PG | 定时快照 + WAL |
| 缓存/会话 | Redis | 可重建,无需备份 |
| 文件/媒体(上传、大屏播放列表) | `uploads/` + `park_playlists` | 对象存储或卷备份 |
| new-api 数据(引擎侧) | 卷挂载 `/data` | 随服务群备份 |
### 11.4 网络与安全
- 公网仅暴露 gatewayEMQX / Redis / DB / new-api 全部内网,凭据不扩散。
- 服务间调用用服务账号 token(环境变量注入),算力服务 → new-api 用其管理令牌(仅程序化)。
- 出站仅算力引擎需要访问云厂商 API;其余服务禁出站(或白名单)。
---
## 十二、当前 code 各项目如何工作
> 每个子项目均为独立仓库(组织 Pine),位于 `code/`。以下为职责 / 关键文件 / 启动命令 / 工作流。
### 12.1 `server-core` — 核心服务端(总后端)
- **职责**:身份/平台 API + 培训子应用,对外统一 `opc.pinesound.cn`。
- **关键文件**`dispatcher.py`(统一入口,按路径路由 `/api/*`→培训子应用、其余→平台应用)、`app/main.py`(身份 + 业务域)、`app/training/`(培训子应用,独立库 `data/opc.db`)、`app/routers/`auth/opc/admin/government…)。
- **启动**`cd code/server-core && uv run uvicorn dispatcher:app --host 0.0.0.0 --port 8090 --reload`
- **工作流**:前端请求 → dispatcher → `/api/*` 走培训子应用(报名/测评/政策),`/auth` `/opc` `/admin` 走平台应用(七端口 RBAC / 业务域)。
### 12.2 `compute-engine` — 算力引擎(new-api 微服务)
- **职责**OpenAI 兼容 `/v1` 模型中继 + 额度/令牌/token 流水;**仅服务,管理/页面自研**。
- **关键文件**`main.go`(入口)、`relay/`(模型中继)、`controller/`(管理 API)、`docker-compose.yml`;启动说明见 `README.云超服.md`。
- **启动**`cd code/compute-engine && cp .env.example .env && docker compose up -d`
- **工作流**:智能体/算力服务经 loopback `:3000` 调用 `/v1/*`(模型)与 `/api/*`(管理,程序化);引擎代理云厂商渠道(OpenAI/DeepSeek/通义千问/Claude/Gemini),不做本地推理。
### 12.3 `agent-desktop` — 智能体桌面应用(PineAgents
- **职责**:智能体工作台(Agent OS):对话、Skills/插件、定时任务、代码模式、多频道。
- **关键文件**`src/pineagents/`Python 后端运行时:agents/runtime/governance/sandbox/memory)、`console/`React 前端)、`console/src-tauri/`Tauri 壳)、`src/pineagents/app/routers/auth.py`(认证转发到 server-core)。
- **启动**`cd code/agent-desktop/console && yarn dev`;后端 `pineagents app`:8088)。
- **工作流**:用户从 console / CLI / 频道发消息 → 后端运行时编排 → 智能体决策(ReAct)→ 工具执行(治理/沙箱)→ 模型调用经 **compute-engine** `/v1` 计量。
### 12.4 `park-desktop` — 园区大屏桌面应用(dpm
- **职责**:多园区通用大屏:数据大屏、数字孪生、AI/语音助手、媒体轮播、企业墙;园区账号登录只显示本园区。
- **关键文件**`src/`React 前端,路由 / /twin /ai /screen /voice /wall)、`src-tauri/`(桌面壳)、`backend/`FastAPI :10085 + MQTT + sim_engine)、`app/data_source.py`(规划:接核心服务端 + 算力引擎真实数据)。
- **启动**`cd code/park-desktop && yarn dev`;后端 `cd backend && uv run python main.py`:10085)。
- **工作流**:大屏经 REST/MQTT/SSE 拉快照 → 园区账号登录(carrier 身份,org_id 隔离)→ 只展示本园区数据;真实 token 消耗经 server-core 代取 compute-engine。
### 12.5 `web-official` — 官网展示端(PineAgentsWeb
- **职责**:公开展示站(产品/政策/招生/案例),静态 SPA。
- **关键文件**`src/`Vite + React)、`vite.config.ts`、`package.json`。
- **启动**`cd code/web-official && pnpm install && pnpm run dev`
- **工作流**:纯展示,公开接口 + 静态内容;可选登录走后端。
### 12.6 `training` — 培训前端(小程序 + 网站)
- **职责**:C 端培训业务(课程/活动/报名/测评/政策/算力),后端已并入 server-core 培训子应用。
- **关键文件**`miniprogram/`Taro 小程序)、`website/`Vite React`src/user/` C 端);`API_BASE = https://opc.pinesound.cn`。
- **启动**`cd code/training/miniprogram && yarn dev:weapp``cd code/training/website && pnpm dev`
- **工作流**:小程序/网站调 `opc.pinesound.cn/api/*` → server-core dispatcher → 培训子应用(报名/测评/政策/算力);与 server-core 身份互认(统一身份)。
### 12.7 临时项目(不入库)
- `code/bark-notify/`:临时测试的 Bark 推送工具,与云超服无关,不纳入项目范围。
---
## 十三、server-core 分层架构与算力通信规范
### 13.1 FastAPI 四层架构(单向依赖)
| 层 | 职责 | server-core 目录(规划) |
|----|------|------------------------|
| **接口层** | 接收请求、返回响应、参数校验、路由 | `app/routers/` + `app/schemas/`Pydantic |
| **业务层** | 业务逻辑编排、用例(用领域对象实现用例) | `app/services/` |
| **领域层** | 核心业务模型与规则(实体 / 值对象 / 领域服务) | `app/domain/` |
| **基础设施层**(含数据模型层) | 数据库访问、缓存、消息队列、外部服务适配 | `app/infrastructure/``repositories/`、`models/`、`cache/`、`mq/` |
**依赖方向(单向,禁止反向依赖)**:
```
接口层 → 业务层 → 领域层
↘ ↘ ↘
基础设施层(数据模型 / DB / 缓存 / MQ / 外部服务)
```
- 接口层只做「收请求 → 调业务层 → 返回响应」;业务层不依赖接口层。
- 领域层是核心模型与规则,**不依赖**业务层 / 接口层 / 基础设施层的具体实现(只面向其接口)。
- 基础设施层实现接口,**不得反向依赖**上层。
**全异步**:接口层 `async def` → 业务层 async → 仓储 asyncSQLAlchemy async),事件循环内杜绝阻塞调用;外部 HTTP 用 `httpx.AsyncClient`。见 13.4。
### 13.2 算力通信规范
- **内部**FastAPIserver-core)与**算力调度服务**compute-engine / 算力引擎)经**内部 IP / loopback** 交互(`http://127.0.0.1:3000`),不经过公网。
- **对外**:前端 / 用户的算力调用统一走**服务端 `/api/v1`**server-core 统一入口),**不直连**算力引擎。
- 算力引擎(new-api)仅作服务被消费,无页面暴露;额度 / 令牌 / 流水由服务端算力服务程序化管理(见 §4.3)。
### 13.3 参考工程化:PineSoundServer
server-core 的工程化(数据目录 / 容器启动 / 运维脚本)参考 `C:\Users\Administrator\MyCode\PineSoundServer`
- **`serverdata/`**:数据目录规范(`logs/ data/ files/ keys/ prompts/` + 各中间件数据 `emqx-data/ redis-data/ minio/ milvus/`)。
- **`serverrun/`**:容器与微服务启动(`start-all.sh` 编排、各服务 `docker-compose.yml`、`envcopy.sh` 配置加密、`encrypt-certs.sh` 证书加密)。
- **`ops/`**:运维脚本(`init_admin` / `db_backup` / 数据迁移 / `clear_redis_tokens` / 算力套餐与分区初始化等)。
### 13.4 异步与并发(设计之初即考虑)
**全异步调用链**:接口层 `async def` → 业务层 async → 仓储 asyncSQLAlchemy async)。事件循环内**杜绝阻塞**(不用 `time.sleep` / 同步 IO;外部调用统一 `httpx.AsyncClient` 带超时 / 重试 / 熔断)。
| 服务 | 异步方案 | 要点 |
|------|---------|------|
| **MySQL** | SQLAlchemy 2.0 `create_async_engine` + async session`asyncmy` / `aiomysql` | 连接池(`pool_size` / `max_overflow` / `pool_pre_ping`);**每请求独立 async session**`async with` 管事务边界);开发环境 `aiosqlite` |
| **Redis** | `redis.asyncio` | 会话 / 缓存 / 限流 / **分布式锁**(`SET NX EX`);连接池 |
| **OSS 对象存储** | 异步封装(阿里云 OSS / MinIO`aioboto3` 或 oss2 线程池包装) | 上传异步、断点续传、回调通知,不阻塞请求线程 |
**并发正确性**
- 写操作(抢单 / 扣款 / 报名 / 领券)用**行锁**(`SELECT ... FOR UPDATE`+ 幂等键,防并发重复。
- 乐观锁(`version` 字段)处理并发更新冲突。
- 事务边界清晰:多表写(如 `_adopt_phone`、结算 + 佣金)包在一个事务内。
- 外部依赖(算力引擎 / 云厂商)异步调用 + 超时重试,失败可降级。
---
## 附:与既有设计文档的关系
- 本设计是「`三端架构设计.md`(培训三端)」与「`身份体系与端口权限设计方案.md`(云超服七端口)」的**合一演进**:培训业务并入云超服端口体系。
- `云超服平台全量方案设计.md` 的六端口管理功能,本设计以「已实现(RBAC/任务/内容/补贴)+ 本次新增(课程/活动/报名/测评/算力/入驻/财务/工商/园区)」两栏承接。
- 大屏升级以 `code/park-desktop/backend/README.md` 为权威基线,本设计只描述数据源与对接改造。