部署与运维
服务器跑在 Cloudflare,前端托管在 Cloudflare Pages。部署模型高度一致——本地开发和线上部署差别最小。
Git Push to GitHub ↓GitHub Action (可选) ├── Server: bun run deploy:server → Workers └── Client: Git Connection → Pages (自动)自动部署(推荐)
Section titled “自动部署(推荐)”Cloudflare Pages 从 GitHub 仓库自动拉取部署:
1. 进入 GitHub → Settings → Integrations → Cloudflare2. 选择 repo3. Cloudflare Pages 自动识别 build script4. 环境变量配置 VITE_API_URL# Servercd server && bun run cf-deploy
# Clientcd client && bun run build && bun run pages-deploySecret 管理
Section titled “Secret 管理”在 server/wrangler.jsonc 中定义 Binding。
然后通过 CLI 设置 secrets:
# BETTER_AUTH_SECRETbunx wrangler secret put BETTER_AUTH_SECRET
# R2 Bucketbunx wrangler r2 bucket create mark
# D1 Databasebunx wrangler d1 create app-databasebunx wrangler d1 migrations apply DB --remoteKV 也是通过 CLI 管理:
# KV namespace (多环境)bunx wrangler kv namespace create ACCOUNT_MANAGER_ENVIRONMENTS# 输入 jsonbunx wrangler kv key put environments --path config.jsonServer
Section titled “Server”{ "vars": { "ALLOWED_ORIGINS": "https://your-app.pages.dev", "BETTER_AUTH_URL": "https://server.yourname.workers.dev/api/auth" }, "d1_databases": [...], "r2_buckets": [...], "kv_namespaces": [...]}Client
Section titled “Client”VITE_API_URL=https://server.your-app.workers.devVITE_APP_TITLE=Mark AdminD1 数据库
Section titled “D1 数据库”# 生成迁移脚本cd packages/db && bun run db:generate
# 应用到本地 D1 (wrangler dev)bun run db:migrate
# 应用到远程 D1 (production)bun run db:migrate:prod# 远程bunx wrangler d1 execute DB --remote --command "DROP TABLE IF EXISTS user"
# 本地bunx wrangler d1 execute DB --local --command "DROP TABLE IF EXISTS user"R2 文件存储
Section titled “R2 文件存储”# 查看 Bucketbunx wrangler r2 object list --name mark
# 下载文件bunx wrangler r2 object get --name mark/file.png
# 删除文件bunx wrangler r2 object delete --name mark/file.png上传在应用代码内完成(路由 /uploads)。
Worker 日志
Section titled “Worker 日志”查看实时日志:
bunx wrangler tail生产监控:
- Workers Dashboard → Analytics → Requests
- 通过
/metrics端点暴露自定义指标 (todo) - Cloudflare Logpush 整合
单次部署大概流程
Section titled “单次部署大概流程”# 1. 安装依赖bun install
# 2. 构建所有 workspacebun run build
# 3. 部署 Servercd serverbun run cf-deploy
# 4. 更新 Server URL 变量cd clientbun run build && bunx wrangler pages install dist# Server (Workers)Cloudflare Dashboard → Worker → Settings → Domains → Add Route
api.mycompany.com/*
# Client (Pages)Cloudflare Pages → Project → Custom Domains → Add
admin.mycompany.comDNS 自动归因到 Cloudflare,TLS 证书自动颁发。
| 指标 | 来源 | 报警阈 |
|---|---|---|
| Worker Errors | Cloudflare Dashboard | 5xx > 5% |
| API Latency | Workers | p95 > 200ms |
| D1 Read Count | D1 Dashboard | — |
| R2 Storage | R2 Dashboard | 900GB/1TB |
# 查看实时 Worker 日志bunx wrangler tail
# 查看昨日下载统计bunx wrangler d1 execute DB --remote --command "SELECT COUNT(*), date(created_at) FROM user GROUP BY date ORDER BY date DESC"
# 查看 R2 Bucketbunx wrangler r2 object list --benchmark
# 查看部署记录bunx wrangler deployments list文档: /auth/login 页面正常路由: /api/auth/sign-in 有做connections: workers 错误页 → check BETTER_AUTH_SECRET matchCORS 错误
Section titled “CORS 错误”方案: 确保:1. ALLOWED_ORIGINS 包含 Pages 域名2. Client 的 VITE_API_URL 匹配 Workers URL步骤:1. 检查 DB 已经用 script 创建2. 检查 email 中的 migration 命令3. bun run db:migrate:prod 执行迁移R2 Upload 失败
Section titled “R2 Upload 失败”检查:1. R2 Bucket 已创建并配置2. 文件大小 < 100MB page limits3. 外部请求中 ABV_ATTACHMENT 显示 error| 服务 | 使用量 | 月成本 |
|---|---|---|
| Workers | 50K 请求 | $0.00 |
| Worker Duration | 5-20ms avg | $0.00 |
| D1 | 10K read /月 | $0.00 |
| R2 | 5MB store | $0.00) |
| Pages | 5K visits | $0.00/月 |
| KV | 50K reads | $0.00/月 |
| 总计 | $0.00/月 |
个人使用在 Cloudflare Free Tier 充足。
面试高频问题
Section titled “面试高频问题”Q: 成本和性能如何平衡?
A: Mark 使用 Cloudflare Free Tier——零成本。如果 DAU 超过 1000,升级到 Cloudflare Pro ($20/月) 将 Warm Worker 运行时间从 10ms 升至 50ms。但即使张J中,依然为零成本。
Q: 如何处理 Deployment 失败?
A: (1) Cloudflare Pages 在部署失败后保留以前的成功部署——回滚只需 Dashboard 上“Rollback to this deployment”;(2) Worker 也有部署历史,可以回溯;(3) 数据库迁移不能自动回滚——需要手动运行 bun wrangler drop。
Q: D1 容量超额怎么办?
A: D1 的 5GB limit 是行方向数据 5 GB “最大”——没错 “最大”意味着不能插入更多数据。清理策略:清理 token_stats、tokens_usage_log、user_logs。
Q: 如何使用 GitHub Actions 自动化?
A: 参考 DEPLOYMENT.md 中的 GitHub Actions 集成方法——设置 CLOUDFLARE_API_TOKEN secret + wrangler-action marketplace。