David Boureau

Web developer & teacher @saaslit

How to deploy a Rails 7 app to Heroku

Heroku is the most well-known deployment platform, and also the easiest to use. Let's try it on a fresh but realistic Rails 7 application.

What is Heroku?

Heroku is the most well-known deployment platform, i.e. a place where to make your web application available to the public, on the wild Internet - so not just on your local machine.

Despite the raise of multiple competitors, for many years now, it is still unbeaten in terms of simplicity and ubiquity.

Heroku is so good, that they are able to increase prices despite the lack of roadmap - a miracle in the IT field.

I wrote about HatchboxIO recently, which was a decent alternative for Rails users.

The bare minimal Rails 7 application

We are going to ensure that the deployed app is able to handle JS, CSS, and relational database. I see too many tutorials where a "Hello world" page is considered good enough. I personaly advise to try a little more than that, in order to compare deployment platforms from a broader perspective : assets compilation, database, seeding, and so on.

Prerequisites for this tutorial

ruby -v  # 3.3.0
rails -v  # 7.1.3
bundle -v  # 2.4.10
node -v # 20.11.0
yarn --version # 1.22.21
git --version # 2.34.1
psql --version # 14.11

Build a simple Rails app

Ok we take the most simple use case, so let's use Boring Rails™ here

mkdir myapp && cd myapp 
echo "source 'https://rubygems.org'" > Gemfile
echo "gem 'rails', '7.1.3.2'" >> Gemfile
bundle install

bundle exec rails new . --force --database=postgresql -j=esbuild -c=tailwind

So now we have a production-ready database (postgre), a JS builder (esbuild), a real-world framework (tailwind)

Add an authentication workflow

In order to have some logic, as well as a populated database, let's add an authentication gem.

bundle add authentication-zero
bin/rails generate authentication
bin/rails db:create db:migrate

The bare minimal CSS and JS

Just add a little bit of Tailwind classes on one element to see if CSS will work properly

Inside app/views/sessions/new.html.erb, change the form submit as follow :

  <div data-controller="hello">
    <%= form.submit "Sign in", class: "text-white bg-blue-700 hover:bg-blue-800 focus:outline-none focus:ring-4 focus:ring-blue-300 font-medium rounded-full text-sm px-5 py-2.5 text-center me-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" %>
  </div>

And change app/javascript/controllers/hello_controller.js as follow :

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  connect() {
    console.log("Stimulus is working!")
  }
}

The Procfile

The Procfile is an easy-to-understand text file, where you describe what will be run on each release

Good news : you already have a Procfile.dev file for local developments.

web: env RUBY_DEBUG_OPEN=true bin/rails server
js: yarn build --watch
css: yarn build:css --watch

This is the local Procfile.dev - even if you don't know about it, you can guess it launches a server, and watch changes about js and css.

Now add Procfile file like this, at the root of your project :

web: bundle exec puma -C config/puma.rb
release: bin/rails db:migrate

Before Heroku - check that everything is working locally

Launch your app locally with

bin/dev

And open your browser at localhost:3000

You should see the blue button for "sign in", meaning that Tailwind is working locally.

You should see "Stimulus is working!" in the web dev console of the browser.

Try to login with credentials - it should show an error.

Good! So now we have something that is closer of an actual production webapp.

Deploy to Heroku

First, install the Heroku CLI on your local machine.

Then, stay at the root of "myapp" in your terminal, and type :

heroku --version # Should print current Heroku CLI version
heroku login  

Now credit card is required (alas) at Heroku billing page

Then

heroku create 
heroku addons 
# Should print : No add-ons for app MyApp
heroku addons:create heroku-postgresql:mini
heroku buildpacks:add --index 1 heroku/ruby
heroku buildpacks:add --index 2 heroku/nodejs

And finally

git add . && git commit -m 'initial commit'
git push heroku main

Wait for one minute or two, you should see the build logs in your terminal...

and...

Done!

Now you should see your app under the heroku dashboard, which is pretty intuitive.

Open the app, check again that the CSS and JS are working properly.

Summary

Setting up a real-world application was actually longer than deploying an app to Heroku, which is still nowadays the best cross-deployment app for junior developer. I wouldn't advise to stick to Heroku for a long time. Once you get your first users, it may be time to consider another platform, since it's really not cheap once you meet success.

Good luck to all, health first!

David.

☝️ Join the junior webdev newsletter

We try to send you every week language-agnostic algorithm exercice and relevant blog articles

Read more