こんにちは、かつコーチです。
「作ったアプリを世界に公開してみたい」という気持ちはあっても、デプロイの手順が分からず止まってしまう方は多いです。
この記事では、無料枠から使えるホスティングサービス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_KEYはconfig/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.yamlのfromDatabase設定により、DATABASE_URL環境変数を自動的にWebサービスへ注入します。
手動で設定する必要はありませんが、ダッシュボードの「Environment」タブで値が反映されているか確認しておくと安心です。
よくあるデプロイ失敗の回避法
アセットプリコンパイル時のエラー
私が初めてRenderにデプロイしたとき、ビルドログで次のエラーが出てデプロイが失敗しました。
Could not find a JavaScript runtime
❌Before
原因は、RAILS_MASTER_KEYを設定しないままビルドを実行し、assets:precompileが本番用のcredentialsを復号できずに失敗していたことでした。
エラーメッセージ自体はJavaScriptランタイムを指していましたが、実際の原因は別の場所にありました。
✅After
Renderのダッシュボードで「Environment」タブを開き、RAILS_MASTER_KEYにconfig/master.keyの中身を設定しました。
再デプロイしたところ、アセットプリコンパイルが正常に完了しました。
エラーメッセージの表面的な内容だけで判断せず、ビルドログ全体を上から確認する習慣が大切だと実感しました。
マイグレーション未実行によるエラー
❌Before
render.yamlのbuildCommandにrails 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_sslとconfig.force_sslをproduction.rbで有効にし、リダイレクトループを防ぐRAILS_MASTER_KEYはダッシュボードから手動設定が必要- ビルドスクリプトに
db:migrateを含め忘れると、デプロイ成功後にDBエラーが発生する - エラーメッセージの表面だけでなく、ビルドログ全体を確認する習慣を持つ
次に読むべき記事
- rails newでプロジェクトを作成する手順(Rails 8対応)
- CSRF対策とStrong Parametersでセキュリティを守る
タグ: Ruby on Rails, 初心者向け, デプロイ