00 / 00
部署指南
选择 Cloudflare、Zeabur 或 Docker,并正确迁移 D1、配置密钥和验证上线结果。
01MVP 的 Web 可以运行在 Cloudflare Workers 或 Node/Docker,主数据库统一使用 Cloudflare D1。

怎么选择
| 方式 | 数据库 | 适合场景 |
|---|---|---|
| Cloudflare Workers | Worker 通过 DB binding 直连 D1 | 海外用户为主、希望减少服务器运维 |
| Zeabur Docker | Node 通过受保护的 D1 binding 代理访问同一个 D1 | 暂时保留现有 Zeabur 运行时或需要 Node 容器 |
| 自有 Docker | 默认同 Zeabur;国内部署时可实现普通 SQLite 适配器 | 自有服务器、K8s、备案或网络可控要求 |
当前 01mvp.com 运行在 Zeabur,cf.01mvp.com 运行在 Cloudflare。它们不是两套产品,也不维护两份数据。
为什么是 D1 / SQLite
当前数据量、访问量和写入并发不需要 PostgreSQL 的高并发写入、扩展和专属事务能力。D1 能减少独立数据库服务与连接池运维,也为以后把站点完全收敛到 Cloudflare 留出直接路径。
国内自托管不等于继续使用 D1。应用保持 SQLite 语义,因此可以换成普通 SQLite,配合持久卷、备份和单写节点运行。只有真实需求已经超过这个边界时,再评估 PostgreSQL。
部署顺序
- 完成代码检查和构建。
- 审查已经生成并提交的 SQLite migration。
- 运行
vpr @01mvp/product#db:deploy,先把 migration 应用到远端 D1。 - 部署 Cloudflare Worker;如果 Node 需要访问 D1,先确认代理端点和 token 已配置。
- 部署 Zeabur/Docker。
- 检查两个域名的
/api/health、公开页、登录和关键业务流程。
不要让应用启动过程自动修改生产 schema,也不要把 D1 代理 token、支付密钥、认证 secret 写进镜像或仓库。
生产环境变量
通用必需项:
BETTER_AUTH_SECRET=<long-random-secret>
VITE_WEB_URL=https://example.com
VITE_SERVER_URL=https://example.com
AUTH_COOKIE_PREFIX=exampleNode/Docker 额外需要:
D1_PROXY_URL=https://<cloudflare-domain>/_internal/d1
D1_PROXY_TOKEN=<server-only-random-token>Cloudflare Worker 使用 DB D1 binding,并把同一个 D1_PROXY_TOKEN 配成 Worker secret。这个代理只给受信任的服务端使用,不能暴露到浏览器。
上线检查
vpr @01mvp/product#lint
vpr @01mvp/product#type-check
vpr @01mvp/product#test
vpr @01mvp/product#build然后按部署目标阅读 Cloudflare Workers、Zeabur 或 Docker。
这篇文档有问题?