首次部署
通过 deploy:init 创建 Cloudflare 资源、写入生产配置并部署到 workers.dev。
首次部署不需要手工创建 D1、KV、R2 Bucket 和 Queue,也不要自己把资源 ID 填进 wrangler.jsonc。项目提供的 deploy:init 会检查目标账户和资源名称,在你确认后完成整个初始化过程。
部署前准备
开始前确认下面几项已经就绪:
- Cloudflare 账号已验证,并且准备部署的账户已经开通 R2;
- 已决定 Turnstile 暂时使用官方测试密钥,还是使用正式 Widget 的 Site Key 和 Secret Key;
- 默认邮件服务仍为 Resend 时,已经准备好 Resend API Key;
- 已确定发件人邮箱和支持邮箱;
- 如果准备同时启用 Stripe,已经准备好连接标识、Secret Key 和 Webhook Secret。
如果目前只有 Cloudflare 分配的 workers.dev 地址,可以先使用模板自带的 Turnstile 测试密钥。确定正式域名后再创建 Widget、替换 .env.production 中的密钥并重新部署。完整过程见配置 Turnstile。Stripe、OAuth 和通知服务没有启用时不用为了部署而临时注册。
远程配置写入 .env.production
.env 继续用于本地开发。Turnstile、Resend 和 Stripe 的远程环境配置在 deploy:init 交互过程中输入,并保存到 .env.production。Turnstile 测试密钥也应填在这里,不能因为它是测试值就让远程部署去读取本地 .env。这两个文件都不会提交到 Git。
登录 Cloudflare
在项目根目录执行:
npx wrangler login浏览器会打开 Cloudflare 授权页。

确认登录用户能够访问准备部署的账户,再允许 Wrangler 访问。授权完成后可以用下面的命令核对:
npx wrangler whoami控制台会输出当前授权的账号信息和权限列表:

如果能看到多个账户,记住这次项目应该使用哪一个。deploy:init 会在终端中让你选择。
运行首次部署
执行:
npm run deploy:init按照终端提示依次完成:
- 选择 Cloudflare 账户;
- 确认 Worker 名称以及由它派生的资源名称;
- 输入成对的 Turnstile Site Key 和 Secret Key;首次验证部署可以使用官方测试组合;
- 确认发件人邮箱和支持邮箱;
- 默认使用 Resend 时输入
RESEND_API_KEY; - 选择是否现在配置 Stripe;
- 确认写入
.env.production; - 查看准备创建的 Worker、D1、KV、R2 和 Queue,确认后开始部署。

脚本不会复用或覆盖同名的现有资源。检测到名称冲突时,它会停止并说明冲突位置;确认资源归属之前,不要为了继续执行而随意删除 Cloudflare 账户中的内容。
确认后,脚本会自动完成类型检查和生产构建,创建并绑定 Cloudflare 资源,部署 Worker,迁移远程数据库,同步 KV,最后检查首页及已启用的内容页面。
部署成功后,终端会打印类似下面的地址:
https://my-project.<你的-workers.dev-子域>.workers.dev
打开这个地址,确认首页和 /docs 可以访问。

使用官方测试组合时,可以继续验证注册等表单是否接通,但它不会识别真实机器人;使用正式 Widget 时,还要确认其 Hostname 列表包含浏览器地址栏中的实际主机名。
中途退出后怎么继续
如果在配置检查阶段退出,且尚未创建远程资源,修正终端指出的问题后可以重新运行:
npm run deploy:init如果 Worker 或部分资源已经创建,则先检查远程状态和本地绑定,不要直接重复初始化。数据库迁移、KV 同步或健康检查阶段的失败,按部署中断处理继续。
成功完成首次部署以后,项目已经记录 Cloudflare 账户、资源 ID 和生产环境。后续修改代码或 .env.production 时改用:
npm run deploy:update不要在已经初始化的项目上反复运行 deploy:init,也不要绕过项目脚本单独维护另一套 Wrangler Secrets。
使用自定义域名
首次部署必须先在 workers.dev 上完成。准备切换到 Cloudflare 中已经管理的正式域名时运行:
npm run domain:set -- https://app.example.com命令会更新站点地址和 Worker Custom Domain,重新验证并部署项目。准备切换域名前,建议先在 Turnstile 创建正式 Widget,并把真实密钥写入 .env.production,这样 domain:set 会连同新密钥一起部署。如果先绑定了域名,之后才替换密钥,则修改 .env.production 后再运行 npm run deploy:update。
域名切换完成后,还要分别处理 Resend 中用于发送邮件的域名、OAuth 回调地址和 Stripe Webhook。终端会打印当前项目对应的回调地址,逐项复制到各服务后台即可。
到这里,项目已经完成从 Saavo 模板到 Cloudflare 的第一次完整部署。接下来进入实践,开始修改产品内容;准备面向真实用户时,再按照部署上线完成正式检查。