A few months ago I started to play with Fabric, and the result was a simple script that automates the creation of a new Django project. In the last months I continued my experiments and extended the script to a full stack for creation and deployment of Django projects.
As the details behind the script like the project structure that I use and the server setup are a bit long, I will keep this post only on the script usage. I will write a follow-up one describing the project structure and server.
So in brief, the setup that I use consists of Ubuntu, Nginx as web server and uWSGI as application server. Upstart controls the last one. The script is available for download at GitHub.
In a wait for more detailed documentation, here is a short description of the main tasks and what they do:
startproject:<project_name>
- Creates a new virtual environment
- Installs the predefined packages (uWSGI, Django and South))
- Creates a new Django project from the predefined template
- Creates different configuration files for development and production environment
- Initializes a new git repository
- Prompts the user to choose a database type. Then installs database required packages, creates a new database and user with the name of the project and generates the local settings file
- Runs syncdb(if database is selected) and collectstatic
setup_server
- installs the required packages such as Nginx, PIP, GCC, etc.
- prompts for a database type and install it
- reboots the server as some packages may require it
Once you have a ready server and a project, just use this the following task to deploy it to the server. Please have in mind that it should be used only for initial deployment.
deploy_project:<project_name>,<env_type>,<project_repository>
- Creates a new virtual environment
- Clones the project from the repository
- Installs the required packages
- Creates symbolic links to the nginx/uwsgi configuration files
- Asks for a database engine, creates a new DB / User with the project name and updates the settings file
- Calls the update_project task
update_project:<project_name>,<env_type>
- Updates the source code
- Installs the required packages(if there are new)
- Runs syncdb, migrate and collect static
- Restart the Upstart job that runs the uWSGI and the Nginx server
The script is still in development, so use it at your own risk. Also, it reflects my own idea of server/application (I am planning to describe it deeper in a follow-up post) setup, but I would really like if you try it and give feedback. Feel free to fork, comment and advice.