Cloudflare Workers
使用专用 Workers 应用、D1、R2 与 Cloudflare Email Sending 部署。
将 Workers 应用接入 D1、R2 和 Cloudflare 邮件,依次完成资源创建、配置、预览和部署。
开始前准备
安装项目依赖,准备具备 Workers/D1/R2/Email Sending 权限的 Cloudflare 账号和部署域名。选择 apps/web-cloudflare,命令在仓库根目录运行。需要先体验本地时,完成 快速开始。使用全新远端数据库;已有产品先准备 升级方案。
1. 准备账号与资源
在仓库根目录安装依赖,使用应用自带 Wrangler,无需全局安装:
pnpm install
pnpm --filter @musemvp/cloudflare exec wrangler login
pnpm --filter @musemvp/cloudflare exec wrangler d1 create <your-database-name>
pnpm --filter @musemvp/cloudflare exec wrangler r2 bucket create <your-bucket-name>账号需要能使用 Workers、D1、R2 和 Email Sending。额度、权限、CPU 与 bundle 限制以平台当前规则为准;模板不保证所有功能零费用。
2. 配置绑定
编辑 apps/web-cloudflare/wrangler.jsonc。不要复用模板演示账号的资源 ID、域名或名称。
{
"name": "your-app",
"main": ".open-next/worker.js",
"compatibility_date": "2026-09-30",
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
"workers_dev": false,
"preview_urls": false,
"routes": [{ "pattern": "app.example.com", "custom_domain": true }],
"assets": { "binding": "ASSETS", "directory": ".open-next/assets" },
"d1_databases": [{
"binding": "DB",
"database_name": "your-database-name",
"database_id": "<your-d1-id>",
"migrations_dir": "../../packages/db/migrations-d1"
}],
"r2_buckets": [{ "binding": "R2_BUCKET", "bucket_name": "your-bucket-name" }]
}这是绑定片段;保留模板其余必要配置。DB 与 R2_BUCKET 的大小写必须一致。当前 scripts/d1-migrations.ts 的 databaseName 也是演示名称,派生产品必须同步改成自己的 D1 名称后再执行数据库命令。
3. 初始化本地环境
pnpm muse:init --yes --app cloudflare
pnpm db:seed:d1
pnpm cf:typegen
pnpm dev:cf初始化写入 apps/web-cloudflare/.env.local 和 .dev.vars,生成认证/订阅签名密钥并应用本地 D1 迁移。它不会创建远端 D1 或 R2。默认本地账号为 [email protected] 与 [email protected],密码取 MUSE_SEED_PASSWORD(默认 musemvp)。只用于开发。
pnpm dev:cf 是 Next 开发模式;要检查真实 Worker 打包和绑定,再用 pnpm cf:preview。修改 .env.local 后也要同步 .dev.vars,不要假定两文件会持续自动同步。
4. 配置生产邮件、认证和支付
按 环境变量 为 Worker 配置服务端密钥。至少设置认证密钥、订阅签名密钥和 Cloudflare 邮件凭据;按实际启用功能配置 OAuth、Turnstile 与支付网关。生产 MAIL_PROVIDER=cloudflare。
构建时设置 NEXT_PUBLIC_SITE_URL=https://app.example.com 和其他实际使用的 NEXT_PUBLIC_*。仅在 Worker 运行时修改公开变量不会更新已经内联的客户端 URL。
可用应用作用域的命令逐项写入密钥:
pnpm --filter @musemvp/cloudflare exec wrangler secret put BETTER_AUTH_SECRET
pnpm --filter @musemvp/cloudflare exec wrangler secret put NEWSLETTER_TOKEN_SECRET
pnpm --filter @musemvp/cloudflare exec wrangler secret put CLOUDFLARE_API_TOKEN其余变量在部署平台配置,或通过经过筛选的密钥文件导入。不要整份上传本地 seed 与开发配置。
5. 迁移并部署
pnpm db:migrate:d1:status
pnpm db:migrate:d1:remote
pnpm db:migrate:d1:status --strict
pnpm cf:deploy远端迁移脚本先导出备份,在本地克隆上应用并检查迁移,再应用远端。备份含用户数据,妥善保管。cf:deploy 会先执行严格 D1 状态检查,存在待执行迁移则停止,而不是自动修改生产数据库。
OpenNext 配置使用 webpack 构建;pnpm build:cf 是应用 Next 构建,cf:preview / cf:deploy 还会构建 Worker。保留锁文件和当前 OpenNext 补丁,直到明确验证新版本不再需要。绑定变化后重新执行 pnpm cf:typegen,不要手写 cloudflare-env.d.ts。
确认结果
运行 pnpm cf:preview,打开它给出的 URL 检查构建后的 Worker 和本地绑定。执行 pnpm cf:deploy 后打开配置的 HTTPS 域名,检查远端 D1 状态。通过生产账号流程验证登录、真实邮件和自己的头像上传/下载,不在远端创建默认开发 seed 账号。最后完成 上线检查清单。
常见问题
- 登录/退出、OTP 与 OAuth 回调使用实际 HTTPS 域名验证。
- 头像 PUT/GET 经同源
/files/avatars/*进入 R2;检查会话、用户前缀与绑定。 - 支付使用沙盒,确认真实签名 Webhook 更新合约与权益。
D1 binding DB is required/R2 binding R2_BUCKET is required:检查绑定,而不是添加DATABASE_URL或 S3 密钥。- D1 不支持包中的交互式
transaction();多语句写入需走支持的batch(),见 数据库配置。