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
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.
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.
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.