HerokuにRailsアプリをデプロイしてみた

# これは何
仕事でHerokuを使っていますが、デプロイまわりのことがあまりわかっていないので、試しにHerokuに簡単なRailsアプリをデプロイしてみた備忘録です。
`git push heroku master`で手軽にデプロイできました。
また、`Procfile`はherokuにアプリケーションの実行コマンドを指示するもの、ということを認識しました。

# 手順URL
公式のこちらのスタートガイドの手順に沿って進めました。
Rails5をデプロイする手順になっていましたが、現時点（2020/3）で最新のRails6にしました。
https://devcenter.heroku.com/articles/getting-started-with-rails5

他にも、Python、Goとかいろんな言語のスタートガイドが揃ってます。
https://devcenter.heroku.com/start

# 手順
## 1. [ローカルでアプリケーション準備](https://devcenter.heroku.com/articles/getting-started-with-rails5#local-setup)
- 開発マシンに[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)をインストールする必要があります。

- ローカルで、手順に沿ってRailsアプリケーションを新規作成します。
    - この手順に沿ってやると、Railsは現在の最新（現時点だとRails6)に勝手になります。（gem install railsコマンドでバージョンを指定していないため）
    - 記載がなかったのですが、ローカルで`rails server`する前に、以下コマンドでDBを作成する必要がありました。

    ```ruby
$ rails db:create
Created database 'firstapp_development'
Created database 'firstapp_test'

    ```

- ローカルで画面を確認します。
<img width="300" alt="local.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245454/7335999a-6298-e089-e15c-c83cb22dd350.png">

- ローカルで稼働確認が取れたら、gitリポジトリに保存します。

## 2. [Herokuにデプロイ](https://devcenter.heroku.com/articles/getting-started-with-rails5#deploy-your-application-to-heroku)

- Railsプロジェクトのディレクトリで、`heroku create`コマンドを叩くと、アプリケーションがHerokuに作成されます。（以下のコマンド内のアプリ名は公式記載のもの）
    - アプリ名を指定すれば指定のアプリ名で作成できますが、一意である必要があるので指定がむずかしい。。。
    - 今回は、アプリ名指定なしの`heroku create`を叩きました。アプリ名は勝手にランダムになります。

```bash
$ heroku create firstapp
Creating ⬢ firstapp... !
 ▸    Name firstapp is already taken
```

```bash
$ heroku create
Creating app... done, secret-tor-42278
https://secret-tor-42278.herokuapp.com/ | https://git.heroku.com/secret-tor-42278.git
```

- アプリがherokuに作成されました！herokuのコンソールで見れます。
    <img width="998" alt="heroku_new_app.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245454/73514d0d-8b90-febe-1304-4c920a77e755.png">
 

- herokuのリモート設定がプロジェクトに追加されたことを以下のコマンドで確認できます。

```
$ git config --list | grep heroku
remote.heroku.url=https://git.heroku.com/secret-tor-42278.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
```

- `git push heroku master`コマンドで、指定されているherokuのリモートにデプロイすることができます。

```
$ git push heroku master
remote: Compressing source files... done.
remote: Building source:
remote:
（略）
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/secret-tor-42278.git
 * [new branch]      master -> master
```

- デプロイ時のログは、コンソールからも同じものが見れそうです。
    <img width="1180" alt="build-log.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245454/b51c78cb-3f4c-e75f-9f16-c6480c9682cc.png">

## 3. [アプリケーション起動、アクセスする](https://devcenter.heroku.com/articles/getting-started-with-rails5#visit-your-application)

- デプロイしても、dynoが起動していないのでアクセスできないので、`heroku ps:scale web=1`コマンドでdynoを起動します。
- [dyno](https://devcenter.heroku.com/articles/dynos)はHerokuの構成の基本単位である軽量コンテナーです。
- デフォルトで、アプリケーションは無料のdynoにデプロイされます。無料のdynoの動作について詳しくは[こちら](https://devcenter.heroku.com/articles/free-dyno-hours)。
    - 無料のweb dynoは、30分、トラフィックを受信しないとスリープします。
    - 個人アカウントには、毎月550時間の無料のdyno時間が与えられます。超えるとその月はずっとスリープ状態になります。
    - 無料dynoの残り時間は、`heroku ps -a [アプリ名]`で確認できます。
 
```bash
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free
```

- dynoの状態を`heroku ps`コマンで確認します。

```bash
$ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2020/03/08 08:41:15 +0900 (~ 5m ago)

```

- `heroku open`コマンドで、ブラウザが開き、アプリケーションにアクセスできます。

```bash
$ heroku open
```

<img width="400" alt="heroku-app.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245454/c9c72505-cd5a-83a2-b0e6-68ea51ef7d1e.png">

## 4. [Webサーバーを構成する](https://devcenter.heroku.com/articles/getting-started-with-rails5#configure-your-webserver)
- デフォルトでは、アプリのWebプロセスは`rails server`で実行されますが、これをpumaに変えます。pumaの設定ファイルは、`config/puma.rb`です。
    - pumaの構成方法の詳細は[こちら](https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server)。
- HerokuにRailsアプリケーションの起動コマンドを指示するには、アプリケーションディレクトリのルートに`Procfile`を作成する必要があります。Procfileの詳細は[こちら](https://devcenter.heroku.com/articles/procfile)。
- Procfileというファイルを新規作成し、以下を書き込みます。

```bash:Procfile
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
```

- または、pumaの設定ファイルを指定します。

```bash:Procfile
web: bundle exec puma -C config/puma.rb
```

- `Procfile`を使った起動をlocalで試すには、`heroku local`を実行します。
    - `.env`ファイルを介してローカルで環境変数を管理することもできます。
    - `.env`ファイルは、ローカル環境のセットアップであるため、`.gitignore`に追加しておくと良いです。

```bash
$ echo "RACK_ENV=development" >>.env
$ echo "PORT=3000" >> .env
```

```bash
$ heroku local
[OKAY] Loaded ENV .env File as KEY=VALUE Format
9:04:22 web.1    |  Puma starting in single mode...
9:04:22 web.1    |  * Version 4.3.3 (ruby 2.6.5-p114), codename: Mysterious Traveller
9:04:22 web.1    |  * Min threads: 5, max threads: 5
9:04:22 web.1    |  * Environment: development
9:04:30 web.1    |  * Listening on tcp://0.0.0.0:3000
9:04:30 web.1    |  Use Ctrl-C to stop
```

- ローカルで確認が取れたので、 `Procfile`をgitに追加し、Herokuにデプロイします。

```bash
$ git add .
$ git commit -m "use puma via procfile"
$ git push heroku master
```

- `heroku ps`で見ると、pumaで起動していることが確認できます。

```bash
$ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bundle exec puma -C config/puma.rb (1)
web.1: up 2020/03/08 09:09:05 +0900 (~ 1m ago)
```

- herokuコンソールのResourcesタブでも、起動コマンドが見れました。  
<img width="600" alt="heroku-resources.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245454/64908c7c-0229-8350-912c-37ba9f48329e.png">


# 所感
本当に基本を試してみただけですが、Herokuへのデプロイはとてもお手軽でした。
herokuアカウントさえあれば無料枠でいろいろできそうです。（私はクレジット登録もまだしていないです）