Makina Blog

Le blog Makina-corpus

Déployer vos projets Django avec git push


Un guide pour mettre à jour vos applications en production avec git.

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 [#]_ ! Ou utilisez un fichier requirements.txt [#]_ 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.

mkdir -p /var/git/yourapp.git
mkdir -p /var/www/yourapp

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

cd /var/git/yourapp.git
git init --bare .

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 !

Actualités en lien

DbTools­Bundle : sortie de la version 2

18/03/2025

Décou­vrez les nouveau­tés de la version 2 du DbTools­Bundle, au programme : version Stan­da­lone, Docker et Lara­vel
Voir l'article
Image

Vali­der les types énumé­rés Django en base de données

21/01/2025

Appre­nez à mettre en place une contrainte SQL permet­tant de vali­der les types énumé­rés en base de données à l’aide de l’ORM Django.
Voir l'article
Image
Encart Django

Utiliser des fonctions PostgreSQL dans des contraintes Django

07/11/2023

Cet article vous présente comment utiliser les fonctions et les check constraints PostgreSQL en tant que contrainte sur vos modèles Django.

Voir l'article
Image
Django PostgreSQL

Inscription à la newsletter

Nous vous avons convaincus