简而言之:Strapi 绝对需要数据库,并且它不能直接部署在 Vercel 上。
如果你尝试把 Strapi 扔给 Vercel,会直接碰壁。这跟它的底层架构有本质关系:
1. 为什么 Strapi 必须配数据库?
Strapi 属于 API-driven / Database-backed CMS(依赖数据库的动态 CMS),这与前面提到的 Hugo 或 Keystatic 有着底层逻辑的区别:
- 数据不存文件: 无论是你定义的字段结构,还是写好的文章内容,Strapi 都是实时写入数据库表中的(不像 Hugo 存为本地
.md文件)。 - 默认的 SQLite 不能直接上生产: 虽说 Strapi 本地开发时会默认创建一个
.tmp/data.db的 SQLite 文件让你开箱即用,但 SQLite 是单文件嵌入式数据库。在生产环境中,高并发或多人同时在后台修改时极易锁死,且由于它高度依赖本地文件系统,无法在无状态的云平台中直接进行数据持久化同步。
2. 为什么不能部署在 Vercel 上?
Vercel 主要是为静态前端项目和无状态的 Serverless 函数设计的。而 Strapi 有两个致命特性与 Vercel 冲突:
- 常驻进程需求: Strapi 作为一个 Node.js 后端应用,它的管理后台、Webhooks 和定时任务需要服务器 24 小时不间断在线。Vercel 的 Serverless 函数在没有请求时会直接“休眠(冷启动)”。
- 文件存储只读: Vercel 在运行时的文件系统是只读的。你一旦在 Strapi 后台上传一张媒体图片,或者 SQLite 数据库试图写入新文章,Vercel 就会直接报错拒绝写入。
虽然 Strapi 后端不能放 Vercel,但在现代的前后端分离(Jamstack)架构里,大家依然非常喜欢将两者的优势结合:
+-----------------------------------+ +----------------------------+
| Vercel (前端托管) | | Supabase / Neon / AWS |
| Next.js / Astro / Vue Frontend | | (独立云端 PostgreSQL) |
+-----------------+-----------------+ +--------------+-------------+
| |
| API 请求 | 读取/写入数据
v v
+---------+-----------------------------------------+------------+
| Render / Railway / Fly.io / Strapi Cloud |
| (独立常驻服务器跑 Strapi 后端) |
+----------------------------------------------------------------+
1. 后端应用部署(跑 Strapi 进程)
你需要把 Strapi 部署到支持持久化 Node.js 进程的平台上,比如 Render.com、Railway.app 或 Zeabur。这些平台支持常驻运行,且支持对接持久化磁盘空间(Persistent Disk)。
2. 生产数据库配置(存内容)
千万不要图省事在服务器里直接用本地 SQLite 文件。推荐去搞一个云端托管的 PostgreSQL 数据库,目前有非常多对开发者极度友好的全免费/低成本选择:
- Supabase 或 Neon:提供开箱即用的 Serverless PostgreSQL 托管,免费额度巨大,和 Strapi 配合极佳。
3. 前端消费(放 Vercel)
当你把 Strapi 和数据库在外部平台配置好后,你会得到一个 API 接口(如: https://api.yourdomain.com)。接着,你就可以在 Vercel 上愉快地部署 Next.js、Astro 或者你的任何前端框架,通过环境变量去请求这个 Strapi 接口获取内容,享受 Vercel 的全球边缘加速。
💡 一句话总结: 想玩免数据库的纯静态,出门右转选 Keystatic 或 Sveltia;想玩强大的功能级 Headless 动态大厂生态,选 Strapi,但必须乖乖去外面配一个 PostgreSQL 数据库。
对于具体的配置流程,How to Deploy Strapi on Vercel 详细演示了如何通过搭配外部 PostgreSQL 数据库(如 Supabase 或 Railway)以及编写适当的 vercel.json 配置文件,绕过环境限制将前端连接至后端服务的方法。