Contentful 与 DatoCMS 的替代方案

一个面板,N 个项目,不随流量增长的账单

API 优先的多租户无头 CMS。读取路径从不经过 API —— 访客越多,上涨的是缓存命中率,而不是您的账单。

您的数据存放在我们自己运维的服务器上没有按用量计费的第三方服务企业版可部署到您自己的服务器

用数字看读取路径

每次读取的数据库查询
0
每个页面的 HTTP 请求
2
容错搜索响应时间
<50 ms
可单独关闭的模块
7+

每个组件都在我们自己的基础设施上

PostgreSQL
Valkey
Typesense
Garage · 兼容 S3
nginx 边缘缓存
NestJS
Drizzle
Next.js

功能

内容基础设施,不再是负担

一切都在 API 之后;没有任何功能被锁在面板里。

多租户与 RLS

每个项目都是独立的空间。隔离发生在数据库层,而不是应用层:即使应用层出错,PostgreSQL 行级安全也不会让一个租户的数据泄露到另一个租户。

模型引擎与字段角色

内容类型不写死在代码里;您可以在面板或通过 API 定义。字段带有 titleslugbody 等角色 —— 构建流水线和 SEO 生成看的是角色,而不是字段名。

模块化架构

媒体、搜索、Webhook、SEO、GraphQL、导入、分析 —— 每一项都独立且可关闭。关闭不会删除数据;重新启用后,模块会从中断处继续。

从边缘提供读取

已发布的内容在构建时写入不可变地址,并由 nginx 边缘缓存提供。无论内容条数还是访客数量,都不会抬高一次读取的成本。

媒体库

兼容 S3 的对象存储(Garage)、跨三个区域复制的图片以及自动生成的衍生图。您上传的文件留在我们自己的基础设施上,绝不会进入按用量计费的 CDN。

容错搜索

基于 Typesense 的多语言全文搜索。即使访客把「Istanbul」拼成「Istanul」,也能找到正确的内容;响应在 50 毫秒以内返回。

Webhook

发布、更新、删除 —— 每个事件都会通知到您的系统。投递保存在持久队列中,并以指数退避方式重试;即使进程崩溃,事件也不会丢失。

GraphQL

模型无需手写,而是由空间的内容类型推导而来。新增一个类型,它立即可被查询。深度和长度限制是强制的,用于防御查询炸弹。

类型安全的 SDK

@corpusctl/client 附带 React、Vue 和 Next.js 适配器。区块渲染器不带任何默认样式 —— 我们不强加一行 CSS,设计完全由您决定。

代码示例

面板里可以,一行命令也可以

面板中能做的每件事都有对应的 API;没有任何功能被锁在界面里。

publish.sh
# 1) 定义内容类型 —— 模型不写死在代码里
curl -X PUT "$API/v1/content-types/post" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT" \
  -H "content-type: application/json" \
  -d '{
    "name": "post",
    "title": "Post",
    "fields": [
      { "name": "title", "type": "text",   "role": "title", "required": true },
      { "name": "slug",  "type": "slug",   "role": "slug",  "required": true },
      { "name": "body",  "type": "blocks", "role": "body" }
    ]
  }'

# 2) 创建草稿
curl -X POST "$API/v1/documents" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT" \
  -d '{ "type": "post", "data": { "title": "Hello", "slug": "hello" } }'

# 3) 发布 —— 校验、构建与推送到边缘,一次调用完成
curl -X POST "$API/v1/documents/$ID/publish" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT"

# → { "data": { "version": 3, "contentHash": "…", "durationMs": 42 } }

读取路径不触碰数据库

  • 内容寻址缓存。 地址就是内容的哈希。因为它不会变,所以可以无限期缓存 —— 「数据过期」不再是问题。
  • 流量增长,成本不增长。 读取请求从不经过 API,也就没有可计费的调用;账单不会随访客一起上涨。
  • 写入与读取分属不同的类。 ReadClient 不携带密钥令牌,可在浏览器中运行;ManagementClient 仅限服务端。如果合并成一个类,泄露令牌就只是一行代码的失误。

架构

写入路径与读取路径各自独立

点击发布会触发一次构建;访客读到的是那次构建的产物,而不是系统本身。

写入路径读取路径(快)面板 · ManagementClientAPI — NestJSPostgreSQLRLS · 分区发布构建流水线前端 · ReadClientnginx 边缘缓存命中 → 毫秒级响应未命中时源站 — nginx对象存储 — 兼容 S3<tenant>/c/<hash>.json · 不可变
两条路径只在对象存储处交汇。由于访客流量从不到达 API 和 PostgreSQL,写入侧的负载与读取侧完全无关。

不可变地址

内容以其哈希寻址。同一个地址永远不会返回不同的内容,因此可以缓存 30 天;发布时会刷新清单。

清单分片存放

读取哪个清单分片由客户端根据 slug 计算。即使空间里有一万条内容,也只下载一个很小的文件。

版本与定时

每条记录都有版本,旧版本可以恢复为草稿。可以安排未来时间发布;调度器会自行触发构建。

对比

我们哪里领先,哪里不领先

我们并非每一行都胜出。这张表存在的意义,是让您清楚看到自己选择了什么。

corpusctl 与 Contentful、DatoCMS 的对比 —— 基于 2026年8月 时的公开产品信息。
对比项corpusctlContentfulDatoCMS
计费模式固定套餐。读取请求不经过 API,因此没有可计量的调用。按 API 调用、记录数和用户数计费;超额另行收费。按 API 调用和流量计费。
多项目管理内建于核心。一个面板、无限空间;用户在每个空间中拥有各自的角色。每个项目是一个独立的「space」;多数套餐按 space 收费。每个项目是一个独立环境;按项目计套餐。
租户隔离在数据库层面 —— PostgreSQL 行级安全(RLS)。在应用层面;细节未公开。在应用层面;细节未公开。
数据存放位置我们自己运维的服务器;企业版可完全部署到您自己的服务器。厂商的云;高阶套餐可选区域。厂商的云;高阶套餐可选区域。
按用量计费的第三方服务没有。PostgreSQL、Valkey、Typesense、Garage、nginx —— 全部在我们自己的基础设施上。有;搜索、图片和 CDN 层按用量计费。有;图片 CDN 与图像处理按用量计费。
强加的渲染方式没有。区块渲染器不带任何默认样式;遇到未知区块会跳过,绝不崩溃。提供富文本渲染器;样式由您决定。提供结构化文本渲染器;样式由您决定。
关闭功能每项功能都是可关闭的模块;关闭不会删除数据,降级套餐同样不会。套餐限制会让功能不可用。套餐限制会让功能不可用。
全球边缘网络单区域边缘缓存。我们没有全球 PoP 网络。多区域全球 CDN。多区域全球 CDN。
应用市场没有。集成通过 Webhook 和 API 自行编写。广泛且成熟的应用生态。拥有插件生态。
企业级成熟度年轻的产品;SSO 与正式 SLA 在路线图上。SOC 2、SSO、SLA —— 成熟。高阶套餐提供 SSO 与 SLA。
如果您要以毫秒级延迟服务全球受众,并且需要一个现成的集成市场,诚实的回答是:今天的 Contentful 更成熟。但对于服务土耳其和欧洲、同时运营多个项目、又不希望访客数量牵动账单的团队来说,corpusctl 是有意为之的更优取舍。

常见问题

常见问题

如果没找到您要的答案,请写信到 [email protected]

今天就开通您的第一个空间

注册账号只需几分钟:一个邮箱、一个密码,再给空间取个名字就够了。我们不要银行卡。如果迁移需要帮助,写信给我们。