Render.comにDockerで開発したRailsアプリをデプロイする方法

・dockerで開発したアプリをrenderで公開したい
・rails + PostgreSQLでアプリを公開したい
・でも、どうすればいいかわからない

という人向けに記事です。

僕自身、Railsアプリを公開したのですが、1日以上かかって大変な思いをしました。
とはいえ、終わってみると「イッシュンデデキルヤン」ってなってるので、皆さんに共有しておきます。

※Render.comのアカウントは作成している前提です。

## Dockerfile,compose.yaml,entrypoint.shの修正
こちらは各自によって違うので参考にならないかもしれない。
だが一応載せておくことにする。

はっきり言って、以下の記事をめちゃめちゃ参考にしているので以下の記事を読んでほしい↓

https://zenn.dev/hs7/articles/2cc4d67650ba69

僕はmariaDBでデータベースを使っていたので、PostgreSQLに移行するのが難しかった。
まぁ、僕と同じ環境なら以下のコードコピペでも動くかもだけど...
```docker: Dockerfile
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs vim
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
COPY . .
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD [ "rails","server","-b","0.0.0.0" ]
```

```yaml: compose.yaml
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_volume:/var/lib/postgresql/data
    restart: always
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    restart: always
    tty: true
    stdin_open: true
    depends_on:
      - db
volumes:
  postgres_volume:
```

entrypoint.shはDockerfileと同じディレクトリ上に書くといい
```bash: entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate

exec "$@"
```
とまぁこんな感じで書けばOKだと思う。（僕の環境とは違うからエラーになるかもだけど、ちょこちょこカスタマイズするんだぞ！！）


## デプロイ方法2STEP

### まずはPostgreSQLを作成する
正直以下の記事の方が写真付きでわかりやすいので、PostgreSQLとWeb Serviceを作ったら帰ってきてください笑↓

https://ph-1ab.com/render-deploy-with-own-domain/#toc1

以下に簡単に作成方法を書いておきます
1, NewのボタンからPostgreSQLを作成する。
2, 以下の項目を入力する
- Name
- Database
- User
- Region
- PostgreSQL Version

3, Create Databaseボタンをクリック
4, Internal Database URLをコピーしておく

### 次にWeb Serviceを作る
これも、以下の記事見た方がいいよ↓
https://ph-1ab.com/render-deploy-with-own-domain/#toc1

1, NewのボタンからWeb Serviceを選択する
2, 作成したいリポジトリを選ぶ
3, 以下の項目を入力する
- Name
- Region
- Branch
- Runtime
- Environment Variables
ここで、環境変数（左側）をDATABASE_URLにして先ほどコピーしたInternal Database URLを貼り付ける。
- DockerfilePath

4, Create Serviceをクリックする
デプロイ完了！！（エラーが起きたら、ログやメッセージを見て修正していく）

## 僕が陥ったエラーへの対処法
### ホスト先が認められずエラー
Block hosts: (ホスト名）
こんなエラーメッセージがデカデカと出たら、以下のコードを追加して解決しよう。
config/application.rbに以下のコードを追加
```ruby:config/application.rb
class Application < Rails::Application
    ...
    config.hosts << "（リンク先）" # 追加
    ...
end
```
（リンク先）には「https://　」は必要ないです。

## まとめ
いや〜意外と簡単でしたか？
僕は1日以上かかったので、大変でした。

なぜデプロイするのか皆さんの事情はわからないですが、この記事がお役に立てれば幸いです！

参考になった記事（ありがとうございました）
ファイル関係のコード↓

https://zenn.dev/hs7/articles/2cc4d67650ba69

Render.comにデプロイする方法（写真付きでわかりやすかったです）↓

https://ph-1ab.com/render-deploy-with-own-domain/#toc1