部署Ruby on Rails至Railway遇PostgreSQL配置崩溃错误求助
问题解决指南
1. 先搞定DATABASE_URL的URI错误
从崩溃日志能看到URI::InvalidURIError,根本问题出在DATABASE_URL里的PGPASSWORD变量语法写错了:
你原来写的是:
DATABASE_URL=postgresql://${{ PGUSER }}:{{ PGPASSWORD }}@${{ PGHOST }}:${{ PGPORT }}/${{ PGDATABASE }}
注意{{ PGPASSWORD }}前面少了个$,得改成${{ PGPASSWORD }},正确的写法是:
DATABASE_URL=postgresql://${{ PGUSER }}:${{ PGPASSWORD }}@${{ PGHOST }}:${{ PGPORT }}/${{ PGDATABASE }}
变量没正确解析,导致密码部分直接变成了{{ PGPASSWORD }}字符串,把整个数据库连接URI搞废了,这才引发的错误。
2. 必须把sqlite3换成PostgreSQL
Gemfile里的gem 'sqlite3', '1.4'绝对是生产环境的大忌,和你的问题直接相关,生产环境不能用SQLite,理由很实在:
- SQLite是单文件数据库,Railway用容器部署,容器重启或者加实例的时候,数据库文件直接丢了,数据根本存不住;
- SQLite扛不住并发请求,生产环境多用户访问的时候,会锁死、卡成狗;
- 你已经在Railway配置了PostgreSQL的变量,完全匹配,必须换对应的gem。
切换步骤:
- 修改Gemfile,按环境区分数据库gem:
# Gemfile group :development, :test do gem 'sqlite3', '1.4' end group :production do gem 'pg', '~> 1.4' end
- 改
config/database.yml,让生产环境直接读DATABASE_URL变量:
# config/database.yml production: url: <%= ENV['DATABASE_URL'] %>
- 把修改提交到GitHub,重新让Railway部署就行。
3. 额外优化建议
- 确认Railway的PostgreSQL服务已经正常跑起来,PGHOST、PGPORT、PGPASSWORD这些变量和服务给的信息完全对得上;
- Procfile的启动命令可以改改,别每次启动都跑migrate(重复迁移可能出问题),改成:
web: bin/rails server -b 0.0.0.0 -p $PORT
migrate可以放到Railway的构建阶段,或者手动执行一次就行,不用每次启动都跑。
内容的提问来源于stack exchange,提问作者Philipe
相关产品推荐
相关产品推荐

