Skip to content

配置 Railway 预览

账号

我们使用一个公共账号进行部署, 您可以向您的主管询问登录账号的方法.

Railway 介绍

项目

登录后您会看到如下界面:

首页

下面的每一个卡片都是一个项目, 如有需要, 您可以使用右上角的按钮创建新的项目.

环境和服务

进入项目后您会看到如下界面:

项目页

简单来说, 项目下会有环境, 例如development环境, production等.

在环境下, 则可以创建服务, 服务表示一个具体的程序.

我们的工作流

WARNING

在我们的工作流中:

  • 我们的一个项目对应railway的一个项目.
  • 每个项目都会有两个环境, developmentproduction, 其中前者对应dev分支, 后者对应main分支.
  • 我们只使用其docker服务.
  • 我们只用其部署前端和后端服务, 不使用其数据库, 也不在其上部署例如采集服务之类的非前端/后端服务.

使用

仓库配置

在项目根目录创建/deploy/development/deploy/production文件夹.

每个文件夹至少应该包含:

  • dockerfile 文件
  • railway.json 文件

其中dockerfile文件可自由编写, 能正常的使用即可.

对于railway.json文件, 需要做以下工作:

  • 描述构建方式: 我们总是使用dockerfile.
  • 描述dockerfile文件路径: 指定使用的dockerfile的文件的路径.
  • 描述观察文件: 当新提交修改了观察文件时, 会触发railway重新部署.
  • 设置程序端口: railway会注入一个叫PORT的环境变量作为服务端口, 我们的程序应该在这个端口启动.

WARNING

不幸的是, railway的配置文件无法修改PORT这个名字, 也无法通过配置文件指定该变量的值.

幸运的是, railway支持重载启动命令, 我们可以在启动命令中读取该变量, 将其与程序适配.

DANGER

这里railway出了一个馊主意: 注入固定名字的环境变量作为服务端口.

显然, 代码部署不应该影响代码编写, 而固定名字的环境变量违反了这一点(即使它很常见).

事实上, 一个程序中出现多个端口是可能的(应用端口, 数据库端口, 通信端口...), 这时候相关的环境变量通常会命名为前缀_PORT, 将任何一个简写为PORT也是可能的, 不应该认为PORT就是服务端口.

虽然上面演示的重载启动命令可以一定程度上解决这个问题, 但依然有情况是危险的. 例如在dockerfile中使用evn指定PORT变量, 但这个PORT变量并不是railway期待的服务端口, 此时在dockerfile中配置的PORT值将丢失.

因此, 如果代码中使用了名为PORT的环境变量时, 要特别小心处理.

这是一个例子(/deploy/development/railway.json):

json
{
  "$schema": "https://railway.app/railway.schema.json",
  "build": {
    "builder": "DOCKERFILE",
    "dockerfilePath": "/deploy/development/dockerfile",
    "watchPatterns": ["/applications/**", "/deploy/development/**"]
  },
  "deploy": {
    "startCommand": "bash -c 'export APP_PORT=$PORT && pnpm run dev'"
  }
}

Railway 配置

  1. 确认进入合适的项目和环境, 创建服务, 选择github仓库.

创建服务选择仓库

此时因为还没有配置, 所以会出现报错, 是正常的:

报错是正常的

  1. 进入配置页面进行配置

选择合适的分支:

选择分支

生成域名, 这样就可以用该域名访问服务了:

生成域名01生成域名02

填入合理的配置文件路径:

设置配置文件路径

不幸的是, 修改配置文件路径后, railway并不会重新部署, 这应该是railway的一个问题.

我们可以通过修改其他配置来迫使railway重新部署, 例如项目根路径:

修改根路径迫使railway重新部署

修改后可以看到已触发重新部署:

已触发重新部署