v-crn Code Log

主に備忘録

RailsアプリをHerokuにデプロイする

RailsアプリをHerokuにデプロイする手順をまとめました。

前提

  • Herokuのユーザー登録が完了している
  • Heroku CLI 7.26.0
  • Rails 5以降

Herokuのインストール

Macの場合

$ brew tap heroku/brew && brew install heroku

※上記コマンドは変更されることがあるので公式Heroku CLIを確認すること。

Herokuへのログイン

$ heroku login
Enter your Heroku credentials.
Email:
Password:

アプリケーション枠の作成

$ heroku create アプリ名(任意)

アプリ名を空欄にしておくとランダムな単語を組み合わせてURLが作成されます。

アセットプリコンパイル

# config/environments/production.rb

config.assets.compile = true      # false -> trueに変更

コンソールにログを出力させる設定(Rails5では不要)

前提通りRails5を使用しているならこのセクションは飛ばして構いません。

Rails5以前はここで'rails_12factor'というgemを入れることになっていましたが、Rails5では不要になりました。Herokuへのアップロード方法を調べたときにrails_12factorのインストールを指示する古い記事が散見されたので念のため書いておきます。

ちなみに以下がコンソールにログを出力させる設定部分です。

# config/environments/production.rb

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

if ENV["RAILS_LOG_TO_STDOUT"].present?
  logger           = ActiveSupport::Logger.new(STDOUT)
  logger.formatter = config.log_formatter
  config.logger = ActiveSupport::TaggedLogging.new(logger)
end

Herokuへ送信

$ git add -am "add logger configuration in production.rb for heroku"
$ git push heroku master

master以外のブランチから送る場合、次の形式でプッシュ。

$ git push heroku ブランチ名:master

herokuへpushするときによくあるエラー

Activating bundler (2.0.1) failed: Could not find 'bundler' (2.0.1) required by your /tmp/build_*******************/Gemfile.lock.

...
remote:  !
remote:  !     Could not detect rake tasks
remote:  !     ensure you can run `$ bundle exec rake -P` against your app
remote:  !     and using the production group of your Gemfile.
remote:  !     Activating bundler (2.0.1) failed:
remote:  !     Could not find 'bundler' (2.0.1) required by your /tmp/build_ca1a4fd3f5e6f625b5caeb3631a89daf/Gemfile.lock.
remote:  !     To update to the latest version installed on your system, run `bundle update --bundler`.
remote:  !     To install the missing version, run `gem install bundler:2.0.1`
remote:  !     Checked in 'GEM_PATH=vendor/bundle/ruby/2.5.0', execute `gem env` for more information
remote:  !     
remote:  !     To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
remote:  !
...

 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/sample-app.git'

これは2019年7月2日現在、Herokuがbundler 2に対応していないために発生するエラーのようです。

HerokuはまだBundler2.0に対応していない? - Qiita

You must use Bundler 2 or greater with this lockfile · Issue #6784 · bundler/bundler · GitHub

Could not find 'bundler'

解決策は「Bundler 2のbuildpackをあてる」、もしくは「Bundlerのバージョンを下げる」の2択があります。

1. Bundler 2のbuildpackを設定する

$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2

私の環境ではこの方法で解決しましたが、一旦プッシュに成功してもこの後に実行するマイグレーションheroku run rails db:migrate)で失敗することもあるようです。その場合はBundlerのバージョンを下げてみましょう。

2. Bundlerのバージョンを下げる

$ gem uninstall bundler
$ gem install bundler -v 1.17.3
$ rm Gemfile.lock
$ bundle install

Gemfile.lockの末尾に

BUNDLED WITH
   1.17.3

と記述されていることが確認できたらOKです。

ArgumentError: Missing secret_key_base for 'production' environment, set this string with rails credentials:edit

secret_key_base(bundle exec rake secretで確認できます)を以下のコマンドで本番環境の環境変数に登録すると解決します。

$ heroku config:add SECRET_KEY_BASE="$(bundle exec rails secret)"

HerokuにDBアドオンを追加

DBとしてPostgresqlを使う場合

$ heroku addons:create heroku-postgresql

マイグレーション

$ heroku run rails db:migrate RAILS_ENV=production

環境変数の設定

追加/変更

$ heroku config:set 環境変数名=セットしたい値

削除

$ heroku config:unset 環境変数名

確認

$ heroku config

Herokuの再起動

$ heroku restart

起動に成功していればアプリのURLにアクセスできるはずです。 HerokuアプリのURLはheroku infoで確認できます。

$ heroku info
=== sample-app
Addons:         heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/sample-app.git
Owner:          example@gmail.com
Region:         us
Repo Size:      2 MB
Slug Size:      50 MB
Stack:          heroku-18
Web URL:        https://sample-app.herokuapp.com/