【Ruby on Rails】RailsアプリをRenderにデプロイする方法

Ruby

こんにちは、かつコーチです。

「作ったアプリを世界に公開してみたい」という気持ちはあっても、デプロイの手順が分からず止まってしまう方は多いです。

この記事では、無料枠から使えるホスティングサービスRender(インフラ管理を意識せずアプリを公開できるPaaS)へのデプロイ手順を、PostgreSQLの接続設定まで含めて解説します。

初めてのデプロイでもつまずかないよう、実際に発生しやすいエラーとその対処法も紹介します。

RenderへのRailsアプリのデプロイ手順

事前準備:本番環境用の設定

デプロイ前に、config/database.ymlが環境変数からDB接続情報を読み込めるようになっているか確認します。

# config/database.yml
production:
  <<: *default
  database: myapp_production
  url: <%= ENV["DATABASE_URL"] %>

Rails 8系の標準構成であれば、この設定は最初から用意されています。

続いて、config/environments/production.rbで静的アセットの配信設定を確認します。

# config/environments/production.rb
config.assume_ssl = true
config.force_ssl = true

RenderはHTTPS終端をロードバランサ側で行うため、この2行を有効にしておくとリダイレクトループを防げます。

render.yamlでのサービス定義

Renderは、リポジトリ直下にrender.yamlを置くことで、Webサービスとデータベースをまとめて定義できます。

# render.yaml
services:
  - type: web
    name: myapp
    runtime: ruby
    buildCommand: "./bin/render-build.sh"
    startCommand: "bundle exec puma -C config/puma.rb"
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: myapp-db
          property: connectionString
      - key: RAILS_MASTER_KEY
        sync: false

databases:
  - name: myapp-db
    plan: free

RAILS_MASTER_KEYconfig/master.keyの値です。

sync: falseを指定し、Renderの管理画面から手動で環境変数として設定します。

ビルドスクリプトの用意

buildCommandで指定したbin/render-build.shを作成します。

#!/usr/bin/env bash
# bin/render-build.sh
set -o errexit

bundle install
bundle exec rails assets:precompile
bundle exec rails assets:clean
bundle exec rails db:migrate

実行権限を付与するのを忘れないようにしてください。

chmod +x bin/render-build.sh

Renderへの登録とデプロイ

GitHubリポジトリをRenderのダッシュボードに接続し、「New Blueprint」からrender.yamlを読み込ませます。

自動的にWebサービスとPostgreSQLデータベースが作成され、初回のビルド・デプロイが開始されます。

ビルドログにdb:migrateの実行結果が表示されるので、マイグレーションが正常に完了しているか確認しましょう。

PostgreSQLの接続設定

開発環境と本番環境のDB差異に注意する

ローカル開発でSQLite3を使っている場合、本番のPostgreSQLとの差異でエラーが出ることがあります。

GemfileにPostgreSQL用のgemを追加し、本番でのみ有効になるよう設定します。

# Gemfile
group :production do
  gem "pg"
end

ローカルでも本番と同じPostgreSQLを使う構成にしておくと、デプロイ時の差異によるトラブルを未然に防げます。

DATABASE_URLの自動注入を確認する

Renderは、render.yamlfromDatabase設定により、DATABASE_URL環境変数を自動的にWebサービスへ注入します。

手動で設定する必要はありませんが、ダッシュボードの「Environment」タブで値が反映されているか確認しておくと安心です。

よくあるデプロイ失敗の回避法

アセットプリコンパイル時のエラー

私が初めてRenderにデプロイしたとき、ビルドログで次のエラーが出てデプロイが失敗しました。

Could not find a JavaScript runtime

❌Before

原因は、RAILS_MASTER_KEYを設定しないままビルドを実行し、assets:precompileが本番用のcredentialsを復号できずに失敗していたことでした。

エラーメッセージ自体はJavaScriptランタイムを指していましたが、実際の原因は別の場所にありました。

✅After

Renderのダッシュボードで「Environment」タブを開き、RAILS_MASTER_KEYconfig/master.keyの中身を設定しました。

再デプロイしたところ、アセットプリコンパイルが正常に完了しました。

エラーメッセージの表面的な内容だけで判断せず、ビルドログ全体を上から確認する習慣が大切だと実感しました。

マイグレーション未実行によるエラー

❌Before

render.yamlbuildCommandrails db:migrateを含め忘れると、デプロイ自体は成功するのに、アプリへのアクセス時に次のエラーが出ます。

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "articles" does not exist)

✅After

#!/usr/bin/env bash
# bin/render-build.sh
set -o errexit

bundle install
bundle exec rails assets:precompile
bundle exec rails assets:clean
bundle exec rails db:migrate

ビルドスクリプトの最後にrails db:migrateを含めることで、デプロイのたびに最新のスキーマが本番DBへ反映されるようになりました。

マイグレーションファイルを追加した際は、この一行が実行されているかを必ずビルドログで確認してください。

まとめ

この記事のポイント

  • Renderへのデプロイはrender.yamlでWebサービスとPostgreSQLをまとめて定義する
  • config.assume_sslconfig.force_sslをproduction.rbで有効にし、リダイレクトループを防ぐ
  • RAILS_MASTER_KEYはダッシュボードから手動設定が必要
  • ビルドスクリプトにdb:migrateを含め忘れると、デプロイ成功後にDBエラーが発生する
  • エラーメッセージの表面だけでなく、ビルドログ全体を確認する習慣を持つ

次に読むべき記事

  • rails newでプロジェクトを作成する手順(Rails 8対応)
  • CSRF対策とStrong Parametersでセキュリティを守る

タグ: Ruby on Rails, 初心者向け, デプロイ

タイトルとURLをコピーしました