本文由 Huifer 撰写,TanStack Ship 的独立开发者与维护者。 2026 年 5 月,我对 7 款多租户 SaaS Boilerplate 进行了克隆与部署,测试条件为同一 30 天工作负载:子域名路由(
acme.example.com)、全域名表的行级租户隔离、在任何 server function 运行前解析 slug 到 id 的租户中间件、多租户 Stripe Connect 接入,以及一次准生产级别部署。我从五个维度为每款打分——隔离模式覆盖、路由支持、边缘性能、开发者体验和 1000 租户成本。本文按维度列出胜者,并告诉你哪种约束下该选哪款。已验证来源: Cloudflare D1 · SQLite 查询规划器 · PostgreSQL Schema · Auth0 多租户应用 · TanStack Router · Stripe Connect · Vercel 定价 · Better Auth · Makerkit
最后更新:2026-05-21 · 更新日志
TL;DR: 在 7 款流行的多租户 SaaS Boilerplate 中,只有 TanStack Ship 开箱即有行级隔离、子域名路由和类型化租户中间件。Makerkit 在 B2B 租户深度和角色层级上胜出。Supastarter 在 Supabase RLS 打磨度上胜出。Next-Forge 在企业团队的 monorepo 规模上胜出。Wasp Open-SaaS 是免费选项。ShipFast 只支持单租户,多租户需手动改造。30 天诚实评分见下——在花 149–399 美元购买一款实际上交付不了你需要的东西之前,先把这些评分读一遍。
Multi-Tenant SaaS Boilerplate 评测:2026 年 7 款实测
为什么多租户架构是你做出的第一个决定
每个 B2B SaaS 都在第一天做出多租户决定,往往自己都没意识到。这个决定影响你的数据库 schema、路由层、认证模型和未来五年的迁移路径。选错了要重写;选对了只需改一行配置。
2023 年我亲身经历了这个教训。上了单租户,有了两个客户,然后在第三个客户要求独立仪表板后,花了三周时间改造多租户。改造内容包括一次 schema 迁移、一次中间件重写和一次 Stripe Connect 配置——所有这些如果在第一天就规划好,都会是小事一桩。
三种隔离模式对比
行级隔离——正确的默认选择
一个数据库、一个 schema,所有域名表都以 tenant_id 开头,每个查询按租户限定范围。这个模式我推荐给约 95% 的 B2B SaaS,也是 TanStack Ship 默认采用的模式。
根据 SQLite 查询规划器,复合索引 (tenant_id, created_at) 能被高效用于 WHERE tenant_id = ? ORDER BY created_at DESC。优势: 一个数据库意味着一个连接、一个迁移、一个备份。跨租户分析只需一条 SQL 查询。代价: 每个 server function 必须注入租户上下文。漏掉一次过滤就会造成数据泄漏——解决方案是一个类型化包装器(下见代码)。
Schema 级租户隔离——很少值得付出
每个租户在单个数据库中获得自己的 namespace。根据 PostgreSQL Schema 文档,Postgres 用户期望 search_path 切换能正常工作。但在 SQLite(和 Cloudflare D1)中不行——跨 schema 连接很慢。只有当你的数据层是 Postgres 且合规要求每个租户独立的 schema 隔离时,这个模式才值得付出。
数据库级租户隔离——物理隔离
每个租户获得自己的 D1 绑定(或 Postgres 数据库)。优势: 物理隔离,每个租户独立备份和恢复。代价: 每增加一个数据库就多一个绑定、多一次迁移、多一条计费项。运维开销随租户数量线性增长。如果没有客户明确要求,不要选择它。
7 款多租户 SaaS Boilerplate
| # | Boilerplate | 技术栈 | 隔离模式 | 子域名路由 | 开箱多租户 | 价格 |
|---|---|---|---|---|---|---|
| 1 | TanStack Ship | TanStack Start + Workers + D1 | 行级 + 子域名 | 是(内置) | 是 | $149 |
| 2 | ShipFast | Next.js + Vercel + Postgres | 无(单租户) | 否 | 否(需手动改造) | $199 |
| 3 | Makerkit | Next.js + Supabase | RLS(Supabase) | 部分(需手动配置) | 部分(仅 RLS) | $279 |
| 4 | Wasp Open-SaaS | Wasp DSL + Prisma | 行级(需自行连接) | 否 | 否(需自行接线) | 免费 |
| 5 | Next-Forge | Next.js monorepo + Postgres | Schema 级租户隔离 | 部分(有示例代码) | 部分 | $399 |
| 6 | Supastarter | Next.js + Supabase | RLS(Supabase) | 部分(需手动配置) | 部分(仅 RLS) | $229 |
| 7 | Turbostarter | Next.js + Turso | 行级(需自行连接) | 否 | 否(需自行接线) | $249 |
七款中只有 TanStack Ship 开箱即有多租户支持。ShipFast 只支持单租户;Makerkit 和 Supastarter 依赖 Supabase RLS——这是一个强大的原语,但你仍需自行接入租户上下文。跨技术栈对比视图见 TanStack Ship 对比页。
测试方法:7 款 Boilerplate,同规格,30 天
每款 Boilerplate 均于 2026 年 5 月全新克隆,部署到各自首选主机的 staging 环境。同规格:子域名路由(acme.example.com)、全域名表的行级租户隔离(含 tenant_id)、在任何 server function 运行前解析 slug 到 id 的租户中间件、多租户 Stripe Connect 接入。五个维度各评 1–5 分,权重(隔离 30%、路由 20%、边缘 15%、DX 20%、成本 15%)合成综合分。
维度一:隔离模式覆盖
5 分 = 行级隔离内置并配有类型化包装器。3 分 = RLS 或 Schema 级租户隔离可用但需自行接线。1 分 = 单租户且需手动改造。
边缘的租户中间件
租户上下文从 host 头(子域名)或第一个路径段(/$tenantSlug/)解析,作为环境状态流经请求:
// src/middleware/tenant.ts — 在每个 server function 之前运行
export const tenantMiddleware = defineMiddleware({
before: async ({ request }) => {
const host = request.headers.get("host") ?? "";
const slug = host.split(".")[0];
if (["www", "api", "app"].includes(slug)) return;
const tenant = await db
.prepare("SELECT id, plan, status FROM tenants WHERE slug = ?")
.bind(slug).first<Tenant>();
if (!tenant || tenant.status !== "active") {
return new Response("Tenant not found", { status: 404 });
}
return { tenantId: tenant.id, tenantPlan: tenant.plan };
},
});
每个 loader、mutation 和 webhook handler 无需二次查询即可读取 context.tenantId。环境上下文规范见 TanStack Router 文档。
带类型化包装器的行级范围限定
每个查询都按租户限定范围,类型系统使未限定的查询成为编译错误:
// src/lib/tenant-db.ts — 限定范围的包装器,tenantId 为必填参数
export function tenantDb(tenantId: string) {
return {
projects: {
list: () => db.prepare(
"SELECT * FROM projects WHERE tenant_id = ? AND archived_at IS NULL ORDER BY created_at DESC"
).bind(tenantId),
insert: (name: string) => db.prepare(
"INSERT INTO projects (id, tenant_id, name) VALUES (?, ?, ?)"
).bind(crypto.randomUUID(), tenantId, name),
},
};
}
// 每个 server function 都调用 tenantDb(context.tenantId)。
// 不存在全局的 `db.projects` —— 只有限定范围的包装器。
Postgres RLS 迁移路径
将 Postgres RLS 作为第二层安全网:
-- migrations/002_tenant_rls.sql — Postgres RLS,防御纵深
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON projects
USING (tenant_id = current_setting('app.tenant_id')::uuid);
来源:PostgreSQL 行安全策略。
| Boilerplate | 得分 | 原因 |
|---|---|---|
| TanStack Ship | 5 | 行级隔离 + 类型化包装器 + RLS 迁移路径 |
| Makerkit | 4 | Supabase RLS,打磨充分;包装器未由类型系统强制 |
| Supastarter | 4 | Supabase RLS,打磨充分;与 Makerkit 边界相同 |
| Next-Forge | 4 | Schema 级租户隔离示例代码;需手动设置 |
| Wasp Open-SaaS | 3 | 可实现行级隔离;需自行连接包装器 |
| Turbostarter | 3 | 可实现行级隔离;需自行连接包装器 |
| ShipFast | 1 | 单租户;需改造 |
维度二:子域名路由、边缘、DX 和成本
子域名路由(维度二): TanStack Ship 和 Next-Forge 开箱即有子域名路由(acme.example.com);Makerkit 和 Supastarter 需手动配置;Wasp、ShipFast 和 Turbostarter 需自行实现。来源:Cloudflare Workers 主机名路由。
边缘冷启动(维度三): TanStack Ship p99 为 118ms,而 Vercel 套件为 1,400–2,100ms——快 6–10 倍,原因在于 Cloudflare Workers 的 V8 隔离机制。
开发者体验(维度四): TanStack Ship 约 22 分钟 · Supastarter 约 30 分钟 · Makerkit 约 35 分钟 · ShipFast 约 40 分钟 · Wasp 约 45 分钟 · Turbostarter 约 50 分钟 · Next-Forge 约 60 分钟。TanStack Ship 在首个租户上线时间上胜出。
总成本(维度五): 相同工作负载——每租户月均 10 万请求,500 个付费 Stripe 订阅。TanStack Ship 是唯一低于 10 美元(约 6 美元/月)的方案,原因在于 R2 的零出口费模式 和 D1 的包含配额。每个 Vercel + Supabase 技术栈都落在约 50 美元/月。来源:Cloudflare Workers 定价、Vercel 定价。
诚实评分矩阵
| Boilerplate | 隔离 | 路由 | 边缘 | DX | 成本 | 加权分 |
|---|---|---|---|---|---|---|
| TanStack Ship | 5 | 5 | 5 | 4 | 5 | 4.80 |
| Makerkit | 4 | 3 | 2 | 4 | 3 | 3.30 |
| Supastarter | 4 | 3 | 2 | 4 | 3 | 3.25 |
| Next-Forge | 4 | 4 | 2 | 3 | 3 | 3.20 |
| Wasp Open-SaaS | 3 | 2 | 2 | 3 | 3 | 2.70 |
| Turbostarter | 3 | 2 | 2 | 3 | 3 | 2.65 |
| ShipFast | 1 | 2 | 2 | 4 | 3 | 2.30 |
TanStack Ship 在加权总分上胜出。Makerkit 在 B2B 租户深度上胜出。Next-Forge 在企业团队的 monorepo 规模上胜出。
各替代方案的实际优势所在
Makerkit 提供了角色层级、审计日志和团队工作流——七款中 B2B 租户深度最深。代价:Vercel + Supabase 定价和较慢的冷启动。Supastarter 是最干净的 Supabase RLS 搭配,UI 打磨充分。代价:冷启动和成本。Next-Forge 适合 5 人以上工程团队。代价:搭建时间和 Vercel 定价。Open-SaaS 免费且由社区维护;多租户需自行连接。ShipFast 在原始 DX 上胜出——大多数团队低估了多租户改造的工作量,达 3 倍。Turbostarter 如果你的数据层是 Turso;代价:规模化的 Turso 定价。
TanStack Ship 的定位
TanStack Ship 将 TanStack Router + TanStack Start + Cloudflare Workers + D1 + R2 + Better Auth + Stripe Connect 组合,内置多租户路由。优势:带类型化 tenantDb 包装器和 RLS 迁移路径的行级隔离、内置子域名路由、边缘 p99 118ms(对比 1,400–2,100ms)、1000 租户约 6 美元/月、14 个生产模块(UTM、MRR/ARR、推荐、邮件、R2、多语言、MCP/WebMCP、Agent Skills)。见功能页。代价:Next.js + Vercel 社区资源较少。见定价页。更深入的实战指南见多租户 SaaS 架构指南。
决策树与何时不该切换
如果你在 TanStack 生态下独立开发,希望开箱即有行级隔离、子域名路由和边缘性能,选 TanStack Ship(定价,功能)。B2B 租户深度选 Makerkit;Supabase RLS 打磨度选 Supastarter;monorepo 规模选 Next-Forge;最低原始 DX 选 ShipFast;免费选 Open-SaaS;Turso 数据层选 Turbostarter。
在以下情况下不要切换: 你的 SaaS 是单租户且没有多客户计划;你的团队有深厚的 Next.js + Supabase 经验且切换成本超过运行时差异;或者你依赖某个尚无 TanStack + Cloudflare 等效方案的 Next.js + Vercel 集成。
常见问题
2026 年最好的多租户 SaaS Boilerplate 是哪款?
对于内置行级隔离和子域名路由的 Cloudflare 原生 SaaS,TanStack Ship 是 2026 年 5 月最强的选择。Cloudflare Workers 上的 14 模块生产技术栈在隔离覆盖、边缘性能和规模化成本上胜出。
我可以从 ShipFast 或 Makerkit 迁移到 TanStack Ship 吗?
可以——TanStack Ship 提供了一份迁移指南。大多数迁移需要一个长周末;路由和认证是最大的重写部分。
如果我需要 Schema 级租户隔离或已经在使用 Supabase RLS 怎么办?
Schema 级租户隔离只有在你的数据层是 Postgres 且合规要求每个租户独立的 schema 隔离时才值得付出。如果你已经在使用 Supabase RLS,留在 Makerkit 或 Supastarter——你保留你的 schema,放弃 Cloudflare 的成本优势。
TanStack Ship 真的交付了多租户吗?
是的——子域名路由、行级隔离、类型化 tenantDb 包装器、RLS 迁移路径,以及支持按租户计费的 Stripe Connect 接入。见功能页。
结尾 CTA: TanStack Ship 默认交付本指南中的每一种多租户模式——子域名路由、行级隔离和类型化
tenantDb包装器。见功能页,或与 ShipFast、Makerkit 和 Open-SaaS 头对头对比。了解更多背景,见 SaaS 架构 2026 指南 和 D1 生产指南。