RailsアプリをHerokuへデプロイ＆SSL化する

## この記事は
ローカルで作成したRailsアプリをHerokuへデプロイし、SSL化する手順をまとめた記事です。

## 想定する状態
- Railsアプリをローカルで作成済み
- ソースコードをGitHubにプッシュ済み

## ゴール
- RailsアプリをHeroku上で表示できる
- SSL化（https://...)されている

![スクリーンショット_2020-03-08_15_39_25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/53988d67-2f53-f6da-96fa-a3a7c6714106.jpeg)

## 環境
- Ruby 2.5.7
- Rails 5.2.3

## 手順
### 1. Herokuに新規登録する
以下のHeroku公式サイトから、新規登録（無料）を行います（画面右上）。
[Heroku: Cloud Application Platform](https://jp.heroku.com/)

<img width="600" alt="スクリーンショット_2020-03-08_15_03_55.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/c917e7c4-ef28-1229-0a77-a58fc8369f7d.jpeg">

基本は指示に従っていけば登録できますが、詳しい手順が知りたい方は以下のサイトを参考にしてみてください。

[https://www.sejuku.net/blog/8178](https://www.sejuku.net/blog/8178)

### 2. Heroku用のデータベースをインストールする
Herokuでは**PostgreSQL**というデータベースを使用します。
開発環境でもPostgreSQLを使用している場合はこの章は不要なのですが、sqlite3やMySQLなどを使っている場合はHeroku用にPostgreSQLを用意する必要があります。

#### 2-1. Gemfile書き換え

例えば開発環境ではsqlite3を使っていた場合、Gemfileを次のように書き換えます。

```rb:Gemfile
group :development, :test do # 開発環境、テスト環境
  gem 'sqlite3' # sqlite3
end

group :production do # 本番環境
  gem 'pg' # PostgreSQL
end
```

#### 2-2. gemのインストール
書き換えたGemfileを反映するため、bundle installします。

```rb
$ bundle install
```

#### 2-3. config/database.ymlの書き換え

データベースの設定ファイルを、次のように書き換えます。

```rb
# 変更前
production:
  <<: *default
  database: db/production.sqlite3

# 変更後
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

### 3. Herokuへログインする

ターミナルで次のコマンドを打ち込みます。

```rb
$ heroku login
#=> heroku: Press any key to open up the browser to login or q to exit:  # Enterする
```

するとブラウザで次の画面が開きます。

<img width="600" alt="スクリーンショット_2020-03-08_15_03_55.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/955e087b-d959-1198-8d6f-5ee322249246.png">

画面からログイン処理を行うと、ログインが成功します。
ターミナルにも次のように表示されます。

```rb
Logging in... done
Logged in as <登録したメールアドレス>
```

### 4. Heroku上でアプリ作成

サービス名（サイト名）を決めて、次のコマンドを実行します。

```rb
heroku create <サービス名>
#=> Creating ⬢ <サービス名>... done
#    https://<サービス名>.herokuapp.com/ | https://git.heroku.com/<サービス名>.git
```

無事アプリが作られていれば、https://<サービス名>.herokuapp.com/にアクセスすると次のようになっているはずです。
![スクリーンショット 2020-03-08 9.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/8f5a263b-db1a-3bc0-161a-f1370da321c8.png)


### 5. Herokuへソースコードをプッシュ
さあ、いよいよHerokuにソースコードをアップしていきます（ソースコードがGitHubで管理されていることが前提です）。

次のコマンドを打ち込んでください。

```rb
$ git push heroku master
...
# remote: Verifying deploy... done.
# To https://git.heroku.com/<サービス名>.git
#  * [new branch]      master -> master
```

上のように、deploy doneになれば成功です。
この状態で先ほどの画面をURLをリロードすると、次のように表示が変わっているはずです。

![スクリーンショット 2020-03-08 9.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/62a47203-6f9f-8d69-1e27-4160f8f3bf4e.png)

正常に表示されていないのは、まだHeroku上のデータベースが更新されていない（マイグレーションが行われていない）ことが原因です。
なので次のコマンドを打ってください。

```rb
$ heroku run rake db:migrate
```

これがうまくいけば、先ほどのURLで無事トップページが表示されているはずです。

![スクリーンショット_2020-03-08_15_39_25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465401/53988d67-2f53-f6da-96fa-a3a7c6714106.jpeg)

### 6. SSL化
ここまで来ればもう一息です。
最後にHerokuページをSSL化します...といっても、実はURLを見るとわかるように既にSSL化されています。
これはHerokuが気を利かせてくれたおかげなのですが、アプリ側でもより安全な設定に変更しておきましょう。

#### 6-1. production.rbの修正
本番環境ではSSLを強制するように設定を修正します。

```config/environments/production.rb
Rails.application.configure do
  .
  .
  config.force_ssl = true  # コメントアウトを外す
  .
  .
end
```

#### 6-2. WebサーバーはPumaを使う
HerokuではデフォルトでWEBrickというWebサーバを使っていますが、高トラフィックを捌くのには不向きで本番環境において適切なサーバではありません。
そこで、代わりにPumaを使うことにします。

本番環境のWebサーバー設定ファイルとして、以下を修正します。
※詳しく知りたい方は[HerokuのPumaのドキュメント](https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server)を参照してください。

```config/puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/
  # deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end
```

最後にProcfileをルートディレクトリの直下（Gemfileと同じ階層）に作成します。
これは、Heroku上でPumaを走らせるための設定ファイルになります。

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

以上で設定は完了です。
お疲れ様でした！

## 参考
[heroku公式ページ（https://devcenter.heroku.com/articles/heroku-cli）](https://devcenter.heroku.com/articles/heroku-cli)

[Railsチュートリアル（https://railstutorial.jp/）](https://railstutorial.jp/)

[挫折した人必見！HerokuでRailsアプリを公開する方法（https://www.sejuku.net/blog/8178）](https://www.sejuku.net/blog/8178)