docs: 记录 MVP-1 管理端运行方式 (#23)

This commit is contained in:
ila
2026-08-21 23:02:53 +08:00
parent 35fd0342f0
commit f182bfbfcd
3 changed files with 48 additions and 11 deletions
+12 -5
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Architecture-and-Code-Map
wiki_url: https://git.ilapage.cn/OPC/chorus/wiki/Architecture-and-Code-Map.-
wiki_revision: 8805724b04c14ef2bb5161a79a037b36e1485b68
synchronized_at: 2026-08-21T09:20:42Z
wiki_revision: 8c1c40529eb6da550fdfc395ec878a0431c9ef30
synchronized_at: 2026-08-21T15:02:17Z
<!-- gitea-wiki-mirror:end -->
# 架构与代码地图
@@ -29,13 +29,20 @@ chorus/
│ └── crypto/ 密钥加密接口
├── internal/platform/ HTTP/SSRF、gobreaker、imaging、本地/S3 适配
├── portal/ 用户页面、HTMX 片段、JSON API、worker 组装
├── admin/ 固定 go-admin 后端,业务 app 在 app/chorus/
├── admin/ 固定 go-admin 后端的嵌套 Go module;生产入口 cmd/server.go,业务 app 在 app/chorus/
├── admin-ui/ 固定 go-admin-ui 导入代码与定制页
└── migrations/ 所有生产表、sys_* 基线和配置种子
```
固定来源和提交见 [项目档案](Project-Profile.-)。`D:\github\goadmin` 只用于来源审查和首次导入,运行、CI 与部署不得依赖该路径。
### #23 已落地的管理端后端
- `admin/` 是独立 Go module;从仓库根目录使用 `go -C admin build .` 和 `go -C admin test ./...`。`admin/cmd/server.go` 只注册生产 `server` 子命令,必须提供受保护的 go-admin settings 文件和 `CHORUS_MASTER_KEY`。
- `admin/app/chorus/` 实现 Provider、ProviderModel、PromptTemplate、RoutePool、Generation 与终端用户查询 API。所有 Chorus API 经过固定 go-admin 的 JWT 与 Casbin 链;JWT 只从 `Authorization: Bearer` 读取,不接受 Query 或 Cookie token。
- 原 go-admin 的 AutoMigrate、代码生成、Swagger、WebSocket 与静态文件路由未导入生产入口。`/api/v1/chorus/` 不提供 DELETE;被引用记录使用启停而不是物理删除。
- 通用操作日志对 `/api/v1/chorus` 完全跳过请求体与结果持久化,避免把凭据写入 `sys_oper_log`;配置变更和被拒绝的探测由 `admin_audit_events` 记录脱敏摘要。
## MVP-0 的最小形态
| 目录 | MVP-0 实现 | 暂缓 |
@@ -196,10 +203,10 @@ ClaimLease(只取得租约并记录 lease 事件)
管理 API 位于独立管理员认证/Casbin 下的 `/api/v1/chorus/`:
- providers/models/templates/users 使用列表、详情、创建、更新和启停;已被引用的记录不提供物理删除。Provider 响应只给 `has_credential`、活动 credential 版本和 `key_id`,永不返回 `api_key_enc`/明文。
- providers/models/templates 使用列表、详情、创建、更新和启停;users/generations 只读列表。已被引用的记录不提供物理删除。Provider 响应只给 `has_credential`、活动 credential 版本和 `key_id`,永不返回 `api_key_enc`/明文或密文信封。
- `PUT providers/:id/credential` 只接收新明文一次,事务内加密、创建新版本、切换 active、退役旧版本并写审计;`POST providers/:id/credential/:version/activate` 可审计回退。普通 Provider 更新省略 secret 即保持不变,不能用空字符串意外清除。
- route-pools 使用 `version` 乐观锁;发布活动绑定时校验能力、至少一个启用成员、正权重、PromptTemplate 兼容和 breaker 参数,不合格返回字段级错误。
- `POST provider-models/:id/connectivity-checks` 需要独立权限和 CSRF/JWT 保护。事务锁定最近检查并预留 running 记录;冷却内返回 429 和 `retry_after_seconds`。服务端按 api_type 使用预先配置的固定最小探针,不接收任意 Prompt/extra_body,经过相同 SSRF/认证/超时链路,完成后写脱敏结果与 audit。保存配置不自动测试,CI/日常调试只用 mock;首个真实 Provider、探针和冷却值仍是上线前人工确认门禁。
- `POST provider-models/:id/connectivity-checks` 有独立 Casbin API 权限,并且仅接受 Authorization Bearer JWT,不使用 Cookie/Query token,因此没有浏览器 Cookie CSRF 通道。事务锁定最近检查并预留 running 记录;冷却内返回 429 和 `retry_after_seconds`。未显式授权时 API 写一条脱敏拒绝审计并返回 403,绝不构造出站请求。只有运行时明确设置 `CHORUS_ADMIN_ALLOW_CONNECTIVITY_PROBES=1`,并同时提供正数冷却、HTTP 超时与响应上限,服务端才按 api_type 使用固定最小探针;不接收任意 Prompt/extra_body,仍经过同一 SSRF/认证/超时链路,完成后写脱敏结果与 audit。保存配置不自动测试,CI/日常调试只用 mock;首个真实 Provider、探针和冷却值仍是上线前人工确认门禁。
#### portal 契约