HerokuCLI-manifestのデプロイ解説編。Docker環境のRails6をHerokuにデプロイする(2/2)
  • 2020.06.25に公開
  • Udemy
  • 6. Heroku.ymlを使ったDockerデプロイ
  • No.3 / 5

今回達成すること

前回は、下のリスト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にデプロイしますよー。

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

▷ 疲れた寝る。

▷ 腹へった。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
Udemyの投稿
1
  • このカテゴリーの歩き方
  • /
  • #01
【お知らせ】UdemyでRails × Nuxt.jsの動画を公開することになりました
2
  • このカテゴリーの歩き方
  • /
  • #02
アプリケーション仕様書
3
  • このカテゴリーの歩き方
  • /
  • #03
このカテゴリーの歩き方(まずはここをチェック)
4
  • このカテゴリーの歩き方
  • /
  • #04
(Docker+Rails6+Nuxt.js+PostgreSQL)=>Heroku 環境構築~デプロイまでの手順書
1
  • Docker入門
  • /
  • #01
Docker for Macをインストールする手順
2
  • Docker入門
  • /
  • #02
分かるDocker解説。仮想環境・コンテナ・Dockerイメージ・Dockerfileとは何か?
3
  • Docker入門
  • /
  • #03
分かるDocker解説。DockerComposeとは何か?
1
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #01
【Docker+Rails6+Nuxt.js】今回作成するアプリの開発環境の全体像を知ろう
2
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #02
【MacOS】Homebrew経由でGitをインストールする方法
3
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #03
Rails6を動かすAlpineベースのDockerfileを作成する(AlpineLinuxとは何か)
4
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #04
Nuxt.jsを動かすAlpineベースのDockerfileを作成する(C.UTF-8とは何か)
5
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #05
.envファイルを使ったdocker-compose.ymlの環境変数設計
6
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #06
Rails6・Nuxt.js・PostgreSQLを動かすdocker-compose.ymlファイルを作成する
7
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #07
docker-compose.ymlを使ってRails6を構築する(PostgreSQLパスワード変更方法)
8
  • Dockerを使ったRails+Nuxt.js環境構築
  • /
  • #08
docker-compose.ymlを使ってNuxt.jsを構築する
1
  • 複数プロジェクトのGit管理
  • /
  • #01
複数プロジェクトで行うGit管理の全体像を理解しよう(Gitサブモジュール解説)
2
  • 複数プロジェクトのGit管理
  • /
  • #02
【Git】既存の子ディレクトリをサブモジュール管理に変更する手順
3
  • 複数プロジェクトのGit管理
  • /
  • #03
【GitHub】秘密鍵の生成・公開鍵を追加・SSH接続するまでを画像で分かりやすく
4
  • 複数プロジェクトのGit管理
  • /
  • #04
【GitHub】リモートリポジトリの追加・サブモジュールのリンク設定を行う
1
  • RailsAPI×Nuxt.js初めてのAPI通信
  • /
  • #01
【Rails6】"Hello" jsonを返すコントローラを作成する
2
  • RailsAPI×Nuxt.js初めてのAPI通信
  • /
  • #02
【Nxut.js】axiosの初期設定を行う(baseURL・browserBaseURLを解説)
3
  • RailsAPI×Nuxt.js初めてのAPI通信
  • /
  • #03
【Rails6】Gem rack-corsを導入してCORS設定を行う(オリジン・CORSとは何か)
1
  • Heroku.ymlを使ったDockerデプロイ
  • /
  • #01
デプロイ準備。Herokuへ新規会員登録を行いHerokuCLIをインストールする
2
  • Heroku.ymlを使ったDockerデプロイ
  • /
  • #02
heroku.yml解説編。Docker環境のRails6をHerokuにデプロイする(1/2)
3
  • Heroku.ymlを使ったDockerデプロイ
  • /
  • #03
HerokuCLI-manifestのデプロイ解説編。Docker環境のRails6をHerokuにデプロイする(2/2)
4
  • Heroku.ymlを使ったDockerデプロイ
  • /
  • #04
Dockerfile解説編。Docker環境のNuxt.jsをHerokuにデプロイする(1/2)
5
  • Heroku.ymlを使ったDockerデプロイ
  • /
  • #05
デプロイ完結編。Docker環境のNuxt.jsをHerokuにデプロイする(2/2)
1
  • モデル開発事前準備
  • /
  • #01
【Rails6】application.rbの初期設定(タイムゾーン・I18n・Zeitwerk)
2
  • モデル開発事前準備
  • /
  • #02
【Rails6】モデル開発に必要なGemのインストールとHirb.enableの自動化
3
  • モデル開発事前準備
  • /
  • #03
【Docker+Rails】A server is already running. Check /tmp/pids/server.pidエラーの対応
4
  • モデル開発事前準備
  • /
  • #04
【Docker】<none>タグのイメージを一括削除する & Rails .gitignoreの編集
1
  • ユーザーモデル開発
  • /
  • #01
Railsユーザーモデル作成。テーブル設計・ユーザー認証設計を理解する
2
  • ユーザーモデル開発
  • /
  • #02
Railsユーザーモデルのバリデーション設定(has_secure_password解説)
3
  • ユーザーモデル開発
  • /
  • #03
Railsバリデーションエラーメッセージの日本語化(ja.yml設定方法)
4
  • ユーザーモデル開発
  • /
  • #04
EachValidatorクラスのカスタムバリデーション設定(Rails6/lib以下読込)
5
  • ユーザーモデル開発
  • /
  • #05
Rails環境ごとにSeedデータ切り替えるseeds.rbの書き方
6
  • ユーザーモデル開発
  • /
  • #06
Rails6から導入された並列テストを理解する
7
  • ユーザーモデル開発
  • /
  • #07
Railsユーザーモデルバリデーションテスティング(name/email/password)
8
  • ユーザーモデル開発
  • /
  • #08
Nuxt.jsからRailsのユーザーテーブルを取得しHerokuにデプロイする
1
  • Nuxt.jsフロント開発事前準備
  • /
  • #01
【Nuxt.js2.13超解説】バージョンアップ手順と6つの新機能+2つの変更点
2
  • Nuxt.jsフロント開発事前準備
  • /
  • #02
Docker AlpineベースのNode.js上で動くNuxt.jsにVuetifyを導入する
3
  • Nuxt.jsフロント開発事前準備
  • /
  • #03
VuetifyにカスタムCSSを導入してオリジナルブレイクポイントを作る
4
  • Nuxt.jsフロント開発事前準備
  • /
  • #04
Nuxt.jsにnuxt-i18nを導入して国際化に対応する
1
  • ログイン前のレイアウト構築
  • /
  • #01
Nuxt.jsのレイアウト・ページ・コンポーネントの役割を理解しよう
2
  • ログイン前のレイアウト構築
  • /
  • #02
Nuxt.js ウェルカムページを構成するコンポーネントファイル群を作成しよう(1/4)
3
  • ログイン前のレイアウト構築
  • /
  • #03
Nuxt.js ウェルカムページにアイキャッチ画像・アプリ名・メニューボタンを表示しよう(2/4)
4
  • ログイン前のレイアウト構築
  • /
  • #04
Nuxt.js addEventListenerでスクロールを検知しツールバーの色を変化させよう(3/4)
5
  • ログイン前のレイアウト構築
  • /
  • #05
Nuxt.js ウェルカムページをレスポンシブデザインに対応させよう(4/4)
6
  • ログイン前のレイアウト構築
  • /
  • #06
Nuxt.js 会員登録ページのレイアウトファイルを作成しよう(1/4)
7
  • ログイン前のレイアウト構築
  • /
  • #07
Nuxt.js 名前、メール、パスワードのコンポーネントファイルを作成しよう(2/4)
8
  • ログイン前のレイアウト構築
  • /
  • #08
Nuxt.js 親子コンポーネント間の双方向データバインディングを実装する(3/4)
9
  • ログイン前のレイアウト構築
  • /
  • #09
Nuxt.js Vuetifyのv-text-fieldを使った会員登録フォームのバリデーション設定(4/4)
10
  • ログイン前のレイアウト構築
  • /
  • #10
Nuxt.js ログインページ実装とHerokuデプロイまで(router. replaceとpushの違いとは)
1
  • ログイン後のレイアウト構築
  • /
  • #01
Nuxt.js ログイン後のツールバーを作成しよう(inject解説)
2
  • ログイン後のレイアウト構築
  • /
  • #02
Nuxt.js アカウントメニューページ・ログアウト機能を実装しよう(nuxt-child解説)
3
  • ログイン後のレイアウト構築
  • /
  • #03
Nuxt.js ログイン後のトップページにプロジェクト一覧を表示しよう
4
  • ログイン後のレイアウト構築
  • /
  • #04
Nuxt.js プロジェクトページにVuetifyのナビゲーションドロワーを追加しよう
5
  • ログイン後のレイアウト構築
  • /
  • #05
Nuxt.js paramsIDからプロジェクトを検索してVuexに保存しよう
1
  • サーバーサイドのログイン認証
  • /
  • #01
JWTとは何か?(ruby-jwtのインストール)
2
  • サーバーサイドのログイン認証
  • /
  • #02
【Rails×JWT】ログイン認証解説とJWT初期設定ファイルの作成
3
  • サーバーサイドのログイン認証
  • /
  • #03
【Rails×JWT】トークン発行とデコードを行うAuthTokenクラスの作成
4
  • サーバーサイドのログイン認証
  • /
  • #04
【Rails×JWT】 ログイン判定を行うAuthenticatorモジュールの作成
5
  • サーバーサイドのログイン認証
  • /
  • #05
【Rails×JWT】UserクラスからJWTを扱うTokenizableモジュールの作成
6
  • サーバーサイドのログイン認証
  • /
  • #06
【Rails×JWT】AuthTokenクラスとAuthenticatorモジュールをテストする
7
  • サーバーサイドのログイン認証
  • /
  • #07
【Rails×JWT】JWTをCookieに保存するログインコントローラーの実装
8
  • サーバーサイドのログイン認証
  • /
  • #08
【Rails×JWT】ログインコントローラーのテストとHerokuデプロイ
1
  • フロントエンドのログイン認証
  • /
  • #01
【Rails×Nuxt.js】クロスオリジン通信でのCookie共有設定
2
  • フロントエンドのログイン認証
  • /
  • #02
【Nuxt.js】Railsからのログイン成功レスポンスをVuexに保存する
3
  • フロントエンドのログイン認証
  • /
  • #03
【Nuxt.js】ローカルストレージの有効期限を暗号化する(crypto-js解説)
4
  • フロントエンドのログイン認証
  • /
  • #04
【Nuxt.js】JWT有効期限内のユーザーをログインしたままにする実装
5
  • フロントエンドのログイン認証
  • /
  • #05
【Nuxt.js】ログイン前後のリダイレクト処理をミドルウェアで実装する
6
  • フロントエンドのログイン認証
  • /
  • #06
【Nuxt.js】ログイン失敗時のトースターをグローバルイベントとして作成する
7
  • フロントエンドのログイン認証
  • /
  • #07
【Nuxt.js】エラーページを作成する
8
  • フロントエンドのログイン認証
  • /
  • #08
【Rails×Nuxt.js】デモプロジェクトの作成とHerokuデプロイ(ログイン認証完)
1
  • 本番環境への対応
  • /
  • #01
【Rails×Nuxt.js】SafariのクロスサイトCookie保存拒否に対応する
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。