はじめに
Renderの無料プランでは、サーバーにSSHログインして rails db:seed
を直接実行できません。
この記事では、HTTP経由で安全に db/seeds.rb
を走らせ、MVPや開発初期のサンプルデータ投入を手早く実現する方法を紹介します。
- 当方プログラミング初心者のため、内容はできるだけシンプルにまとめています
- 実際に運用する場合は、環境変数で認証情報を管理するなど、安全な方法を検討してみてください
対象者(Who)
- Railsアプリを開発している人
- Renderの無料プランを利用している人
- Shellアクセスなしでブラウザ経由でデータを作りたい人
できること(What)
- Railsのサンプルデータや初期データを生成
- HTTPリクエスト経由でRailsサーバーに「データ生成を実行させる」
使うタイミング(When)
- Render無料プランでアプリをデプロイした直後
- Shellアクセスなしで初期データを投入したいとき
- 開発・ステージング環境でテストデータを生成したいとき
実行場所(Where)
- Render無料プラン上のアプリケーションサーバー
- ブラウザやPostmanなどのHTTPクライアントから
-
/seed
など専用ルートを作ってWeb経由で実行
なぜブラウザ経由なのか(Why)
Render無料プランではSSHでサーバーにログインできません。そのため、rails db:seed
や rails console
を直接実行できません。
RailsはHTTPリクエストでコードを実行できるので、ブラウザやHTTPクライアントから「サーバーに命令を送る」形にすれば、SSHなしでもデータ生成が可能です。
認証を付ければ本番環境でも安全に使えます。
実際の手順(How)
1. ルートを追加する
# config/routes.rb
# 注意: 終わったらこのルートは削除orコメントアウト
if Rails.env.production?
post '/seed', to: 'seeds#run'
end
2. Seeds用コントローラを作成
db/seeds.rb
の処理をHTTPリクエストで実行できるようにします。認証情報は環境変数から読み込みます。
# app/controllers/seeds_controller.rb
class SeedsController < ApplicationController
# HTTP Basic認証(本番では環境変数で管理)
http_basic_authenticate_with name: ENV.fetch('SEED_USER'),
password: ENV.fetch('SEED_PASSWORD')
# ここは適宜必要な処理を入力
def run
load Rails.root.join('db', 'seeds.rb')
render plain: 'Seeds 実行完了', status: :ok
rescue => e
render plain: "Seed 実行失敗: #{e.message}", status: :internal_server_error
end
end
環境変数の設定例(Render本番)
Renderで /seed
を実行するために設定します
Name | Value |
---|---|
SEED_USER | admin |
SEED_PASSWORD | secret |
任意の文字でOK |
補足: 環境変数はRailsサーバー起動時に読み込まれるため、設定後は再デプロイして反映
3. ブラウザからアクセス
https://your-app.onrender.com/seed
注意:
/seed
はBasic認証で保護されています。アクセスするとユーザー名とパスワードの入力を求められるので、環境変数で設定したSEED_USER
とSEED_PASSWORD
を入力してください。
注意点
- 認証情報はコードに直書きせず、環境変数で管理する
- 実行が終わったら
/seed
ルートを無効化or削除 - 無料プランはスリープやストレージ制限があるため、大量データの投入は避ける
まとめ
Render無料プランでも、認証付きの専用ルートを用意すればブラウザ経由でサンプルデータ投入が可能です。