Comment déployer des applications Flask sur Raspberry Pi
Vous avez souvent besoin d'une interface web pour vos projets Raspberry Pi. Flask est un framework Python qui facilite la programmation d'API web. Mais vous devez ensuite ajouter toutes les étapes de déploiement pour exécuter automatiquement l'application Flask. Dans cet article je veux montrer comment vous pouvez le faire avec Gunicorn, Nginx et une intégration une intégration systemd.
Application Flask
Flask est un framework écrit en Python qui facilite la programmation rapide d'API REST. Il fonctionne sur des Raspberry Pi avec le système d'exploitation Raspberry Pi. Par exemple, vous pouvez programmer une API qui allume une lampe LED en envoyant une requête POST. POST est une méthode de requête du protocole HTTP. Ainsi, vous pouvez connecter votre Raspberry Pi à votre réseau, par exemple pour la domotique.
Mais il y a quelques étapes supplémentaires nécessaires pour exécuter votre application Flask en douceur. En outre, vous devez exécuter automatiquement l'application Flask au démarrage de votre Raspberry Pi.
Gunicorn
Les développeurs de Flask recommandent l'utilisation de Gunicorn comme serveur HTTP pour l'application Flask en mode de production.
Tout d'abord, vous devez installer Gunicorn. Je l'ajoute normalement au fichier requirements.txt, comme ceci :
requirements.txt
flask==1.1.4
gunicorn==20.1.0
Avec ```pip3 install -r requirements.txt`` vous pouvez installer les dépendances.
Ensuite, vous devez créer un fichier de configuration pour Gunicorn, par exemple:
gunicorn_config.py
bind="0.0.0.0:8000"
workers=2
Ensuite, vous pouvez démarrer votre application Flask avec Gunicorn, comme dans mon cas, l'application Flask est dans app.py :
gunicorn app:app
Cette commande lance notre application sur le port 8000, mais nous souhaitons la rendre disponible sur le port 80 qui est le port standard pour les applications web.
Nous avons donc besoin d'un proxy web, pour lequel nous utilisons Nginx.
Nginx
Nginx est un serveur web et un proxy web open source populaire qui a été créé par Igor Sysoev. Nous l'utilisons ici comme proxy pour notre serveur Gunicorn.
Vous pouvez installer Nginx sur votre Raspberry Pi avec
sudo apt-get install nginx
Ensuite, vous devez l'activer pour qu'il s'exécute automatiquement à chaque démarrage de votre Raspberry Pi :
sudo systemctl start nginx
sudo systemctl enable nginx
La configuration recommandée de Nginx en tant que proxy est la suivante :
/etc/nginx/sites-enabled/default
server {
listen 80 ;
nom_serveur exemple.org ;
access_log /var/log/nginx/example.log ;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
}
}
Systemd
La dernière étape de notre voyage consiste à exécuter automatiquement le serveur Gunicorn à chaque nouveau démarrage du Raspberry Pi.
Nous y parvenons en intégrant Gunicorn dans le service systemd de Linux.
Systemd est utilisé dans la plupart des systèmes Linux modernes pour gérer les services. Chaque fois que vous démarrez votre système d'exploitation Raspberry Pi la gestion de l'exécution correcte des services qui doivent être exécutés est faite par systemd.
Vous devez créer un nouveau service pour systemd dans le dossier
/usr/lib/systemd/system
Le fichier texte du service doit avoir un certain format et les informations requises :
votre-nom.service
[Unité]
Description=Votre service
After=multi-user.target
[Service]
WorkingDirectory=/home/pi/your/path
ExecStart=/home/pi/projets/votre-app/venv/bin/gunicorn app:app &
[Install]
WantedBy=multi-user.target
Vous devez nommer le fichier en fonction de votre service et ajouter
le chemin correct où se trouve votre projet.
J'utilise virtualenv, c'est pourquoi ```gunicornest lancé depuis le dossier
/venv/bin``.
Gunicorn est démarré avec &
afin qu'il fonctionne en arrière-plan.
Vous pouvez maintenant utiliser systemctl
pour démarrer et arrêter votre service :
sudo systemctl start votre-nom.service
sudo systemctl stop votre-nom.service
Afin de démarrer automatiquement votre serveur à chaque fois que le Raspberry Pi vous devez utiliser la commande suivante :
sudo systemctl enable votre-nom.service
Conclusion
Ceci termine notre voyage dans le déploiement d'une application Flask. Ces étapes peuvent être un modèle utile chaque fois que vous avez besoin de faire tourner votre application Flask automatiquement sur votre Raspberry Pi.
Références
-
Serveur HTTP WSGI Gunicorn : https://gunicorn.org
-
Nginx : https://www.nginx.com
Publié le
18 mai 2022