← 返回日志

最佳实践:Strapi + Vercel 的正确姿势.

简而言之: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.comRailway.appZeabur。这些平台支持常驻运行,且支持对接持久化磁盘空间(Persistent Disk)。

2. 生产数据库配置(存内容)

千万不要图省事在服务器里直接用本地 SQLite 文件。推荐去搞一个云端托管的 PostgreSQL 数据库,目前有非常多对开发者极度友好的全免费/低成本选择:

  • SupabaseNeon:提供开箱即用的 Serverless PostgreSQL 托管,免费额度巨大,和 Strapi 配合极佳。

3. 前端消费(放 Vercel)

当你把 Strapi 和数据库在外部平台配置好后,你会得到一个 API 接口(如: https://api.yourdomain.com)。接着,你就可以在 Vercel 上愉快地部署 Next.js、Astro 或者你的任何前端框架,通过环境变量去请求这个 Strapi 接口获取内容,享受 Vercel 的全球边缘加速。

💡 一句话总结: 想玩免数据库的纯静态,出门右转选 KeystaticSveltia;想玩强大的功能级 Headless 动态大厂生态,选 Strapi,但必须乖乖去外面配一个 PostgreSQL 数据库。

对于具体的配置流程,How to Deploy Strapi on Vercel 详细演示了如何通过搭配外部 PostgreSQL 数据库(如 Supabase 或 Railway)以及编写适当的 vercel.json 配置文件,绕过环境限制将前端连接至后端服务的方法。

相关文章 / 延续阅读 →