This morning I wanted to deploy a simple Sinatra app to Render.com. It wasn’t super obvious to me, so I figured I’d write down what worked in the end.
First, a Gemfile:
# Gemfile
source 'https://rubygems.org'
gem 'sinatra'
gem 'sinatra-contrib'
gem 'puma'
* I’m pretty sure sinatra-contrib
is not necessary.
Also at this point in time you’ll need to bundle lock --add-platform x86_64-linux
for your Render.com deployment to work.
Here’s my main.rb
"hello world" app:
# main.rb
require 'sinatra'
get '/' do
'Hello world!'
end
And .ruby-version
, assuming you’re using a version manager like rbenv:
3.2.2
I decided to use a render build file, even though it’s very simple. ./bin/render-build.sh
:
#!/usr/bin/env bash
# exit on error
set -o errexit
bundle install
Finally, in production (Render.com) I needed to use a config.ru
file. Attempting to run with a simple ruby main.rb
resulted in this error:
==> Starting service with 'ruby main.rb'
<internal:/opt/render/project/rubies/ruby-3.2.2/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sinatra (LoadError)
from <internal:/opt/render/project/rubies/ruby-3.2.2/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from main.rb:2:in `<main>'
Here’s my config.ru
:
# config.ru (run with rackup)
require './main'
run Sinatra::Application
And so my Build Command in Render.com settings:
./bin/render-build.sh
And my Start Command in Render.com settings:
rackup -p $PORT