Strapi v5 部署 Railway 实战:绕开 file-type 和 pg 缺失」

23 阅读4分钟

Strapi v5 部署 Railway 实战:绕开 file-typepg 缺失

Railway 是一个高性能的 PaaS 平台,但 Strapi CMS(尤其是 v5 版本)在部署到 Railway 时,需要特别注意以下事项。这份指南基于实战经验总结,旨在帮助你一次性部署成功。


一、平台前置条件(国内用户必读与重要变更)

在使用 Railway 之前,你必须解决平台本身对国内用户的限制以及最新的服务变化:

1. 账户注册与付费模式 (重要变更!)

  • 注册方式:必须通过 GitHub 账户 进行 OAuth 登录。

  • 手机验证:需要完成手机号验证(国内手机号可接收验证码)。

  • 付费模式(硬性要求)

    • 已取消 $5 免费额度。Railway 现已是纯付费服务。
    • 💳 绑定国际信用卡/借记卡:这是硬性要求,否则无法部署。你需要一张支持国际支付的 Visa 或 Mastercard。

🎁 注册福利与推广链接 (新用户可获得 $20 额度)

Railway 提供了推广福利。以下是使用链接注册和自行注册的对比:

  • 自行注册(不使用链接):

    • 新用户无法获得任何部署额度 ($0)。
  • 通过下方链接注册(强烈推荐):

    • 新用户福利: 在首次付费后,可以额外获得 $20 美元 的部署额度。
    • 🤝 支持作者: 你支持了本文作者,作者可获得你首笔账单 15% 的现金收益。

点击此处注册 Railway 获得 $20 额度

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。

实施细节:

  1. package.json 中添加 overrides 字段:

    JSON

    "overrides": {
      "file-type": "16.5.4"
    }
    
  2. 完成后必须在本地运行 npm install 更新 package-lock.json,然后一起提交。

2. 数据库驱动缺失 (pg 包)

错误现象:

部署失败,日志显示 Cannot find module 'pg' 或 AggregateError。

解决方案:

Railway 提供 PostgreSQL,你的项目必须安装对应的驱动包 pg。

实施细节:

  1. 在本地终端运行安装命令:npm install pg --save
  2. 提交 package.jsonpackage-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 成功启动并完成了数据库表结构的初始化,即使后续移除一些非必要的环境变量,应用也能稳定运行。因此,关键在于 首次成功连接