Railway部署Rails应用
基本步骤
-
在Railway上新建一个项目,选择
Deploy from github repo,然后选择自己需要部署的项目仓库(如果是第一次使用需要进行授权) "Deploy from github repo" -
接下来的选项卡,选择
Deploy now或Add variables都可以,之后Railway会创建项目并自动进行构建部署,记得在Deployments面板中先中止本次的部署操作 "Deploy project" -
在当前项目中点击
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"Setup Start command" -
手动重新部署项目
-
点击
Set up your project locally选项卡,安装Railway CLI,连接到当前项目,在本地终端执行命令railway run rails db:migrate完成数据库迁移操作 "migrate database"
踩坑
Missing secret_key_base错误,这是生产环境部署时没有在环境变量中配置secret_key_base值导致的 "Missing 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错误,应该是环境变量值没有读到导致的 "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配置文件中,不过不推荐使用,因为这样既不安全也不灵活