# Debug Session: staging-admin-api-500 - **Status**: [OPEN] - **Issue**: staging 部署后,支付管理与套餐管理调用后端仍失败;期望两个后台 API 在管理员会话下正常返回。 - **Debug Server**: pending - **Log File**: .dbg/trae-debug-log-staging-admin-api-500.ndjson ## Reproduction Steps 1. 登录 https://staging.jyotisha.chat/admin。 2. 打开支付管理,触发 GET /api/admin/payments?limit=20&offset=0。 3. 打开套餐管理,触发 GET /api/admin/packages。 4. 记录 HTTP 状态、当前部署 SHA 与 web 容器脱敏错误类别。 ## Hypotheses & Verification | ID | Hypothesis | Likelihood | Effort | Evidence | |----|------------|------------|--------|----------| | A | admin_runtime 缺支付/套餐对象权限 | High | Low | Pending:预期 PostgreSQL permission denied | | B | staging migration 未执行或仍 pending | High | Low | Pending:预期 migration ledger 缺授权 migration | | C | staging 正在运行旧 SHA/旧镜像 | High | Low | Pending:预期 health SHA 与 staging head 不一致 | | D | ADMIN_DATABASE_URL 指向错误数据库或角色 | Medium | Medium | Pending:预期 current_user/database 与预期不符 | | E | SQL 与 staging schema 不匹配 | Medium | Low | Pending:预期 undefined table/column/function | | F | deploy 用户无法直接访问 Docker socket | Confirmed | Low | run 1309:访问 `/var/run/docker.sock` 返回 permission denied;既有自动部署使用 `sudo docker`。 | ## Log Evidence | Evidence | Observation | |---|---| | staging health | 当前部署 SHA 仍为 `dd8e2ad`。 | | required permission migration | `d44a414` 尚未部署。 | | Gitea migration | run 1309 在远端 Docker 操作失败,错误为 deploy 用户访问 `/var/run/docker.sock` permission denied。 | | known privilege boundary | `.gitea/workflows/backend-quality-gate.yml` 的同主机自动部署已使用 `sudo docker`,证明可用边界是非交互 sudo Docker,而不是 docker 组直连。 | ## Verification Conclusion Pre-fix 结论:后台 500 的已知权限迁移尚未落库;run 1309 暴露 Docker socket 权限,run 1313 又证明只将 Docker 子命令改为 sudo 仍不足,root-owned 部署树的 mutation lock 会在迁移执行前拒绝 deploy 用户。修复应以 `sudo -n env` 启动整个受控脚本,脚本内直接使用 `docker`,并以 sudo 清理可能成为 root-owned 的 incoming。修复后仍需实际运行迁移、确认 health 切换到目标 SHA,并完成管理员登录态支付/套餐 smoke;在这些证据完成前保持 OPEN。