Admin:增加管理员 AI 服务商与模型配置 #200

Open
opened 2026-08-13 10:05:26 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#199 / AI规格批量匹配
  • 阶段:1. 管理员模型配置与密钥安全

要解决什么

AI 规格匹配需要在不重新发布 Admin 的情况下快速切换服务商、OpenAI 兼容接口和模型。配置只能由管理员维护;API Key 属于凭据,不能进入数据库、data/、日志、Gitea 或文档,也不能在保存后向任何账号回显明文。

做什么 / 不做什么

  • 做:
    • 增加仅管理员可访问的“AI 模型配置”页面和 Web 接口。
    • 支持维护多个 OpenAI 兼容服务商配置、选择一个当前启用项、测试连接和热切换。
    • 普通配置包含名称、HTTP/HTTPS Base URL、模型、超时、最大并发、自动写入置信度阈值和状态。
    • API Key 通过独立密钥存储接口写入部署指定的仓库/data//release 之外文件;生产文件权限为 600。
    • 保存后只显示“已配置”和脱敏尾号,只允许替换或清除。
    • 记录不含密钥的配置变更审计。
  • 不做:
    • 不显示、下载或通过接口返回完整 API Key。
    • 不把 API Key 写入数据库、data/、日志、请求错误、工单或文档。
    • 不接入各服务商专有协议,不修改 Client 接口。
    • 不在本工单实现规格匹配。

怎么做

  • 预计修改 admin/config/、admin/model/、admin/repository/、admin/service/、admin/handler/web/、路由、模板和 Admin 基线文档。
  • MySQL 使用实施时下一个未占用迁移版本保存非敏感配置和审计;只有 repository 写 SQL。
  • 增加 AISecretStore 边界。生产密钥文件路径由启动配置指定,推荐 /etc/cmautobuy/ai-secrets.yaml;写入采用临时文件、fsync/原子替换和 600 权限。Windows 开发文件必须被 Git 忽略且不能位于 data/。
  • GET 页面只返回脱敏状态;POST 使用 CSRF 并在 handler 与 service 两层校验管理员身份。
  • Base URL 明确允许 HTTP 和 HTTPS,阻止其他协议及凭据进入 URL,并防止指向环回、链路本地或云元数据地址;确需私有模型端点时仍只能通过现有部署级静态允许列表开放,不增加新的 HTTP 配置项。
  • “测试连接”使用最小、无业务数据请求,超时受控,不记录 Authorization、完整请求或完整响应。
  • 切换采用先测试、后启用;测试失败保持上一有效配置。运行中的匹配批次继续使用启动快照。

验收标准

  • 管理员能新增、编辑、测试、启用、停用服务商配置;任一时刻最多一个启用项。
  • 采购员访问配置页面和所有写接口均被服务端拒绝。
  • 保存 API Key 后页面和 HTTP 响应不能取回明文,只显示已配置状态和脱敏尾号。
  • 数据库、data/、日志和测试输出中搜索不到测试 API Key。
  • 生产密钥文件位于指定安全路径、权限为 600,失败写入不会破坏旧密钥。
  • 测试连接失败不会切换当前有效配置;成功后无需重启即可供新批次使用。
  • URL 校验只允许 HTTP/HTTPS,并阻止 URL 内凭据及未允许的本机/私网/元数据地址;HTTP 不绕过 DNS、实际拨号和重定向校验。
  • 配置审计只记录操作者、时间和非敏感字段差异。
  • MySQL 8.4 _test 首建、上一版本升级、重复迁移和 schema 自检通过。
  • 固定 Go 1.23.0 的 build、test、vet 通过。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go build ./...
go test ./... -count=1
go vet ./...
Remove-Item Env:GOTOOLCHAIN

另用独立 MySQL 8.4 _test 库验证迁移;用管理员/采购员会话验证权限;使用脱敏假密钥验证原子写入、权限、日志和数据库无泄露。

风险和回退

  • 风险:网页会话被盗、SSRF 或日志错误可能泄露密钥。通过禁止明文回显、严格 URL 校验、权限、CSRF、脱敏和最小测试请求控制。
  • 回退:关闭 AI 配置入口和启用项;保留非敏感配置/审计。删除密钥只能由管理员明确操作,不随数据库回退自动删除。

HTTP 兼容范围变更(2026-08-14)

用户明确要求 AI Base URL 必须兼容 HTTP,且不增加其他配置。#223 在不放宽现有 SSRF、URL 凭据、DNS、拨号和重定向校验的前提下,使 HTTP 与 HTTPS 共用同一套端点策略;HTTP 的明文传输风险在工单和页面提示中明确说明。

  • #223 Admin:AI 服务商 Base URL 兼容 HTTP
## 基本信息 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#199 / AI规格批量匹配 - 阶段:1. 管理员模型配置与密钥安全 ## 要解决什么 AI 规格匹配需要在不重新发布 Admin 的情况下快速切换服务商、OpenAI 兼容接口和模型。配置只能由管理员维护;API Key 属于凭据,不能进入数据库、`data/`、日志、Gitea 或文档,也不能在保存后向任何账号回显明文。 ## 做什么 / 不做什么 - 做: - 增加仅管理员可访问的“AI 模型配置”页面和 Web 接口。 - 支持维护多个 OpenAI 兼容服务商配置、选择一个当前启用项、测试连接和热切换。 - 普通配置包含名称、HTTP/HTTPS Base URL、模型、超时、最大并发、自动写入置信度阈值和状态。 - API Key 通过独立密钥存储接口写入部署指定的仓库/`data/`/release 之外文件;生产文件权限为 600。 - 保存后只显示“已配置”和脱敏尾号,只允许替换或清除。 - 记录不含密钥的配置变更审计。 - 不做: - 不显示、下载或通过接口返回完整 API Key。 - 不把 API Key 写入数据库、`data/`、日志、请求错误、工单或文档。 - 不接入各服务商专有协议,不修改 Client 接口。 - 不在本工单实现规格匹配。 ## 怎么做 - 预计修改 `admin/config/`、`admin/model/`、`admin/repository/`、`admin/service/`、`admin/handler/web/`、路由、模板和 Admin 基线文档。 - MySQL 使用实施时下一个未占用迁移版本保存非敏感配置和审计;只有 repository 写 SQL。 - 增加 `AISecretStore` 边界。生产密钥文件路径由启动配置指定,推荐 `/etc/cmautobuy/ai-secrets.yaml`;写入采用临时文件、fsync/原子替换和 600 权限。Windows 开发文件必须被 Git 忽略且不能位于 `data/`。 - GET 页面只返回脱敏状态;POST 使用 CSRF 并在 handler 与 service 两层校验管理员身份。 - Base URL 明确允许 HTTP 和 HTTPS,阻止其他协议及凭据进入 URL,并防止指向环回、链路本地或云元数据地址;确需私有模型端点时仍只能通过现有部署级静态允许列表开放,不增加新的 HTTP 配置项。 - “测试连接”使用最小、无业务数据请求,超时受控,不记录 Authorization、完整请求或完整响应。 - 切换采用先测试、后启用;测试失败保持上一有效配置。运行中的匹配批次继续使用启动快照。 ## 验收标准 - [ ] 管理员能新增、编辑、测试、启用、停用服务商配置;任一时刻最多一个启用项。 - [ ] 采购员访问配置页面和所有写接口均被服务端拒绝。 - [ ] 保存 API Key 后页面和 HTTP 响应不能取回明文,只显示已配置状态和脱敏尾号。 - [ ] 数据库、`data/`、日志和测试输出中搜索不到测试 API Key。 - [ ] 生产密钥文件位于指定安全路径、权限为 600,失败写入不会破坏旧密钥。 - [ ] 测试连接失败不会切换当前有效配置;成功后无需重启即可供新批次使用。 - [ ] URL 校验只允许 HTTP/HTTPS,并阻止 URL 内凭据及未允许的本机/私网/元数据地址;HTTP 不绕过 DNS、实际拨号和重定向校验。 - [ ] 配置审计只记录操作者、时间和非敏感字段差异。 - [ ] MySQL 8.4 `_test` 首建、上一版本升级、重复迁移和 schema 自检通过。 - [ ] 固定 Go 1.23.0 的 build、test、vet 通过。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go build ./... go test ./... -count=1 go vet ./... Remove-Item Env:GOTOOLCHAIN ``` 另用独立 MySQL 8.4 `_test` 库验证迁移;用管理员/采购员会话验证权限;使用脱敏假密钥验证原子写入、权限、日志和数据库无泄露。 ## 风险和回退 - 风险:网页会话被盗、SSRF 或日志错误可能泄露密钥。通过禁止明文回显、严格 URL 校验、权限、CSRF、脱敏和最小测试请求控制。 - 回退:关闭 AI 配置入口和启用项;保留非敏感配置/审计。删除密钥只能由管理员明确操作,不随数据库回退自动删除。 ## HTTP 兼容范围变更(2026-08-14) 用户明确要求 AI Base URL 必须兼容 HTTP,且不增加其他配置。#223 在不放宽现有 SSRF、URL 凭据、DNS、拨号和重定向校验的前提下,使 HTTP 与 HTTPS 共用同一套端点策略;HTTP 的明文传输风险在工单和页面提示中明确说明。 - [ ] #223 Admin:AI 服务商 Base URL 兼容 HTTP
Author
Owner

2026-08-14 开始实施。按工单既定方案先完成 MySQL v20 非敏感配置/审计、独立 600 权限密钥文件、管理员页面与 OpenAI 兼容测试连接;实现过程中不接触生产凭据。

2026-08-14 开始实施。按工单既定方案先完成 MySQL v20 非敏感配置/审计、独立 600 权限密钥文件、管理员页面与 OpenAI 兼容测试连接;实现过程中不接触生产凭据。
Author
Owner

????(2026-08-14)

??? #200 ??,??:018da3f?

  • ?? MySQL v20:AI ???????????,???????????????
  • ????????? SSR ??????????????/???????????
  • API Key ??????????????;?????600 ??,???????????
  • ?? HTTPS?URL ???DNS/??/??? SSRF ??;??????????????
  • ?? Go 1.23.0 ? go build ./...?go test ./... -count=1?go vet ./... ????
  • ????? CMAUTOBUY_MYSQL_TEST,?? MySQL 8.4 _test ??????? Linux ????/??????????;?????????

????:?????,?????????????????????

## ????(2026-08-14) ??? #200 ??,??:`018da3f`? - ?? MySQL v20:AI ???????????,??????????????? - ????????? SSR ??????????????/??????????? - API Key ??????????????;?????600 ??,??????????? - ?? HTTPS?URL ???DNS/??/??? SSRF ??;?????????????? - ?? Go 1.23.0 ? `go build ./...`?`go test ./... -count=1`?`go vet ./...` ???? - ????? `CMAUTOBUY_MYSQL_TEST`,?? MySQL 8.4 `_test` ??????? Linux ????/??????????;????????? ????:?????,?????????????????????
Author
Owner

归档已完成:docs/task/200-Admin增加管理员AI服务商与模型配置.md,归档提交 2f51126。工单保持开启,等待用户验收;MySQL 8.4 _test 与生产 Linux 密钥文件权限仍按归档中的“没验证到的部分”执行。

归档已完成:docs/task/200-Admin增加管理员AI服务商与模型配置.md,归档提交 2f51126。工单保持开启,等待用户验收;MySQL 8.4 _test 与生产 Linux 密钥文件权限仍按归档中的“没验证到的部分”执行。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#200