Herokuへのデプロイ方法【Heroku+Rails+MySQL】

## 本記事について
RailsアプリをHerokuへデプロイする機会があったので、備忘録として当記事を作成しました。
ほぼ参考にさせていただいたサイトや記事の通りですが、自分が詰まった部分については詳しく記載しました。

:::note warn
**2023/3/26追記:**
現在、herokuの無料プランは終了しています。
:::

## 環境:
- MacOS 10.13.4
- Rails  5.2.0
- DB: MySQL

## Railsプロジェクト作成
[脳死 rails new するためのコマンド - Qiita](https://qiita.com/murakami-mm/items/0e2adf68de27dbf54461)　参照  
※Herokuのアプリ名には、英数字とハイフンしか使用できないので、このとき作るアプリの名前も英数字とハイフンで作成すること!!!

## 作成したRailsプロジェクトのGit管理
- Gemfile修正  
`sqlite3`が入っている場合、production環境でsqlite3が利用されないように修正する。

```
gem 'sqlite3', group: [:development, :test]
```

`mysql2`を追加

```
gem 'mysql2'
```

- コマンドライン上で、作成したRailsプロジェクトのディレクトリに移動
- 以下のコマンドを実行すると、プロジェクトがGitで管理されるようになる。

```
$ git init
$ git add .
$ git commit -m "<適当なコミットメッセージ>"
```

- 以下のコマンドで、コミットログに問題がないか確認

```
$ git log
```

## Herokuのアカウント作成

https://jp.heroku.com/ を参照

## Herokuのtoolbeltインストール


- これをインストールすると、コマンドライン上でherokuコマンドが使えるようになります。  
https://devcenter.heroku.com/articles/heroku-cli

```
$ brew tap heroku/brew && brew install heroku
```

- Herokuのバージョンを確認

```
$ heroku -v
```

## SSHキーの追加

### キーの作成(現在作成中)
SSHキーの設定関連(現在作成中)

- 参考: https://devcenter.heroku.com/articles/keys

### 作成したHerokuアカウントにキーを追加  

- herokuにログイン

```
$ heroku login
```

- 以下のコマンドでSSHキーがherokuのアカウントに追加されます。

```
$ heroku keys:add ~/.ssh/id_rsa.pub
```

※`id_rsa`の部分は、先ほど作成したSSHキーの名前に置き換えること。

- 追加に成功していれば、以下のコマンドで追加したSSHキーが確認できます。

```
$ heroku keys
```

## Herokuにアプリケーションを作成
- コマンドライン上で、先ほど作成したRailsプロジェクトのディレクトリに移動
- Herokuにアプリケーションを作成

```
$ heroku apps:create <アプリの名前>
```

`<アプリの名前>`には、先ほど作成したRailsプロジェクト名を入れる。  
※Herokuのアプリ名には英数字とハイフンしか使えない。

- Herokuのリモートリポジトリを確認

```
$ git remote -v
```

上記コマンドを実行すると以下のように出力される。

```
heroku  https://git.heroku.com/<アプリの名前>.git (fetch)
heroku  https://git.heroku.com/<アプリの名前>.git (push)
origin  git@github.com:shou1012/<アプリの名前>.git (fetch)
origin  git@github.com:shou1012/<アプリの名前>.git (push)
```

- Herokuのアプリケーション名変更  
上記手順で出力された`<アプリの名前>`が異なっている場合、以下のコマンドでHerokuのアプリケーション名が変更できる。

```
$ heroku git:remote -a <変更後のアプリの名前>
```

## HerokuのDB設定
### DBを追加する
下記コマンドを実行すると、「ClearDB MySQL」というアドオンが「Igniteプラン」で追加される。

```
$ heroku addons:create cleardb:ignite
```

以下のようなエラーが出た場合は、Herokuアカウントでクレジットカード情報の登録が必要。

```
▸    Please verify your account to install this add-on plan (please enter a credit card) For more
▸    information, see https://devcenter.heroku.com/categories/billing Verify now at
▸    https://heroku.com/verify
```

※アドオンの追加にはクレジットカード情報の登録が必要だが、「Igniteプラン」は無料のため、この設定だけで料金が発生することはない。(2022/3/20(Sun)現在)  
詳細は[このURL](https://elements.heroku.com/addons/cleardb)を参照

### Herokuアプリの環境変数設定
- ClearDBのURL確認  
以下のコマンドで、ClearDBのURLが確認できる。

```
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```

- 環境変数の設定  
上記コマンドで表示されたそれぞれの値を変数に設定する。

```
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```

※ RailsのGemfileで'mysql2'を使用しているので、`DATABASE_URL`は`mysql2://`で始める必要がある。  
設定内容を確認すると、以下のように表示される。

```
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DATABASE_URL:         mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DB_HOSTNAME:          <ホスト名>
DB_NAME:              <データベース名>
DB_PASSWORD:          <パスワード>
DB_PORT:              3306
DB_USERNAME:          <ユーザー名>
```

## Herokuへデプロイ
### Railsプロジェクトに必要な準備
- `config/environments/production.rb`に以下を追記  
(この辺りの設定に関しては、後々修正します。)

```
config.assets.compile = true
config.assets.initialize_on_precompile=false
```

- rootへのルーティング作成
Herokuでアプリケーションにアクセスした時、最初に開くページをRails側で設定してください。

### Herokuへデプロイ
- ローカルリポジトリをHerokuへpush

```
$ git push heroku master
```

※`master`以外のローカルブランチをpushする場合は、以下のコマンドを実行してください。

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

- HerokuのDBのmigrate

```
$ heroku rake db:migrate
```

- アプリケーションにアクセス
以下のコマンドを実行すると、ブラウザでアプリケーションが開きます。

```
$ heroku open
```

## 参考サイト・記事
- [Deploying with Git | Heroku Dev Center](https://devcenter.heroku.com/articles/git)
- [mysqlを使ったRailsアプリをHerokuにデプロイする流れ](https://qiita.com/shou1012/items/bf55a185920e717f4011)
- [HerokuでMySQLを使おうとして詰まったところ](https://qiita.com/senou/items/108ef1d94dcb5b227b4f)