API init
This commit is contained in:
parent
7f8e3e2a50
commit
3ad462c1bd
|
@ -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 {
|
||||
location = /api { rewrite ^ /api/; }
|
||||
location /api { try_files $uri @api; }
|
||||
location @api {
|
||||
include uwsgi_params;
|
||||
uwsgi_pass unix:/tmp/hello.sock;
|
||||
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
|
||||
|
|
|
@ -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
|
|
@ -8,12 +8,14 @@ app = Flask(__name__)
|
|||
|
||||
|
||||
@app.route("/")
|
||||
def hello():
|
||||
return "<h1 style='color:blue'>Hello There!</h1>"
|
||||
def index():
|
||||
return "<h1 style='color:blue'>Ar Redadeg API</h1>"
|
||||
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
|
13
api/api_redadeg.service
Normal file
13
api/api_redadeg.service
Normal file
|
@ -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
|
|
@ -2,7 +2,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from hello import app
|
||||
from api_redadeg import app
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run()
|
||||
|
|
Loading…
Reference in a new issue