Accueil / Blog / Métier / 2013 / Déployer vos projets Django avec git push

Déployer vos projets Django avec git push

Par Mathieu Leplatre publié 26/08/2013, édité le 28/01/2016
Un guide pour mettre à jour vos applications en production avec git.
Déployer vos projets Django avec git push

Déployer des applications en une seule commande est devenue le Saint-Graal des développeurs! Il y a d'ailleurs plus d'articles là-dessus que sur les croisades du Moyen-âge :)

Je ne pouvais pas laisser passer l'opportunité d'en écrire un moi aussi !

Avertissement: L'objectif est de présenter un article le plus simple, clair et court possible. L'installation du serveur depuis zéro n'utilise donc pas d'outil de déploiement/approvisionnement (autre sujet brûlant)

Prérequis : dépendances simplifiées

Il est chaudement recommandé d'avoir un Makefile simple pour votre application, qui regroupe les commandes nécessaires à l'installation des dépendances.

Voici un exemple minimaliste (fonctionnel), pour un projet nommé revolution

install: bin/python

bin/python:
    virtualenv .
    bin/python setup.py develop

serve: bin/python
    bin/python ./manage.py runserver 8888

deploy: bin/python
    bin/python ./manage.py collectstatic --clear --noinput
    touch revolution/wsgi.py  # trigger reload

clean:
    rm -rf bin/ lib/ build/ dist/ *.egg-info/ include/ local/

Si votre projet n'a pas de setup.py, écrivez-en un [1] ! Ou utilisez un fichier requirements.txt [2] en remplaçant bin/python setup.py develop par bin/pip install -r requirements.txt dans le Makefile.

Désormais, vous pouvez lancer les commandes de déploiement avec make deploy.

Première étape : configuration du serveur

Préparer le dépôt

Sur le serveur, créez deux répertoires : un pour le dépôt Git l'autre pour l'application déployée.

En l'initialisant de la manière suivante, le dépôt Git pourra ensuite nous servir de remote:

Grâce aux hooks Git, nous allons déployer le code reçu ("pushé" par un développeur) dans le répertoire de l'application déployée.

Créez le fichier hooks/post-receive avec le contenu suivant

#!/bin/sh
dest=/var/www/yourapp
echo "Deploying into $dest"
GIT_WORK_TREE=$dest git checkout --force
cd $dest
make deploy

Et rendez le exécutable

chmod +x /var/git/yourapp.git/hooks/post-receive

Configuration du serveur Web

Encore une fois, pour aller droit au but, nous utilisons ici Apache mod_wsgi, puisque sa mise en place est triviale.

Bien-sûr, nous gardons une préférence pour nginx, gunicorn, uwsgi or circus mais là, l'objectif c'est de décrire un déploiement avec git push !

sudo apt-get install libapache2-mod-wsgi

Créez un fichier de configuration Apache ultra simple dans /etc/apache2/sites-available/001-yourapp

WSGIPythonPath /var/www/yourapp:/var/www/yourapp/lib/python2.6/site-packages

<VirtualHost *:80>
    ServerName yourapp.com
    ServerAdmin contact@yourapp.com

    Alias /static/ /var/www/yourapp/public/static/
    <Directory /var/www/yourapp/public/static>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIScriptAlias / /var/www/yourapp/revolution/wsgi.py
    <Directory /var/www/yourapp/revolution/>
        <Files wsgi.py>
            Order deny,allow
            Allow from all
        </Files>
    </Directory>
</VirtualHost>

Et activer le site

sudo a2ensite 001-yourapp
sudo /etc/init.d/apache2 restart

L'application est désormais en ligne...

Étapes suivantes : push !

Maintenant que l'application est en production, vous allez évidemment déployer des mises à jour !

Confortablement installé sur votre siège, vous n'avez qu'à pusher des commits vers le serveur, de la même façon que pour votre forge préférée !

Ajouter la remote (la 1ère fois)

$ git remote add production ssh://user@server:/var/git/yourapp.git

Et pousser !

$ git push production master

...
Counting objects: 862, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (437/437), done.
Writing objects: 100% (817/817), 121.16 KiB, done.
Total 817 (delta 608), reused 452 (delta 332)
remote: Deploying into /var/www/yourapp
...
remote: bin/python setup.py develop
...
...
remote: 345 static files copied.
To server:/var/git/yourapp.git
   2fe81f4..76a3fb8  master -> master

Votre site est à jour ! En fonction évidemment des systèmes de cache etc., mais en tous cas, c'est la dernière version de l'application qui tourne !

Évidemment, vous allez vouloir pousser des branches spécifiques en production, mais ça, vous savez déjà faire ! Sinon contactez-nous !

[1]https://docs.djangoproject.com/en/dev/intro/reusable-apps/#packaging-your-app
[2]http://www.pip-installer.org/en/latest/requirements.html
ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Formation Django initiation à Toulouse du 13 au 15 mars Formation Django initiation à Toulouse du 13 au 15 mars 26/01/2017

Entrez de plain-pied dans l'univers de Django aux côtés de développeurs ayant une expérience de ...

Formation GIT le 28 novembre à Toulouse et Nantes Formation GIT le 28 novembre à Toulouse et Nantes 26/09/2016

Un peu de théorie et beaucoup de pratique pour comprendre le modèle et l’architecture de GIT.

Retour sur la PyConFr 2016 Retour sur la PyConFr 2016 18/10/2016

Nous étions présents à Rennes pour PyConFr 2016. Voici notre compte-rendu à chaud.

Wagtail: How to use the Page model and its manager (part 2) Wagtail: How to use the Page model and its manager (part 2) 08/08/2016

The Page model has several methods specific to Wagtail. This is also the case of its manager. We ...

Les nouveautés de Git 2.9 Les nouveautés de Git 2.9 16/06/2016

Il y a trois jours paraissait la version 2.9.0 de Git. Survol rapide des nouveautés.