生产环境检查表
上线前逐项确认。没有完成密钥、网络和备份部分时,不建议开放注册或充值。
发布信息
先记录这次部署的可追溯信息:
| 项目 | 记录 |
|---|---|
| 应用版本 / 镜像 digest | |
| Git commit | |
| 发布时间 | |
| 发布人 | |
| PostgreSQL 版本 | |
| Redis 版本 | |
| 配置备份位置 | |
| 数据库备份位置 | |
| 回退版本 | |
| 验收负责人 |
密钥与账号
- [ ]
POSTGRES_PASSWORD是独立随机密码。 - [ ]
JWT_SECRET已固定,不会随容器重启变化。 - [ ]
TOTP_ENCRYPTION_KEY已固定并安全备份。 - [ ] 管理员使用独立邮箱和强密码。
- [ ] 已启用管理员 TOTP。
- [ ]
.env、config.yaml和备份文件不在 Git 中。 - [ ] 只有应用和必要运维账号能读取数据库。
数据库属于敏感凭证库
上游 OAuth token 和 API Key 会保存在账号数据中。必须限制数据库、备份和只读副本的访问,并对备份实施加密。
网络与 SSRF 防护
默认配置为了兼容自定义上游而比较宽松。公网运营时建议显式设置:
dotenv
SECURITY_URL_ALLOWLIST_ENABLED=true
SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=false
SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS=false
SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS=api.openai.com,api.anthropic.com,generativelanguage.googleapis.com,cloudcode-pa.googleapis.com,*.openai.azure.com- [ ] URL allowlist 已开启。
- [ ] allowlist 包含实际使用的全部上游域名。
- [ ] 不允许任意私网地址和非 HTTPS 上游。
- [ ] PostgreSQL、Redis 和应用管理端口不直接暴露公网。
- [ ] 账号代理失败时不会静默回退到真实出口。
- [ ] 防火墙只开放 80/443 和受限 SSH。
HTTPS 与反向代理
- [ ] 域名证书有效并自动续期。
- [ ] HTTP 自动跳转 HTTPS。
- [ ] SSE 响应缓冲关闭。
- [ ] WebSocket Upgrade 头正确转发。
- [ ] 反向代理读写超时能够覆盖长模型请求。
- [ ] Nginx 已设置
underscores_in_headers on。 - [ ] CDN 不缓存 API、鉴权和支付回调路径。
- [ ] 真实客户端 IP 只从可信代理读取。
PostgreSQL
- [ ] 使用支持的 PostgreSQL 版本。
- [ ] 磁盘空间和 inode 有监控。
- [ ] 数据库连接数大于所有应用实例连接池总和,并保留余量。
- [ ] 已配置自动备份。
- [ ] 已在隔离环境完成恢复演练。
- [ ] 升级前会创建额外备份。
Redis
- [ ] Redis 只允许内网访问。
- [ ] 跨主机连接启用认证,必要时启用 TLS。
- [ ] 已启用 AOF 或符合需求的持久化策略。
- [ ] 设置合理的内存上限和淘汰策略。
- [ ] 监控内存、连接数、延迟和 key 淘汰。
应用运行
- [ ]
RUN_MODE=standard,除非明确使用内部简单模式。 - [ ] 时区在应用、PostgreSQL 和运维报表中一致。
- [ ]
/health有外部健康检查。 - [ ] 日志有轮转、保留和集中检索。
- [ ] 告警覆盖错误率、延迟、无可用账号、余额异常和数据库容量。
- [ ] 已测试一个非流式请求和一个流式请求。
- [ ] 已验证请求产生正确用量与扣费。
支付与商业运营
- [ ] 支付回调只使用 HTTPS。
- [ ] 支付平台签名密钥没有出现在日志或前端。
- [ ] 回调重复发送不会导致重复入账。
- [ ] 订单对账和异常退款流程已有负责人。
- [ ] 已确认项目许可证、上游服务条款和当地合规要求。
- [ ] 对用户明确披露计费规则、退款政策和服务可用性边界。
发布流程
- [ ] 镜像使用固定版本,而不是不可追踪的
latest。 - [ ] 发布前查看迁移内容与版本说明。
- [ ] 已完成数据库备份。
- [ ] 有可执行的应用回退和数据库恢复方案。
- [ ] 发布后检查健康、日志、登录、API、用量和支付。
首次上线验收
基础设施
- [ ] 应用、PostgreSQL、Redis 容器/服务状态正常。
- [ ] 重启应用后 JWT 会话行为符合预期。
- [ ] 重启 Redis 后普通请求能够恢复。
- [ ] 磁盘、连接数和文件描述符有充足余量。
- [ ] NTP 正常,所有实例时间一致。
Web 与身份
- [ ] 首页和登录页通过 HTTPS 打开。
- [ ] 管理员登录、刷新 token、退出正常。
- [ ] TOTP 启用和恢复流程已经测试。
- [ ] 找回密码邮件中的 URL 使用正确域名。
- [ ] 开启的每个 OAuth 回调都完成真实登录测试。
- [ ] 被禁用用户不能继续登录或请求。
网关
- [ ]
/v1/models使用测试 Key 返回正确模型。 - [ ] Anthropic 非流式请求成功。
- [ ] Anthropic SSE 逐事件返回。
- [ ] OpenAI Responses 非流式请求成功。
- [ ] 使用的客户端协议和工具调用已验证。
- [ ] 客户端断开后并发槽位会释放。
- [ ] 主账号故障时可以切换备用账号。
- [ ] 所有账号不可用时错误格式符合客户端预期。
计费
- [ ] 成功请求产生且只产生一条有效计费记录。
- [ ] requested/upstream/billing model 正确。
- [ ] 输入、输出和缓存 Token 正确。
- [ ] 用户费用与账号成本符合倍率。
- [ ] 余额、订阅、API Key quota 与平台配额更新正确。
- [ ] 定价缺失会告警,而不是静默错误扣费。
- [ ] Usage worker 没有 dropped/failed 异常。
账号与调度
- [ ] 每种账号类型都完成账号测试。
- [ ] 代理出口 IP/区域符合预期。
- [ ] 账号并发达到上限时会等待或切换。
- [ ] 粘性会话能够复用账号。
- [ ] 限流账号在冷却后能恢复。
- [ ] OAuth token 刷新不会在多实例重复竞争失败。
运维
- [ ] Ops 页面有实时指标和历史聚合。
- [ ] 错误详情不泄漏完整凭证或 prompt。
- [ ] Token refresh、aggregation、cleanup 等 job 有 heartbeat。
- [ ] 告警渠道已真实触发一条测试告警。
- [ ] 日志可以按 Request ID 检索。
- [ ] 数据保留和 cleanup 周期符合业务要求。
备份恢复验收
- [ ] PostgreSQL 逻辑备份命令定时执行。
- [ ] 备份文件大小和校验值有监控。
- [ ] 备份加密并复制到独立位置。
- [ ] 已恢复到隔离 PostgreSQL 实例。
- [ ] 恢复库可以登录并查询账号、分组和历史用量。
- [ ]
.env、YAML、TOTP/JWT secret 有独立备份。 - [ ] 明确 RPO(允许丢多少数据)与 RTO(多久恢复)。
- [ ] 回退应用时知道新数据库迁移是否兼容。
容量验收
- [ ] 应用 CPU/内存在预期并发下有 30% 以上余量。
- [ ] PostgreSQL 没有持续连接等待或慢查询。
- [ ] Redis 没有 evicted keys、blocked clients 或高延迟。
- [ ] 用量 worker 队列不会持续增长。
- [ ] 反向代理活跃连接和 fd 有余量。
- [ ] 上游账号池总并发大于目标用户并发。
- [ ] 代理出口没有成为所有账号的单点。
变更管理
每次修改以下内容,都按一次小型发布处理:
- [ ] 分组 platform、倍率、模型映射或 fallback。
- [ ] 大批量账号、代理或凭证。
- [ ] JWT/TOTP/OAuth/支付 secret。
- [ ] PostgreSQL/Redis endpoint 或连接池。
- [ ] URL allowlist 与真实 IP 信任。
- [ ] 用量 worker、调度器和 WebSocket 模式。
变更前导出配置,变更后执行最小 smoke test,并观察错误率、用量和费用。
开放注册前
- [ ] 默认用户余额为 0。
- [ ] 默认分组是低风险、有限额度分组。
- [ ] 邮箱验证和 Turnstile 正常。
- [ ] 注册、登录、找回密码有速率限制。
- [ ] 用户协议、隐私政策、计费规则和退款政策可访问。
- [ ] 用户无法看到管理员备注、上游凭证和内部错误。
- [ ] 有用户 Key 泄漏和滥用处置流程。
开放支付前
- [ ] 先在沙箱完成成功、取消、超时、重复回调测试。
- [ ] 回调金额、币种、订单号和签名都会验证。
- [ ] 同一订单重复 webhook 不会重复加余额。
- [ ] 本地 pending 订单可以主动 reconcile。
- [ ] 支付 provider 限额与负载均衡符合预期。
- [ ] 管理员人工补单、退款和调账都有审计。
- [ ] 每日自动对账和异常通知已配置。
最终 Go / No-Go
可以上线必须同时满足:
text
安全基线通过
AND 数据可恢复
AND 非流式/流式请求通过
AND 用量与扣费通过
AND 告警可到达
AND 有明确回退负责人任何一项不满足,都应选择 No-Go,而不是依赖上线后观察。