Deploying your Django app on Railway

Deploying your Django app on Railway

The Heroku alternative you've been looking for

In this article, we will be deploying our Django app on Railway. Railway is a Platform as a Service (PAAS) and they offer web server and database hosting which is sufficient to deploy our app to the web.

Before moving on with this tutorial, there is a prerequisite which is detailed in this guide. You can call it pre-deployment. Please go through it and come back once it's checked ☑️

Also, you need to create an account on Railway(obviously).

Now, let's begin.

Installing Nixpacks

Run the command below in your terminal if you use Ubuntu or WSL2. Else you can check for other methods here.

curl -LO https://github.com/railwayapp/nixpacks/releases/download/v2.0.11/nixpacks-v2.0.11-amd64.deb sudo dpkg -i nixpacks-v2.0.11-amd64.deb

Installing Railway CLI

You can install this using the shell script below if you're on macOS, Linux or Windows via WSL. Just run the command in your applicable terminal. You can check for other methods here.

bash <(curl -fsSL cli.new)

Login

railway login

Create a Project

A project is like a Github Organization or an Heroku Pipeline that defaults to the production environment. You can also create other environments for staging, testing, etc

railway init

Associate Directory to Project

Basically, this links the current directory (folder) you're in, to your Railway project. Very useful, especially as you can have multiple projects.

railway link

Navigate with the arrow keys and hit enter to select a project.

Environment Variables

Railway may have asked you to let them set up your environment variables from your .env file while you were deploying with railway up. That works but you may want to modify or add more. To see all existing environment variables, run

railway variables

To set or modify a variable

railway variables set {VARIABLE_NAME}:{VARIABLE_VALUE}

Procfile

Procfiles are a popular format used to specify a web/release process. To use this you need to create a Procfile in your root directory.

touch Procfile

Then paste this into it

web: gunicorn {YOUR_DJANGO_PROJECT_NAME}.wsgi

release: python manage.py migrate

Deploy

At this point, our app should be ready for a smooth deployment. You can do this with

railway up

It then builds and deploys your app on Railway 🎉

Nixpacks

If you had a successful deployment, you can skip this. However, if you have a psycop2g dependency, you'll run into an error while trying to deploy (as at the time of writing this). The fix for this is to install a postgresql nix package. First, create a file called nixpacks.toml in your root directory touch nixpacks.toml Then paste this snippet into it [phases.setup] nixPkgs = ["...", "postgresql"]

Port

After deploying your app, you need to set up a port number as Railway doesn't do this for us out of the box. Login to Railway on your web browser. Navigate to your project, then to your web deployment, then to your settings, and then set your port to 8000 as is the default for Django. Or whatever you want to use.

Shell commands

There are where we would need to run some commands directly in the hosted environment. With Railway, we can do this in a subshell that makes use of our hosted app's variables.

railway shell

This opens up that subshell. And for example, we can then create a superuser as we usually do with

python manage.py createsuperuser

Domain name

After our app is deployed, we need to generate a domain name for it so that it becomes accessible as Railway does not generate one by default. Pretty much the same process for setting up our port earlier.

End

And that's all that needs to be done! Thanks for following through to the end, and let me know if you encountered any issue not mentioned here.

¡Hasta luego!