Render.comへrails appをdeploy

## Render.とは？

簡単に言うとRender.comはherokuのようなweb hosting serviceです。

Herokuの無料プラン提供終了に伴い、学習用に無料で使用できるサービスを探していく中で良さそうだなと思ったので試してみました。

とは言え後で分かったなのですが、DBは作成後90日間無料で使用できますがそれ以降は2週間以内に有料プランに移行しないと削除されてしまうという事なので注意が必要です。

## 投稿の目的

率直に言うと自分の理解を深めるのが一番の狙いですが、Render.comへのdeploy方法の記事は存在しているもののまだまだ情報が少ないと感じたので参考になる方がいるかもしれないと思い投稿してみました。私が以前deployした時に詰まったところも共有できたらと考えています。

以下の動画でStripeをRailsに実装する方法を学習していく中でherokuへdeployする必要があったのですが、学習用に有料サービスは使いたくないと思い無料で使えるRender.comにdeployする事にしました。

https://www.youtube.com/watch?v=qEVn9sXNCAI

以下を参考にdeployしていきます。

https://render.com/docs/deploy-rails


## 新規プロジェクト作成時の注意点

Render.comのDBはpostgreSQLに対応しているようですので、新規プロジェクト作成時には

```shell:
rails new mysite --database=postgresql
```

のような形でDBにpostgreSQLを指定する事をオススメします。指定しないと開発環境のDBがsqlite3で作成されると思うのですが、deploy時にpostgresqlへ移行の手間がかかります。移行の仕方は上記でも解説されてますがこの作業が生じないにこした事はないので、そこを強調した上で移行の説明は割愛します。

プロジェクト用のrepositoryがない場合は事前に作成しておいてください。

## 本番deployの準備

(1) `config/database.yml`を開き`production`の部分を以下に置き換える
```yml:config/database.yml
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
```
これによりRender.comのダッシュボードからDBのURLを環境変数として追加可能になります。

(2) `config/puma.rb`の 
```ruby:config/puma.rb
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
```
と
```ruby:config/puma.rb
preload_app!
```
についてる`#`を外して有効化します。公式では`workersENV.fetch("WEB_CONCURRENCY") { 4 }`だが`workersENV.fetch("WEB_CONCURRENCY") { 2 }`のままで以前は問題なかったのでここは無視して進めます。

(3) `config/environments/production.rb`の`config.public_file_server.enabled`の行を以下に置き換える。
```ruby:config/environments/production.rb
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? || ENV['RENDER'].present?
```

## Build Scriptの作成

`bin`フォルダ内に`render-build.sh`というファイルを作成し以下を貼り付ける。

```bash:bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
```

次にターミナルから

```shell:
chmod a+x bin/render-build.sh
```

を走らせてこのscriptが走る事を確認する。

## Render.comへのdeploy準備

プロジェクトのroot directoryに`render.yaml`というファイルを作成し以下を貼り付ける。

```yaml:render.yaml
databases:
  - name: shoplify
    databaseName: shoplify
    user: shoplify

services:
  - type: web
    name: shoplify
    env: ruby
    buildCommand: './bin/render-build.sh'
    startCommand: 'bundle exec puma -C config/puma.rb'
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: shoplify
          property: connectionString
      - key: RAILS_MASTER_KEY
        sync: false
```

`shoplify`はYouTube動画で作成しているプロジェクト名ですが、この部分は好きなプロジェクト名に変更しても問題ありません。後にDBやWeb Service作成時に必要になります。

ここまで出来たらGitHubもしくはGitLabのrepositoryへpushしてください。

## Deploy編

GigHubとGitLabとGoogleを経由でsign in可能なので登録は特に必要ないです。私はGitHubからdeployするのでGitHUb経由でsign inしてます。

① DB作成
Dashboardから`New`ボタンをクリックしてすると選択肢が出てくるので`PostgreSQL`を選択。

![Screenshot 2023-03-18 at 23.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/6c8ab0fc-96b8-5ba7-444d-c26db9cc3a63.png)

`Name`と`Database`と`User`に`render.yaml`で入力した値を入力（私の場合は`shoplify`）して`Create Database`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/babc2ea5-a62b-ac0b-19ad-e217fdaebce7.png)

これでDBが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/19e8891a-552b-864e-21a8-6c568d26bd7f.png)

② Web Service作成

Dashboardから`New`ボタンをクリックしてすると選択肢が出てくるので`Web Service`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/1132e2cf-da0b-df07-c3e7-6f23a9c18e8c.png)

`Configure account`をクリックしてRender.comに繋げるアカウントを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/6b4398c8-11f3-a71c-b56d-27d71c9a2be3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/b9bc1435-baec-b08e-0a1d-a4d31eb9040f.png)

Repository accessを設定する。私はOnly select repositoriesを選択し、接続するreposotiryを指定。私は`shoplify`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/de0b8dd5-8440-55c7-d5b4-a26b2e141f52.png)

Connect a repositoryのところで`shoplify`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/eac3fc9e-25bb-ec04-d1b6-6546f04fd725.png)

詳細入力画面で`render.yaml`に入力したプロジェクト名を入力。私の場合は`shoplify`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/2c7d4825-e57e-aa91-0ce2-fe58b5fdb3fe.png)

次にBuild CommandとStart Commandにrender.yamlの値を入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/ac2e0147-2bc3-991f-9476-425de5b1b2dc.png)

最後に`Advanced`→`Add Environmental Variable`から環境変数を追加。

`DATABASE_URL`の値ですが、dashboardで先ほど作成したDBを選択し、ConnectionsにあるInternal Database URLをコピペして入力。

`RAILS_MASTER_KEY`は`config/master.key`に記されている値をそのまま入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/1809bd8e-e3f9-13ec-8198-6116b3b392df.png)

ここまで出来たら`Create Web Service`をクリック。

これでdeployできたかと思いましたが残念ながら失敗。ログを見ると

```shell:
$ bundle lock --add-platform x86_64-linux
```

を走らせる必要があるようです。参考までに以下の記事にもこの部分の解説がありました。

https://qiita.com/koki_73/items/60b327a586129d157f38

上記を走らせてからrespositoryにpushして再度deployしたところ成功しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885056/8a413984-cfbd-7ef6-9830-9248c454870e.png)

### 最後に

途中で気づいたのですがRender.comではDBが1つしか無料で有効化できないようなので使い勝手が良いとは言えず、情報が少ないのもそのせいな気がしてます。

とは言えheroku以外へのdeploy経験ができたので個人的には前向きに捉えてます。