【デイトラ】Webアプリ開発コースで作成したRailsアプリをRender.comでデプロイする方法

## はじめに
いま受講しているデイトラのWebアプリ開発コースでは、合計3つのアプリを作成します（ハンズオンで作成するアプリ　＋　課題として作成するアプリ　×　2）

ハンズオン形式でレクチャーされているデプロイ方法はherokuです。
PostgreSQLのアドオンをそれぞれのアプリに使用する必要があるため、
各アプリごとに$5/月かかってしまう計算になります。

気持ち的にそのお金があるなら技術書を買いたいので、Renderを使ったデプロイに挑戦してみました。

### 開発環境
- Ruby 2.7.7 => 3.1.0*
- Rails 6.0.6.1 =>  6.1.7.8*
- node.js v14.16.1
- PostgreSQL 14
- Windows11
- WSL2(Ubuntu)

*もともとのバージョンが古く、Renderでのデプロイに対応していなかったため、アップデート作業が必要になりました

### デプロイまでの流れ
1. デプロイ用の設定（S3の設定など）
1. Renderの登録・設定
1. RubyとRailsのバージョンアップ対応
1. Renderでのデプロイ

*今回は実際に自分がやった流れ通りに記述しますが、もう一度最初からやるなら2と3の順番は逆にすると思います

## デプロイ用の設定（S3の設定など）
以下の設定を行いました。
デイトラ受講中の方なら中級編のherokuでデプロイする方法の途中までと全く同じです。

- S3の設定
    - userの作成
    - Bucketの作成
- dotenvの導入とAccessKey,SecretKeyを環境変数として埋め込み
- 本番環境のStorageをS3に設定


## Renderの登録・設定
以下の記事と公式ガイドを参考に登録、設定を進めていきました。

- [【誰でも簡単】RailsアプリをRender.comでデプロイする手順まとめ](https://qiita.com/koki_73/items/60b327a586129d157f38)
- [Render公式ガイド（Railsアプリのデプロイ方法）](https://docs.render.com/deploy-rails)
- [Render公式ガイド（PostgreSQLの設定方法）](https://docs.render.com/databases)


Qiita記事を参考にざっくり全体像を理解して登録を進め、細かい点は公式ガイドを翻訳機能で翻訳しつつ読み進める感じでわりとスムーズにできました。

### 詰まった箇所
#### master.keyがない
自身の環境だとmaster.keyがなかったため以下の記事を参考にmaster.keyを作成しました。
[master.keyが見つからない問題 [初見殺し] - はじめてのデプロイで嵌るポイント(Rails 5.2以降)](https://qiita.com/naokit-dev/items/5e09b2fb4b64a29712e4)

*特に[②master.keyの中身がわからない場合](https://qiita.com/naokit-dev/items/5e09b2fb4b64a29712e4#:~:text=%E9%85%8D%E7%BD%AE%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86-,%E2%91%A1master.key%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88,-credentials.yml.enc)と同様の手順を踏みました

### 環境変数の設定方法
慣れていないこともあり、何を設定すればよいか手間取りました。
最終的には以下のkeyを設定しました。
*Environment Variablesと記載のあるデーブルで設定します

- AWS_ACCESS_KEY
- AWS_BUCKET_NAME
- AWS_SECRET_KEY
- DATABASE_URL
- NODE_VERSION
- RAILS_MASTER_KEY
- TZ
- WEB_CONCURRENCY

上記のKeyに対してvalueを入力していきます。

AWS系のものはデイトラ生の方なら、herokuのときにdotenvで設定したものと同様です。

DATABASE_URLは[Render公式ガイド（PostgreSQLの設定方法）](https://docs.render.com/databases)で作成したPostgreSQLの詳細ページの'Internal Database URL'をコピーすればできました。

NODE_VERSIONは下記を参考にしつつ設定すればそんなに難しくないと思います。
[Setting Your Node.js Version
](https://docs.render.com/node-version)
ちなみにnode.jsのバージョンはコマンドラインで以下を実行することで確認できます。
```bash
node -v
```
TZはvalueにAsia/Tokyoと記載すれば適切に反映されました。

## Ruby,Railsのバージョンアップ
デイトラWeb開発コースでは、Ruby 2.7.7、Rails 6.0.6.1を使うように説明があります。（たしか…）

しかしRenderではRuby3.1未満をサポートしていません。そのため、Renderを使用するためにはRubyのバージョンを3.1以上に上げる必要があります。

Rubyのバージョン管理方法はchatGPTでもすぐに答えてくれるので、そちらに譲ることにして、この記事ではバージョンを上げた後に発生したエラーと解決方法を記述していきます。

ちなみに、エラーはアップデート前に作成し、すべてパスしていたRSpecのテストをすべて実行する中で発生させています。事前に細かくテストを記載していたことが、ここで役に立ちました。


### BadAlias Unknown alias: default
なにやらyamlファイルがうまく読み込まれないかコンパイルされないかで発生しているエラーのようでした。
よく使う`rails s` `rails c`といったコマンドも使えなくなってしまいました。

#### 解決策
以下の記事を参考に、Railsのアップグレード、psychのバージョンダウンで解決しました。
僕の場合、Railsをアップグレードしてもエラーが解消されず、psychのバージョンダウンで解決したようです。なので、Railsのアップグレードは必要なかったかもしれません。

[Psych::BadAlias Unknown alias: defaultのエラーの原因とその対応](https://qiita.com/kazuhito_nakayama/items/fbbc5cd18625de4016aa)
[visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias)　解決方法](https://qiita.com/mono_glyceride/items/a447f2451078e8031cbc)

### undefined method `service_name'
どうやらRailsアップグレードの影響でActiveStorageのカラムが変わってしまったようです。

#### 解決策
下記の記事を参考に、ActiveStorageをアップデートし、migrateし直すことで解消しました。

[Rails 6.1.3にアップグレードした後に「undefined method `service_name' 」のエラーが発生する](https://qiita.com/ColinLeefwz/items/ffab6e323bfb4693ca9b)

## Renderでのデプロイ
デプロイしてはエラーが出る、を繰り返してようやく完了しました…
ちなみにRenderではGithubのmasterブランチと連携している場合、masterが更新されるたびに自動でデプロイできるように設定できます。
手動でもRenderのWebアプリ画面の右上の'Manual Deploy'ボタンを押すことでデプロイを開始できます。

### cannot load such file -- rexml/document (LoadError)
rexmlがない、というエラーがなぜか突然出ました。

#### 解決策
以下の記事を参考にgemをインストールすることですぐに解消できました。
[【備忘録】【エラー解決】cannot load such file -- rexml/document (LoadError)](https://qiita.com/asami___t/items/d0eb10efe95651a4a8d7)

### LoadError: cannot load such file -- dotenv/load
dotenvがないといわれました。

#### 解決策
もともとdotenvを使用するため`config/application.rb`に`require 'dotenv/load'`と記述していました。
ただコンソールで確認したところ、この記述を削除しても問題なく.envファイルを読み込めていたため削除したところ解消しました。

下記の記事も参考にさせていただきました。
[【Rails7】gemの設定ミスで本番環境のパスワードリセットメールが届かなかった話](https://zenn.dev/mockey/articles/f73e4d873beac5)

### Bin/rails:permission denied error
ビルドはうまくいくようになりましたが、次の工程で早速つまりました。
Renderでの最初のアプリ登録時にデフォルトのまま設定したStart Commandの`./bin/rails server`がうまく機能していないようでした。

#### 解決策
下記の公式QAを参考に、Start Commandを'bundle exec rails server'に変更しました。
[Bin/rails:permission denied error](https://community.render.com/t/bin-rails-permission-denied-error/21137/1)

*この変更は、アプリ詳細ページのSettingsから行えます。
*ちなみに、権限の問題を直球で解消しようと思い、実行権限をつけてみたのですが駄目でした。

### ActionView::Template::Error (The asset "auth_image" is not present in the asset pipeline.

画像に関するパイプラインがうまく機能していないようでした。
正直原因は深堀りできていないのですが、以下の記事を参考に動的コンパイルモードの設定を行ったところ解消しました。

[Render.com にRailsアプリをデプロイ /　設定でつまったところ紹介](https://qiita.com/kyokucho1989/items/f32b1ce5d0b67d60b70b)



## おわりに
目下画像周りの投稿に開発環境では再現しないエラーが出ているので修正が必要なのですが、デプロイ自体は上記の対応で完了し、アプリもちゃんと閲覧できる状態になりました！

デバッグのためたくさんの方の記事を拝見し、やはり基礎的な知識としてサーバーやネットワーク等のインフラ周りの知識がないと独力での解消や深い理解は難しいと感じました。

たくさん勉強しよう。