[Ruby] 在将Rails部署到Heroku时需注意的七个事项 [Heroku]
最近,我们举办了一场针对Ruby开发者的Heroku入门网络研讨会。现在,我想对这次活动的内容进行回顾,并补充一些注意事项的解释。
请参阅原始幻灯片,了解面向Ruby开发者的Heroku入门。
部署之前的注意事项
在部署之前,我将介绍开发应用程序时应考虑的五个要点。
1. 关于选定数据库服务器的问题
在Heroku上,一般推荐使用Heroku Postgres作为RDBMS,而在需要高速NoSQL数据库的情况下,则推荐使用Heroku Redis。原因是这些都是Heroku提供的插件,并且特别推荐使用Heroku Postgres的原因是它始终可以使用最新版本。
当然,您也可以使用MySQL、Mongo、Cassandra等第三方供应商提供的数据库,但对于Heroku而言,我们建议使用以”Heroku”为开头的附加组件,这些以”Heroku”开头的组件表示它们是由Heroku提供的附加功能。
另外,不建议使用SQLite。原因是Heroku Dyno根据约定每隔约24小时进行重启,这会导致本地磁盘被初始化。
2. 数据库配置文件/database.yml
不仅仅限于Heroku Postgres,与数据库的连接定义通常是通过环境变量进行定义的。当在Rails中使用数据库时,可以通过使用这个连接定义来简单地进行连接。
如果使用Heroku Postgres,可以这样写。
production:
url: <%= ENV['DATABASE_URL'] %>
3. 进程文件
Heroku会根据部署时文件的组织和内容,大致自动选择最佳配置并应用。对于Ruby,Rails和Rack规范的Web应用将立即被检测到,并自动定义常见的启动步骤和环境变量。
然而,如果想选择与通常不同的启动方法(例如,希望使用 Thin 而非 Webrick)或者设置 Worker Dyno 的启动步骤而不是 Web Dyno,则需要定义 Procfile。
如果要启动常规的 Rails 应用,通常需要在 Procfile 中进行配置。但是,如果使用 Heroku,它会自动执行,而无需准备 Procfile。
web: bundle exec rails server -p $PORT -e $RAILS_ENV
如果想要设定与通常不同的启动步骤或Worker Dyno的启动步骤,可以这样做
bash: Procfile
web: 使用bundle exec运行app.rb
mqtt: 使用bin/proximo运行bundle exec mqtt.rb
redshift: 使用bin/proximo运行bundle exec redshift.rb
在这种情况下,Web服务器由app.rb启动。已准备好mqtt和redshift两个Worker Dyno,并在与Web Dyno分开的非同步方式下执行。另外,bin/proximo使用Proximo插件来固定IP地址并使用。因此,如果要使用特定的启动步骤,则Procfile是必需的。
在外部连接时,有两种方法可以固定IP化。
4. Gemfile (适用于Rails4的情况)
让我们像咒语一样记住它。
在使用Heroku部署Rails的情况下,请定义使用rails_12factor Gem用于生产环境。
group :production do
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.15'
# Use easily Heroku with Rails
gem 'rails_12factor'
end
从Rails5开始不再需要。
5. 配置/秘密.yml
有时候,会在.gitignore文件中指定config/secret.yml文件不包含在git的目标中。如果在.gitignore文件中定义了/config/secret.yml,请注释或删除它。
由于通常情况下已经被定义为标准方式,我们将保持原样。在Heroku上,如果检测到Rails应用程序,将自动生成 SECRET_KEY_BASE 环境变量。
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
部署时的注意事项
在部署时,我将为您解释两个需要牢记的注意事项。
1. Gemfile.lock 是必需的
如果从其他地方克隆了git,则可能不太需要,但如果要部署自己的Web应用程序,则Gemfile.lock是必需的。
因此,可能需要使用Linux/Mac等UNIX环境(如果有Windows的方法,请告诉我)。Heroku在部署时似乎会根据Gemfile.lock文件注册Rubygems。
以下是Heroku在执行部署时通过bundle install进行的目录指定的示例,请参考。
bundle install --path vendor/bundle --binstubs vendor/bundle/bin
需要进行数据库的迁移。
我记得以前有自动执行的功能,但现在需要手动迁移了。在部署到Heroku后,如果不在Heroku上执行db:migrate,数据库表将一直不存在,并持续报错。
heroku run bundle exec rake db:migrate
其他
在优化和运行应用程序时,Heroku和Heroku Dyno有着最小的限制要求。
请参阅限制以获取详细信息。