# 基本步骤
在 Railway 上新建一个项目,选择
Deploy from github repo
,然后选择自己需要部署的项目仓库(如果是第一次使用需要进行授权)接下来的选项卡,选择
Deploy now
或Add variables
都可以,之后 Railway 会创建项目并自动进行构建部署,记得在Deployments
面板中先中止本次的部署操作在当前项目中点击
New
按钮,创建一个Postgresql
数据库配置环境变量(可以根据需要修改)
环境变量名 | 值 | 备注 |
---|---|---|
PORT | 3000 | 可以根据需要修改 |
RAILS_MAX_THREADS | 5 | 可以根据需要修改 |
RACK_ENV | production | 不要修改 |
RAILS_ENV | production | 不要修改 |
RAILS_MASTER_KEY | [your master key] | 项目中 master.key 文件中的值 |
SECRET_KEY_BASE | [your secret_key_base] | 可以使用 RAILS_ENV=production rake secret 生成 |
DATABASE_URL | ${{Postgres.DATABASE_URL}} | 直接引入之前创建好的数据库的连接信息 |
PGHOST | ${{Postgres.PGHOST}} | 直接引入之前创建好的数据库的连接信息 |
PGPORT | ${{Postgres.PGPORT}} | 直接引入之前创建好的数据库的连接信息 |
PGUSER | ${{Postgres.PGUSER}} | 直接引入之前创建好的数据库的连接信息 |
PGPASSWORD | ${{Postgres.PGPASSWORD}} | 直接引入之前创建好的数据库的连接信息 |
PGDATABASE | ${{Postgres.PGDATABASE}} | 直接引入之前创建好的数据库的连接信息 |
接下来在 Rails 项目的
Settings
面板中配置域名和启动命令rails server
手动重新部署项目
点击
Set up your project locally
选项卡,安装Railway CLI
,连接到当前项目,在本地终端执行命令railway run rails db:migrate
完成数据库迁移操作
# 踩坑
Missing secret_key_base
错误,这是生产环境部署时没有在环境变量中配置secret_key_base
值导致的
除了配置环境变量以外,还要在config/environments/production.rb
文件进行配置
require "active_support/core_ext/integer/time" | |
Rails.application.configure do | |
... | |
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. | |
config.force_ssl = true | |
... | |
# Production SECRET_KEY_BASE | |
config.secret_key_base = '<%= ENV["SECRET_KEY_BASE"] %>' | |
end |
Database empty url
错误,应该是环境变量值没有读到导致的
- 出现错误的配置如下:
... | |
production: | |
adapter: postgresql | |
url: '<%= ENV["DATABASE_URL"] %>' | |
user: '<%= ENV["PGUSER"] %>' | |
password: '<%= ENV["PGPASSWORD"] %>' | |
pool: 5 | |
timeout: 5000 | |
encoding: unicode |
- 解决方案是将 url 配置项中的单引号对删掉,然后重新部署:
... | |
production: | |
adapter: postgresql | |
url: <%= ENV["DATABASE_URL"] %> | |
user: <%= ENV["PGUSER"] %> | |
password: <%= ENV["PGPASSWORD"] %> | |
pool: 5 | |
timeout: 5000 | |
encoding: unicode |
当然也可以直接复制 数据库连接url
到 config/database.yml
配置文件中,不过不推荐使用,因为这样既不安全也不灵活