Project

General

Profile

Actions

Django hosting by ungleich

Status

This document is IN PRODUCTION (since 2016-04-08).
Pricing can be found on the ungleich products page.

Version 2: Kubernetes Based (active as of 2023)

Deployment preparation

  • Create a (docker) container that contains everything the django app needs to run
  • The container should listen on port 9000
    • This allows running django on port 8000 and potentially an nginx or similar inside for serving static files as well
  • The container needs to read the database configuration from environment variables (see below)

Database configuration

The database configuration is passed into the container using environment variables as follows:

  POSTGRES_USER
  POSTGRES_DB
  POSTGRES_PASSWORD
  POSTGRES_HOST

Additionally the following variable is passed in that needs to be interpolated (i.e. variables need to resolve):

DATABASE_URL = postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):5432/$(POSTGRES_DB)

Static (pre-compiled) files

If you want to serve static, pre-compiled files, add them into your container in /app/static.
All files stored in that directory will be exposed using an integrated nginx.

Data directory

If your application needs to store files to persistent storage, it should be stored below /data. Usually the following structure is used:

  • DJANGO_MEDIA_ROOT = /data/media

Version 1: VM Based (obsolete as of 2023)

How to use

  1. Configure your app
  2. Deploy your app
  3. Install project specific python requirements into the pyvenv
  4. Restart uwsgi to restart your app
  5. Go to http://your-hostname/ and enjoy!

Configure your app

WSGI

  • Ensure that there is projectname/wsgi.py in your project root
Database

Add the following to your settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'app',
    }
}

Static and media files

Static files should be placed in /home/app/app/static and media files in /home/app/app/media.

Use the following code for configuration:

PROJECT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')

Usually to generate/deploy the static files, you can use collectstatic:

python manage.py collectstatic                                                             

Deploy (first time)

You can login to your VM as user app:

ssh app@MYHOSTNAME
git clone <path-to-your-project> ~/app
  • Deploy / update your app into the folder ~app/app (that is the app folder in the home of the user app)
  • We recommended to use git to deploy it

Deploy (update)

ssh app@MYHOSTNAME
cd ~/app
git pull

Install python requirements into the pyvenv

Pyvenv has been installed to ~app/pyvenv for you.
Required packages for the hosting like PostgreSQL support and uwsgi support have already been placed.

You need to use pyvenv found in ~app/pyvenv, as uwsgi loads this pyvenv before loading your app.

To install your requirements use:

. ~/pyvenv/bin/activate
pip install ...

Restarting the app

  • sudo systemctl restart uwsgi

Viewing logfiles

  • nginx access log: tail -F /var/log/nginx/access.log
  • nginx error log: tail -F /var/log/nginx/error.log
  • uwsgi log: tail -F /var/log/uwsgi/app/app.log

Description of the stack

Technologies

  • Debian
  • nginx
  • PostgreSQL
  • uwsgi
  • python3 venv

Configuration

  • user "app"
    • in group "adm" (to view logfiles)
  • PostgreSQL with
    • database "app"
    • Listens only on localhost / socket (no remote connections)

Updated by Nico Schottelius about 1 month ago ยท 30 revisions