How to deploy your Python Django project
Tags: django, python
Published: 2021-11-18 20:37:27

[Django](https://www.djangoproject.com/) is a top Python web-framework known for its features, scalability, and flexibility.

In this guide, we'll walk through how you can deploy your Django projects with [Cleavr.io](https://cleavr.io).


## Prerequisites

Before proceeding, you'll need to have an active [Cleavr.io](https://cleavr.io) account and have a server provisioned and ready-to-go.

## Step 1 - Add a NodeJS SSR app

Add a new NodeJS SSR site to your server in Cleavr.

We're using NodeJS SSR as the site's app type as it will install Node AND PM2 to the server. PM2 manages more than just node applications, so we'll take advantage of this to serve our Django app and keep it alive.

## Step 2 - Configure allowed hosts

In the Django project, locate the `settings.py` file, or wherever you have `ALLOWED_HOSTS` defined, and add the domain used in the previous step to the list of allowed hosts.

For example, this is what our example looks like:

```
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'c2lbzu22oxujfgnr2848.cleaver.rocks']
```

Push your changes to your GIT repo.

## Step 3 - Configure app repo

Once the site has successfully been added to the server, click the **Setup and deploy** link to configure the web app.

On the settings > repo tab, add `armgitaar/django-helloworld` to the repo and keep branch as `master`.

In this example, we're using a Django repo originally by [Django Venezuela](https://github.com/django-ve) that I've modified a bit to make the port number use the one automatically assigned by Cleavr. [View the example repo here](https://github.com/armgitaar/django-helloworld).

To view the modification, open the [manage.py](https://github.com/armgitaar/django-helloworld/blob/master/manage.py) file and take note of the following lines:

```
from django.core.management.commands.runserver import Command as runserver
runserver.default_port = os.environ.get('PORT', 8000)
```

Django apps default to run on port `8000` and the above configuration will first check what the environment port is and will select that port if available.

## Step 4 - Configure entry and PM2 ecosystem

On the **Build** tab, set **Entry Point** to `manage.py` and **Arguments** to `runserver`.

In the PM2 ecosystem, we'll need to set the interpreter to Python3 as well as remove a couple of configs that aren't compatible with Python apps.

Add interpreter:
```
"interpreter": "/usr/bin/python3",
```

Remove the following lines:
```
 "instances": "max",
 "exec_mode": "cluster_mode",
```

The ecosystem should look similar to the following:

```
{
  "name": "your.domain.com",
  "script": "manage.py",
  "args": "runserver",
  "log_type": "json",
  "cwd": "/home/cleavr/your.domain.com/current",
  "interpreter": "/usr/bin/python3",
  "env": {
    "PORT": assigned port number,
    "CI": 1,
  }
}
```

## Step 5 - Configure deployment hooks

On the deployment hooks page,

- Disable **Install NPM Packages** hook
- Disable **Build Assets** hook

Add a new hook to install Python dependencies:

```
pip install -r requirements.txt
```

Add a new hook for migration:

```
python3 manage.py migrate
```

Order the above hooks to run before the activation deployment hook.


## Step 6 - deploy!

Once all of the above is complete, deploy the app!

For this example, there is one more thing we need to do, which is create an admin. The easiest way is to SSH into the server and run the following command:

```
python3 manage.py createsuperuser --username admin --email admin@mail.com
```

You will be prompted to add and confirm a password.

Once completed, you should now see 'Hello World' render on the app's domain.