运维与上线

部署与安全清单

通过显式迁移、Cron、readiness、可信网络与生产安全控制部署 Web 和管理应用。

已与启动模板提交 2a1a04a 同步。

请在应用本地可用后,把本页作为采用者的最后检查清单。目标不仅是“部署成功”,而是得到一个能够认证、收费、运维、恢复和管理,且没有开发捷径的版本。

选择部署形态

  • Web 与管理控制台是两个独立构建,应使用不同来源;它们可以共享仓库、数据库、认证 secret 和版本 tag。
  • 文档以 Vercel 为例,因为 vercel.json 已配置 Cron;任何能提供 PostgreSQL、Redis、HTTPS、环境 secret 和认证调度器的 Node 平台都可使用。
  • Serverless 流量使用连接池 PostgreSQL URL;供应商有需要时,迁移使用直连 URL。先迁移再发布代码,迁移不会自动放进 build。
  • CSP 先用 report-only,观察 analytics、Turnstile、Stripe 与存储实际使用的 host,再决定何时 enforce。

可以上线的标准: 两个应用从同一版本构建;迁移已验证;/api/ready 健康;备份可恢复;Cron 与 Stripe webhook 完成真实测试;生产无 demo flag;只读/可写管理员权限符合预期。

将 Web 与 apps/admin 作为不同来源的独立服务部署。使用 Node >=20.19.0 <23 和 pnpm 10.22.0,运行 pnpm lintpnpm test:covpnpm build,再显式执行 pnpm db:check:prodpnpm db:migrate:prod。迁移绝不是自动 build 步骤。

生产必备控制

  • BETTER_AUTH_SECRET、正确 URL、生产 PostgreSQL,以及经过恢复演练的备份。
  • Redis 分布式限流和明确可信的客户端 IP header/来源。
  • 认证流程 Turnstile;关闭 demo 与本地认证链接日志。
  • CRON_SECRET,并每五分钟调用 /api/cron/jobsvercel.json 已含计划)。
  • 启用计费时使用 Stripe live key、已验证 webhook、安全 Portal 与 Price ID。
  • 启用存储时保持对象私有、最小权限凭据、正确 CORS 与短期签名 URL。
  • 验证邮件域,并按所在地审查数据保留和法律策略。

/api/health 用于存活,/api/ready 用于部署就绪;后者检查环境、数据库、迁移、Redis 与队列,队列降级即使不阻断请求也需告警。

安全 header 包含生产 HSTS 和 report-only CSP 路径。先观察报告,再按分析、验证码、支付和存储 host 收紧策略。部署后 smoke-test 认证、组织隔离、结账/webhook、Cron、导出/删除与管理端 MFA。上线前阅读模板 DEPLOYMENT.mddocs/security-headers.md.env.example

当前版本还提供 Web、Admin、Worker、Content Studio 的加固镜像,以及汇总配置、容器、迁移、完整性、保留、测试和构建的 pnpm launch:check。请继续阅读容器与上线就绪并通过备份与恢复演练证明恢复能力。

部署与安全清单 · Sushi SaaS