Rails+Docker+MySQLのアプリをHerokuへデプロイする手順とエラーになったポイント

この記事では、Herokuへのデプロイ手順と私が引っかかったエラーを書き留めています。
説明不足、理解不足なところもあるかと思いますので、その際はご教授いただけると嬉しいです。

<h2>バージョン</h2>
<ul>
 <li>Rails 6.1.3</li>
 <li>Ruby 2.6.8</li>
 <li>MySQL 8.0</li>
 <li>ストレージ AWS S3</li>
</ul>

<h2>Herokuへのデプロイでエラーになったポイント</h2>
最終的に以下の2つのポイントが原因でHerokuデプロイ時にエラーが出ていました。
<h3>bundlerバージョンが違う</h3>
Herokuではデフォルトのbundlerバージョンが指定されています。
Gemfile.lockの末尾で確認できるBUNDLED WITHが
2.〜の場合はbundler2.0.2が、
1.〜の場合はbundler1.17.3が
指定がない場合はbundler1.17.3のバージョンが使われます。
私の場合、Ruby 2.6を使用していたため、bundlerバージョン1.17.2が入っており、これがHerokuデフォルトのbundlerバージョンである1.17.3より古いバージョンであることが原因で、デプロイ時エラーになっていたことが考えられます。
また、Ruby2.6からbundlerは組み込みになったため、bundlerの追加はできても、組み込みのbundlerバージョン自体は削除できません。
そのため、原則はRubyに組み込まれているbundlerのバージョンのままHerokuにデプロイするのが良さそうです。
<h3>環境変数の未設定</h3>
これはHerokuの仕組みをよく理解していないことから起こったイージーミスでした。。
環境変数の設定は下記で順番に説明していきます。
また、すでにHerokuにはログインしている前提で話を進めていきます。
<h2> config/database.yml を設定する</h2>

```config/database.yml
production:
  <<: *default
  database: <%= ENV['APP_DATABASE'] %>
  username: <%= ENV['APP_DATABASE_USERNAME'] %>
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>
  host: <%= ENV['APP_DATABASE_HOST'] %>
```
まずこのように環境変数を設定します。
なお、環境変数は任意の名前で設定します。
私の場合は「APP_DATABASE〜」としています。

<h2>Herokuにアプリを作成</h2>

```
$ heroku create アプリ名
```

これでHerokuにアプリが登録されます。
このアプリ名は世界中で名前がカブらないように設定しないとエラーになります。

```
$ heroku create
```

また、アプリ名を指定しなければ、Herokuがカブらないアプリ名を自動で作成してくれます。
<h2>Herokuにデータベースを作成</h2>

```
$ heroku addons:create jawsdb:kitefin
```

私は開発環境でMySQL8.0を使用しており、本番環境でもバージョンを統一させるためにjawsDBを選択しました。
（ちなみにclearDBがMySQL5.7まで対応のためです）
今回は説明用のため無料プランであるkitefinを入力しています。

```
$ heroku addons:create jawsdb:kitefin -a herokuのアプリ名 --version=8.0
```

またこのように入力すればバージョンの指定もできます。
現在のjawsDB MySQLデフォルトのデータベースバージョンは8.0となっているため、コマンドで指定しなくても8.0がcreateされます。
<h2>Herokuに各環境変数をセットする</h2>
環境変数の設定作業はHeroku上からでも設定できますが、今回はコマンド入力で進めていきます。
Heroku上で設定する場合、Herokuのアプリを開き、Settingsの中の「Config Vars」というところから環境変数をAddできます。
<h3>データベースURL</h3>

```
$ heroku config:get CLEARDB_DATABASE_URL
```

まずはこちらのコマンドを入力し、DB接続情報を確認します。
表示された情報を元に下記コマンドでMySQL2のURLをセットします。

```
$ heroku config:set DATABASE_URL='mysql2://ユーザー名:パスワード@ホスト名/データベース名?reconnect=true'
```

<h3>ユーザー名</h3>
続いて先程のユーザー名の部分をコピーして次のように変数をセットします。


```
$ heroku config:add APP_DATABASE='ユーザー名' -a アプリ名
```

<h3>パスワード</h3>

```
$ heroku config:add APP_DATABASE_PASSWORD='パスワード' -a アプリ名
```

パスワードも同じように入力します。
<h3>ホスト名</h3>

```
$ heroku config:add APP_DATABASE_HOST='ホスト名' -a アプリ名
```

ホストも同じように入力します。
<h3>データベース名</h3>

```
$ heroku config:add APP_DATABASE_HOST='データベース名' -a アプリ名
```

続いてデータベース名も入力。
<h3>S3アクセスキーID</h3>
AWS　S3をストレージとして使用している場合も同じように環境変数を設定していきます。

```
$ heroku config:add AWS_ACCESS_KEY_ID='アクセスキーID' -a アプリ名
```

<h3>S3シークレットアクセスキー</h3>

```
$ heroku config:add AWS_SECRET_ACCESS_KEY='アクセスキーID' -a アプリ名
```

もし、Google mapなどのAPIをアプリケーションで使っているなら、そちらのAPIキーも同じように入力していけばOKです。
<h2>Herokuにアプリをデプロイする</h2>
環境変数の設定ができたら、いよいよデプロイに入ります！

```
$ git add .
```

ステージング環境にaddします。

```
$ git commit -m "heroku first commit"
```

ローカルリポジトリにコミットして

```
$ git remote add heroku Herokuのgit　URL
```

Herokuと繋ぎます。
git URLはHerokuのアプリページの中のSettingsで確認することができます。
(コマンドを入力したあと、error: remote heroku already exists.と出たらすでにこの作業は完了しています。)

```
https://git.heroku.com/アプリ名.git
```

URLはこのようになっています。

```
$ git push heroku master
```

あとはHerokuにpushすればアプリのデプロイは完了です。
ブランチを切って作業している場合は

```
$ git push heroku ブランチ名:master
```

こちらのコマンドでpushします。
最終的には環境変数の設定は以下のようになりました。
JAWSDB_URL以下の環境変数はデプロイ時に設定されたものです。
![スクリーンショット 2021-08-08 23.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194218/e846e174-ce70-fde7-8f8c-7e791ef0e0c6.png)

<h2>最後にrails db:migrate</h2>
上記の設定でデータベースの作成までが完了しているため、最後に

```
$ heroku run rails db:migrate
```

こちらのコマンドを入力すれば、デプロイしたアプリケーションが正常に起動するはずです！
もし、エラーが出たときは、その都度

```
$ heroku logs --tail
```

こちらのコマンドでlogを確認してエラーの原因を探ります。
また、エラーを確認するために便利なaddons（papertrailなど）も用意されていますので、ご興味の有る方は調べてみてください。
この記事が、Herokuデプロイで困っている方の助けになると嬉しいです。
また誤っている箇所があれば、ご指摘いただけると非常に助かります。

##参考
https://devcenter.heroku.com/articles/jawsdb