部署到 Cloudflare
建正式库、上传一次密钥、发布到自定义域名。
正式环境的 Worker 名、域名和 D1 ID 在 scripts/production-target.ts。wrangler.jsonc 只给本地用。
第一次发布
npm install -g cf
cf auth login
npx wrangler login # cf 和 wrangler 登录不通用
cf d1 create --name 你的库名 # 把返回的 uuid 填进 production-target.ts
npm run db:migrate:production
上传密钥,只需一次:
cp .env.production.example .env.production # 填好;已被 Git 忽略
npx wrangler secret bulk .env.production --name 你的Worker名 # Worker 还不存在时会问是否先建空 Worker,选 y
NUXT_AUTH_SECRET 新生成:node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"。也可以在 Cloudflare 后台 Worker → Settings → Variables and Secrets 里逐个填。
npm run deploy:production:check # 预演,看绑定是否是正式库和正式域名
npm run deploy:production
之后的发布
npm run db:migrate:production # 有新迁移时
npm run deploy:production
普通发布不带密钥,已上传的会保留(Cloudflare 说明)。只改了代码才需要发布;新增变量时代码和变量都要上线,先后不限。
改线上变量
本地 .env 不会同步到线上,线上的值单独改,改完立即生效,不用重新发布。
npx wrangler secret put 变量名 --name 你的Worker名 # 改一个
npx wrangler secret bulk .env.production --name 你的Worker名 # 改多个
npx wrangler secret delete 变量名 --name 你的Worker名 # 删除
npx wrangler secret list --name 你的Worker名 # 查看名字
secret bulk 只改文件里出现的变量,其它不动。文件里留空的 KEY= 会把线上值改成空字符串,不改的变量整行删掉。
例:关掉 Google One Tap,secret put NUXT_GOOGLE_ONE_TAP,填 false。
检查
curl https://你的域名/api/health
curl https://你的域名/api/auth-providers
Google 客户端要登记 https://你的域名/api/auth/callback/google。
原理
nuxt build 生成 .output/server/wrangler.json,wrangler 发布读的是它。这份配置不能分环境,所以 scripts/use-production-config.ts 在构建后把 Worker 名、域名、D1 和线上地址改成正式值。
/docs 预渲染成静态 HTML,Markdown 不会上线。静态资源请求免费、不计入 Worker 调用(Cloudflare 说明,2026-10-20)。