Strapi v5 部署 Railway 实战:绕开 file-type 和 pg 缺失
Railway 是一个高性能的 PaaS 平台,但 Strapi CMS(尤其是 v5 版本)在部署到 Railway 时,需要特别注意以下事项。这份指南基于实战经验总结,旨在帮助你一次性部署成功。
一、平台前置条件(国内用户必读与重要变更)
在使用 Railway 之前,你必须解决平台本身对国内用户的限制以及最新的服务变化:
1. 账户注册与付费模式 (重要变更!)
-
注册方式:必须通过 GitHub 账户 进行 OAuth 登录。
-
手机验证:需要完成手机号验证(国内手机号可接收验证码)。
-
付费模式(硬性要求) :
- ❌ 已取消 $5 免费额度。Railway 现已是纯付费服务。
- 💳 绑定国际信用卡/借记卡:这是硬性要求,否则无法部署。你需要一张支持国际支付的 Visa 或 Mastercard。
🎁 注册福利与推广链接 (新用户可获得 $20 额度)
Railway 提供了推广福利。以下是使用链接注册和自行注册的对比:
-
自行注册(不使用链接):
- ❌ 新用户无法获得任何部署额度 ($0)。
-
通过下方链接注册(强烈推荐):
- ✅ 新用户福利: 在首次付费后,可以额外获得 $20 美元 的部署额度。
- 🤝 支持作者: 你支持了本文作者,作者可获得你首笔账单 15% 的现金收益。
2. 网络与部署环境要求
-
稳定且可靠的代理/VPN
- 关键影响:部署过程中,网络波动极易导致超时或失败。
- 建议:强烈建议在部署时使用高质量的代理网络环境。
-
域名配置
- 注意:Strapi Admin 面板需要知道其运行的公开 URL。
- 建议:在 Railway 环境变量中设置
PUBLIC_URL为你的自定义域名或 Railway 提供的公开 URL。
二、代码必须修复(两大核心兼容性问题)
0. 项目创建与初始化
首先,在本地终端创建你的 Strapi 项目:
Bash
npx create-strapi-app@latest my-project --quickstart
注:
--quickstart默认使用 SQLite 数据库,请务必阅读下一节“数据库持久化”的警告。
1. 修复 CommonJS/ESM 兼容性 (file-type 错误)
错误现象:
部署启动时出现 No "exports" main defined in ... file-type/package.json(Strapi v5 常见)。
解决方案:
必须使用 npm overrides 字段,强制使用最后一个支持 CommonJS 的版本:16.5.4。
实施细节:
-
在
package.json中添加overrides字段:JSON
"overrides": { "file-type": "16.5.4" } -
完成后必须在本地运行
npm install更新package-lock.json,然后一起提交。
2. 数据库驱动缺失 (pg 包)
错误现象:
部署失败,日志显示 Cannot find module 'pg' 或 AggregateError。
解决方案:
Railway 提供 PostgreSQL,你的项目必须安装对应的驱动包 pg。
实施细节:
- 在本地终端运行安装命令:
npm install pg --save - 提交
package.json和package-lock.json。
三、部署优化与数据库注意事项
此部分旨在强调平台部署的正确姿势,避免数据丢失和不必要的配置。
1. 数据库持久化(PostgreSQL 必须)
- 致命陷阱:绝对不要在 Railway 上使用默认的 SQLite 数据库。Railway 的文件系统是暂时的 (ephemeral) ,每次部署或容器重启,SQLite 的数据都会丢失。
- 最佳实践: 通过 Railway 的插件功能添加一个 PostgreSQL 数据库,并将其与 Strapi 服务连接。
2. 环境变量配置解析与极简原则
Strapi 数据库配置文件依赖一系列环境变量来配置连接。在 Railway 环境下,你无需手动设置大部分参数。
Strapi 期待的数据库连接环境变量(PostgreSQL 部分):
DATABASE_URL:这是 核心变量。Railway 会自动注入完整的连接字符串。Strapi 会优先使用它,因此你无需手动配置主机、端口等。DATABASE_CLIENT:无需设置。Strapi 会根据DATABASE_URL的协议自动识别为postgres。DATABASE_HOST等:无需设置。它们的值已包含在自动注入的DATABASE_URL中。DATABASE_SSL:关键排查点。控制是否开启 SSL 连接。在出现AggregateError时,通常需要设置为true进行测试。
极简原则: 你的目标是确保 DATABASE_URL 存在即可。只有在完成代码修复后仍然出现 AggregateError,才应尝试在 Railway 环境变量中添加 DATABASE_SSL: true 进行测试。
3. 解决 AggregateError 的核心原则
AggregateError 通常是由于 连接失败或初始化失败 导致的。在完成 “修复一” 和 “修复二” 后,项目理论上已经具备了所有正确的代码和依赖。
- 实战经验:一旦 Strapi 成功启动并完成了数据库表结构的初始化,即使后续移除一些非必要的环境变量,应用也能稳定运行。因此,关键在于 首次成功连接。