Rails7.0 + Herokuで初めての本番環境へのデプロイ!!

## やったこと
Ruby on Railsで作成した自作アプリをHerokuでデプロイしました。
デプロイする上で多様な情報に埋もれてかなり詰まったので、その方法・手順を整理していきます！

## 開発環境
* macOS Monterey
* Ruby 3.1.2
* Ruby on Rails 7.0.4
* Heroku
* MySQL 8.0
* GitHub

# デプロイの手順
1. Rails上のファイルの設定
1. Herokuの登録・設定
1. （:construction:WIP）追加の設定（SSL, Redis, credentials, ActiveStorage）　

## 1. Rails上のファイルの設定
1. config/database.ymlについては、`DATABASE_URL`という環境変数をHeroku上で後に設定すればそれ以外の環境変数は不要。（[参考](https://qiita.com/dawn_628/items/4160fec4f476491c1953)）
    ```yml:config/database.yml
    production:
      <<: *default
    ```
1. config/environments/production.rbはデフォルトのままでOK。（[参考](https://qiita.com/jnchito/items/3d225112a3ac95379b1d)）

1. Procfileの作成（[参考](https://devcenter.heroku.com/ja/articles/procfile)）
    サーバープロセスのブート方法を明記。
    ```:Procfile
    web: bin/rails server -p $PORT -e $RAILS_ENV
    worker: bundle exec sidekiq
    ```

1. 上記の変更をgitにコミットしておく。

## 2. Herokuの登録・設定
1. [こちら](https://signup.heroku.com/)からHerokuのアカウント作成

1. Heroku CLIをインストール
    ```sh
    $ brew tap heroku/brew && brew install heroku
    ```
1. Herokuにログイン（ → herokuコマンドが使える状態に）
    ```sh
    $ heroku login
    ```

1. Heroku上でアプリを作成。ソースコードをHerokuが受け取れるようになる。`heroku`というリモートリポジトリが追加される。`<アプリ名>`には自身のアプリの名前を入れる。（ただし重複不可）
    ```sh
    $ heroku apps:create <アプリ名>
    ```

1. 本番環境でMySQLを使うためにJawsDBアドオンを追加。`<プラン名>`には現時点で無料プランの`kitefin`を入れた。
（[JawsDBを使う理由](https://qiita.com/haruyan_hopemucci/items/14e0dbeb0aedd85a74ee)、[MySQLのバージョン指定方法](https://dhate.hatenablog.com/entry/2019/12/08/012312)）
    ```sh
    heroku addons:create jawsdb:<プラン名> -a <アプリ名> --version=8.0
    ```
    
1. Heroku上で環境変数を設定（[参考](https://qiita.com/murakami-mm/items/9587e21fc0ed57c803d0)）
    ① JawsDBのURLを確認
    ```sh
    $ heroku config
    === karoyaka Config Vars
    JAWSDB_URL: mysql://<ユーザー名>:<パスワード>@<ホスト>:<ポート番号>/<データベース名>
    ```

    ② 確認したURLを、環境変数として設定していく。`mysql2` gemを使用しているため、`DATABASE_URL`では`mysql2://`スキーマを使う。（[参考](https://devcenter.heroku.com/articles/jawsdb#using-jawsdb-with-rails)）
    ```sh
    $ heroku config:set DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト>/<データベース名>?reconnect=true'
    ```
1. Heroku上へデプロイ。`main`ブランチ以外からのプッシュ時は、`<現在のブランチ名>:main`と書けばOK。今後も、ソースコードの変更のたびにこのコマンドを打つ。
    ```sh
    $ git push heroku main
    ```
1. データベースのマイグレーション
    ```
    $ heroku run rails db:migrate
    ```

1. 画像プロセッサVipsを動かすのに必要なライブラリをインストール。インストール理由は、画像サイズの操作のために`variant`メソッドを使っているため。（[参考①](https://qiita.com/west2538/items/da8c33749993d17c67e2#heroku%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)、[参考②](https://tosbourn.com/vips-rails-7-heroku/)）
    ```sh
    $ heroku stack:set heroku-20 # ビルドパックの対象内のstackに変更
    $ heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-apt
    $ heroku buildpacks:add --index 2 https://github.com/brandoncc/heroku-buildpack-vips
    $ cat <<EOF >Aptfile
    > libglib2.0-0
    > libglib2.0-dev
    > libpoppler-glib8
    > EOF
    ```
    → コミット & デプロイ

1. アプリを開く !! 🥳
    ```sh
    $ heroku open
    ``` 

## 3. （:construction:WIP）追加の設定
 ※ 作業途中。これから設定していきます。

1. config/master.key （[参考①](https://ameblo.jp/kumakou1234/entry-12640310364.html)、[参考②](https://yukitoku-sw.hatenablog.com/entry/2020/02/04/145331)）


1. config/initializers/sessions_store.rb ? 
    1. [Rails の session store に Heroku Redis を利用する](https://qiita.com/NaokiIshimura/items/024c3d35ddc3188a0524)
    
1. config/environments/production.rbファイルで、config.force_ssl = trueを追加し、HTTPSを強制するように

1. ActiveStorageをS3に設定