Multi-Tenant SaaS Boilerplate 评测:7 款实测,诚实打分

7 款多租户 SaaS Boilerplate 实测 30 天,评测行级隔离、子域名路由和租户中间件,附代码和诚实评分。

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

本文由 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技术栈隔离模式子域名路由开箱多租户价格
1TanStack ShipTanStack Start + Workers + D1行级 + 子域名是(内置)是$149
2ShipFastNext.js + Vercel + Postgres无(单租户)否否(需手动改造)$199
3MakerkitNext.js + SupabaseRLS(Supabase)部分(需手动配置)部分(仅 RLS)$279
4Wasp Open-SaaSWasp DSL + Prisma行级(需自行连接)否否(需自行接线)免费
5Next-ForgeNext.js monorepo + PostgresSchema 级租户隔离部分(有示例代码)部分$399
6SupastarterNext.js + SupabaseRLS(Supabase)部分(需手动配置)部分(仅 RLS)$229
7TurbostarterNext.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/)解析,作为环境状态流经请求:

typescript
// 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 文档。

带类型化包装器的行级范围限定

每个查询都按租户限定范围,类型系统使未限定的查询成为编译错误:

typescript
// 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 作为第二层安全网:

sql
-- 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 Ship5行级隔离 + 类型化包装器 + RLS 迁移路径
Makerkit4Supabase RLS,打磨充分;包装器未由类型系统强制
Supastarter4Supabase RLS,打磨充分;与 Makerkit 边界相同
Next-Forge4Schema 级租户隔离示例代码;需手动设置
Wasp Open-SaaS3可实现行级隔离;需自行连接包装器
Turbostarter3可实现行级隔离;需自行连接包装器
ShipFast1单租户;需改造

维度二:子域名路由、边缘、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 Ship555454.80
Makerkit432433.30
Supastarter432433.25
Next-Forge442333.20
Wasp Open-SaaS322332.70
Turbostarter322332.65
ShipFast122432.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 生产指南。