やりたいこと
- 作成した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にデプロイする設定
アプリの停止・起動
サーバーを起動・停止したい場合は、該当するディレクトリへ移動し、以下のコマンドを打つ。
#停止 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)