Deploying our Plug.Router application to Heroku
By Bobby Grayson | Posted 2019-02-12
Want to put your app in the real world? Today we do it with Heroku!
In our previous post, Building web apps with Plug.Router we built a website using just Plut.Router.
Today we’ll explore how to take the previous app we built and get it up and running on Heroku; this post won’t focus on Phoenix deployments.
In this (brief) post, we will show how to get things up and running on Heroku for a vanilla Plug app.
It really is quite easy, but today when I set out to do it, the resources I found either focused on Phoenix or had a few holes, so I figured I would write up a simple one here.
Before we get started, head over to Heroku and make an account as well as install their CLI tools.
Let’s Do It
To deploy our application to Heroku we’ll need to do a few things:
-
Add a
Procfilewhich tells Heroku what our server process does - Add buildpacks to our application. These instruct Heroku on how to build our Elixir code.
- Add our environment variables
-
Finally, update our
application.excode to use thePORTvariable provided by Heroku
We won’t waste too much time on Procfile details but simply put they define what our server processes will do. In our case we’ll want to run our application in the web process. To do that let’s create and open Procfile in our application root:
web: mix run --no-halt
We’ve told Heroku we want our web process to execute the mix run --no-halt command.
That’s it!
Now we can run heroku create to make it real.
We have a few more steps before its ready to see live, though.
The joy of using Heroku is that they handle a lot of the work for you with awesome builtin tooling.
One of those features is the buildpacks which include instructions for building, in our case compiling, our application code.
For Elixir we’ll need to add a specialized buildpack that knows how to fetch Elixir dependencies and build that code.
heroku buildpacks:set https://github.com/HashNuke/heroku-buildpack-elixir
Now we need to setup our environment variables.
For our application we only need to worry about one: MIX_ENV.
heroku config:set MIX_ENV=prod
We also need to give our buildpack some config so it knows what our Elixir/Erlang environments are like.
Put this in a file called elixir_buildpack.config.
# Erlang version
erlang_version=21.1
# Elixir version
elixir_version=1.8
Now we can get it up in the real world:
git push heroku master && heroku open
And after that push succeeds, we can see our portfolio site live and working in the real world.
Happy Hacking!