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:build、cf:preview、cf:deploy、cf:typegen脚本;- 面向 Supabase 的 PostgreSQL 配置样例:
.env.example和.dev.vars.example; - Postgres client 针对 Cloudflare/serverless 禁用 prepared statements,并避免跨请求复用 singleton 连接;
- 可选的 Cloudflare Hyperdrive 支持,绑定名为
HYPERDRIVE。
推荐数据库路径
生产环境建议:
- 保持
DATABASE_PROVIDER=postgresql。 - 使用 Supabase Postgres。
- 流量起来后,优先配置 Cloudflare Hyperdrive,绑定名为
HYPERDRIVE。 - 如果暂时没有配置 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 lint和pnpm build; - 用
pnpm cf:preview在 staging Worker 上验证; - 对 Supabase 运行 migrations;
- 确认 auth callback URL 使用
https://tariffschart.com; - 设置 Cloudflare secrets;
- 在 Cloudflare logs 中确认计划任务正常触发;
- 在 billing、webhook、降级、退款和正式法律复核完成前,继续关闭公开自助付费入口。