Heroku公開手順

今回はアプリケーションのHerokuへの公開手順
が複雑だったため、復習のため記事に残したいと思います。

## はじめに
作成したアプリケーションは、自らのPCでしか動かすことはできません。
サービスを公開するためには、どこかにサーバーを用意して、その中で作成したWebアプリケーションを動かす必要があります。この作業をデプロイと言います。
今回はアプリケーションの公開、運用を行うためのサーバーを提供するサービス、
Herokuのサービスを利用し、アプリケーションを公開しています。
Herokuを利用するには、アカウント登録が必要ですが、今回登録の仕方は書きません。

## バージョン
・Ruby 2.6.5
・Rails 6.0.0

## デプロイ手順

### CLIでHerokuの操作をできるようにする
CLIをインストールすると、herokuというコマンドが使用できるようになり、ターミナルからHerokuへアクセスが可能になります。
ターミナルにコマンドを実行する際は、公開したいアプリケーションのディレクトリで実行すると
ミスを防げるようになります。
ターミナルに以下のコマンドを実行します。

```
% brew tap heroku/brew && brew install heroku
```
実行しましたら、インストールできたか確認します。

```
% heroku --version

heroku/7.40.0 darwin-x64 node-v12.16.2
```
バージョンが表示されれば成功です。

### Herokuにログイン

以下のコマンドを実行し、emailとpasswordを入力します。

```
% heroku login --interactive
  => Enter your Heroku credentials.
# メールアドレスを入力し、エンターキーを押す
  => Email:
# パスワードを入力して、エンターキーを押す
  => Password:
```

### Herokuにアプリケーションを作成
ここから、アプリケーションをデプロイしていきます。
heroku createコマンドでアプリケーションを作成します。
名前はすでに、作成されている名前は使用できません。

```
# 必ずデプロイするディレクトリにいるか確認する。
% heroku create アプリケーション名
```

下記のコマンドで、作成できたか確認します。

```
% git config --list | grep heroku
```
fatal: not in a git directory以外が表示されていれば、このまま進みます。

### データベースの設定
データベースを設定します。
Herokuでは、使用するデータベースの設定が、デフォルトでPostgreSQLというデータベースになっています。
開発環境では、MySQLを使用しているため、同様にこちらに設定します。
ClearDBアドオンを追加することによって設定できます。
これを追加することにより、HerokuでMySQLを使用できるようになります。

```
% heroku addons:add cleardb
```
これでデータベースをMySQLに設定できました。しかし、Ruby on Railsを使う場合は、MySQLに対応するGemについて考慮する必要があり、そちらの設定の変更を行います。

```
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```
ClearDBデータベースのURLを変数heroku_cleardbに格納します。

```
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```
これで、データベースのURLを再設定できました。

### Heroku上にmaster.keyを設置

アプリケーションを開発する際、サーバーのアクセスキーやAPIキーなど、外部に漏らしたくない情報を扱う事があります。デプロイをする際、それらの情報はセキュリティの観点から暗号化する必要があります。暗号化された情報は、開発環境および本番環境であらかじめ用意した鍵を用いて復号（暗号化された情報を使えるように）します。

Railsのバージョン5.2以降では、credentials.yml.encを利用して、情報を暗号化します。

・credentials.yml.encファイル
Railsにて、外部に漏らしたくない情報を扱う際に用いるファイルです。
何が書いてあるかはわからないようになっていますが、credentials.yml.encと対になるmaster.keyが存在する場合、credentials.yml.encの暗号文を復号し、ファイル内の記述を確認できます。

・master.keyファイル
credentials.yml.encの暗号文を復号する、鍵の役割を持ったファイルです。特定の
master.keyはデフォルトで.gitignoreに記述されており、Gitで管理されない仕組みになっています。

credentials.yml.encファイルを暗号文が確認できます。
そして、以下のコマンドを実行すると、credentials.yml.encをmaster.keyによって復号し、
中身を確認できます。

```
% EDITOR="vi" bin/rails credentials:edit
```
確認後は、「escキー」→「:」→「q」と入力し、「enterキー」を押すと閉じる事ができます。


セキュリティの面から、master.keyはデフォルトでGitに管理されない仕組みとなっています。

Herokuへアプリケーションをデプロイする際、デプロイされるコードというのは、Gitで管理されているコードになります。master.keyはこのままだとHeroku上へデプロイできず、credentials.yml.encもHeroku上で扱えないということになります。
そこで、Heroku上には、環境変数としてmaster.keyの値を設置します。

環境変数とは、簡単に説明すると外部に漏らしたくない情報をしまっておく箱というような
感じのものです。
その環境変数を設定するためには、heroku configというコマンドを使用します。
Heroku上で環境変数の参照・追加・削除等をする場合に用います。
heroku config:set 環境変数名="値"と実行すると追加できます。

```
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```
RAILS_MASTER_KEYとうい変数の中に格納します。

以下のコマンドで格納できたかが確認できます。

```
% heroku config
```

### アプリケーションのプッシュ
Herokuで利用する環境を指定します。
Herokuには、Stackという環境が用意されています。

Stackとは、Herokuにおけるアプリケーションの動作環境のことです。Stackはデプロイされたアプリケーションを読み取り正常に稼働させるために用意されています。
デフォルトのStackは「Heroku-20」です。一方で、別のStackを選択することもできます。
今回、Rubyのバージョンが2.6.5のため、動作するStackを指定します。

```
% heroku stack:set heroku-18 -a アプリケーション名
```

次にgit push heroku masterを実行しましょう。

```
% git push heroku master
```

次に、Herokuにアプリケーションの情報を反映することができました。しかし、データベースにはマイグレーションの情報が反映されていません。

```
% heroku run rails db:migrate
```
これで、Heroku上でマイグレーションが実行できます。

下記のコマンドを実行しアプリケーションの詳細を確認します。

```
% heroku apps:info
```
URLが記載されているので、そちらにアクセスすると公開したアプリケーションを確認できます。

### 補足
git push heroku masterを実行した際に、「remote: ! Could not detect rake tasks」「remote: ! ensure you can run $ bundle exec rake -P against your app」とエラーが表示される場合、bundlerのバージョンがエラーの原因である可能性が高いです。
bunderのバージョンを変更します。

①現在入っている、bunderの削除

```
% gem uninstall bundler
```
何度か確認を求められるが、「y」を入力しenterを推します。

② bundlerのバージョンを指定してインストールします
今回は、2.1.4なので指定します。

```
%  gem install bundler -v '2.1.4'
```
③ Gemfile.lockを削除します
④ Gemfile.lockを作り直します

```
%  bundle install
```
⑤ 変更をGitHubへ反映させます
GitHubDesktopより、commit と pushを行います。
⑥ Herokuにアプリケーションの情報を追加します

```
% git push heroku master
```
エラーが出なければデプロイ完了です。

## 終わりに
以上がHerokuへの公開手順です。
環境により、やり方は異なると思いますので全てが
このやり方で成功するというわけではないのでご了承ください。