Herokuデプロイ最速手順（MySQL）

###
ようやくHerokuを使ってデプロイが出来ました。
AWSよりは簡単にデプロイ出来ましたが、少し詰まったところもありましたので、
Herokuへのデプロイ最速手順を備忘録として残します。

## 参考にさせていただいたページ
- [RailsアプリをHerokuにデプロイ（MySQL）](https://qiita.com/rainbow___0/items/1789920cf797b5e80a5e)  

- [Heroku ClearDBにSequel Proから接続する](http://hhmmm.hateblo.jp/entry/2016/02/15/204638)


## 事前準備
- Herokuアカウントを取得しておきましょう  
[Heroku公式サイト](https://jp.heroku.com/)  
- HerokuでMySQLを使用するためにクレジットカードを登録しておきましょう  
(Herokuの右上のユーザー情報から"Account Setting" → "Billing"にてクレジットカードを設定できます)  
※ 超過しない限り請求されることはありません。
- gitへデプロイするアプリの保存をしておきましょう


## HerokuのCLIを導入
```:ターミナル
$ brew install heroku/brew/heroku
```
## Herokuコマンドが使えるか確認
```:ターミナル
$ heroku -v
herokuのバージョンが出てくればherokuコマンドが使えるので問題ありません

 ›   Warning: heroku update available ・・・・・
と表示された場合は下記コマンド入力してherokuをバージョンアップしましょう

$ heroku update
```
## Herokuのリポジトリ用のアプリを作成
```:ターミナル
$ cd <デプロイしたいアプリ>

$ heroku create <アプリ名>
#ここで入力したアプリ名がURLに入ります(https://<アプリ名>.herokuapp.com)

$ heroku rename <変更したいアプリ名>
#アプリ名を変更した場合はこちらを入力
```
Herokuホームページでもリポジトリは作成できますが、
今回はCLIでのデプロイ方法となりますので割愛いたします。

## Databeseを設定
```javascript:config/database.yml
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
  database: <%= ENV['DATABASE_USERNAME'] %>
  username: <%= ENV['DATABASE_PASSWORD'] %>
  password: <%= ENV['RAILS_MASTER_KEY'] %>
```

## プリコンパイルの設定

**※こちらはアプリケーションのパフォーマンスに悪影響を及ぼす場合はあるため設定しないでください。**

以下Herokuのヘルプページより引用

>本番環境でアプリケーションの config.assets.compile = true を有効にすると、アプリケーションが非常に低速になる場合があります。
>(中略)
>この設定は、実行時にその他の不安定な動作の原因になることも知られているため、通常は推奨されません。
>
>[Heroku での Rails アセットパイプライン | Heroku Dev Center](https://devcenter.heroku.com/ja/articles/rails-asset-pipeline#compile-set-to-true-in-production)

```ruby:config/environments/production.rb
config.assets.compile = true
```
~~Railsは本番環境での動的な画像の表示(プリコンパイル)がデフォルトでオフになっています。~~
~~画像を表示するために以下の記述を`false`から`true`に変更してください。~~
~~この記述により、assets以下のフォルダから動的にコンパイルしながらページを読み込みます。~~
~~また、以下の内容も指定のディレクトリに記述してください。~~  

**※以下も現在は使われない設定値のため、特に記述する必要はありません。**

```ruby:config/application.rb
config.assets.initialize_on_precompile = false
```
~~こちらは本番環境にて、プリコンパイルのタスクをRailsの起動無しで実行するように指定します。~~

尚、Herokuにデプロイ後、ブラウザで画像が表示されない場合は、以下記事を参考に画像の拡張子やパスを再度確認してみましょう。


https://qiita.com/jnchito/items/3d225112a3ac95379b1d


(@jnchitoさんありがとうございます)

## HerokuでRailsが使えるようgemを導入
**※Rails 5以降ではこのgemのインストールは必要ありません。**  

```:Gemfile
gem 'rails_12factor', group: :production
```
入力後`bundle install`も忘れずに。

## HerokuでMySQLを使用するため、環境変数を設定
```:ターミナル
$ heroku addons:create cleardb:ignite
#CLEARDB_DATABASE_URL: mysql://ユーザー名:パスワード@サーバー名/データベース?reconnect=true
```
`cleardb`というのがherokuでmysqlを使うためのアドオンになります。


## 環境変数を追加
```:ターミナル
$ heroku config:set DATABASE_URL=""
""の間に値を入れて追加していきます
（DATABASE_URLの部分をDB_PASSWORDやDB_USERNAMEに変える）

$ heroku config:set DB_USERNAME=""　　#任意
$ heroku config:set DB_PASSWORD=""　　#任意
$ heroku config:set SECRET_KEY_BASE=""　#下記のコマンドを入力して確認
```

```:ターミナル
$ bundle exec rake secret RAILS_ENV=production
ここに出てくるデータがSECRET_KEY_BASEの値になります
```

環境変数は`heroku config`コマンドで確認が出来ます。
`heroku config`を入力し、入力した内容が反映されていれば完了です。

## データベースのバージョンに注意
`heroku config`で環境変数を確認すると以下の様に出力されます。

```:ターミナル
=== <アプリ名> Config Vars
CLEARDB_DATABASE_URL:     mysql://bc***********f:9******6@us***********************05.cleardb.net/heroku_**************36?reconnect=true
DATABASE_URL:             mysql://bc***********f:9******6@us***********************05.cleardb.net/heroku_**************36?reconnect=true
DB_PASSWORD:              **********
DB_USERNAME:              **********
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          e1b523***************89c41048d********************dd7f24****************f38bce8f************bbb*************0462bcf5*************cb052e7
```
`CLEARDB_DATABASE_URL`と`DATABASE_URL`が`mysql`を使用する設定となっておりますが、
デプロイするアプリが**`mysql2`**を使用する場合は、どちらも`mysql2`に変更しないとページが表示されないので注意してください。  
**変更する際はHerokuのマイページより対象のアプリを選択、ダッシュボード内の`setting`の中にある`Config Vars`の`Reveal Config Vars`をクリックすると環境変数が表示されますので、そこで変更しましょう。**

## Herokuにpushし自動デプロイを行います
```:ターミナル
$ git push heroku master
```
```:ターミナル
remote: -----> Discovering process types
remote:        Procfile declares types     -> (none)
remote:        Default types for buildpack -> console, rake, web
remote: 
remote: -----> Compressing...
remote:        Done: 51.6M
remote: -----> Launching...
remote:        Released v26
remote:        https://<アプリ名>.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/<アプリ名>.git
   6d73aed..b64f81f  master -> master
```
このような表示が出てきたら、ひとまずデプロイは完了です！

## デプロイが完了したら本番環境でアプリを開きましょう
```:ターミナル
$ heroku open
```
ちゃんと本番環境で表示がされているか確認してみましょう。

## 本番環境上のログを確認するコマンド
```:ターミナル
$ heroku logs
```
本番環境でのログが確認できます。
**ページが表示できない**時や**遷移したページが表示されない**時は、
入力してエラー内容を確認してみましょう。

##その他使用したコマンド
```:ターミナル
$ heroku run rake db:migrate　
# ローカルでマイグレーションファイルを追加した際は再度デプロイ後マイグレーションファイルの更新が必要

$ heroku run rake db:reset
# ローカルでのコマンド同様、本番環境でデータベースをリセットしたい時に使用

$ heroku run rake db:seed
# seedに初期データを登録していて本番環境のデータベースをリセットした際、再度seedを読み込むために必要
```

## Heroku ClearDBとSequel Proを繋げる方法
本番環境のデータベースのレコードを見たい時ありますよね。
そんな時は`Sequel Pro`に繋いじゃいましょう！

```:ターミナル
$ heroku config --app <アプリ名>
=== アプリ名 Config Vars
CLEARDB_DATABASE_URL: mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
〜〜〜〜
```
`CLEARDB_DATABASE_URL`の中身は上記のようなルールになっています。
これを`Sequel Pro`を立ち上げた際の接続情報に入力してあげればいいわけです。
<img width="527" alt="スクリーンショット 2020-06-13 14.51.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642721/bd43f20e-36fa-423c-b2a1-f4267c40c779.png">
`ホスト`・`ユーザー名`・`パスワード`の部分は`CLEARDB_DATABASE_URL`からコピー、
`データベース`・`ポート`は入力しなくても構いません。
`名前`は任意ですのでわかりやすい名前をつけて接続をクリックすれば完了です。