角色:Model(拥有用户/邀请码/注册/用量/赞助)
端口 8010 · 面向客户端 · 签发系统的 HS256 JWT
user_manager 拥有账号体系:本地用户名/密码鉴权、邀请码、注册审批、用量事件、赞助记录。它是唯一签发 JWT 的服务。管理员账号在初始化时直接写入数据库(app/db/seed.py,幂等),不再是“第一个注册用户自动成为 root”。
鉴权 /api/auth/*
| 方法 / 路径 | 鉴权 | 用途 |
|---|
POST /api/auth/register | 无 | 提交注册申请(status=pending,等待管理员审批) |
POST /api/auth/login | 无 | 返回 {token, user:{id, username, role}} |
GET /api/auth/me | Bearer | 当前身份 |
赞助 /api/donations/*
| 方法 / 路径 | 鉴权 | 用途 |
|---|
GET /api/donations/summary | Bearer | 当前用户的赞助汇总 + show_prompt(静默期内为 false,客户端据此隐藏「赞助」按钮) |
POST /api/donations | Bearer | 自行登记一笔站外赞助;返回 {id, ...summary} |
GET /api/donations/mine | Bearer | 当前用户的赞助明细 |
GET /api/donations/supporters | 无 | 致谢名单(用户名 + 日期)与匿名人数 |
管理 /api/admin/*(仅 root)
| 方法 / 路径 | 用途 |
|---|
GET /api/admin/users | 列出用户 |
DELETE /api/admin/users/{id} | 删除用户(不能删自己) |
PUT /api/admin/users/{id}/role | 设置角色 |
GET /api/admin/invite-codes | 列出邀请码 |
POST /api/admin/invite-codes | 新建邀请码 |
PUT /api/admin/invite-codes/{id}/toggle | 启用/停用 |
DELETE /api/admin/invite-codes/{id} | 删除 |
GET /api/admin/registration-requests | 列出注册申请 |
POST /api/admin/registration-requests/{id}/approve | 通过 |
POST /api/admin/registration-requests/{id}/reject | 拒绝 |
GET /api/admin/usage-summary | 管理概览聚合(用户/邀请码/申请/用量),供 Admin Server 使用 |
GET /api/admin/donations | 列出赞助记录(可按 ?status= 过滤) |
PUT /api/admin/donations/{id}/status | 置为 confirmed / rejected / pending;驳回会同时移出汇总、致谢名单并解除静默期 |
内部 /v1/internal/*(仅供其他服务调用)
| 方法 / 路径 | 用途 |
|---|
POST /v1/internal/usage | 记录一条用量事件 |
GET /v1/internal/usage/me | 查询当前用户用量 |
GET /v1/internal/users?ids= | 批量把 user_id 解析成用户名(控制器做列表补全用) |
另有原 Supabase OAuth 路由 /v1/login/config、/v1/register/config 等保持不变,供客户端获取 Supabase 运行时配置。
注册流程
管理员账号不走这条流程,而是在初始化时由 app/db/seed.py 直接写入 users 表(幂等,按用户名去重)。
数据库(local_auth.db)
users、invite_codes、registration_requests、usage_events、donations。初始化时,schema 幂等预置邀请码 zy、wai、zx,app/db/seed.py 再把管理员账号(默认 admin / admin123)直接写入 users 表;app/db/migrations.py 给旧库补上 users 上的赞助汇总字段。完整字段、约束与索引见 数据库表字段参考。
环境变量
下表变量同样是该服务根目录下的 YAML 配置键(键名一致):config.yaml 存非敏感默认值(已提交,如 ROOT_ADMIN_USERNAME),config.local.yaml 存密钥与本机覆盖(已 gitignore,可从 config.example.yaml 复制)。优先级(高 → 低):环境变量 > config.local.yaml > config.yaml > 代码默认值。JWT_SECRET、ROOT_ADMIN_PASSWORD 等密钥与机器相关的 DB 路径放进 config.local.yaml。(说明:本表为本地账号体系的 YAML 配置;旧的 Supabase .env 设置仍由 app/config.py 的 get_settings() 读取。)
| 变量 | 说明 | 默认 |
|---|
JWT_SECRET | 签发/校验 JWT 的共享密钥 | change-me-in-config-local |
ROOT_ADMIN_USERNAME / ROOT_ADMIN_PASSWORD | 初始化时写入数据库的管理员账号(密码置空则跳过) | admin / admin123 |
LOCAL_AUTH_DATABASE_PATH | 本地账号 SQLite 路径 | 仓库根目录下 local_auth.db |
DONATION_PROMPT_MUTE_DAYS | 一笔赞助之后隐藏「赞助」按钮的天数 | 30 |
DONATION_FX_TO_CNY | 币种 → CNY 的静态近似汇率(仅用于把混合币种折成一个总额) | CNY: 1.0、USD: 7.1、EUR: 7.8 |
本地账号与 Supabase 相互独立
启动时本地账号库(SQLite)总会初始化;Supabase 引擎的连通性检查是尽力而为——若不可达,仅记录告警并继续,因此 /api/auth/* 与 /v1/internal/* 可离线工作。Supabase 的 /v1/* OAuth 路由会在请求时自行报错,直到 Supabase 恢复可达。
cd rakull_server/user_manager
JWT_SECRET=dev-secret uv run uvicorn app.main:app --port 8010