Herokuの導入について

# 悩んでいること
Herokuの設定についてさまざまな方法があることを知ったため、初心者の私では、どの方法が最も適しているのか選定が難しいことです。
そのため、まずは現在の私の環境を整理して、そのためのベストな方法を探していきたいと思います。

# 環境
・Mac OS
・Ruby 3.1.4
・Rails 7.0.8
・PostgreSQL 12.18

また、Dockerの活用もしてあり、Herokuの初期設定も終わらせております。

# Herokuの導入方法
#### 1 Heroku上にDockerコンテナを起動させて本番環境に公開する方法
この場合だと、Container Registryを活用することで、Dockerイメージを保存してHeroku上で動作させるとのこと。
>※疑問に思ったこと
githubのブランチ（mainとdevelop）とデプロイの関係について理解できておらず、開発環境であるはずのdevelopからHerokuにデプロイされてしまうことに矛盾を感じた。
⇨結論、一般的な開発フローとしてdevelopブランチでデプロイして確認し、mainにマージする流れは一般的であると知りました。基本的な理解がまだまだ足りないと痛感いたしました。

#### 2 ビルドパックを活用して、Herokuが最適化された環境を自動で構築する方法
こちらの方法だと、学習コストや管理コストが１つ目の方法に比べ抑えられるとのこと。
このことから、今回はこちらのビルドパックを活用したデプロイを実装していきたいと思います。

# まずはじめに
Herokuにて、デプロイを実装していきたいと思います。
すでにHerokuの新規登録は終わらせて、Heroku CLIをダウンロードしている状態です。
```php:ターミナル
% heroku login
 ›   Warning: heroku update available from 8.1.9 to 9.5.1.
heroku: Press any key to open up the browser to login or q to exit: 
 ›   Error: quit

```
上記のようにバージョンをあげてくださいときたので、updateを実行したところ
```php:ターミナル
% heroku update
heroku: Updating CLI from 8.1.9 to 10.0.0-b084308... done
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: ENOENT: no such file or directory, open '/Users/medakasan/.local/share/heroku/channel'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/Users/medakasan/.local/share/heroku/channel'
}

```
上記のように「/Users/medakasan/.local/share/heroku/channel」が見つからないとエラーが出たので、
```php:ターミナル
% touch /Users/medakasan/.local/share/heroku/channel
```
これでchannelファイルを作成し、以下のコマンドでheroku cliを再起動します。
```php:ターミナル
% curl https://cli-assets.heroku.com/install.sh | sh
```
その結果無事に再起動がかかり、バージョンの更新ができました。
```php:ターミナル
% heroku --version
heroku/10.0.0 darwin-arm64 node-v20.17.0
```
再度ログインを実行してみました。
```php:ターミナル
% heroku login
```
そこで、herokuのパスワードを入力すると、herokuのブラウザが起動して、ログインすれば連結完了です。

次にherokuで空のアプリを作成していきます。アプリ名の部分がurlの一部になります。
```php:ターミナル
% heroku create アプリ名
```
私はAWS S3バケットを使用しているため、ここで接続情報が取得できるように、heroku cliを使って設定します。
```php:ターミナル
% heroku config:set AWS_ACCESS_KEY_ID=（作成されたAccess Key ID） AWS_SECRET_ACCESS_KEY=（作成されたSecret Access ID）
```
今回は開発環境のdevelopブランチをherokuにデプロイしてみます。
```php:ターミナル
% git push heroku develop:main
```
その時にFailed to install gems via Bundler. という謎のエラーが出たのですが、それはこちらを参考に解決しました。どうやら、ローカルでbundle installをした情報がGemfile.lockに記載されており、それがheroku環境で問題を起こしたみたいです。ですので、Gemfile.lockに新しく環境を追加しました。
[参考サイト](https://qiita.com/m6mmsf/items/fb8a8672df98bdb59c9c)

作成されたURLを確認したところ、以下のような画面が出てきました。指定されている通り、ターミナルで「heroku logs --tail」を実行しました。
![スクリーンショット 2024-12-25 10.26.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952789/fad98afb-c076-8798-c349-4841d07d05e9.png)
そうすると「aws-sdk-s3」が入っていないとのことだったので、Gemfileについてして、再ビルドを実行しました。

最後にherokuのproduction環境でデータベースに接続できるように設定します。
接続するデータベースを作成するために、heroku-postgresqlというプラグインを活用します。以下のコマンドをターミナルで入力してください。
```php:ターミナル
$ heroku addons:create heroku-postgresql:essential-0
```
無料プランは既に廃止されているので、今回はessential-0を選択しました。ご自身のご利用状況に応じて変更してください。
その後に、heroku configを実行して、DATABASE_URLがあることを確認してください。

確認できたら、batabase.ymlの接続情報を以下のように修正していきます。
```php:config/database.yml
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
```
最後にherokuにある空のデータベースにテーブルなどを作成するために、以下のコードを入力してください。
```php:ターミナル
$ heroku run rails db:migrate
```
上記のコードは新しいテーブルを作成したり、モデルの変更がローカルであった場合はherokuのデータベースには反映されないため、忘れず行うようにしましょう。

# 最後に
ここまで閲覧いただき、誠にありがとうございました。私自身が初心者でわからない中記述しておりますので、何か間違えていることがあるかとは思いますが、少しでも同じ悩みを持っている人の助けになればと思います。次はCirclCIにチャレンジしてみます。