Just do IT

思うは招く

Rails アプリを Heroku にデプロイするときの手順

やりたいこと

  • 作成したRailsアプリをHerokuにデプロイしたい
  • でもまずはテストアプリをデプロイして感覚をつかみたい

前提

  • Macを使用
  • PostgreSQLがPCにインストールされている
$ ruby -v
ruby 2.7.1

$ rails -v
Rails 6.0.3.3

$ psql -V
psql (PostgreSQL) 12.1

Rails アプリを用意する

#postgresqlを指定してアプリ作成
$ rails new heroku-deploy-sample -d postgresql
$ cd heroku-deploy-sample/

#適当にscaffoldする
$ rails g scaffold blog title:string body:text

#db:createも忘れずに
$ rails db:create

#マイグレーション
$ rails db:migrate

Gemfile

※これは最初に -d postgresql していたらする必要はありません※

HerokuではデフォルトでPostgresQLが採用されている。一方で、RailsアプリはデフォルトでSQLite3が使われている。そのため、初期設定のGemfileのままデプロイしようとしてもエラーになる。よって、RailsアプリでPostgresQLが使えるようになる、pg gem を追加する。

#どこでもよいので追加
gem "pg"

#これは削除
gem "sqlite3", "~> 1.4"

最初に -d postgresql をしていたらこれは自動で設定されているため、やる必要はない。そもそもローカルでもPostgresQLを使っている。念のため、Gemfileに gem "sqlite3" が残っていないかだけチェックしましょう。

僕はこれが残っていてデプロイ時に何回もエラーを吐きました。

bundle

本番環境以外のgemをbundleする。

bundle install --without production

ルートURLを設定

Rails.application.routes.draw do
  root "blogs#index"
  resources :blogs
end

サーバーを立ち上げて確認しておく。

$ rails s

コンパイルSSL設定

config/environments/production.rb

config.assets.compile = true
config.force_ssl = true

デプロイすると Heroku が自動でSSL化をしてくれる。しかし、アプリ側でもSSLアクセスを強制するために、 config.force_ssl = true にしておく。

コミット

これでアプリ側の作業は完了。コミットを積んでおく。

$ git add .
$ git coomit -m "first commit"

Heroku にデプロイ

Herokuに登録

登録手順は省く。

Heroku CLIをインストール

Mac に Heroku CLI をインストール。たくさん文字が表示される。数分かかるのでコーヒーを飲んで待つ。

$ brew tap heroku/brew && brew install heroku

こんな表示があらわれる。

To use the Heroku CLI's autocomplete --
  Via homebrew's shell completion:
    1) Follow homebrew's install instructions https://docs.brew.sh/Shell-Completion
        NOTE: For zsh, as the instructions mention, be sure compinit is autoloaded
              and called, either explicitly or via a framework like oh-my-zsh.
    2) Then run
      $ heroku autocomplete --refresh-cache

  OR

  Use our standalone setup:
    1) Run and follow the install steps:
      $ heroku autocomplete

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions

Herokuコマンドの補完機能を設定する方法だが、そもそもコマンドラインからデプロイをすることはほぼない(GitHubと連携して自動デプロイする)と思っていたのでスルーした。

Heroku CLIがインストールされているか確認。いろんな記事ではパスを通す設定が紹介されているが、ぼくの場合はインストールしただけでパスは通ったようだ。

#バージョン確認
$ heroku --version
heroku/7.42.13 darwin-x64 node-v12.16.2

Heroku にログインする。

$ heroku login

heroku: Press any key to open up the browser to login or q to exit:
  • どれか適当なキーを押してブラウザを立ち上げる
  • Herokuのログイン画面が出るのでブラウザ上でログインする
  • 登録したメールアドレスが表示されたらOK
Logging in... done
Logged in as ~~@gmail.com

立ち上がったページはクローズしても大丈夫。

Heroku アプリをつくる

デプロイをするアプリの名前を指定して作成する。

$ heroku create heroku-deploy-sample

Creating ⬢ heroku-deploy-sample... !
 ▸    Name heroku-deploy-sample is already taken

「名前がすでに取られてまっせ」と出たので変更する。もしくは、引数に名前を指定しなければ、Herokuが適当に作ってくれる。デプロイのテストなら名前を入れる必要はないかも。

$ heroku create heroku-deploy-sample-hoge
Creating ⬢ heroku-deploy-sample-hoge... done
https://heroku-deploy-sample-hoge.herokuapp.com/ | https://git.heroku.com/heroku-deploy-sample-hoge.git

URLが生成された。

Heroku に push

コードをHerokuにpushする。数分かかるのでコーヒーを飲んで待つ。

$ git push heroku master

マイグレーションも忘れずに

本番環境でマイグレーションを実行する。数分かかるのでコーヒーを飲んで待つ。

$ heroku run rails db:migrate

これで取得できたURLへアクセスしてみる。さきほど取得したURLに直接アクセスしてもいいし、以下コマンドを使用してもよし。

$ heroku open

デプロイできたはず。めちゃくちゃ簡単ですね。

自分がハマったポイント

ローカルでPostgresQLで開発していて、bundle install --without production を実行してデプロイしようと思ったらできなかった。

gemfileに sqlite3 のgemが残っていたので削除し、再度bundle をしたらpushが通った。

コードを変更した場合

gitに変更を記録して、heroku へ push するだけ。

$ git add .
$ git coomit -m "change heading"
$ git push heroku master

とはいえ、実際に運用するならこれは使わないと思う。GitHubなどと連携してmasterにPRがマージされたら自動でHerokuにデプロイする方法をとると思う。(ぼくはそうしている)

GitHubのmainブランチにマージされたら自動でHerokuにデプロイする設定

k-koh.hatenablog.com

アプリの停止・起動

サーバーを起動・停止したい場合は、該当するディレクトリへ移動し、以下のコマンドを打つ。

#停止
heroku ps:scale web=0
Scaling dynos... done, now running web at 0:Free

#起動
heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free

メンテナンスモードにもできる。

#オン
heroku maintenance:on

#オフ
heroku maintenance:off

これらの設定はブラウザからでも可能。

環境変数の設定

#環境変数一覧を見れる
$ heroku config

#環境変数名を指定して参照
$ heroku config:get 環境変数名

#環境変数を追加
$ heroku config:set 環境変数名="value"

#環境変数を削除
$ heroku config:unset 環境変数名

環境変数の設定例:

#作成
$ heroku config:set HOGE="そりゃ悪手だろ。蟻んコ"
Setting HOGE and restarting ⬢ heroku-deploy-sample-hoge... done, v8
HOGE: そりゃ悪手だろ。蟻んコ

#参照
$ heroku config:get HOGE
そりゃ悪手だろ。蟻んコ

#削除
$ heroku config:unset HOGE

ログを見る

アプリを動かしているとき、リアルタイムで吐き出されるログを確認できる。デバッグなどに便利。

リアルタイムでログを見るオプション

heroku logs -t

ほかにもいろんなオプションがある

$ heroku logs -h
OPTIONS
  -a, --app=app        (required) app to run command against
  -d, --dyno=dyno      only show output from this dyno type (such as "web" or "worker")
  -n, --num=num        number of lines to display
  -r, --remote=remote  git remote of app to use
  -s, --source=source  only show output from this source (such as "app" or "heroku")
  -t, --tail           continually stream logs
  --force-colors       force use of colors (even on non-tty output)

参考