Cloudflare + Supabase 部署

TariffsChart 在 Cloudflare Workers 和 Supabase Postgres 上运行的生产配置说明。

TariffsChart 现在以 Cloudflare Workers + OpenNext 作为主要部署路径,以 Supabase Postgres 作为生产数据库。

这篇文档是部署和运维 checklist。它不改变产品责任边界:TariffsChart 仍然是关税假设、来源证据和复核流程工具,不是报关行,也不提供 guaranteed landed cost。

本轮更新了什么

代码库现在包含:

  • 用于 Cloudflare Workers 的 wrangler.jsonc
  • 用于 OpenNext Cloudflare adapter 的 open-next.config.ts
  • 自定义 Worker 入口 cloudflare-worker.ts,普通请求交给 OpenNext handler,计划任务通过 scheduled() 触发来源监控;
  • package.json 中的 cf:buildcf:previewcf:deploycf:typegen 脚本;
  • 面向 Supabase 的 PostgreSQL 配置样例:.env.example.dev.vars.example
  • Postgres client 针对 Cloudflare/serverless 禁用 prepared statements,并避免跨请求复用 singleton 连接;
  • 可选的 Cloudflare Hyperdrive 支持,绑定名为 HYPERDRIVE

推荐数据库路径

生产环境建议:

  1. 保持 DATABASE_PROVIDER=postgresql
  2. 使用 Supabase Postgres。
  3. 流量起来后,优先配置 Cloudflare Hyperdrive,绑定名为 HYPERDRIVE
  4. 如果暂时没有配置 Hyperdrive,DATABASE_URL 使用 Supabase Transaction Pooler 连接串,并保持 prepare: false

Supabase pooler 示例:

DATABASE_URL=postgresql://postgres.PROJECT_REF:PASSWORD@aws-0-REGION.pooler.supabase.com:6543/postgres?sslmode=require

当存在 env.HYPERDRIVE.connectionString 时,应用会优先使用 Hyperdrive;否则回退到 DATABASE_URL

Cloudflare secrets

不要把真实密钥写进 wrangler.jsonc。用 Wrangler 设置:

pnpm wrangler secret put DATABASE_URL
pnpm wrangler secret put AUTH_SECRET
pnpm wrangler secret put TARIFF_MONITOR_CRON_SECRET
pnpm wrangler secret put RESEND_API_KEY

自助付费正式开放前,支付相关 secret 可以继续留空:

pnpm wrangler secret put STRIPE_SECRET_KEY
pnpm wrangler secret put STRIPE_WEBHOOK_SECRET
pnpm wrangler secret put CREEM_API_KEY
pnpm wrangler secret put CREEM_WEBHOOK_SECRET

本地预览

复制 .dev.vars.example

cp .dev.vars.example .dev.vars

然后运行:

corepack enable
pnpm install
pnpm cf:preview

数据库迁移

上线前先对 Supabase 运行 migration:

pnpm db:generate
pnpm supabase:migrate

如果还处于私有 beta,也可以临时 push schema:

pnpm supabase:push

正式有真实用户后,建议使用 migrations 管理生产数据库。

部署

pnpm cf:build
pnpm cf:deploy

pnpm cf:deploy 使用了 --keep-vars,避免部署时覆盖 Cloudflare dashboard 或 Wrangler 中已经设置的 secrets。

来源监控计划任务

wrangler.jsonc 已配置每日一次的 cron trigger:

"triggers": {
  "crons": ["0 10 * * *"]
}

自定义 Worker 的 scheduled() handler 会调用:

POST /api/tariff/source-monitors/run

正式依赖计划任务前,请设置其中一个 secret:

TARIFF_MONITOR_CRON_SECRET=replace-with-random-secret
# optional fallback
CRON_SECRET=replace-with-random-secret

即使还没有开启定时检查,Pro beta 和 Team pilot 用户仍然可以在 /workspace/alerts 中手动执行检查。

Hyperdrive,可选但推荐

创建一个指向 Supabase Direct connection 的 Hyperdrive 配置,然后在 wrangler.jsonc 中加入:

"hyperdrive": [
  {
    "binding": "HYPERDRIVE",
    "id": "<cloudflare-hyperdrive-id>"
  }
]

绑定存在时,TariffsChart 会自动优先使用 Hyperdrive connection string。

上线 checklist

生产上线前:

  • 运行 pnpm install,让 pnpm-lock.yaml 包含 @opennextjs/cloudflare
  • 本地或 CI 运行 pnpm lintpnpm build
  • pnpm cf:preview 在 staging Worker 上验证;
  • 对 Supabase 运行 migrations;
  • 确认 auth callback URL 使用 https://tariffschart.com
  • 设置 Cloudflare secrets;
  • 在 Cloudflare logs 中确认计划任务正常触发;
  • 在 billing、webhook、降级、退款和正式法律复核完成前,继续关闭公开自助付费入口。