准备生产配置与密钥

整理应用配置、正式服务凭据和环境文件,理解部署脚本如何上传变量与 Secret。

上线前要把开发阶段的品牌、服务地址和测试凭据整理成生产配置。这里延续前面品牌与项目配置和可选服务的操作,重点确认最终部署使用哪一份值。

一、先分清配置放在哪里

文件或位置保存的内容修改后如何生效
config/base.ts品牌、发件人、支持邮箱、管理员邮箱等构建并部署
config/deploy.ts功能开关、邮件提供商、额外允许的域名等构建并部署
config/products.ts产品、Plan、Price ID 和购买权益构建并部署
config/i18n.ts、locales/支持的语言和界面文案构建并部署
wrangler.jsonc账户、Worker 名称、资源绑定、域名和定时规则通过部署流程更新
.env本地开发环境值重启本地开发服务
.env.production远程部署的环境值与应用密钥运行部署或更新命令
第三方服务后台发信域名、OAuth 回调、Webhook 和允许主机在相应平台保存,涉及本地密钥变化时再部署

example.vars 是变量清单,不是可以直接拿去上线的完整配置。只填实际启用的服务,暂时没有使用的提供商无需为了消除所有提示而开通。

首次运行 deploy:init 会收集必要信息并创建或补充 .env.production。如果提前手工准备了文件,脚本会读取其中已有的值。

二、保留现有 SAAS_SECRET

当前部署脚本要求 .env 和 .env.production 中的 SAAS_SECRET 存在且完全一致。首次部署会在生产文件缺少该值时使用本地项目已有的值,后续更新与域名切换也会检查一致性。

因此,不要在上线当天为这个项目临时生成另一把生产密钥,也不要为了通过检查而随意替换两份文件。它参与已有加密数据的处理,替换后可能导致历史数据不可读。

如果创建新项目时还没有生成密钥,应回到本地开发完成初始化。独立新项目可以有自己的密钥,已有项目的密钥轮换则需要专门的数据迁移方案。

这个要求不代表其他服务都应共用测试凭据。Stripe、Turnstile、OAuth 等仍应按自己的环境和站点配置。

三、确认正式服务配置

服务需要检查的值上线要求
TurnstileCLOUDFLARE_TURNSTILE_SITE_KEY、CLOUDFLARE_TURNSTILE_SECRET_KEY两者属于同一正式 Widget,主机列表包含正式站点
ResendRESEND_API_KEY当前发信域名已验证,Key 有发送权限
StripeSTRIPE_CONNECTION_ID、STRIPE_SECRET_KEY、STRIPE_WEBHOOK_SECRET正式收款使用匹配的正式配置,Price ID 也属于同一模式
GitHub OAuthGITHUB_CLIENT_ID、GITHUB_CLIENT_SECRET属于配置了正式回调的应用
Google OAuthGOOGLE_CLIENT_ID、GOOGLE_CLIENT_SECRET来源、回调和应用发布状态满足实际使用要求
R2 签名访问R2_ACCOUNT_ID、R2_ACCESS_KEY_ID、R2_SECRET_ACCESS_KEY仅在使用预签名上传或下载等 API 功能时配置
外部通知config/notifications.ts 启用的目标所引用的变量目标地址、令牌与实际接收渠道一致

普通 R2 绑定读写不等于必须配置 R2 API 密钥,按存储功能中实际使用的接口准备即可。

默认邮件提供商是 Resend。如果选择 Cloudflare 邮件服务,需要相应账户能力、EMAIL 绑定和允许的发件人,不能只把配置中的提供商名称改掉。两种方式的准备步骤见邮件。

测试 Turnstile 密钥可用于初次验证部署是否接通,正式开放前应换成真实配置。脚本主要检查是否填写,不会替你判断输入的是不是测试值。

四、整理站点地址

首次部署使用脚本生成的 workers.dev 地址。绑定正式域名时,domain:set 会把 .env.production 的 VITE_SITE_URL 更新为正式 HTTPS 源地址,例如:

VITE_SITE_URL="https://app.example.com"

这里只展示单个字段,不是完整的环境文件。站点地址不要带 /docs 等路径、查询参数或片段。

生产构建会使用这个地址生成站点相关内容,运行时也依赖它。只改 Cloudflare 控制台里的值,而没有同步本地配置并重新部署,可能导致页面链接与运行时地址不一致。

config/deploy.ts 的 hosts 用于额外允许的主机,VITE_SITE_URL 中的主机已自动允许,通常不必重复加入。trustedOrigins 则是跨来源请求信任配置,不是 DNS 绑定或 OAuth 回调清单。同源站点上线无需为此添加通配符。

域名、根域与 www、文件域名的处理见正式域名与第三方回调。

五、理解变量如何上传

部署脚本读取 .env.production 后,按项目维护的公开字段清单处理:

  • 公开字段作为 Worker 变量传入,例如 VITE_SITE_URL、Turnstile Site Key 和 OAuth Client ID。
  • 其他非空字段作为 Secret 随部署上传,例如 SAAS_SECRET、OAuth Client Secret 和 Stripe 签名密钥。
  • 空值会跳过,不会自动删除远程已有的 Secret。

公开字段的判断不是只看有没有 VITE_ 前缀。也不要给密码、访问令牌或签名密钥自行添加 VITE_ 前缀,这类变量可能进入客户端构建产物。

Cloudflare 部署用的 CLOUDFLARE_API_TOKEN 等凭据不能放进 .env.production,脚本会拒绝把它们作为应用环境部署。交互式开发可使用 Wrangler 登录,自动部署则在执行环境中管理凭据。

日常修改以本地生产配置为依据,再运行 npm run deploy:update。如果应急时只改了远程 Secret,后续部署可能重新覆盖它,应把受保护的配置记录同步更新。

取消服务或撤销凭据时,仅把本地值置空不够。先处理功能开关和调用方,再在提供商处撤销凭据,并按需要移除远程 Secret,避免误以为空字符串已经完成清理。

六、发布前检查产品内容

准备配置时一并检查:

  • 站名、Logo、支持邮箱、发件人以及法律页面已替换成自己的内容。
  • adminEmails 是能接收邮件并完成验证的地址。
  • 所有正在销售的 Plan 都绑定真实 Price,金额、币种、周期和权益描述一致。
  • 联盟比例、优惠活动和赠送权益符合本次发布计划。
  • 文档、博客和语言菜单只展示准备发布的内容,不把模板测试文章当成正式帮助中心。
  • 业务特有的外部服务已经部署,主站的绑定和凭据已对齐。

不收款的首版可以暂时跳过 Stripe,但购买入口和产品说明也应与这一决定一致。保留占位 Price 的套餐不能作为真实可购买方案展示。

七、运行配置检查

尚未首次部署时运行:

npm run doctor
npm run verify

已经初始化过远程项目时,额外运行:

npm run doctor:remote

verify 包含代码规范、类型、测试和生产构建。doctor:remote 检查配置与身份,不会替你向用户发送邮件或完成支付。

不要把完整环境文件粘贴进工单、聊天记录或版本库。需要排查时,记录变量名称、所属环境和是否已配置即可。

下一步:管理生产数据库与内容。