From 3ad462c1bdc4cd3aed4622a6ac18ec60e805363a Mon Sep 17 00:00:00 2001 From: MaelREBOUX Date: Mon, 5 Apr 2021 23:09:54 +0200 Subject: [PATCH] API init --- api/README.md | 101 +++++++++-------------------- api/{hello.ini => api_redadeg.ini} | 4 +- api/{hello.py => api_redadeg.py} | 8 ++- api/api_redadeg.service | 13 ++++ api/wsgi.py | 2 +- 5 files changed, 53 insertions(+), 75 deletions(-) rename api/{hello.ini => api_redadeg.ini} (77%) rename api/{hello.py => api_redadeg.py} (63%) create mode 100644 api/api_redadeg.service diff --git a/api/README.md b/api/README.md index c74401c..42c0f06 100644 --- a/api/README.md +++ b/api/README.md @@ -8,19 +8,20 @@ Cette API sert à : * lancer les scripts de traitements des données * accéder à des informations sur les les traitements +API Flask copiée depuis [https://github.com/MaelREBOUX/simple_flask_api +](https://github.com/MaelREBOUX/simple_flask_api) + ## Installation -### Créer un environnement virtuel Python - -Il faut installer des paquets permettant de builder les librairies requises : +### Installer les paquets requis ```bash sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev libpcre3 libpcre3-dev python3-setuptools ``` +### Créer un environnement virtuel Python -Après avoir bien entenud fait un git clone du dépôt : ```bash cd api @@ -35,77 +36,55 @@ Tester python3 hello.py ``` -Vérifier que l'on obtient bien un "Hello There" sur la page http://localhost:5000/ +Vérifier que l'on obtient bien quelque chose en allant sur la page http://localhost:5000/ Faire `ctrl + C` pour arrêter. -### Configurer uWSGI +## Tester uWSGI -On utilise les fichiers wsgi.py et hello.ini - -On teste si uWSGI et le socket fonctionne en utilisant le fichier de configuration : +On teste maintenant si uWSGI et le socket fonctionnent bien en utilisant le fichier de configuration ```api_redadeg.ini``` : ```bash -uwsgi --ini hello.ini +uwsgi --ini api_redadeg.ini ``` +aire ```ll /tmp/api_redadeg*``` pour voir si le socket a bien été créé par www-data. + +Tester si on obtient bien toujours quelque chose sur la page [https://ar-redadeg.openstreetmap.bzh/api/](https://ar-redadeg.openstreetmap.bzh/api/) + +À ce stade tout est fonctionnel mais il faut maintenant créer un daemon pour ne pas avoir une commande uwsgi dans le shell. + +Sortir du mode venv en tapant : ```deactivate```. + + ### Configurer nginx On rajoute les directives suivantes au fichier de conf nginx ``` - location = /hello { rewrite ^ /hello/; } - location /hello { try_files $uri @hello; } - location @hello { - include uwsgi_params; - uwsgi_pass unix:/tmp/hello.sock; + location = /api { rewrite ^ /api/; } + location /api { try_files $uri @api; } + location @api { + include uwsgi_params; + uwsgi_pass unix:/tmp/api_redadeg.sock; } ``` On recharger la configuration de nginx : ```sudo service nginx reload```. -Tester si on obtient bien toujours un "Hello There" sur la page http://localhost/hello/ +Tester si on obtient bien toujours quelque chose sur la page [https://ar-redadeg.openstreetmap.bzh/api/](https://ar-redadeg.openstreetmap.bzh/api/) -Super ! Mais il faut que la commande ```uwsgi -s …``` qui crée le socket soit active dans le shell. - -Pour sortir du mode venv, taper : ```deactivate```. +À ce stade tout est fonctionnel mais il faut maintenant créer un daemon pour ne pas avoir une commande uwsgi dans le shell. +Sortir du mode venv en tapant : ```deactivate```. ### Configurer un socket spécifique permanent sur la machine -Il s'agit ici de configurer un socket sépcifique qui sera démarré automatiquement au boot. - -```navigateur --> nginx http://{host}/api/ :80 --> socket unix {localhost} :5001 --> programme.py``` - -En décodé : la route /api/ demandée à nginx sera routée vers un serveur Python local qui écoute sur le port 5001 de la machine pour servir le script python qui répondra. - -On va supposer que l'on est sous Debian 10 ou Ubuntu Server 20.04 donc on va créer un démon sous system.d. - -Créer un fichier "unit" : - ```bash -sudo nano /etc/systemd/system/api_hello.service -``` - -avec les directives ci-dessous : - -``` -[Unit] -Description=uWSGI instance to serve Hello API -After=network.target - -[Service] -User=root -Group=www-data -WorkingDirectory=/data/projets/ar_redadeg/api -Environment="PATH=/data/projets/ar_redadeg/api/venv/bin" -ExecStart=/data/projets/ar_redadeg/api/venv/bin/uwsgi --ini hello.ini - -[Install] -WantedBy=multi-user.target +cp api_redadeg.service /etc/systemd/system/ ``` On n'oublie pas de mettre les permissions au serveur web sur les fichiers : @@ -114,7 +93,7 @@ On n'oublie pas de mettre les permissions au serveur web sur les fichiers : chown -R www-data:www-data /data/projets/ar_redadeg/api/ ``` -Et on crée le répertoire pour les logs : +Et on crée le répertoire pour les logs (en option) : ```bash mkdir -p /var/log/uwsgi/ @@ -131,7 +110,7 @@ sudo systemctl start api_hello sudo systemctl status api_hello ``` -Faire ```ll /tmp/hello*``` pour voir si le socket a bien été créé par www-data. +Faire ```ll /tmp/api_redadeg*``` pour voir si le socket a bien été créé par www-data. Tester si on obtient bien toujours un "Hello There" sur la page http://localhost/hello/ @@ -139,25 +118,9 @@ Tester si on obtient bien toujours un "Hello There" sur la page http://localho Si on veut supprimer le service : ```bash -systemctl stop api_hello -systemctl disable api_hello -rm /etc/systemd/system/api_hello.service +systemctl stop api_redadeg +systemctl disable api_redadeg +rm /etc/systemd/system/api_redadeg.service systemctl daemon-reload systemctl reset-failed ``` - -## Sources - -https://flask.palletsprojects.com/en/1.1.x/deploying/uwsgi/ - -https://www.vultr.com/docs/deploy-a-flask-website-on-nginx-with-uwsgi - -https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-20-04 - -https://medium.com/@ksashok/using-nginx-for-production-ready-flask-app-with-uwsgi-9da95d8ac0f9 - -https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html - -https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#putting-behind-a-full-webserver - -https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#automatically-starting-uwsgi-on-boot diff --git a/api/hello.ini b/api/api_redadeg.ini similarity index 77% rename from api/hello.ini rename to api/api_redadeg.ini index 7e46efb..231afa5 100644 --- a/api/hello.ini +++ b/api/api_redadeg.ini @@ -1,12 +1,12 @@ [uwsgi] manage-script-name = true -mount = /hello=wsgi:app +mount = /api=wsgi:app master = true processes = 5 -socket = /tmp/hello.sock +socket = /tmp/api_redadeg.sock chmod-socket = 660 vacuum = true diff --git a/api/hello.py b/api/api_redadeg.py similarity index 63% rename from api/hello.py rename to api/api_redadeg.py index eae9644..ca187ef 100644 --- a/api/hello.py +++ b/api/api_redadeg.py @@ -8,12 +8,14 @@ app = Flask(__name__) @app.route("/") -def hello(): - return "

Hello There!

" +def index(): + return "

Ar Redadeg API

" + pass @app.route("/about/") def about(): - return "This is a simple Flask Python application" + return "This is a simple Flask Python application" + if __name__ == "__main__": app.debug = True diff --git a/api/api_redadeg.service b/api/api_redadeg.service new file mode 100644 index 0000000..87c80aa --- /dev/null +++ b/api/api_redadeg.service @@ -0,0 +1,13 @@ +[Unit] +Description=uWSGI instance to serve Ar Redadeg API +After=network.target + +[Service] +User=root +Group=www-data +WorkingDirectory=/data/projets/ar_redadeg/api/ +Environment="PATH=/data/projets/ar_redadeg/api/venv/bin" +ExecStart=/data/projets/ar_redadeg/api/venv/bin/uwsgi --ini api_redadeg.ini + +[Install] +WantedBy=multi-user.target diff --git a/api/wsgi.py b/api/wsgi.py index 84f08f3..7bd0d06 100644 --- a/api/wsgi.py +++ b/api/wsgi.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- -from hello import app +from api_redadeg import app if __name__ == "__main__": app.run()