Makina Blog
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
Valider les types énumérés Django en base de données
Django
21/01/2025

Utiliser des fonctions PostgreSQL dans des contraintes Django
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.

Comment migrer vers une version récente de Django ?
Django
06/11/2023
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.
