gwift-book/source/part-2-deployment/00-main.adoc

5.4 KiB
Raw Blame History

Déploiement

Nous sommes encore au début du projet mais abordons dès maintenant le déploiment. Il y a plusieurs raisons pour le faire.

La première est que le serveur que Django met à notre disposition nest prévu que pour le développement : inutile de passer par du code Python pour charger des fichiers statiques (feuilles de style, fichiers JavaScript, images, …​). Il est également probable que la base de donnée de votre application doive supporter plus dun utilisateur. SQLite fonctionne très bien dès lors quon se limite à un seul utilisateur : vous risquez de rencontrer des erreurs de base de données verrouillée pour écriture car un autre processus y accède déjà. Il est donc nécessaire davoir un environnement plus solide pour la production. Déploiement.

Une autre raison de sintéresser au déploiment dès à présent est quà trop attendre et peaufiner son développement en local, sa finalité (se retrouver exposé sur un serveur) risque dêtre perdue de vue. Vous risquez doublier une partie des désidérata ou une fonctionnalité essentielle, de passer énormément de temps à adapter les sources pour quelles fonctionnent sur un environnement en particulier.

Aborder le déploiement très tôt permet également de rédiger dès le début les procédures dinstallation, de mise à jour et de sauvegardes. Déployer une nouvelle version sera aussi simple que de récupérer la dernière archive depuis le dépôt, la placer dans le bon répertoire, appliquer des actions spécifiques (et souvent identiques entre deux versions), puis redémarrer les services adéquats.

Dans cette partie, les points suivants serons abordés :

  • La définition de linfrastructure nécessaire à notre application.

  • La configuration de lhôte, qui hébergera lapplication : dans une machine physique, virtuelle ou un container. On abordera aussi rapidement les déploiements via Ansible, Chef, Puppet ou Salt.

  • Les différentes méthodes de supervision de lapplication : comment analyser les fichiers de logs et comment intercepter correctement une erreur si elle se présente et comment remonter linformation.

  • Une partie sur la sécurité et la sécurisation de lhôte.

Infrastructure

Linfrastructure et le chemin parcouru par une éventuelle requête peut être schématisé de la manière suivante :

  • Au niveau de linfrastructure,

    1. lutilisateur fait une requête via son navigateur (Firefox, Chrome, …)

    2. le navigateur envoie une requête http, sa version, un verbe (GET, POST, …​), un port et éventuellement du contenu

    3. le firewall du serveur (Debian GNU/Linux, CentOS, …​) vérifie si la requête peut être prise en compte

    4. la requête est transmise à lapplication qui écoute sur le port (probablement 80 ou 443; et a priori Nginx)

    5. elle est ensuite transmise par socket et est prise en compte par Gunicorn

    6. qui la transmet ensuite à lun de ses workers (= un processus Python)

    7. après exécution, une réponse est renvoyée à lutilisateur.

architecture
  • Au niveau logiciel (la partie mise en subrillance ci-dessus), la requête arrive dans les mains du processus Python, qui doit encore

    1. effectuer le routage des données,

    2. trouver la bonne fonction à exécuter,

    3. récupérer les données depuis la base de données,

    4. effectuer le rendu ou la conversion des données,

    5. et renvoyer une réponse à lutilisateur.

django process

Définition de linfrastructure

Comme abordé dans la première partie, Django est un framework complet intégrant tous les mécanismes nécessaires à la bonne évolution dune application. Il est ainsi possible commencer petit et de suivre lévolution des besoins en fonction de la charge estimée ou ressentie, dajouter un mécanisme de mise en cache, des logiciels de suivi, etc.

Pour une mise ne production, le standard de facto est le suivant :

  • Nginx comme reverse proxy

  • Gunicorn ou Uvicorn comme serveur dapplication

  • Supervisorctl pour le monitoring

  • PostgreSQL ou MariaDB comme base de données.

  • Redis ou Memcache pour la mise à en cache (et pour les sessions ? A vérifier).

En mode containers, nous conseillons Docker et Traefik.

Cest celle-ci que nous allons décrire ci-dessous.

Configuration et sécurisation de la machine hôte

Supervisor, nginx, gunicorn, utilisateurs, groupes, …​

entity Nginx entity "Gunicorn (sockets/HTTP)" as gunicorn database PGSQL

Aussi : Docker, Heroku, Digital Ocean, Scaleway, OVH, Ansible, Puppet, Chef, …​ Bref, sur Debian et CentOS pour avoir un panel assez large. On oublie Windows: rien que Gunicorn et Nginx ny tournent pas.

Mise à jour

Script de mise à jour.

su - <user>
source ~/.venvs/<app>/bin/activate
cd ~/webapps/<app>
git fetch
git checkout vX.Y.Z
pip install -U requirements/prod.txt
python manage.py migrate
python manage.py collectstatic
gunicorn reload -HUP
Warning
le serveur de déploiement ne doit avoir quun accès en lecture au dépôt source.

Supervision

Quest-ce quon fait des logs après ? :-)

  1. Sentry

  2. Nagios

  3. LibreNMS

  4. Zabbix

Unresolved directive in <stdin> - include::infrastructure.adoc[]

Unresolved directive in <stdin> - include::database.adoc[]

Unresolved directive in <stdin> - include::centos+debian.adoc[]