Heroku: how to deploy a Django app with Postgres in 5 minutes!

Heroku is the Platform as a Service (PaaS) platform that allows web developers to develop, create, run and manage their web applications completely on the cloud. To be provided as a service not just the hardware, but also the platform that seperates the hardware itself and allows you to enjoy the features that allow you to easilly carry out automatic balancing, deployment management and lots more.

If you do not already have an account with heroku, you can simply sign up now by going to heroku.com, it is entirely free to register and start using their services right away.

Deploying a Django Web Application on heroku is usually a difficult task to carry out as a beginner especially when your Django application has a backend and you want to use the heroku postgres as your cloud database.

In my early days building and hosting django projects on heroku, i really spent several hours reading online how to host a django project with postgres on heroku because there was no detailed article on how to do that. This post is step by step guide to on how i learnt to deploy Django apps on heroku easily using postgres as backend.

STEP 1: Create a Django app ( This is if you haven’t already created it).

STEP 2 : Download and Install the Heroku Command Line Interface.

STEP 3 : Open up your main project folder in the terminal. Create and activate a new virtual environment (this is if you dont already use a seperate virtual environment for this your project that you want to host.

cd main_project_folder
virtualenv venv
source venv/bin/activate

STEP 4: Install the dependencies and these packages that are required by your django app.

pip install django gunicorn whitenoise dj-database-url psycopg2

STEP 5 : Create a file named Procfile and add the following line below to it.

web: gunicorn nameOfProject.wsgi --log-file -

Here nameOfProject is name of folder which includes

settings.py

Heroku apps makes use of a file named Procfile with no extensions that declares the commands that are executed by the application on the applications startup. For more information about Heroku Procfile, refer → Here

STEP 6 : Create a requirements file requirements.txt

This requirements file will hold all the modules that you made use in your app for proper functioning and yeah you do not have to manually write down every module that you used, there's a command for that and its right below.

pip freeze > requirements.txt

STEP 7 : Create a runtime file
Use the command below to create a runtime text file in your projects root folder

touch runtime.txt

then, add the following python-3.6.7 or any other python runtime supported by heroku.

STEP 8 : Initialize a git repository in your application root folder(if you have not already done that). Also add and save the changes you made to git.

git init

Add all the changes to git by running

git add .

and commit the changes them by

git commit -m "message"

STEP 9 : Login to Heroku terminal by running

heroku login

Next create your heroku application by running

heroku create

If you wants to use a custom name other than the generated name that is usually out of context, run the following commands instead

heroku create nameofapp

STEP 10 : Now let us modify the settings.py file a bit.

Modify allowed hosts by adding thenameofyourapp.herokuapp.com

ALLOWED_HOSTS = ['0.0.0.0', 'localhost', '127.0.0.1', 'nameofapp.herokuapp.com']

You can also use

ALLOWED_HOSTS = ['*',]

Next, Set

DEBUG = False

this is done you could use heroku logs for debugging and your application would show an error page instead of showing your application errors in production.

Modify the INSTALLED_APPS in the settings by adding

whitenoise.runserver_nostatic

also the MIDDLEWARE settings by adding

'whitenoise.middleware.WhiteNoiseMiddleware',

next add the following

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Add

import dj_database_url

at the top. After the DATABASES section
add

db_from_env = dj_database_url.config(conn_max_age=600)
DATABASES['default'].update(db_from_env)

Also make sure that your settings file has the following variables set STATIC_URL, STATIC_ROOT , STATICFILES_DIRS accordingly.

Also make sure that the media file variables is set.

MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'

Commit the changes and save them in git by running

git add .

and

git commit -m "change settings"

STEP 11: Adding and configuring Postgres ( this was a challenge to me then...lol)

The following commands would create postgresql database on heroku for you app and fetch the database url.

heroku addons:create heroku-postgresql:hobby-dev
heroku config -s | grep DATABASE_URL

You can also run

heroku pg:info

to get the details of your database on heroku.

Add-on

will give you nameOfHerokuDB .
Now You can also push your local Postgres database to herokuDB by running

push local database:PGUSER=postgres PGPASSWORD=password  heroku pg:push postgres://name_of_host/name_of_local_database nameOfHerokuDB

For example

PGUSER=postgres PGPASSWORD=mydemopassword heroku pg:push postgres://localhost/myDB  postgresql-convex-12345

**STEP 12 : Disable the default heroku Collectstatic command and push the files to heroku.

Heres something i do, to avoid the heroku static files issues, i run the following commands bellow

python manage.py collectstatic

then i add and commit to git, next i run

heroku config:set DISABLE_COLLECTSTATIC=1
git push heroku master

You can open your deployed application by running

heroku open

Possible Errors

  • If you have not already set static root in your Django settings, you will get a DISABLECOLLECTSTATIC error.
  • Django does not serve static files in the application's server on it's own, that is why why we have to define a place where heroku can keep and manage all the static files.
  • Simply add STATIC_ROOT in your settings.py file. After making all the necesssary changes, make a commit and try pushing with
git push heroku master

again.

It's Deployed!

Congratulations. If you encounter error during the push command which usually comes if you are doing it for the first time, do not freak out, a solution is around the corner, you can simply comment your issue bellow or you can search on Stackoverflow.

20