[Rails] Herokuにアプリをデプロイする

##はじめに
今回はHerokuにRailsアプリケーションをデプロイする方法を記事に残しておきたいと思います。
よろしくお願いします。


##Heroku
Herokuはアプリの公開、運用をするために用いられるサーバー提供をするサービスです。
デプロイの手間が比較的簡単で、無料なので使用されている方々が多いかと思います。

早速、はじめていきます。
HerokuのデフォルトのデータベースはPostgreSQLですが、私はMySQLを利用しています。
一応、データベースの変更方法も記載しています。

#Heroku CLIをインストール

まずはターミナルでherokuのコマンドが使えるようにHeroku CLIをインストールします。
ターミナルで下記のコマンドを実行します。

```terminal:ターミナル
% brew tap heroku/brew && brew install heroku
```

その後、```heroku --version```コマンドを実行するとバージョンが表示されます。
もし表示されなかった場合、インストールできていません。


##Herokuにログイン
この記事はHrokuのアカウント作成は既に終えているものとして進めています。
もしまだできていないという方はこちらから作成してください。↓
https://signup.heroku.com/login

ログインのためのコマンドを打って、必要事項を入力します。

```terminal:ターミナル
# Herokuへログインするためのコマンド
% heroku login --interactive
  => Enter your Heroku credentials.
# メールアドレスを入力し、エンターキーを押す
  => Email:
# パスワードを入力して、エンターキーを押す
  => Password:
```

```Logged in as　'あなたのメールアドレス'```と表示されれば問題なくログインできています。

##Heroku上にアプリを作成する
それではHerokuにアプリを作成していきます。
まずはターミナル上でデプロイしたいアプリのディレクトリ上に移動してください。

アプリのディレクトリに移動できたら、下記のコマンドで作成します。

```terminal:ターミナル
% heroku create アプリ名
```

ちなみにアプリ名は一意性なので誰かとかぶらない名前でなければなりません。

正しく設定できたか確認してみましょう。
下記のコマンドを打ち込みます。

```terminal:ターミナル
% git config --list | grep heroku
```

```fatal: not in a git directory```以外が表示されていれば、このまま進んで問題ありません。

##HerokuでMySQLを使う
デプロイの前にデータベースをデフォルトのPostgreSQLからMySQLに変更します。これはローカルで私が作成したアプリのデータベースがMySQLだったためなので、必須ではありません。

これを実現するためにClearDBアドオンというMySQLを使うためのツールを利用します。これを追加するとHerokuでデータベースを使うことができます。
下記のコマンドを実行します。

```terminal:ターミナル
% heroku addons:add cleardb
Creating cleardb on ⬢ ajax-app-123456... free
Created cleardb-vertical-00000 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation
```

このように出力されていればOKです。WARNなどの警告があったとしても問題ないです。
これでMySQLに設定は完了していますが、Railsを使う場合はMySQLに対するGemのことも考えてあげる必要があるのでその設定を変更します。

下記のコマンドを入力します。

```terminal:ターミナル
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```

これはClearDBデータベースのURLを変数```heroku_cleradb```に格納しました。


続いて下記のコマンドを実行します。

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


##Heroku上にmaster.keyを設置する
Railsアプリでは、外部に漏らしたくない情報をcredentials.yml.encファイルに記述します。このファイルはそのまま開くと暗号化されているため中身を確認できません。しかしmaster.keyファイルで中身を確認することができます。
この二つのファイルはrails newした時に自動で作成されています。master.keyは.gitignoreに記述されているのでGitでは管理されない仕組みになっています。

もしcredentials.yml.encファイルの中身を表示させ、編集する場合は下記のコマンドで実行できます。
もしこの二つのファイルがない場合もこのコマンドで自動生成をした後、中身を確認できます。
今回は特にいじらないので実行しなくてもいいです。

```terminal:ターミナル
% EDITOR="vi" bin/rails credentials:edit
```

確認した後は「escキー」→「:」→「q」と入力し、「enterキー」で閉じれます。


とにかく言いたいことはcredentials.yml.encファイルの中身はちゃんとあるけど、master.keyがないと中身の記述が動かないので、master.keyも一緒にHerokuにあげなきゃだめだよね。でも、これって、生で扱っちゃまずいよね。。。ということです。

なので環境変数にmaster.keyの値を入れて外部にmaster.keyの情報が漏れるないようにする且つ、使えるようにするのです。

下記の記述でHeroku上に環境変数を設定します。

```terminal:ターミナル
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

これでRAILS_MASTER_KEYという環境変数にmaster.keyが格納されたはずです。

下記のコマンドで確認できます。

```terminal:ターミナル
% heroku config
```

この作業はherokuにプッシュする前に行いましょう。


##動作環境を変更する
HerokuにはStackという環境が用意されています。これはデプロイされたアプリを読み取り正常に稼働させてくれる動作環境のことです。
デフォルトのStackは「Heroku-20」ですが、私が作成したアプリはRubyのバージョン2.6.5で、動作しないらしいです。

なので利用するStackを「Heroku-18」に指定する必要があります。
下記のコマンドを実行します。

```terminal:ターミナル
% heroku stack:set heroku-18 -a ajax-app-アプリ名
```

##Herokuへプッシュ
いよいよデプロイです。Herokuはデプロイする際にGitの仕組みを使用します。
下記のコマンドでHerokuへプッシュできます。

```terminal:ターミナル
% git push heroku master
```

##マイグレーションファイルを実行
データベースへマイグレーションの情報がまだ反映できていません。
下記のコマンドでマイグレーションします。

```terminal:ターミナル
% heroku run rails db:migrate
```

これらが全てうまくいけばデプロイ成功です。

##公開確認
ちゃんと公開できているか確認しにいきます。
下記のコマンドを実行します。

```terminal:ターミナル
% heroku apps:info
```

すると```web URL```という項目が出てきます。そこに記載されているのが、アプリが公開されているURLです。

##最後に
初めてネットに自分のアプリを公開するときはなんだかワクワクしました。
いつかいろんな人が使えるアプリを公開できたらなあと思います。