Self-Host vs Managed SaaS Starter 基础设施成本实测:$73 vs $411/月

4 种 self-host vs managed SaaS starter 方案在 50 万 MAU 下的实测:$73/月 Cloudflare 自托管 vs $411/月 Vercel + Supabase。数学、代码、取舍。

Huifer
Huifer
May 14, 202611 min read
其他语言:Deutsch · English

本文由 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 工作负载是合成数据——实际负载会不同。

两点说明:

  1. 2026 年的"自托管"并不意味着自己跑服务器。 Cloudflare 自托管栈用的是 Cloudflare 基础设施,但运行的是开源软件(Better Auth、TanStack Start、D1),你可以 fork 并重新部署。这里的"自托管"意思是"数据面不付 SaaS 溢价"。
  2. "托管"并不等于"天生贵"。 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 已包含 = $0Supabase Pro $25 + 750 GB 带宽超额 × $0.09 = $92
文件存储R2 200 GB × $0.015 = $3Vercel Blob 200 GB × $0.03 + 1 TB 出口 × $0.10 = $106
KV / 缓存5000 万次读取 × $0.50/M = $25Vercel Edge Cache 已包含 = $0
EmailResend Pro 5 万封发送 = $20Resend Pro 5 万封发送 = $20
AuthBetter Auth 自托管 = $0Clerk Pro(5 万 MAU 档位)= $25
可观测性Workers Logs 已包含 = $0Datadog 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 月公开定价页。

差距主要来自哪里

三项明细贡献了大部分差距:

  1. 文件出口($3 vs $106)。 R2 出口免费;Vercel Blob 首 100 GB 后按 $0.05–$0.10/GB 收费。1 TB/月出口量下,费用为 $50–$100。如果你的 SaaS 提供用户上传的图片、视频预览或 PDF 报告,这一项单独就能主导你的账单。
  2. 函数调用超额($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(我们实测数据)。
  3. 数据库带宽($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:

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 写月度成本估算器

把上面的账单明细转成一个可检验的函数:

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 规格,亲测成本差异。开始使用 →