00 / 00

部署指南

上线前检查、部署方式选择、环境变量、数据库迁移和部署后验证。

项目是 Vite Plus + pnpm workspace monorepo,应用在 products/01mvp/apps/web 下。

默认生产路径是 Zeabur + Cloudflare。Zeabur 运行 TanStack Start Docker 服务,Cloudflare 负责域名代理、HTTPS、WAF 和基础访问统计。

部署方式选择

方式适合场景入口
Zeabur默认生产部署,适合 TanStack Start Docker 服务、数据库和域名统一管理Zeabur 部署
Docker自有 VPS、K8s,或需要手动维护容器运行时Docker 部署
Cloudflare Workers明确要把 TanStack Start 适配到 Workers,并愿意处理兼容性验证Cloudflare Workers 部署

Vercel 不在推荐列表中,因为免费套餐的并发和额度极低,付费方案性价比偏低。Zeabur + Cloudflare 是成本更低、更可控的替代方案。

部署前检查清单

在触发任何部署之前,逐项确认以下内容:

  • 本地 vpr @01mvp/product#build 构建成功,无 TypeScript 错误
  • migration 文件已提交到 Git
  • products/01mvp/packages/config/.envpackages/config/.env 或生产变量源中的必填变量已同步到部署平台
  • VITE_WEB_URLVITE_SERVER_URL 指向生产域名
  • OAuth 回调 URL 已在第三方平台更新为生产域名
  • 数据库连接串可从部署平台网络访问
  • Drop / R2 存储桶权限已配置
  • AI API Key 有效且余额充足
  • 支付 Webhook 地址已配置为生产域名
  • 邮件服务 API Key 已配置
  • Turnstile 已开启,认证高风险入口能完成人机验证
  • Cloudflare WAF/DDoS 规则已配置
  • Cloudflare Web Analytics 已按生产域名启用

环境变量管理

多环境策略

01MVP 项目使用以下环境文件管理本地开发变量:

文件用途是否提交到 Git
products/01mvp/packages/config/.env.example01MVP 产品变量模板
products/01mvp/packages/config/.env01MVP 本地开发变量,包含真实密钥
packages/config/.env.example共享变量模板,列出跨产品通用变量
packages/config/.env多产品共享的本地兜底值
部署平台 Variables / Secrets生产、预发等环境真实值平台托管

必填变量

变量名说明示例
DATABASE_URLPostgreSQL 连接串postgresql://user:pass@host:5432/prod
BETTER_AUTH_SECRETAuth 签名密钥随机生成的强密钥
VITE_WEB_URL站点公开 URLhttps://your-domain.com
VITE_SERVER_URLAPI 公开 URLhttps://your-domain.com/api
OPENAI_API_KEYAI API 密钥sk-...

按需变量

类型变量
Drop / R2 存储DROP_R2_BUCKET_NAMEDROP_R2_ENDPOINTDROP_R2_ACCESS_KEY_IDDROP_R2_SECRET_ACCESS_KEYPAGES_BASE_URL
OAuth 登录GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETGITHUB_CLIENT_IDGITHUB_CLIENT_SECRET;微信登录还需 AUTH_ENABLE_WECHAT=true 和微信凭据
支付STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETZPAY_PIDZPAY_KEY
邮件ZEABUR_EMAIL_API_KEYEMAIL_FROMFEEDBACK_EMAIL_TO
安全AUTH_COOKIE_PREFIXCOOKIE_DOMAINTRUSTED_ORIGINSENABLE_OPEN_API_DOCS

敏感变量只在部署平台设置,不要提交到 Git。VITE_ 前缀变量会进入客户端 bundle,只放公开信息。

数据库迁移策略

迁移原则

生产数据库变更必须使用 migration。不要在生产环境运行 db:push,也不要用 Drizzle Studio 手动改表结构。

迁移工作流

开发阶段创建迁移

修改 products/01mvp/packages/db/src/schema 后,创建迁移文件:

vpr @01mvp/product#db:generate

这会在 products/01mvp/packages/db/migrations 下生成 SQL 文件。

提交迁移文件

将生成的 migration 文件提交到 Git,例如 products/01mvp/packages/db/migrations/20260521184410_mighty_epoch/migration.sql

执行生产迁移

部署新代码前,执行已经提交到 Git 的迁移文件:

vpr @01mvp/product#db:deploy

部署并验证

迁移通过后再部署生产代码。部署完成后检查健康检查、登录、支付、后台等关键路径。

生产环境怎么执行迁移

当前模板默认使用显式迁移:先运行 vpr @01mvp/product#db:deploy,再部署生产代码。关键点是:生产 DATABASE_URL 必须正确,migration 文件必须已经提交到 Git,迁移命令必须先通过。

如果你需要保留运行时兜底迁移,可以设置 RUN_STARTUP_MIGRATIONS=true。这只是兼容兜底,不建议作为主要发布流程。

如果需要在上线前从本机验证生产连接,只输出主机名,不要输出完整密码:

node -e 'const u=new URL(process.env.DATABASE_URL); console.log(u.host, u.pathname)'

迁移注意事项

  • migration 文件必须随应用代码一起提交。新代码可能依赖新表结构
  • 生产部署前先执行 vpr @01mvp/product#db:deploy
  • 迁移文件只执行一次。Drizzle 会通过迁移记录表跟踪已应用迁移
  • 大表迁移需要评估影响。ALTER TABLE 在大表上可能锁表,生产环境建议在低峰期执行
  • 破坏性变更拆成两次发布。先加新字段或新表并兼容旧代码,部署稳定后再删除旧字段
  • 回滚方案需要提前准备。重要迁移前先备份数据库或准备回滚 SQL

部署后验证

部署完成后,逐项验证以下功能:

基础访问

  • 网站可通过生产域名正常访问
  • HTTPS 证书有效
  • 页面加载无超时或 500 错误
  • 浏览器控制台无关键错误

用户认证

  • 注册新账号流程正常
  • 登录和登出正常
  • OAuth 登录回调正常
  • Session 刷新后仍然有效

数据库

  • 数据读写正常
  • 新注册用户数据写入成功
  • Drizzle 数据库连接正常,无连接池错误

文件上传

  • 图片或文件能上传到 S3
  • 上传后可正常访问和展示
  • 签名 URL 没有过期或权限错误

付费与通知

  • 支付页面可正常加载
  • Webhook 回调地址指向生产域名
  • 注册、登录、通知类邮件能正常发送

常见部署问题

完整检查清单

构建

  • vpr @01mvp/product#build 通过
  • Node.js 版本符合 24.x
  • Drizzle migration 已提交并执行

环境变量

  • DATABASE_URL 指向生产数据库
  • BETTER_AUTH_SECRET 已设置为强密钥
  • VITE_WEB_URL 指向生产域名
  • VITE_SERVER_URL 指向生产 API
  • AI、Drop/R2、支付、邮件等按需变量已配置

数据库

  • migration 文件已提交到 Git
  • migration 文件已提交
  • 生产启动日志没有 migration 失败

域名和安全

  • 自定义域名已绑定到部署平台
  • DNS 记录已配置
  • HTTPS 证书签发成功
  • 边缘 WAF/DDoS 规则已配置
  • Web Analytics 能看到生产域名访问数据

验证

  • 部署后访问首页正常
  • 登录注册流程正常
  • 核心功能验证通过
  • 支付、邮件、上传等按需功能验证通过

这篇文档有问题?