[{"data":1,"prerenderedAt":19},["ShallowReactive",2],{"doc-deploy":3},{"slug":4,"title":5,"description":6,"toc":7,"html":18},"deploy","部署到 Cloudflare","建正式库、上传一次密钥、发布到自定义域名。",[8,10,12,14,16],{"id":9,"text":9},"第一次发布",{"id":11,"text":11},"之后的发布",{"id":13,"text":13},"改线上变量",{"id":15,"text":15},"检查",{"id":17,"text":17},"原理","\u003Cp>正式环境的 Worker 名、域名和 D1 ID 在 \u003Ccode>scripts\u002Fproduction-target.ts\u003C\u002Fcode>。\u003Ccode>wrangler.jsonc\u003C\u002Fcode> 只给本地用。\u003C\u002Fp>\n\u003Ch2 id=\"第一次发布\">第一次发布\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-bash\">npm install -g cf\ncf auth login\nnpx wrangler login                  # cf 和 wrangler 登录不通用\ncf d1 create --name 你的库名         # 把返回的 uuid 填进 production-target.ts\nnpm run db:migrate:production\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>上传密钥，只需一次：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cp .env.production.example .env.production   # 填好；已被 Git 忽略\nnpx wrangler secret bulk .env.production --name 你的Worker名   # Worker 还不存在时会问是否先建空 Worker，选 y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>NUXT_AUTH_SECRET\u003C\u002Fcode> 新生成：\u003Ccode>node -e &quot;console.log(require(&#39;crypto&#39;).randomBytes(32).toString(&#39;base64url&#39;))&quot;\u003C\u002Fcode>。也可以在 Cloudflare 后台 Worker → Settings → Variables and Secrets 里逐个填。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">npm run deploy:production:check     # 预演，看绑定是否是正式库和正式域名\nnpm run deploy:production\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"之后的发布\">之后的发布\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-bash\">npm run db:migrate:production   # 有新迁移时\nnpm run deploy:production\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>普通发布不带密钥，已上传的会保留（\u003Ca href=\"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fconfiguration\u002Fsecrets\u002F\">Cloudflare 说明\u003C\u002Fa>）。只改了代码才需要发布；新增变量时代码和变量都要上线，先后不限。\u003C\u002Fp>\n\u003Ch2 id=\"改线上变量\">改线上变量\u003C\u002Fh2>\n\u003Cp>本地 \u003Ccode>.env\u003C\u002Fcode> 不会同步到线上，线上的值单独改，改完立即生效，不用重新发布。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">npx wrangler secret put 变量名 --name 你的Worker名              # 改一个\nnpx wrangler secret bulk .env.production --name 你的Worker名    # 改多个\nnpx wrangler secret delete 变量名 --name 你的Worker名           # 删除\nnpx wrangler secret list --name 你的Worker名                   # 查看名字\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>secret bulk\u003C\u002Fcode> 只改文件里出现的变量，其它不动。文件里留空的 \u003Ccode>KEY=\u003C\u002Fcode> 会把线上值改成空字符串，不改的变量整行删掉。\u003C\u002Fp>\n\u003Ch2 id=\"检查\">检查\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl https:\u002F\u002F你的域名\u002Fapi\u002Fhealth\ncurl https:\u002F\u002F你的域名\u002Fapi\u002Fauth-providers\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Google 客户端要登记的地址见 \u003Ca href=\"\u002Fdocs\u002Fgoogle-login\">Google 登录\u003C\u002Fa>。\u003C\u002Fp>\n\u003Ch2 id=\"原理\">原理\u003C\u002Fh2>\n\u003Cp>\u003Ccode>nuxt build\u003C\u002Fcode> 生成 \u003Ccode>.output\u002Fserver\u002Fwrangler.json\u003C\u002Fcode>，wrangler 发布读的是它。这份配置不能分环境，所以 \u003Ccode>scripts\u002Fuse-production-config.ts\u003C\u002Fcode> 在构建后把 Worker 名、域名、D1 和线上地址改成正式值。\u003C\u002Fp>\n\u003Cp>\u003Ccode>\u002Fdocs\u003C\u002Fcode> 预渲染成静态 HTML，Markdown 不会上线。静态资源请求免费、不计入 Worker 调用（\u003Ca href=\"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fstatic-assets\u002Fbilling-and-limitations\u002F\">Cloudflare 说明\u003C\u002Fa>，2026-10-20）。\u003C\u002Fp>\n",1792485320586]