Déploiement



Notre site n'est toujours pas complètement déployé :

  • nous avons dû le lancer à la main avec python hello.py, et il ne tourne que tant que la fenêtre de terminal est ouverte et la commande est lancée.
  • nous avons créé le code du serveur directement sur la machine, il serait beaucoup plus confortable de le faire sur notre machine de développement et de le transférer sur le serveur

gunicorn

Référence : https://bottlepy.org/docs/dev/deployment.html

Nous allons utiliser un serveur HTTP plus performant que le serveur de développement de bottle, qui est prévu pour le développement et pas pour la production. Nous allons utiliser gunicorn, qui est un serveur HTTP WSGI (Web Server Gateway Interface) pour Python. Il est capable de gérer plusieurs requêtes simultanément, ce qui le rend plus adapté pour un environnement de production.

Pour l'installer, en tant que root :

apt install gunicorn

Une petite modification de notre code hello.py est nécessaire pour que gunicorn puisse le lancer. Il faut ajouter une variable app qui contient l'application bottle, et qui permet d'exporter l'application pour un serveur externe.

from bottle import default_app, #...

app = default_app()

Pour lancer le serveur avec gunicorn, il faut se placer dans le répertoire où se trouve le fichier hello.py et lancer la commande suivante :

gunicorn hello:app

Cela va lancer le serveur sur le port 8000 par défaut. On peut changer ce port et beaucoup d'autres options avec des arguments de la ligne de commande.

  • pour changer le port, on peut utiliser l'option -b (bind) : -b localhost:8080 pour le port 8080 par exemple.
  • pour changer le nombre de workers (processus) à lancer, on peut utiliser l'option -w (workers) : -w 4 pour 4 workers par exemple.
  • pour lancer le serveur en arrière-plan, on peut utiliser l'option --daemon : --daemon pour le lancer en arrière-plan.
  • ... (man gunicorn pour les xxx autres options)
gunicorn -b localhost:8080 -w 4 hello:app

Il est possible de mettre toutes ces options dans un fichier de configuration gunicorn.conf.py :

bind = 'localhost:8080'
workers = 4
daemon = True

On peut ensuite lancer le serveur avec la commande :

gunicorn -c gunicorn.conf.py hello:app

Lancement automatique

Pour que le serveur se relance automatiquement après un redémarrage de la machine, on peut utiliser systemd, qui est un système d'initialisation et de gestion de services installé par défaut sur la plupart des distributions Linux.

Il faut créer un fichier de configuration pour le service dans le répertoire /etc/systemd/system/. En tant que root, on peut créer un fichier hello.service :

[Unit]
# Description du service
Description=Hello World service
# On attend que le réseau soit démarré avant de lancer le service
After=network.target
# On attend que le service nginx soit démarré avant de lancer le service (pas obligatoire)
After=nginx.service
[Service]
# La commande à exécuter pour lancer le service (elle doit rester au premier plan)
ExecStart=/usr/bin/gunicorn -b localhost:8080 -w 4 hello:app
# On indique que le service doit être lancé dans le répertoire où se trouve le fichier hello.py
WorkingDirectory=/home/webapp/test
# On indique l'utilisateur sous lequel le service doit s'exécuter
User=webapp
# On indique le groupe sous lequel le service doit s'exécuter
Group=webapp
# On indique que le service doit être redémarré automatiquement dans tous les cas
Restart=always

Il faut ensuite recharger la configuration de systemd :

systemctl daemon-reload

Puis on peut démarrer le service :

systemctl start hello

On peut vérifier que le service est bien démarré avec la commande :

systemctl status hello

On peut aussi activer le service pour qu'il se lance automatiquement au démarrage de la machine :

systemctl enable hello