Render.とは?
簡単に言うとRender.comはherokuのようなweb hosting serviceです。
Herokuの無料プラン提供終了に伴い、学習用に無料で使用できるサービスを探していく中で良さそうだなと思ったので試してみました。
とは言え後で分かったなのですが、DBは作成後90日間無料で使用できますがそれ以降は2週間以内に有料プランに移行しないと削除されてしまうという事なので注意が必要です。
投稿の目的
率直に言うと自分の理解を深めるのが一番の狙いですが、Render.comへのdeploy方法の記事は存在しているもののまだまだ情報が少ないと感じたので参考になる方がいるかもしれないと思い投稿してみました。私が以前deployした時に詰まったところも共有できたらと考えています。
以下の動画でStripeをRailsに実装する方法を学習していく中でherokuへdeployする必要があったのですが、学習用に有料サービスは使いたくないと思い無料で使えるRender.comにdeployする事にしました。
以下を参考にdeployしていきます。
新規プロジェクト作成時の注意点
Render.comのDBはpostgreSQLに対応しているようですので、新規プロジェクト作成時には
rails new mysite --database=postgresql
のような形でDBにpostgreSQLを指定する事をオススメします。指定しないと開発環境のDBがsqlite3で作成されると思うのですが、deploy時にpostgresqlへ移行の手間がかかります。移行の仕方は上記でも解説されてますがこの作業が生じないにこした事はないので、そこを強調した上で移行の説明は割愛します。
プロジェクト用のrepositoryがない場合は事前に作成しておいてください。
本番deployの準備
(1) config/database.yml
を開きproduction
の部分を以下に置き換える
production:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
これによりRender.comのダッシュボードからDBのURLを環境変数として追加可能になります。
(2) config/puma.rb
の
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
と
preload_app!
についてる#
を外して有効化します。公式ではworkersENV.fetch("WEB_CONCURRENCY") { 4 }
だがworkersENV.fetch("WEB_CONCURRENCY") { 2 }
のままで以前は問題なかったのでここは無視して進めます。
(3) config/environments/production.rb
のconfig.public_file_server.enabled
の行を以下に置き換える。
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? || ENV['RENDER'].present?
Build Scriptの作成
bin
フォルダ内にrender-build.sh
というファイルを作成し以下を貼り付ける。
#!/usr/bin/env bash
# exit on error
set -o errexit
bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
次にターミナルから
chmod a+x bin/render-build.sh
を走らせてこのscriptが走る事を確認する。
Render.comへのdeploy準備
プロジェクトのroot directoryにrender.yaml
というファイルを作成し以下を貼り付ける。
databases:
- name: shoplify
databaseName: shoplify
user: shoplify
services:
- type: web
name: shoplify
env: ruby
buildCommand: './bin/render-build.sh'
startCommand: 'bundle exec puma -C config/puma.rb'
envVars:
- key: DATABASE_URL
fromDatabase:
name: shoplify
property: connectionString
- key: RAILS_MASTER_KEY
sync: false
shoplify
はYouTube動画で作成しているプロジェクト名ですが、この部分は好きなプロジェクト名に変更しても問題ありません。後にDBやWeb Service作成時に必要になります。
ここまで出来たらGitHubもしくはGitLabのrepositoryへpushしてください。
Deploy編
GigHubとGitLabとGoogleを経由でsign in可能なので登録は特に必要ないです。私はGitHubからdeployするのでGitHUb経由でsign inしてます。
① DB作成
DashboardからNew
ボタンをクリックしてすると選択肢が出てくるのでPostgreSQL
を選択。
Name
とDatabase
とUser
にrender.yaml
で入力した値を入力(私の場合はshoplify
)してCreate Database
をクリック。
これでDBが作成されます。
② Web Service作成
DashboardからNew
ボタンをクリックしてすると選択肢が出てくるのでWeb Service
を選択。
Configure account
をクリックしてRender.comに繋げるアカウントを選択。
Repository accessを設定する。私はOnly select repositoriesを選択し、接続するreposotiryを指定。私はshoplify
を選択。
Connect a repositoryのところでshoplify
を選択
詳細入力画面でrender.yaml
に入力したプロジェクト名を入力。私の場合はshoplify
。
次にBuild CommandとStart Commandにrender.yamlの値を入力する。
最後にAdvanced
→Add Environmental Variable
から環境変数を追加。
DATABASE_URL
の値ですが、dashboardで先ほど作成したDBを選択し、ConnectionsにあるInternal Database URLをコピペして入力。
RAILS_MASTER_KEY
はconfig/master.key
に記されている値をそのまま入力。
ここまで出来たらCreate Web Service
をクリック。
これでdeployできたかと思いましたが残念ながら失敗。ログを見ると
$ bundle lock --add-platform x86_64-linux
を走らせる必要があるようです。参考までに以下の記事にもこの部分の解説がありました。
上記を走らせてからrespositoryにpushして再度deployしたところ成功しました!
最後に
途中で気づいたのですがRender.comではDBが1つしか無料で有効化できないようなので使い勝手が良いとは言えず、情報が少ないのもそのせいな気がしてます。
とは言えheroku以外へのdeploy経験ができたので個人的には前向きに捉えてます。