部署到 Cloudflare Workers:D1 或 Postgres + Hyperdrive
把 ShipAny(TanStack Start)SaaS 跑在 Cloudflare Workers 上——零运维用 D1,已有数据库就通过 Hyperdrive 连接 Postgres。包含部署步骤、验证方法,以及迁移 shipany.ai 时踩过的坑。
最后更新: 2026年10月8日
shipany.ai 本身就运行在 Cloudflare Workers 上:一个 ShipAny TanStack 应用,通过 Hyperdrive 连接已有的 Postgres 数据库。本文介绍两种支持的方案、部署方法,以及那次迁移中踩过的坑。
两种数据库方案
| D1 | Postgres + Hyperdrive | |
|---|---|---|
| 适合 | 新项目,零外部基础设施 | 已有 Postgres(RDS、Neon、Supabase、自建),或需要 Postgres 特性 |
| 绑定 | d1_databases → DB | hyperdrive → HYPERDRIVE |
| 表结构 | wrangler d1 migrations apply --remote | pnpm db:migrate 直连 Postgres(不经过 Hyperdrive) |
| 打包 | 不打包 Postgres 驱动 | 保留 Postgres 驱动 |
数据库由 wrangler.jsonc 中的 vars.DATABASE_PROVIDER(d1 或 postgresql)决定,构建时据此决定把哪个驱动打进 Worker。
部署
模板自带 deploy-cloudflare Agent 技能,可以自动完成以下全部步骤。手动部署的话:
- 创建数据库绑定——
npx wrangler d1 create <name>;用 Postgres 则执行npx wrangler hyperdrive create <name> --connection-string="postgres://…"。 - 填写
wrangler.jsonc——Worker 名称、显式的compatibility_date、nodejs_compat、vars(DATABASE_PROVIDER、VITE_APP_URL、VITE_APP_NAME),以及第 1 步的绑定。 - 设置密钥——
npx wrangler secret put AUTH_SECRET(加密配置时再加CONFIG_ENCRYPTION_KEY)。 - 把构建期公开变量写进
.env.production——VITE_APP_URL会在构建时写入代码包。 - 部署——
pnpm run cf:deploy会先加载.env.production,用cloudflare_module预设构建,再执行wrangler deploy。
零停机迁移已有域名
如果你的网站已经通过 Cloudflare DNS 运行在别处,完全不用改 DNS。为 example.com/* 添加一条 Worker 路由,Worker 会在请求到达原服务器之前接管流量。回滚时删除这条路由,几秒内流量就回到原服务器。验证完支付和登录之前,保留原来的部署。
踩过的坑
Can't set compatibility date in the future——构建时会填入本机日期。在比 UTC 快的时区,这个日期对 Cloudflare 来说可能是「明天」。请显式设置compatibility_date。- 用 Hyperdrive 时后台配置悄悄丢失——Hyperdrive 模式下没有
DATABASE_URL,旧版配置读取逻辑会把它当成「没有数据库」,返回空配置。页面照常渲染,但支付和 OAuth 都失效了(提示「No payment provider configured」)。请确认配置读取逻辑能识别HYPERDRIVE绑定。 - 交易类应用要关闭 Hyperdrive 查询缓存——默认会缓存读查询最多 60 秒,订单状态、积分余额、后台配置都可能看起来是旧的。Hyperdrive 的加速来自连接池而不是缓存:
npx wrangler hyperdrive update <id> --caching-disabled=true。 - 复用生产数据库时不要执行迁移。 如果表是由其他系统创建的,Drizzle 的迁移记录是空的,
db:migrate会尝试从头建表。 AUTH_SECRET要和之前的部署保持一致,否则所有用户都会退出登录。
每次部署后都要验证
状态码 200 不代表一切正常。请检查:
- 首页引用的
/assets/*文件和新构建一致(确认流量真的到了 Worker)。 /api/config/public返回你配置的开关(stripe_enabled、google_auth_enabled等),并且和之前的部署完全一致。- 数据库连接来自 Cloudflare 的 IP 段(Hyperdrive),
npx wrangler tail没有异常。 - 登录和每个支付渠道的一笔真实付款都能走通。
