feat(server): 上游客户端与 key 管理(阶段 2)

- 上游客户端接口化:UpstreamClient + HTTP / fixture 两实现(env UPSTREAM_SOURCE 切换;fixture 读仓库根样例快照,错误分支由 key 内容约定触发)
- 失败分类:401 / 403 → key_rejected;其余非 2xx / 网络故障 / 超时 / 响应异常 → upstream_unavailable
- /api/manage/api-keys 三端点:清单(按 id 升序,敏感列不出接口)· 登记(上游验证 → 上游字段全组入库)· 启停(幂等、启用需验证并清 consecutive_401s)
- 登记成功触发「立即异步补一轮」hook(引擎骨架占位,阶段 4 填充)
- 统一错误信封:onError → 500 internal · notFound → 404
- 修正:load-env 未被服务端接线(此前只有 drizzle-kit 接了),env.ts 顶部补副作用导入
- 实施计划:进度表阶段 2 ✅ · 实现假设 #11–#14
This commit is contained in:
2026-09-15 00:37:22 +08:00
parent 575643eb13
commit c26012a040
15 changed files with 738 additions and 36 deletions
+7
View File
@@ -19,3 +19,10 @@ KEYS_MASTER_KEY=change-me-32-bytes-base64
# 上游 NewAPI 站点地址(同步引擎调用的 BaseURL,不带尾部斜杠)
NEWAPI_BASE=https://your-newapi-instance.example.com
# 上游客户端实现:http(默认,调真实站点)/ fixture(开发期读仓库根样例快照,见实施计划 §6)
# 仅在离线开发 / 本地验证时设为 fixture——生产必须保持 http
# UPSTREAM_SOURCE=fixture
# 样例文件目录(仅 fixture 实现使用;留空 = 仓库根)
# NEWAPI_FIXTURE_DIR=