You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Rails应用至Heroku-18后,如何解决H-10应用崩溃错误?

Heroku-18迁移后Rails应用H10崩溃排查思路

问题背景

原部署在Heroku-14上的Rails应用,配置为Ruby 2.1.2 + Rails 4.1.6,迁移至Heroku-18时升级为Ruby 2.7.7 + Rails 5.2.2。应用本地运行正常,但部署到Heroku后触发**H10(App crashed)**错误,日志仅显示进程退出状态1,无详细报错信息。

已完成验证:

  • heroku pg:info显示数据库状态正常
  • heroku run rake db:migrate执行成功
  • heroku pg:psql可正常连接数据库
  • 本地通过psql命令远程连接数据库超时(属于Heroku数据库防火墙正常限制)

排查步骤

1. 获取完整启动日志

默认日志可能被截断,通过以下方式捕获详细报错:

  • 仅查看应用进程的实时日志:
    heroku logs --source app --tail
    
  • 手动启动Web进程,直接查看启动时的所有错误:
    heroku run rails server
    
    (注:此命令启动的进程不绑定Heroku路由,但能输出完整启动堆栈)

2. 验证Ruby/Rails版本与依赖兼容性

  • 确认Heroku上的Ruby和Rails版本与本地一致:
    heroku run ruby -v
    heroku run rails -v
    
  • 检查Gem依赖是否完整或存在冲突:
    heroku run bundle check
    
  • 检查Rails 5.2的配置适配:
    • 将config/environments/production.rb中Rails 4.x特有的config.serve_static_assets替换为config.public_file_server.enabled = true
    • 确保config/database.yml使用Heroku自动注入的环境变量,配置示例:
      production:
        url: <%= ENV['DATABASE_URL'] %>
      

3. 显式配置Procfile

虽未设置Procfile时Heroku会使用默认启动命令,但显式定义可避免版本兼容问题:

  1. 在项目根目录创建Procfile,内容为:
    web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-production}
    
    (若原应用使用Unicorn,替换为对应启动命令)
  2. 提交并重新部署:
    git add Procfile && git commit -m "Add explicit Procfile for Heroku" && git push heroku main
    

4. 验证应用内数据库连接

确认应用在Heroku内部能否正常连接数据库:

heroku run rails runner "puts ActiveRecord::Base.connection.active?"

返回true则连接正常;若失败,检查DATABASE_URL环境变量:

heroku config:get DATABASE_URL

5. 检查生产环境必需环境变量

  • 确认SECRET_KEY_BASE已设置(Rails 5.x强制要求):
    heroku config:get SECRET_KEY_BASE
    
    若未设置,生成并添加:
    rails secret
    heroku config:set SECRET_KEY_BASE=<生成的密钥>
    
  • 检查自定义环境变量(如第三方服务API密钥)是否全部配置。

6. 适配Heroku-18系统依赖

Heroku-18基于Ubuntu 18.04,部分旧Gem可能依赖特定系统库:

  1. 在项目根目录创建Aptfile,添加所需依赖库示例:
    libpq-dev
    libxml2-dev
    libxslt1-dev
    
  2. 提交并重新部署,解决Gem编译失败问题。

补充排查技巧

若以上步骤未定位问题,启用Rails调试级日志:
修改config/environments/production.rb:

config.log_level = :debug
config.logger = Logger.new(STDOUT)

重新部署后查看日志,获取完整错误堆栈。


内容的提问来源于stack exchange,提问作者sb-devora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:42:42