All the web developers would like to see their application hosted somewhere in the web where everybody can access it. When I tried to do the same for my django application, there was no free or cheap option to do that. And I didn't wish pay just for testing my application in a live environment. I tried many services like Alwaysdata, Google App Engine and Heroku. But all of them confused me in the beginning and have their own limitations.

Heroku

Later I worked on heroku in one my of projects and only then I understood how easy it is to deploy a django app in heroku. Here I'm giving step-by-step instructions to deploy a django app in heroku which will help lot more people like me.

I'm explaining the steps for deployment from using an Ubuntu system. But most of the methods will remain same irrespective of the operating system.

Versions Used

  • Django - 1.6.5
  • Git - 1.9.1
  • Ubuntu - 14.04

Step 1: Setup Heroku account

Go to Heroku site and create an account using your email address. This is free. No credit card or any other payment information required.

Step 2: Setup Heroku toolbelt

Install Heroku toolbelt in your system. The tool is available for all the most popular platforms. Login to your heroku account from the terminal using the command

heroku login

This will setup your heroku account in your system and will upload SSH key from your system to your heroku account.

Step 3: Setup Git

If you are not using git, download and install git from Git SCM. You can learn more about git from the presentation on Slideshare.

Step 4: Create and clone heroku app

Method 1: Login to your heroku account and create an application by giving a name of your choice. The URL of your heroku application will be yourappname.herokuapp.com. After creating the application, clone it to your system using the command

heroku git:clone -a yourappname

Method 2: You can also create heroku application using the command

heroku create yourappname

You can use any of these methods to create heroku application. If you don't specify your app name in command line, heroku will choose one for you.

Step 5: Configure your django project

Now we need to modify our django project to make it work in the heroku server. Before starting this make sure you are having pip installed in your system.

Step 5.1: Install django-toolbelt

Install django-toolbelt using the command

pip install django-toolbelt

This is a collection of the following packages: Django, psycopg2, gunicorn, dj-database-url, dj-static, static.

Step 5.2: Declare Procfile

Procfile will be used to decalre what command should be executed to start a web dyno. Create a text file in the root directory of your application with the following content

web: gunicorn yourappname.wsgi

This will be used to start your application during each deployment.

Step 5.3: Create requirements.txt

Create requirements.txt using the command

pip freeze > requirements.txt

in the root folder of your application, if you haven't done this already. This will be used to install the dependencies for your application.

Step 5.4: Configure settings.py

Configure your application's settings.py to suit the heroku environment. Include the following settings in your settings.py

# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] =  dj_database_url.config()

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Allow all host headers
ALLOWED_HOSTS = ['*']

# Static asset configuration
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

Make sure that you have all these settings defined only in one location and all dependencies installed.

Step 5.5: Configure wsgi.py

Open wsgi.py and replace the file content with the following content

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

This will be used to serve static files in production environment.

Step 6: Deploy to heroku

Copy your project content to the heroku app folder created in Step 4. Commit your changes using the command

git add .
git commit -am "Initial commit"

You can give a commit message of your choice. After committing, push the application to heroku using the command

git push heroku master

Sometimes you may have to use the command

git push origin master

Step 7: Run syncdb

You can run django management commands using the command heroku run python manage.py <command>. To sync your database, run the command

heroku run python manage.py syncdb

Step 8: Scale web dyno

Web dynos are processes that will run your application. You need to increase your app's web dyno to 1. Heroku offers only one web dyno for free. If you need more than one web dyno, you need to pay heroku. You can scale the web dyno using the following command

heroku ps:scale web=1

One web dyno is sufficient for testing an application or for personal use.

Step 9: Adding custom domain (optional)

If you like to use custom domain for your heroku application, you can do so by adding the domain to your herokuapp and configuring CNAME in your domain DNS editor. Add the domain to your heroku app using the following command.

heroku domains:add www.example.com

Configure CNAME in your domain DNS editor with host as www and Points to as yourappname.herokuapp.com.

Your django application should be live on heroku now. If you are facing any issues, you can check heroku logs using the command

heroku logs

If you are having more than one command in your heroku account, you can run a heroku command by specifying app using --app parameter as given below

heroku run python manage.py shell --app yourappname

Now we have successfully deployed a django application on heroku. Feel free to post your feedback and questions as comments.