Saturday, March 31, 2012

ISPConfig with Django 1.4, Virtualenv and WSGI on Debian Squeeze

I recently go a killer deal on a VPS at so I am moving all my stuff from my Webfaction and Linode to my own VPS. I want something to easily manage my apache configs, dns and mail still and have used ISPConfig in the past and found it pretty good for a free open source program. I actually like it better than cPanel or DirectAdmin which I find too restrictive.

Moving my Django projects from Webfaction will take a bit of work. ISPConfig has some nice options in the GUI for PHP but the Python option uses mod_python :(.

This will not be a complete guide but as usual some documentation for myself. It assumes that ISPConfig is already setup and working, there is an decent setup guide in docs/INSTALL_DEBIAN_6.0_courier_mydns.txt and some older but still useable docs here

First you need to install some additional packages
apt-get install python-setuptools libapache2-mod-wsgi python-dev -y
easy_install pip
pip install virtualenv

Then you need to setup your site in ISPConfig and copy your Django project to it or start a new one. For simplicity we will just create a new one here
cd /var/www/
virtualenv myproject-env
. /myproject-env/bin/activate
pip install mysql-python
pip install PIL
pip install django
django startproject myproject
This will create a file in myproject/myproject/

Then in your ISPConfig Site go to Sites > Website > > Options and in the Apache Directive add the following. Make sure to change the path to the correct absolute path.
Alias /media/ /var/www/clients/client0/web1/myproject/myproject/media/
Alias /static/ /var/www/clients/client0/web1/myproject/myproject/static/

Alias /robots.txt /var/www/clients/client0/web1/myproject/myproject/static/robots.txt
Alias /favicon.ico /var/www/clients/client0/web1/myproject/myproject/static/images/favicon.ico

WSGIDaemonProcess user=web1 group=client0 python-path=/var/www/clients/client0/web1:/var/www/clients/client0/web1/myproject-env/lib/python2.6/site-packages
WSGIScriptAlias / /var/www/clients/client0/web1/myproject/myproject/
<Directory /var/www/clients/client0/web1/myproject>
Order deny,allow
Allow from all
<Directory /var/www/clients/client0/web1/myproject>
Order deny,allow
Allow from all

<Directory /var/www/clients/client0/web1/myproject>
Order deny,allow
Allow from all
This assumes that STATIC_URL STATIC_ROOT MEDIA_URL and MEDIA_ROOT are set to /static/ and /media/ in myproject/myproject
# Django settings for myproject project.
import os

# Add this near the top
PROJECT_DIR = os.path.abspath(os.path. dirname(__file__))

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/"

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "", ""
MEDIA_URL = '/media/'

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/"

# URL prefix for static files.
# Example: ""
STATIC_URL = '/static/'

That should be it.  Make sure that user web1 and group client0 are the owners of the correct directories and files and have exec permission.


Yusuf Febrian Hanjaya said...

hi justin thanks for tutorial but i test your tutorial doesn't running and i have a message "ERROR 403 - Forbidden!:

Justin Hamade said...

Hi Yusuf,

I have stopped using ispconfig and would recommend not using it.

nao-sou-alemao said...

What are you using now?

Justin Hamade said...

Manual config with uwsgi and nginx