← 返回文章列表

从零开始在 Railway 上部署 Strapi 并连接 PostgreSQL

Slug: deploy-strapi-railway-postgresql-zh-cn

从零开始在 Railway 上部署 Strapi 并连接 PostgreSQL

这篇文章完整记录如何从本地创建 Strapi 项目,推送到 GitHub,再部署到 Railway,并连接 Railway PostgreSQL 数据库。

这个流程适合用 Strapi 作为 Next.js 网站、技术博客、AI 导航站、内容网站的 CMS 后台。

最终架构

最终架构如下:


前台网站:

aiseocode.com



Strapi CMS 后台:

cms.aiseocode.com 或 Railway 临时域名



后端部署平台:

Railway



数据库:

Railway PostgreSQL



代码仓库:

GitHub

如果你用 Next.js 做内容站,推荐架构是:


Next.js 前台 → Vercel

Strapi CMS → Railway

数据库 → Railway PostgreSQL

图片存储 → Cloudflare R2、S3 或 Cloudinary

第一步:检查 Node.js 和 npm

先在本地终端检查版本:


node -v

npm -v

git --version

Strapi 5 对 Node.js 版本有要求。如果你的 Node.js 版本太新,比如 Node 25,可能会导致 Strapi 创建失败或启动失败。

推荐使用 Node.js 22 LTS。

如果你使用 nvm,可以这样安装并切换:


nvm install 22

nvm use 22

nvm alias default 22

然后确认版本:


node -v

npm -v

你应该看到类似:


v22.x.x

第二步:本地创建 Strapi 项目

创建项目:


npx create-strapi-app@latest aiseocode-cms

创建过程中建议这样选择:


Login or sign up: Skip

Default database sqlite: Yes

Example structure and data: No

TypeScript: Yes

Install dependencies with npm: Yes

Initialize a git repository: Yes

本地开发阶段先使用 SQLite。后面部署到 Railway 时,再切换到 PostgreSQL。

进入项目目录:


cd aiseocode-cms

启动本地 Strapi:


npm run develop

打开本地后台:


http://localhost:1337/admin

然后创建第一个本地管理员账号。

第三步:推送项目到 GitHub

确认本地 Strapi 能正常运行后,提交代码:


git add .

git commit -m "init aiseocode strapi cms"

git branch -M main

去 GitHub 创建一个仓库,例如:


aiseocode-cms

如果本地已经有项目,不要在 GitHub 上勾选 README、.gitignore 或 License。

然后绑定远程仓库:


git remote add origin https://github.com/your-username/aiseocode-cms.git

git push -u origin main

第四步:安装 PostgreSQL 驱动

Railway 生产环境要使用 PostgreSQL,所以本地项目要先安装 pg


npm install pg

提交并推送:


git add .

git commit -m "add postgres driver"

git push

第五步:配置 Strapi 数据库

打开数据库配置文件:


nano config/database.ts

把内容替换成:


import path from 'path';



export default ({ env }) => {

  const client = env('DATABASE_CLIENT', 'sqlite');



  const connections = {

    postgres: {

      connection: {

        connectionString: env('DATABASE_URL'),

        host: env('DATABASE_HOST'),

        port: env.int('DATABASE_PORT'),

        database: env('DATABASE_NAME'),

        user: env('DATABASE_USERNAME'),

        password: env('DATABASE_PASSWORD'),

        ssl: env.bool('DATABASE_SSL', false)

          ? {

              rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', false),

            }

          : false,

      },

      pool: {

        min: env.int('DATABASE_POOL_MIN', 2),

        max: env.int('DATABASE_POOL_MAX', 10),

      },

    },



    sqlite: {

      connection: {

        filename: path.join(

          __dirname,

          '..',

          '..',

          env('DATABASE_FILENAME', '.tmp/data.db')

        ),

      },

      useNullAsDefault: true,

    },

  };



  return {

    connection: {

      client,

      ...connections[client],

      acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),

    },

  };

};

这份配置实现:


本地开发:SQLite

Railway 生产环境:PostgreSQL

保存后,本地测试:


npm run develop

如果可以正常启动,按下面组合键停止服务:


Control + C

然后提交:


git add .

git commit -m "configure database for railway postgres"

git push

第六步:在 Railway 部署 Strapi

进入 Railway 创建新项目。

选择:


New Project

→ GitHub Repository

→ 选择你的 Strapi 仓库

→ Deploy

Railway 会从 GitHub 拉取项目并开始构建。

刚开始服务可能会崩溃,这是正常的,因为还没有配置环境变量和 PostgreSQL。

第七步:添加 PostgreSQL 数据库

在同一个 Railway 项目中点击:


+ Add

→ Database

→ PostgreSQL

添加后,项目里应该有两个服务:


aiseocode-cms

Postgres

第八步:添加环境变量

进入 Strapi 服务:


aiseocode-cms

→ Variables

添加这些变量:


NODE_ENV=production

HOST=0.0.0.0

PORT=1337



DATABASE_CLIENT=postgres

DATABASE_URL=${{Postgres.DATABASE_URL}}

DATABASE_HOST=${{Postgres.PGHOST}}

DATABASE_PORT=${{Postgres.PGPORT}}

DATABASE_NAME=${{Postgres.PGDATABASE}}

DATABASE_USERNAME=${{Postgres.PGUSER}}

DATABASE_PASSWORD=${{Postgres.PGPASSWORD}}

DATABASE_SSL=false

DATABASE_SSL_REJECT_UNAUTHORIZED=false

如果你的 PostgreSQL 服务名称不是 Postgres,要把变量里的 Postgres 改成实际服务名。

第九步:添加 Strapi 密钥

Strapi 生产环境必须配置安全密钥。

在本地终端生成随机密钥:


openssl rand -base64 32

多执行几次,然后在 Railway 里添加:


APP_KEYS=key1,key2,key3,key4

API_TOKEN_SALT=key5

ADMIN_JWT_SECRET=key6

TRANSFER_TOKEN_SALT=key7

JWT_SECRET=key8

ENCRYPTION_KEY=key9

注意:


APP_KEYS 要包含多个 key,用英文逗号分隔。

不要加引号。

不要保留 tobemodified 这种占位值。

第十步:应用变更并重新部署

添加变量后,Railway 可能会提示:


Apply changes

点击应用并重新部署。

等待服务状态变成:


Online

第十一步:打开 Strapi 后台

进入:


Settings

→ Networking

→ Generate Domain

生成 Railway 临时域名。

然后访问:


https://your-railway-domain.up.railway.app/admin

如果出现 Strapi 管理员注册页面,说明部署成功。

创建生产环境管理员账号。

注意:本地管理员账号和 Railway 管理员账号不共用,因为它们使用的是不同数据库。

第十二步:本地创建 Article 内容类型

Strapi 内容类型建议在本地开发环境创建,然后提交到 GitHub。

本地启动 Strapi:


cd /Users/your-name/aiseocode-cms

npm run develop

打开:


http://localhost:1337/admin

进入:


Content-Type Builder

→ Create new collection type

创建:


Display name: Article

如果需要双语内容,启用 Internationalization。

第十三步:添加 Article 字段

创建这 3 个字段:


title

slug

content

推荐设置:

| 字段 | 类型 | 必填 | 唯一 | 多语言 |

|---|---|---:|---:|---:|

| title | Text | 是 | 否 | 是 |

| slug | Text | 是 | 是 | 是 |

| content | Rich Text | 是 | 否 | 是 |

如果你希望手动填写 slug,就使用 Text 字段,不要用 UID 字段。

如果 slug 字段想限制格式,可以添加这个正则:


^[a-z0-9]+(?:-[a-z0-9]+)*$

它允许:


deploy-strapi-railway-postgresql

nextjs-strapi-blog

ai-seo-tools

不允许:


Best AI SEO Tools

中文标题

best_ai_seo_tools

best ai seo tools

第十四步:添加中文语言

在 Strapi 后台进入:


Settings

→ Internationalization

→ Locales

→ Add new locale

选择:


Chinese (Simplified, China) (zh-CN)

高级设置保持:


Set as default locale: false

推荐语言结构:


默认语言:English

中文语言:zh-CN

前台 URL 可以设计为:


英文:

https://aiseocode.com/article/deploy-strapi-railway-postgresql



中文:

https://aiseocode.com/zh-cn/article/deploy-strapi-railway-postgresql-zh-cn

第十五步:提交 Article 内容类型

本地保存内容类型后,停止 Strapi:


Control + C

然后提交:


git status

git add .

git commit -m "add article content type and zh-cn locale"

git push

Railway 会自动重新部署。

部署完成后,线上 Strapi 后台就会出现 Article 内容类型。

第十六步:创建测试文章

打开线上后台:


https://your-railway-domain.up.railway.app/admin

进入:


Content Manager

→ Article

→ Create new entry

创建英文测试文章:


title: Test Article

slug: test-article

content: This is a test article.

保存并发布。

第十七步:开启公开 API 权限

如果访问 API 出现权限错误,进入:


Settings

→ Users & Permissions Plugin

→ Roles

→ Public

给 Article 开启:


find

findOne

保存后测试:


https://your-railway-domain.up.railway.app/api/articles

如果返回 JSON,说明 Strapi 已经可以正常作为 CMS 使用。

第十八步:绑定正式域名

等 Railway 临时域名确认正常后,可以绑定:


cms.aiseocode.com

在 Railway 里进入:


Settings

→ Networking

→ Custom Domain

添加:


cms.aiseocode.com

然后去你的 DNS 服务商添加 Railway 提供的 CNAME 或 TXT 记录。

验证成功后,Strapi 后台地址就是:


https://cms.aiseocode.com/admin

常见错误与解决方法

错误一:Could not read package.json

说明你没有进入 Strapi 项目目录。

解决:


cd /Users/your-name/aiseocode-cms

npm run develop

错误二:Node.js 版本不支持

如果 Strapi 提示 Node.js 版本不支持,切换到 Node.js 22:


nvm install 22

nvm use 22

错误三:App keys are required

说明 Railway 没有配置 APP_KEYS

解决:


APP_KEYS=key1,key2,key3,key4

错误四:Application failed to respond

去 Railway 查看:


Deployments → Logs

常见原因有:


环境变量缺失

数据库连接失败

添加变量后没有 Apply changes

端口配置错误

最终结果

完成以上步骤后,你将拥有:


本地 Strapi 开发环境

GitHub 代码仓库

Railway Strapi 生产环境

Railway PostgreSQL 数据库

可访问的 Strapi 后台

Article 内容类型

英文和中文双语支持

可供 Next.js 前台调用的 CMS API

这套架构适合技术博客、AI SEO 网站、AI 编程资源站、AI 工具导航站和多语言内容平台。