今回、個人で開発中のRailsアプリをRender.comとNeonにデプロイしました。
デプロイしたのは、Railsアプリのホーム画面を作った初期段階です。
開発環境では問題なく動作しても、本番環境ではエラーが出ることがあり、
ホーム画面が最低限動く段階で早めにデプロイしました。
今回の構成は以下です:
- Ruby 3.3.6
- Ruby on Rails 8.0.2.1
- PostgreSQL
- Docker(開発環境)
この記事の特徴
-
ポートフォリオ向けに最適化した手順
・今回のRailsアプリの環境で必要な設定や注意点をまとめました -
初めてデプロイする人へ
・必要な設定や注意点
・Docker コンテナ内での master.key や SECRET_KEY_BASE 作成手順
を実際の画面のスクリーンショットなどを用いて説明しています。
参考になれば幸いです。
1. config/database.yml を書き換え
config/database.yml
を書き換えていきます。
このファイルは、アプリケーションが利用する データベースの接続情報 を記述する設定ファイルです。
接続情報(ユーザー名・パスワードなど)をソースコードに直接書くのは セキュリティリスク があります。
そこで、Render などの本番環境では 環境変数 を使って設定します。
# productionの部分を下記の内容へ書き換える。
production:
primary: &primary_production
<<: *default
url: <%= ENV['DATABASE_URL'] %>
ポイント
-
&primary_production
- config/database.yml で複数の接続設定を共通化するとき、YAML のアンカー機能を使用
- もし &primary_production がなければ、cache や queue、cable は 参照先が存在せずデプロイでエラーになる
-
url: <%= ENV['DATABASE_URL'] %>
- 本番環境では、環境変数 DATABASE_URL を参照してデータベースに接続
- 接続情報(ユーザー名やパスワード)をソースコードに直書きせず、安全に管理できる
・書き換え後はGitHubにpushすること
・複数DBを使わない場合 config/database.ymlの書き換え内容が変わるので注意してくださいconfig/database.yml# 複数DB使わない時の例 production: <<: *default url: <%= ENV['DATABASE_URL'] %>
# 複数 DB の設定例
production:
primary: &primary_production
<<: *default
url: <%= ENV['DATABASE_URL'] %>
cache:
<<: *primary_production
database: myapp_production_cache
migrations_paths: db/cache_migrate
queue:
<<: *primary_production
database: myapp_production_queue
migrations_paths: db/queue_migrate
cable:
<<: *primary_production
database: myapp_production_cable
migrations_paths: db/cable_migrate
2. Neon でデーターベース作成
今回、Neonというデーターベース管理サービスを使って、データーベースを作成しました。
なぜ、Neonというデーターベース管理サービスを使ったかというと
・データベースが無期限で保持される
・使用した分だけ支払う従量課金制である
・ 開発中やアクセスが少ないときは自動スリープする
つまり 「開発中は無料、小規模サービスならずっと無料、大きく育ったら課金」というモデルで、個人開発や学習用途にぴったりだったからです。
1.ダッシュボードにて、[Create project] を選択します。
データベースに関する設定を求められるので、以下のように設定します。
・Project name: アプリ名
・PostgreSQL version: デフォルトのまま
・Cloud Service Provider: AWS
・RegionL: AWS Asia Pacific 1 (Singapore)
Region を「AWS Asia Pacific 1 (Singapore)」にした理由
開発者や想定ユーザーが日本の場合、シンガポールは日本と近くて 通信遅延が小さいため
2.[Create] を選択すると、データベースが作成されます。
次は、このデータベースに Render.com から接続するための URL を入手します。
画面右上の [Connect] を選択します。
Connection string にデータベースへ接続するための情報が表示されます。
注意
[Copy snippet] を選択するとpsql ' 'の部分もコピーされてしまう為、' '内のpostgresql:〜
部分だけ、コピーするようにしてください。
コピーしたものは、メモ帳などに貼り付けてメモしておいてください。
あとで Render.com に設定するための環境変数として使います。
3.アプリ側に環境変数を設定
.env
ファイルに環境変数 設定
- もしまだなければ,プロジェクトのルートに .env ファイルを作成
-
.env
に接続URLを設定
DATABASE_URL=先ほどコピーしたpostgresql:〜の部分を貼り付ける
⚠️ 重要!
この環境変数には データベースの接続情報(ユーザー名・パスワード) が含まれています。
絶対にGitHubにあげないこと!
3. .gitignore
に、以下を必ず追加してください
/.env*
これで、GitHubには.env
ファイルはあがらなくなります。
4. アプリ側でデプロイ準備
アプリに、render-build.sh
ファイルを作成します。
ファイル作成後、下記のコードをコピペしてください。
これは、デプロイする度にプロジェクトを立ち上げるコマンドになります。
set -o errexit
# 依存関係をインストール
bundle install
# CSS/JS のアセットを事前コンパイル
bundle exec rails assets:precompile
# 古いアセットを削除
bundle exec rails assets:clean
# DB マイグレーションを実行
bundle exec rails db:migrate
参考)Renderのドキュメント
ファイル作成後は GitHubにPushしてください
5. Render で Web Service 作成
- ダッシュボード右上から [+ New] > [Web Service] を選択します
- 次に、デプロイしたい GitHub リポジトリと Render.com を連携させます
[Git Provider] > [デプロイしたいアプリ] のリポジトリを選択すると、自動的に連携されます。
設定を求められるので、以下のように設定します。
・Name: デプロイするアプリ名(デフォルトでも可)
・Language: Ruby
・Branch: main(デフォルトのまま)
・Region: Singapore
・Instance Type: Free
・Build Command:./bin/render-build.sh
へ変更。
注意
render-build.sh
ファイルを作成してないとデプロイ時エラーになります。
6. Environment Variablesの設定
Render で Web Service に必要な環境変数を設定します。
・WEB_CONCURRENCY
デフォルトのまま
・RAILS_MASTER_KEY
config/master.key のファイル内の値をコピーして貼り付け
MASTER_KEYは、
config/master.key
にあります
ない場合は、作成が必要です。
RAILS_MASTER_KEY の作成手順(Docker 環境の場合)
1.Dockerコンテナに入る
docker compose exec web bash
コンテナ内のシェルが開くので
rails credentials:edit
• この操作で config/master.key が生成されます
• Render の RAILS_MASTER_KEY には、このファイル内の値をコピーして貼り付けます
・DATABASE_URL
: 先ほどNeonでコピーしたpostgresql:〜
からはじまるURL
・RAILS_ENV
:production
を 入力
・SECRET_KEY_BASE
:作成が必要
SECRET_KEY_BASE の生成手順
Docker コンテナ内で以下を実行
bin/rails secret
・ターミナルに表示されたランダム文字列をコピー
・Render の SECRET_KEY_BASE に貼り付ける
変数 | 説明 | 補足 |
---|---|---|
RAILS_ENV | 実行環境 | 本番なら production。Render は自動で設定される場合もあるけど明示的に書くと安心 |
RAILS_MASTER_KEY | credentials.yml.enc を復号する鍵 | Git には絶対上げない |
DATABASE_URL | 本番 DB 接続情報 | Neon の接続 URL をそのまま入れる |
SECRET_KEY_BASE | Rails のセッション・cookie 暗号化キー | bin/rails secret で生成したランダム文字列 |
WEB_CONCURRENCY | Puma のワーカー数 | Render の推奨に合わせて 2~5 程度。なくても動くが推奨 |
開発を進めていく中で、環境変数設定が必要になれば、つど追加してください。
これで、環境変数の設定は完了です。
7.デプロイ
ダッシュボード上の [Deploy Web Service] ボタンを押してください。
最新のコミットに基づきデプロイがはじまります。
しばらくするとデプロイが完了しますので、上の方に表示されている URL からアクセスできます。
注意
この時、エラーが出た場合は、ログを確認して原因を特定してください。
今回スリープ対策については記載してませんが、今後対応する予定です
参考記事
※自身の卒業制作向けに手順や補足、Docker 操作などを独自に追加しています