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
Git : annuler proprement un commit après un push Git : annuler proprement un commit après un push 03/11/2011

Python : Bien configurer son environnement de développement Python : Bien configurer son environnement de développement 07/12/2015

Comment utiliser les bonnes pratiques de développement Python.

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.