work on production

This commit is contained in:
Fred Pauchet 2016-04-27 08:19:00 +02:00
parent e0a03fb4d8
commit 890d4a21e2
2 changed files with 48 additions and 4 deletions

View File

@ -2,13 +2,18 @@
Mise en production
==================
Le serveur que django met à notre disposition est prévu uniquement pour le développement.
Le serveur que django met à notre disposition est prévu uniquement pour le développement: inutile de passer par du code Python pour charger des fichiers statiques (feuilles de style, fichiers JavaScript, images, ...). De même, la base de donnée doit supporter plus qu'un seul utilisateur: SQLite fonctionne très bien dès lors qu'on se limite à un seul utilisateur... Sur une application Web, il est plus que probable que vous rencontriez rapidement des erreurs de base de données verrouillée pour écriture par un autre processus. Il est donc plus que bénéfique de passer sur quelque chose de plus solide.
Pour une mise ne production, il nous faut donc quelque chose de plus solide:
Pour une mise ne production, la proposition *de facto* est la suivante:
* Nginx comme serveur principal
* Gunicorn comme serveur d'application
* PostgreSQL comme base de données
* Supervisorctl pour le monitoring
* PostgreSQL comme base de données.
C'est celle-ci que nous allons décrire ci-dessous.
Il est évidemment possible de configurer des connecteurs vers d'autres bases de données (Oracle, MSSQL ou MySQL), mais il ne nous est pas possible de décrire tous les cas d'utilisation.
Voir http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/
Et http://tutos.readthedocs.org/en/latest/source/ndg.html
@ -17,4 +22,4 @@ Et http://tutos.readthedocs.org/en/latest/source/ndg.html
.. include:: production/postgresql.rst
.. include:: production/gunicorn.rst
.. include:: production/nginx.rst
.. include:: production/fabric.rst

View File

@ -0,0 +1,39 @@
*****************************
Automatisation du déploiement
*****************************
Pour automatiser le déploiement, il existe `Fabric <http://www.fabfile.org/>`_.
* **Problème**: cette librairie n'existe que pour Python2.7.
* **Avantage**: on peut écrire du code semblable à `ceci <https://github.com/UrLab/incubator/blob/master/fabfile.py>`_...
.. code-block:: python
from fabric.api import run, cd
from fabric.context_managers import prefix
def deploy():
code_dir = '/home/www-data/incubator'
with cd(code_dir), prefix('source ve/bin/activate'):
run('sudo supervisorctl stop incubator')
run("./save_db.sh")
run("git pull")
run("pip install -r requirements.txt --upgrade -q")
run("./manage.py collectstatic --noinput -v 0")
run("./manage.py makemigrations")
run("./manage.py migrate")
run('sudo supervisorctl start incubator')
En gros:
1. On se place dans le bon répertoire
2. On arrête le superviseur
3. On sauve les données de la base de données
4. On charge la dernière version depuis le dépôt Git
5. On met les dépendances à jour (en mode silencieux)
6. On agrège les fichiers statiques
7. On lance les migrations
8. Et on relance le superviseur.
Avec un peu de chances, l'instance est à jour.