配置 Railway 预览
账号
我们使用一个公共账号进行部署, 您可以向您的主管询问登录账号的方法.
Railway 介绍
项目
登录后您会看到如下界面:
下面的每一个卡片都是一个项目
, 如有需要, 您可以使用右上角的按钮创建新的项目.
环境和服务
进入项目后您会看到如下界面:
简单来说, 项目下会有环境
, 例如development
环境, production
等.
在环境下, 则可以创建服务
, 服务表示一个具体的程序.
我们的工作流
WARNING
在我们的工作流中:
- 我们的一个项目对应railway的一个项目.
- 每个项目都会有两个环境,
development
和production
, 其中前者对应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):
{
"$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 配置
- 确认进入合适的项目和环境, 创建服务, 选择github仓库.
此时因为还没有配置, 所以会出现报错, 是正常的:
- 进入配置页面进行配置
选择合适的分支:
生成域名, 这样就可以用该域名访问服务了:
填入合理的配置文件路径:
不幸的是, 修改配置文件路径后, railway并不会重新部署, 这应该是railway的一个问题.
我们可以通过修改其他配置来迫使railway重新部署, 例如项目根路径:
修改后可以看到已触发重新部署: