cover image
IdO

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

Publié le 18 mai 2022

Creative Commons License
Cette œuvre est soumise à une licence Creative Commons Attribution 4.0 International License.
Thomas Derflinger

Écrit par Thomas Derflinger

Je suis un entrepreneur visionnaire et un développeur de logiciels. Dans ce blog, j'écris principalement sur la programmation web et des sujets connexes comme l'IdO.