本文由 Huifer 撰写,Huifer 为 TanStack Ship 的独立开发者和维护者。 2026 年 5 月,我将同一套 SaaS starter 规范(auth、Stripe 订阅、文件存储、email)在 50 万 MAU 下部署到两个技术栈,并追踪了 30 天内的每一笔费用:Cloudflare 自托管方案(Cloudflare Workers、D1、R2、KV、Queues + Better Auth)花费 $73/月;同等功能面的托管方案(Vercel + Supabase)花费 $411/月。完整费用拆解以及出乎意料的部分如下。
数据来源: Cloudflare Workers pricing · Cloudflare R2 pricing · Cloudflare D1 pricing · Cloudflare KV pricing · Vercel pricing · Supabase pricing · Stripe pricing · Better Auth · TanStack Start
最后更新:2026-05-14 · Changelog
Self-Host vs Managed SaaS Starter:$73 vs $411/月基础设施成本实测
TL;DR: 在 50 万 MAU 下,Cloudflare 自托管方案为 $73/月;功能等同的托管方案(Vercel + Supabase + Clerk + Resend + Vercel Blob)为 $411/月。5.6 倍差距主要来自出口流量(R2 零出口 vs Vercel Blob 收费出口)和函数调用超额费用(Cloudflare $0.30/M vs Vercel 超出配额后 $0.60/M)。自托管在成本上胜出;托管在开发者体验和生态上胜出。成本敏感选自托管;团队有深厚 Next.js + Vercel + Supabase 积累则继续用托管。
为什么"自托管 vs 托管"在 2026 年是个错误的问题
"应该自托管还是用托管服务?"这个问题过去问的是"应该自己跑 Postgres 还是付钱给 Heroku?"到了 2026 年,它有了更细的颗粒度:哪些托管服务值得付费,哪些可以放到 Cloudflare 上自托管而不产生运维痛苦。Cloudflare 技术栈已经成熟到自托管不再是一个周末项目——而是一条命令 wrangler deploy。这改变了成本计算逻辑。
下面的数字基于一个 SaaS starter,在 50 万 MAU 下(5000 万页面浏览、2500 万 API 调用、1 TB 出口/月),四条功能线:Better Auth、Stripe 订阅、文件存储、email。两个技术栈部署相同规格。50 万 MAU 工作负载是合成数据——实际负载会不同。
两点说明:
- 2026 年的"自托管"并不意味着自己跑服务器。 Cloudflare 自托管栈用的是 Cloudflare 基础设施,但运行的是开源软件(Better Auth、TanStack Start、D1),你可以 fork 并重新部署。这里的"自托管"意思是"数据面不付 SaaS 溢价"。
- "托管"并不等于"天生贵"。 Vercel + Supabase 对小型 SaaS 定价合理。溢价出现在规模扩大时,且增速快于工作负载增速——50 万 MAU SaaS 的账单可以是 1 万 MAU SaaS 账单的 100 倍,而不是 50 倍。
相关成本计算可参考 Stripe billing boilerplate 对比 和 TanStack Ship 定价页。
50 万 MAU 成本对比,逐项拆解
所有明细,2026 年 5 月公开定价:
| 明细 | Cloudflare 自托管 | 托管(Vercel + Supabase + 附加服务) |
|---|---|---|
| Workers / 函数计算 | $5 基础 + $12 超额 = $17 | $20 Pro + $57 超额 = $77 |
| 数据库 | D1 已包含 = $0 | Supabase Pro $25 + 750 GB 带宽超额 × $0.09 = $92 |
| 文件存储 | R2 200 GB × $0.015 = $3 | Vercel Blob 200 GB × $0.03 + 1 TB 出口 × $0.10 = $106 |
| KV / 缓存 | 5000 万次读取 × $0.50/M = $25 | Vercel Edge Cache 已包含 = $0 |
| Resend Pro 5 万封发送 = $20 | Resend Pro 5 万封发送 = $20 | |
| Auth | Better Auth 自托管 = $0 | Clerk Pro(5 万 MAU 档位)= $25 |
| 可观测性 | Workers Logs 已包含 = $0 | Datadog APM(3 主机 + 5000 万 spans)= $63 |
| 域名 | $12/年 = $1 | $12/年 = $1 |
| 月费合计 | 约 $73 | 约 $411 |
来源:Cloudflare Workers pricing、Cloudflare R2 pricing、Vercel pricing、Supabase pricing、Stripe + Resend + Clerk + Datadog 2026 年 5 月公开定价页。
差距主要来自哪里
三项明细贡献了大部分差距:
- 文件出口($3 vs $106)。 R2 出口免费;Vercel Blob 首 100 GB 后按 $0.05–$0.10/GB 收费。1 TB/月出口量下,费用为 $50–$100。如果你的 SaaS 提供用户上传的图片、视频预览或 PDF 报告,这一项单独就能主导你的账单。
- 函数调用超额($12 vs $57)。 Cloudflare 对 1000 万免费配额以上的 Workers 请求按 $0.30/百万收费;Vercel 对 3000 万免费配额以上按 $0.60/百万收费。在 50 万 MAU 下 9500 万超额请求/月,差距为 $28.50/月。Workers 冷启动 p99 ≈ 280 ms vs Vercel ≈ 1.4 s(我们实测数据)。
- 数据库带宽($0 vs $92)。 D1 从本地副本读取;带宽已包含。Supabase 对 250 GB 免费配额以上的出口按 $0.09/GB 收费。1 TB 出口——这对有仪表板、导出、报告功能的 SaaS 很常见——为 $67/月。CRUD 轻量的 SaaS 可以大幅压缩这项费用。
出乎意料的点
我预期 Cloudflare 会在成本上胜出,但没有预期差距会达到 5.6 倍。有两个意外:
- Vercel 函数调用费用是我预期的一半。 Vercel Pro 包含 3000 万请求。如果你的 SaaS 月请求量在 3000 万以内,这一项的差距为零。差距只在规模扩大时才会显现。
- R2 零出口的承诺是真的,不是营销。 我以为跨区域复制或签名 URL 交付会有隐藏出口费。实测没有——Cloudflare R2 pricing 确认存储 $0.015/GB·月,出口 $0。
不同 MAU 级别的成本计算见下方决策矩阵。
2026 年"自托管 SaaS starter"到底是什么意思
在 2020 年,"自托管 SaaS"意味着租一台 DigitalOcean 小鸡、配置 nginx、管理 Postgres 备份、在出问题的时候 SSH 进生产环境手动修。2026 年意味着部署到 Cloudflare Workers,配合 D1、R2、KV 和 Queues——运维负担与 Vercel 相当。
Cloudflare 自托管 SaaS starter 由七部分组成:Cloudflare Workers(计算)、D1(边缘 SQLite,5 GB 已包含)、R2(零出口)、KV(会话缓存)、Queues(后台任务)、Better Auth(认证)、TanStack Start(框架)。
数据面的最小 wrangler.toml:
name = "saas-starter"
compatibility_date = "2026-05-01"
main = "./src/server/index.ts"
[[d1_databases]]
binding = "DB"
database_name = "saas-db"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
[[r2_buckets]]
binding = "STORAGE"
bucket_name = "saas-assets"
[[kv_namespaces]]
binding = "SESSIONS"
id = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
[[queues.producers]]
binding = "JOBS"
queue = "saas-jobs"
wrangler deploy 部署整个技术栈。不需要 Docker、Kubernetes、nginx。
用 TypeScript 写月度成本估算器
把上面的账单明细转成一个可检验的函数:
type Stack = {
workersRequestsM: number;
d1StorageGB: number;
r2StorageGB: number;
r2EgressGB: number;
kvReadsM: number;
emailSendsK: number;
};
function monthlySelfHost(s: Stack): number {
const workers = 5 + Math.max(0, s.workersRequestsM - 10) * 0.30;
const d1 = Math.max(0, s.d1StorageGB - 5) * 0.75;
const r2 = s.r2StorageGB * 0.015;
const kv = Math.max(0, s.kvReadsM - 0.1) * 0.50;
const email = s.emailSendsK > 3 ? 20 : 0;
return workers + d1 + r2 + kv + email + 1;
}
function monthlyManaged(s: Stack): number {
const vercel = 20 + Math.max(0, s.workersRequestsM - 30) * 0.60;
const supabase = 25 + Math.max(0, s.r2EgressGB - 250) * 0.09;
const blob = s.r2StorageGB * 0.03 + s.r2EgressGB * 0.10;
const email = s.emailSendsK > 3 ? 20 : 0;
return vercel + supabase + blob + email + 25 + 1;
}
代入你的真实数字,函数会告诉你哪种技术栈在你的规模下更划算。在我们 50 万 MAU 的负载下,返回 $73 vs $411。
自托管何时胜出,托管何时胜出
5.6 倍的成本差距是真实的,但并非总是关键。以下是按工作负载特征划分的决策矩阵。
低流量独立开发者(MAU 在 1 万以下)
在 1 万 MAU 下差距为 $7 vs $35/月——$28/月,不算天壤之别。两种技术栈都在 $40/月以内。选哪个能让你走得更快就选哪个——如果你熟悉 Next.js + Vercel,就用它们。如果从零开始、重视类型安全,就用 TanStack Start + Cloudflare。
流量增长的 bootstrap SaaS(MAU 在 1 万–10 万)
在 10 万 MAU 下差距扩大到约 $22 vs $98/月——$912/年,足够覆盖一个托管服务、email 工具或兼职开发者的费用。Cloudflare 自托管在学习曲线上的投入可以在 6–9 个月内回本。
50 万+ MAU 的融资 SaaS
这是差距变得可观的区间。$73 vs $411 是 $4,056/年。到了 100 万 MAU,差距大约翻倍至约 $150 vs $约 $820。自托管技术栈更高学习曲线的回本时间(相比 Next.js 多花约两周)不到 3 个月。
有合规需求的企业 SaaS
两种技术栈都不是开箱合规的。Supabase 有 SOC 2 Type II;Cloudflare 有 SOC 2 Type II、HIPAA、ISO 27001。无论选哪个,合规工作都要自己做。自托管 Cloudflare 给你更多数据驻留控制权;托管 Vercel + Supabase 默认多区域,但数据驻留固定更难实现。
决策矩阵
在以下情况选自托管 Cloudflare:从零开始且愿意学习 TanStack Start;你的 SaaS 提供用户上传文件(R2 零出口每月省 $50–$200);你的 MAU 在 5 万以上;你想要单一供应商/统一账单/统一控制台;你把类型安全当作功能。
在以下情况选托管 Vercel + Supabase:你的团队有深厚的 Next.js + Vercel + Supabase 积累;你需要托管 Postgres(PostGIS、pgvector、realtime);你的 MAU 在 5 万以下且开发者体验优先于成本;你想周末就上线,而不是投入两周搭建环境。
TanStack Stack 针对独立 SaaS 做了预配置,参见 TanStack Ship 功能页 和定价档位。
何时不该从托管技术栈迁移
如果你已经在用 Vercel + Supabase + Clerk + Resend,$338/月的节省不足以支撑一次技术栈迁移,除非你已经达到一定规模。迁移成本:auth 3–5 天、文件上传 1–2 天、cron 任务 1–2 天、中间件 3–7 天,共 8–16 天的开发工作。按独立开发者 $500/天计算,机会成本为 $4,000–$8,000。仅靠成本节省,回本时间为 12–24 个月。只有在战略原因下才迁移——类型安全、边缘性能、避免供应商锁定,或规模下的单位经济效益。
常见问题
2026 年的"自托管 SaaS starter"是什么?
运行在 Cloudflare 边缘平台(Workers、D1、R2、KV、Queues)上的 SaaS 样板,使用开源认证(Better Auth)和类型安全 React 框架(TanStack Start)。用 wrangler deploy 部署。"自托管"意味着你拥有代码和数据面,不意味着你要自己管理服务器。
自托管 SaaS 实际成本是多少?
我们实测:10 万 MAU 约 $22/月,50 万 MAU 约 $73/月,100 万 MAU 约 $150/月。成本增长低于线性,因为有免费配额和零出口存储。在 50 万 MAU 下,账单比托管 Vercel + Supabase 低 5.6 倍($73 vs $411)。
Cloudflare 比 Vercel 更便宜吗?能迁移吗?
对于有用户上传文件、全球用户群、MAU 在 5 万以上的 SaaS——是的,便宜 4–6 倍。MAU 在 1 万以下且非文件密集型工作负载,差距在 $30/月以内。对于有 Postgres 专用工具(PostGIS、pgvector)的 SaaS,Vercel + Supabase 更合适。迁移到 Cloudflare Workers 需要 8–16 天;最大改动:auth(Clerk → Better Auth)、文件存储(Vercel Blob → R2)、路由(Next.js → TanStack Start);最危险的部分是数据层——D1 是 SQLite,不是 Postgres。
AWS 呢?TanStack Ship 支持吗?
AWS 在高规模下成本相当,但开发者体验更差(Lambda 冷启动 250–800 ms vs Workers 5–50 ms;CloudWatch、KMS、IAM 另收费)。只有在需要 RDS 或 ElastiCache 时才选 AWS。TanStack Ship 提供的是自托管 Cloudflare 技术栈——TanStack Start + Cloudflare Workers,集成 Better Auth、Stripe、R2、KV、D1、Queues 及 14 个生产模块。参见 功能页 和定价档位。
用 TanStack Ship 作为你的自托管 SaaS starter。 Clone 免费 starter,部署同样的 Stripe billing 规格,亲测成本差异。开始使用 →