今回達成すること
前回は、下のリスト1、2の作業を行いました。
今回は残り全ての作業を行い、Herokuデプロイを完了します。
- Heroku用にWebサーバPumaをセッティングする(前回)
- heroku.ymlファイルを作成する(前回)
- HerokuCILのプラグインmanifestを導入する(今回)
- Herokuにアプリケーションを作成する(今回)
- Railsアプリをpushする(今回)
- 本番環境のDB、PostgreSQLを初期化する(今回)
- Herokuにマスターキーを追加する(今回)
- HerokuとPostgreSQLのタイムゾーンの確認(今回)
この記事を完走すれば、インターネット上にHelloが表示されるようになります。
自分のアプリケーションが公開されるのですね!楽しみです。
それでは作業に入りましょう!
HerokuCILのプラグインmanifestを導入する
前回作成したsetup
を記述しました。
api/heroku.yml
setup:
addons:
- plan: heroku-postgresql
config:
RACK_ENV: production
RAILS_ENV: production
RAILS_LOG_TO_STDOUT: enabled
RAILS_SERVE_STATIC_FILES: enabled
この設定を反映させるにはHerokuCLIのプラグイン「manifest」が必要です。
インストールしましょう。
# ログインしとく
$ heroku login
# まずベータ版にアップデート
$ heroku update beta
# manifestをインストール
$ heroku plugins:install @heroku-cli/plugin-manifest
確認しておきましょう。
$ heroku plugins
...
manifest 0.0.5
OK!!これでプラグインがインストールできました。
HerokuCLIを安定版に戻してプラグインを削除するには下記コマンドを実行します。
(注意)今は実行しないでください。
$ heroku update stable
$ heroku plugins:remove manifest
Railsを動かすHerokuアプリを作成する
Railsを入れるHerokuアプリケーションを作成します。
「api」ディレクトリに移動しましょう。
root $ cd api
Herokuアプリ作成コマンドの実行
setup
を反映させるため、--manufest
オプションをつけてHerokuのアプリ作成コマンドを実行します。
api $ heroku create <任意のアプリ名-api> --manifest
# 筆者の場合
# heroku create udemy-demoapp-v1-api --manifest
このアプリ名は重複が許されません。エラーが出た場合は他の名前を使用してください。
Herokuアプリの確認
作成したアプリを確認してみましょう。
api $ heroku open
OK!!インターネット上にあなただけのアプリケーションが作成できました。
マニフェストの確認
setup
に記述した設定がうまくいっているかHeroku管理画面から確認してみましょう。
https://dashboard.heroku.com/apps
素晴らしい!作成したアプリを選択すると、PostgreSQLのアドオンが追加されています。
実は筆者も初めてマニフェストを使ったので今(2020/06/24 22:52)感動しています。
環境変数はどうでっしゃろ?
メニュー「settings」から「Reveal Config Vars」をクリックしてください。
おおお!素晴らしや!!環境変数が設定されています。
感動もそこそこに次の作業へ移りましょう。
Herokuのリモートリポジトリ先を確認する
デプロイの前にHerokuのリモートリポジトリが正しく登録されているか確認します。
api $ git remote -v
heroku https://git.heroku.com/<アプリ名>.git (fetch)
heroku https://git.heroku.com/<アプリ名>.git (push)
OK!!ナイスですね。
リモートリポジトリが無い場合
もし、リモートリポジトリのURLが登録できていなかった方は下記操作を実行して登録します。
まず、アプリ情報を取得します。
api $ heroku apps:info --app <アプリ名>
- アプリ名 ... Herokuのアプリ作成時につけた名前。筆者の場合
udemy-demoapp-v1-api
出てきた情報の「GIT URL」をコピーしましょう。
...
# このURLをコピー
Git URL: https://git.heroku.com/<アプリ名>.git
リモートリポジトリを追加します。
api $ git remote add heroku <GIT URL>
確認しときましょう。
api $ git remote -v
heroku https://git.heroku.com/<アプリ名>.git (fetch)
heroku https://git.heroku.com/<アプリ名>.git (push)
リモートリポジトリが登録されたら--app
オプションをつけなくてもアプリ情報が見れます。
api $ heroku apps:info
Addons: heroku-postgresql:hobby-dev
...
成功しましたね。次へ進みましょう。
GitHubにpushする
前回の変更をGitHubにpushしておきましょう。
api $ git add -A
api $ git commit -m "edit_puma.rb & add_heroku.yml"
api $ git push
Heroku スタックの確認
続いてスタックを確認します。
スタックとは、Herokuが用意しているDockerイメージのようなもので、このスタック上でアプリケーションが動いています。
ただ今回はこちらでイメージを用意しているのでcontainer
モードになっている必要があります。
api $ heroku stack
cedar-14
* container
...
container
に*
印がついていればOK!!
これで用意したDockerfileをデプロイすることができます。
実はHerokuプラグインの「manifest」を導入した時点で、container
モードに変更されます。
便利ですね。手動で変更するにはこのコマンドを実行します。
# 参考コマンド
api $ heroku stack:set container
RailsをHerokuにpush
pushしましょう。(やっと)
api $ git push heroku master
# 成功
...
remote: Verifying deploy... done.
以上でRailsアプリがHerokuにデプロイされました。
本番環境のPostgreSQLを初期化する
ただ、今のままでは動きません。
最初のデプロイ時にはHerokuデータベースの初期化を行わなければなりません。
マイグレーションコマンドを実行しましょう。
api $ heroku run rails db:migrate
おや?大量のエラーですね。。。
rails aborted!
ArgumentError: Missing `secret_key_base` for 'production' environment,
set this string with `rails credentials:edit`
...
ArgumentError: Missing secret_key_baseに対応する
これは「暗号化されたsecret_key_base
が見れないぞ!開くための鍵をくれ。」というエラーです。
鍵は「api/config」直下の
api/config/master.key
e4hdkljefwierlbjiej32376sldkv
でもなぜ鍵があるのにエラーになったのか?
答えはGitの管理下に置かれていないファイルだったからです。
管理下に置かれていないファイルは、Herokuのリポジトリにpushできません。もちろんGitHubにも。
このkeyは秘匿性が高い情報となり、Railsさんが自動でGitの管理外ファイルとして設定してくれているのです。ありがたい。
エラー対応。Herokuにmaster keyをセットする
このエラーはHerokuに
第三者に見られたく無い情報なので、Herokuの環境変数に直接設定しましょう。
api $ heroku config:set RAILS_MASTER_KEY=<master key>
間違った場合はもう一度同じ環境変数名でセットすればOKです。
確認しておきましょう。
api $ heroku config
RACK_ENV: production
RAILS_ENV: production
RAILS_LOG_TO_STDOUT: enabled
RAILS_MASTER_KEY: e4hdkljefwierlbjiej32376sldkv # OK!!
RAILS_SERVE_STATIC_FILES: enabled
もう一度データベースの初期化を行う
エラーに対応したのでもう一度マイグレーションコマンドを実行します。
api $ heroku run rails db:migrate
# 成功
Running rails db:migrate on ⬢ <app name>... up, run.5721 (Free)
D, [2020-06-25T09:41:29.233511 #3] DEBUG -- :
...
OK!!これで本番環境にもデータベースPostgreSQLが用意されました。
さあいよいよアプリの確認です
Railsアプリがインターネットに公開されました。
確認してみましょう。
api $ heroku open /api/v1/hello
heroku open <開きたいパス>
RailsからHelloが返されましたね。成功です。
アプリのトップページに移動するとエラーになります。
これはhtmlファイルを用意していないために起こるエラーで正常な挙動です。ご心配なさらず。
puma.rbが読み込まれているか確認しよう
前回編集した
api $ heroku ps
...
=== web (Free): /bin/sh -c bundle\ exec\ puma\ -C\ config/puma.rb (1)
-
heroku ps
... アプリのdyno(ダイノ)をリストするコマンド。このコマンドにより、
web dyno
がどのプロセスで実行されているかを確認できる。 -
dyno
... Herokuのアプリケーションが実際に実行される場所。実態はEC2上のLinuxコンテナ。
OK!!ちゃんとpumaの設定ファイルが読み込まれていますね。
最後にタイムゾーンを確認しよう
Dockerfileにタイムゾーンの設定をしたことを思い出してください。
「Asia/Tokyo」を指定しましたよね。
Herokuには、このDockerfileを基にしたイメージがビルドされています。
タイムゾーンも「Asia/Tokyo」になっているはずです。(デフォルトはUTC)
確認しましょう。
# Herokuアプリに入る
api $ heroku run sh
# 現在時間の取得
~$ date
# ISTになっていればOK!日本時間
Fri Jun 5 09:17:55 JST 2020
# 抜ける
~$ exit
PostgreSQLのタイムゾーンも確認する
ついでにデータベースのタイムゾーンも確認しておきましょう。
何も設定していないのでデフォルトのUTCになっているはずです。
まずPostgreSQLの名前を取得します。
api $ heroku pg:info
# 名前
Add-on: postgresql-dimensional-xxxxx
この名前をコピーしてPostgreSQLに入ります。
api $ heroku pg:psql <PostgreSQLの名前>
続いてタイムゾーンの確認です。
DATABASE=> show timezone;
TimeZone
----------
Etc/UTC
(1 row)
OKですね。PostgreSQLから抜けましょう。
DATABASE=> \q
以上で全ての作業が完了です。
まとめ
この記事ではHerokuCILのプラグイン「manifest」を使ったRails6のデプロイ手法を説明していきました。
筆者もこの記事を書くまで使ったことがなかったのですが、すごく便利でしたねー。
早く安定版になることを願っています。
さて今後のためにDocker環境のRailsデプロイ手順をまとめておきます。
忘れた時はこの記事に戻って再確認してください。
-
heroku.ymlの作成
-
HerokuCIL「manifest」のインストール
-
Herokuアプリの作成
-
GitにHerokuのリモートリポジトリURLを追加する
-
RailsアプリをHerokuにプッシュ
-
Herokuに環境変数「RAILS_MASTER_KEY」を追加する
-
データベースの初期化
-
タイムゾーンの確認
以上。
次回は?
次はNuxt.jsをHerokuにデプロイしますよー。
▶︎ 👇参ろうぞ。(下リストへ)
▷ 疲れた寝る。
▷ 腹へった。