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

Image
Django PostgreSQL
07/11/2023

Utiliser des fonctions PostgreSQL dans des contraintes Django

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
Encart Django
06/11/2023

Comment migrer vers une version récente de Django ?

Que ce soit pour avoir les dernières fonctionnalités ou les correctifs de sécurité, rester sur une version récente de Django est important pour la pérennité de son projet.

Voir l'article
Image
Agrégateur Geotrek
08/06/2023

Le projet Agrégateur : fusionner des bases de données Geotrek

Le partage et la diffusion des données font partie des problématiques historiques au cœur du projet Geotrek.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus