RailsアプリをHerokuにデプロイする
RailsアプリをHerokuにデプロイする手順をまとめました。
- 前提
- Herokuのインストール
- Herokuへのログイン
- アプリケーション枠の作成
- アセットプリコンパイル
- コンソールにログを出力させる設定(Rails5では不要)
- Herokuへ送信
- HerokuにDBアドオンを追加
- マイグレーション
- 環境変数の設定
- Herokuの再起動
前提
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/