Udemy 6. Heroku.ymlを使ったDockerデプロイ #03
2020年06月25日に公開

HerokuCLI-manifestのデプロイ解説編。Docker環境のRails6をHerokuにデプロイする(2/2)

今回達成すること

前回は、下のリスト1、2の作業を行いました。

今回は残り全ての作業を行い、Herokuデプロイを完了します。


  1. Heroku用にWebサーバPumaをセッティングする(前回)
  2. heroku.ymlファイルを作成する(前回)
  3. HerokuCILのプラグインmanifestを導入する(今回)
  4. Herokuにアプリケーションを作成する(今回)
  5. Railsアプリをpushする(今回)
  6. 本番環境のDB、PostgreSQLを初期化する(今回)
  7. Herokuにマスターキーを追加する(今回)
  8. HerokuとPostgreSQLのタイムゾーンの確認(今回)

この記事を完走すれば、インターネット上にHelloが表示されるようになります。

2020-06-25 10-05-28

自分のアプリケーションが公開されるのですね!楽しみです。

それでは作業に入りましょう!

HerokuCILのプラグインmanifestを導入する

前回作成したheroku.ymlsetupを記述しました。

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!!インターネット上にあなただけのアプリケーションが作成できました。

2020-06-24 22-46-22

マニフェストの確認

setupに記述した設定がうまくいっているかHeroku管理画面から確認してみましょう。

https://dashboard.heroku.com/apps

素晴らしい!作成したアプリを選択すると、PostgreSQLのアドオンが追加されています。

実は筆者も初めてマニフェストを使ったので今(2020/06/24 22:52)感動しています。

2020-06-24 22-51-16

環境変数はどうでっしゃろ?

メニュー「settings」から「Reveal Config Vars」をクリックしてください。

2020-06-24 22-55-15

おおお!素晴らしや!!環境変数が設定されています。

2020-06-24 22-58-36

感動もそこそこに次の作業へ移りましょう。

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

参考 Stacks - Heroku

RailsをHerokuにpush

pushしましょう。(やっと)

api $ git push heroku master

# 成功
...
remote: Verifying deploy... done.

以上でRailsアプリがHerokuにデプロイされました。

参考 heroku.ymlを使用したDockerイメージの構築 - 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」直下のmaster.keyの中にあります。

api/config/master.key
e4hdkljefwierlbjiej32376sldkv

でもなぜ鍵があるのにエラーになったのか?


答えはGitの管理下に置かれていないファイルだったからです。

管理下に置かれていないファイルは、Herokuのリポジトリにpushできません。もちろんGitHubにも。

このkeyは秘匿性が高い情報となり、Railsさんが自動でGitの管理外ファイルとして設定してくれているのです。ありがたい。

エラー対応。Herokuにmaster keyをセットする

このエラーはHerokuにmaster.keyをセットすれば直ります。

第三者に見られたく無い情報なので、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が返されましたね。成功です。

2020-06-25 10-05-28

アプリのトップページに移動するとエラーになります。

これはhtmlファイルを用意していないために起こるエラーで正常な挙動です。ご心配なさらず。

puma.rbが読み込まれているか確認しよう

前回編集したpuma.rbの設定が読み込まれているか確認しておきましょう。

api $ heroku ps

...
=== web (Free): /bin/sh -c bundle\ exec\ puma\ -C\ config/puma.rb (1)

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にデプロイしますよー。

▶︎ 👇参ろうぞ。(下リストへ)

▷ 疲れた寝る。

▷ 腹へった。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる...。そんな方に向けた単発・短期間メンターサービスを行っています。下のサービスへお進みください。
独学プログラマのサービス
次の記事はこちら
1. このカテゴリーの歩き方 #01
【お知らせ】UdemyでRails × Nuxt.jsの動画を公開することになりました
1. このカテゴリーの歩き方 #02
【随時更新】このカテゴリーで作るアプリケーションの仕様書
1. このカテゴリーの歩き方 #03
【随時更新】このカテゴリーの歩き方
1. このカテゴリーの歩き方 #04
(Docker+Rails6+Nuxt.js+PostgreSQL)=>Heroku 環境構築~デプロイまでの手順書
2. Docker入門 #01
Docker for Macをインストールする手順
2. Docker入門 #02
分かるDocker解説。仮想環境・コンテナ・Dockerイメージ・Dockerfileとは何か?
2. Docker入門 #03
分かるDocker解説。DockerComposeとは何か?
3. Dockerを使ったRails+Nuxt.js環境構築 #01
【Docker+Rails6+Nuxt.js】今回作成するアプリの開発環境の全体像を知ろう
3. Dockerを使ったRails+Nuxt.js環境構築 #02
【MacOS】Homebrew経由でGitをインストールする方法
3. Dockerを使ったRails+Nuxt.js環境構築 #03
Rails6を動かすAlpineベースのDockerfileを作成する(AlpineLinuxとは何か)
3. Dockerを使ったRails+Nuxt.js環境構築 #04
Nuxt.jsを動かすAlpineベースのDockerfileを作成する(C.UTF-8とは何か)
3. Dockerを使ったRails+Nuxt.js環境構築 #05
.envファイルを使ったdocker-compose.ymlの環境変数設計
3. Dockerを使ったRails+Nuxt.js環境構築 #06
Rails6・Nuxt.js・PostgreSQLを動かすdocker-compose.ymlファイルを作成する
3. Dockerを使ったRails+Nuxt.js環境構築 #07
docker-compose.ymlを使ってRails6を構築する(PostgreSQLパスワード変更方法)
3. Dockerを使ったRails+Nuxt.js環境構築 #08
docker-compose.ymlを使ってNuxt.jsを構築する
4. 複数プロジェクトのGit管理 #01
複数プロジェクトで行うGit管理の全体像を理解しよう(Gitサブモジュール解説)
4. 複数プロジェクトのGit管理 #02
【Git】既存の子ディレクトリをサブモジュール管理に変更する手順
4. 複数プロジェクトのGit管理 #03
【GitHub】秘密鍵の生成・公開鍵を追加・SSH接続するまでを画像で分かりやすく
4. 複数プロジェクトのGit管理 #04
【GitHub】リモートリポジトリの追加・サブモジュールのリンク設定を行う
5. RailsAPI×Nuxt.js初めてのAPI通信 #01
【Rails6】"Hello" jsonを返すコントローラを作成する
5. RailsAPI×Nuxt.js初めてのAPI通信 #02
【Nxut.js】axiosの初期設定を行う(baseURL・browserBaseURLを解説)
5. RailsAPI×Nuxt.js初めてのAPI通信 #03
【Rails6】Gem rack-corsを導入してCORS設定を行う(オリジン・CORSとは何か)
6. Heroku.ymlを使ったDockerデプロイ #01
最初の一歩。Herokuへ新規会員登録を行いHerokuCLIをインストールする
6. Heroku.ymlを使ったDockerデプロイ #02
heroku.yml解説編。Docker環境のRails6をHerokuにデプロイする(1/2)
6. Heroku.ymlを使ったDockerデプロイ #03
HerokuCLI-manifestのデプロイ解説編。Docker環境のRails6をHerokuにデプロイする(2/2)
6. Heroku.ymlを使ったDockerデプロイ #04
Dockerfile解説編。Docker環境のNuxt.jsをHerokuにデプロイする(1/2)
6. Heroku.ymlを使ったDockerデプロイ #05
デプロイ完結編。Docker環境のNuxt.jsをHerokuにデプロイする(2/2)
7. モデル開発事前準備 #01
【Rails6】application.rbの初期設定(タイムゾーン・I18n・Zeitwerk)
新着
SPA開発
ブログ構築
小ネタ集