目的
herokuへのデプロイの流れを忘れないようにするための備忘録。
Herokuへのデプロイの流れ
0. herokuのインストール
ターミナル上で以下コマンドを入力
% brew tap heroku/brew && brew install heroku
以下のようにバージョンが無事に表示できるようになれば問題ない。
% heroku --version
=> heroku/7.40.0 darwin-x64 node-v12.16.2
1. herokuへログイン
ターミナル上で以下コマンドを入力
% heroku login --interactive
=> Enter your Heroku credentials.
(メールアドレスを入力し、エンターキーを押す)
=> Email:sample@sample.com
(パスワードを入力して、エンターキーを押す)
=> Password:********
下記表示でログインが確認できる状態になれば問題なし。
Logged in as sample@sample.com
2. heroku上へアプリの作成を行う
ターミナル上で以下コマンドを実行
% heroku create アプリ名
% git config --list | grep heroku
=>`fatal: not in a git directory`以外が表示されていれば問題ない
3. heroku上でMySQLを使えるよう
Herokuでは、使用するデータベースの設定が、デフォルトでPostgreSQLというデータベースになっているため、開発環境で使用したデータベースに合わせ、要設定変更。
今回は、開発環境でMySQLを使用したため、MySQLに変更する。
# ClearDBアドオンを追加し、MySQLを使えるようにする
% heroku addons:add cleardb
これでデータベースをMySQLに設定できた。
しかし、Ruby on Railsを使う場合は、MySQLに対応するGemについて考慮し、その設定を変更する必要がある。
# ClearDBデータベースのURLを変数heroku_cleardbに格納
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
# データベースのURLを再設定
# mysql2というGemを使用しているので、DATABASE_URLの冒頭がmysql2://に変更されている
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
4. herokuで非公開の値を管理する
アプリケーションを開発する際、サーバーのアクセスキーやAPIキーなど、外部に漏らしたくない情報を扱う場面がある。
デプロイをする際、それらの情報はセキュリティの観点から暗号化する必要がある。
暗号化された情報は、開発環境および本番環境であらかじめ用意した鍵を用いて復号(暗号化された情報を使えるように)する。
Railsのバージョン5.2以降では、credentials.yml.enc(暗号化用ファイル)を利用して、それらの情報を暗号化する。
credentials.yml.encの暗号文は、master.keyを用いることで復号し、ファイル内の記述を確認できる。
master.keyは非常に重要な情報なので、デフォルトで.gitignoreに記述されており、Gitで管理されない仕組みになっている。
# credentials.yml.encをmaster.keyによって復号し、中身を確認・編集するためのコマンド
# credentials.yml.encとmaster.keyがない場合は、上記コマンドによりcredentials.yml.encとmaster.keyを新規作成した後に、中身を確認・編集することができる。
% EDITOR="vi" bin/rails credentials:edit
# 確認後は、「escキー」→「:」→「q」と入力し、「enterキー」を押して credentials.yml.encを閉じることができる
4.1 credentials.yml.encをリモートリポジトリに反映させる
credentials.yml.encを新規作成できた後は、一連の変更をコミット・プッシュして、リモートリポジトリに反映させる。
しかし、セキュリティの面から、master.keyはデフォルトでGitに管理されない仕組みとなっている。
つまり、master.keyはこのままだとHeroku上へデプロイできず、credentials.yml.encもHeroku上で扱えないということになります。
そこで、Heroku上に別途master.keyを設置し、Heroku上でもcredentials.yml.encを扱えるようにする必要がある。
4.2 環境変数(master.keyの値を入れる秘密の箱)を設定する
# Heroku上に環境変数を設定ためのコマンド
# config:set 環境変数名="値"で実行
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
# 環境変数一覧を確認できる
% heroku config
5. 動作環境を変更する
Stackという、Herokuにおけるアプリケーションの動作環境を変更する必要がある。
(Stackはデプロイされたアプリケーションを読み取り正常に稼働させるために用意されている。)
デフォルトのStackは「Heroku-20」ですが、今まで開発に使用してきたRubyのバージョンは、Heroku-20では使用できない。
そのため、Rubyのバージョン2.6.5が動作するStackを指定する必要がある。
# Herokuで利用するStackのver指定
% heroku stack:set heroku-18 -a アプリ名
6. herokuで使用するNodeのバージョンを指定する
環境構築の際、Nodeのversion14をインストールして、今までアプリ開発を行ってきた。
しかし、Herokuの初期設定ではNodeのversion16を使用する設定になっているため、このままでは正常なデプロイが行えない。
そのため、HerokuでもNodeのversion14を使用できるよう、使用するNodeのバージョンを指定する必要がある。
具体的には、Herokuのbuildpackという機能の使用や、package.json内の記述を変更して、使用するNodeのバージョンを指定する。
※buldpackとは、デプロイされたコードをHeroku上で適切に扱うために用意された、スクリプトのパッケージです。これがあることにより、Herokuで様々な言語のアプリを扱うことができている。
今回は、nodejsとrubyのbuildpackをインストールする。
# nodejsとbuldpackのインストール法
% heroku buildpacks:add heroku/nodejs
% heroku buildpacks:add heroku/ruby
# 「heroku buildpacks」コマンドの実行結果
=== アプリ名 Buildpack URLs
1. heroku/nodejs
2. heroku/ruby
と出れば問題なくインストールできている証拠。
# heroku/rubyがheroku/nodejsより上にきている場合は、下記のコマンドを順に実行して、buildpackの順番を入れ替える。
% heroku buildpacks:remove heroku/ruby
% heroku buildpacks:add heroku/ruby
% heroku buildpacks
続いて、使用するnodeのバージョンをpackage.jsonへ記述する。
まず、下記のコマンドを実行し、インストールされているnodeのバージョンを確認する。
% node -v
# 以下、実行結果の例(数字は異なる可能性がある)
v14.15.3
次に、package.jsonのファイルを開き、以下のように追記する。
{
"name": "アプリ名",
"private": true,
"dependencies": {
"@rails/actioncable": "^6.0.0-alpha",
"@rails/activestorage": "^6.0.0-alpha",
"@rails/ujs": "^6.0.0-alpha",
"@rails/webpacker": "4.2.2",
"turbolinks": "^5.2.0"
},
"version": "0.1.0",
"devDependencies": {
"webpack-dev-server": "^3.10.3"
}, // ここにカンマを記述
"engines" : {
"node": "14.x.x" // ここに先ほど確認したバージョンを記述
}
}
記述内容を変更したpackage.jsonをコミット・プッシュして、リモートリポジトリに反映。
7. herokuへアプリケーションを追加する。
Herokuにデプロイする際には、Gitの仕組みを使用する。Gitで管理しているリポジトリをHerokuへ反映することで、Heroku上で該当するアプリケーションの操作が可能になる。Gitで管理しているリポジトリをHerokuに反映するためにはgit push heroku masterというコマンドを用います。
% git push heroku master
8. heroku上でマイグレーションを実行
Herokuにアプリケーションの情報を反映することができた。
しかし、データベースにはマイグレーションの情報が反映されていない。
rails db:migrateを実行したいところですが、そのままコマンドを入力しても実行できない。
Heroku上で実行したいコマンドの頭には、heroku runをつける。
% heroku run rails db:migrate
9. 公開を確認する
#公開を確認するコマンド
% heroku apps:info
10. デプロイ済みのアプリケーションに変更修正を加えた場合
- 変更修正をcommitする
- ブランチを作成していた場合は、masterブランチへマージする
- Heroku上にpushする
(テーブルに変更を加えた場合は)Heroku上でマイグレーションを実行する