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
|
* lancer les scripts de traitements des données
|
||||||
* accéder à des informations sur les les traitements
|
* 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
|
## Installation
|
||||||
|
|
||||||
### Créer un environnement virtuel Python
|
### Installer les paquets requis
|
||||||
|
|
||||||
Il faut installer des paquets permettant de builder les librairies requises :
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev libpcre3 libpcre3-dev python3-setuptools
|
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
|
```bash
|
||||||
cd api
|
cd api
|
||||||
|
@ -35,77 +36,55 @@ Tester
|
||||||
python3 hello.py
|
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.
|
Faire `ctrl + C` pour arrêter.
|
||||||
|
|
||||||
|
|
||||||
### Configurer uWSGI
|
## Tester uWSGI
|
||||||
|
|
||||||
On utilise les fichiers wsgi.py et hello.ini
|
On teste maintenant si uWSGI et le socket fonctionnent bien en utilisant le fichier de configuration ```api_redadeg.ini``` :
|
||||||
|
|
||||||
On teste si uWSGI et le socket fonctionne en utilisant le fichier de configuration :
|
|
||||||
|
|
||||||
```bash
|
```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
|
### Configurer nginx
|
||||||
|
|
||||||
On rajoute les directives suivantes au fichier de conf nginx
|
On rajoute les directives suivantes au fichier de conf nginx
|
||||||
|
|
||||||
```
|
```
|
||||||
location = /hello { rewrite ^ /hello/; }
|
location = /api { rewrite ^ /api/; }
|
||||||
location /hello { try_files $uri @hello; }
|
location /api { try_files $uri @api; }
|
||||||
location @hello {
|
location @api {
|
||||||
include uwsgi_params;
|
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```.
|
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.
|
À ce stade tout est fonctionnel mais il faut maintenant créer un daemon pour ne pas avoir une commande uwsgi dans le shell.
|
||||||
|
|
||||||
Pour sortir du mode venv, taper : ```deactivate```.
|
|
||||||
|
|
||||||
|
Sortir du mode venv en tapant : ```deactivate```.
|
||||||
|
|
||||||
|
|
||||||
### Configurer un socket spécifique permanent sur la machine
|
### 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
|
```bash
|
||||||
sudo nano /etc/systemd/system/api_hello.service
|
cp api_redadeg.service /etc/systemd/system/
|
||||||
```
|
|
||||||
|
|
||||||
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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
On n'oublie pas de mettre les permissions au serveur web sur les fichiers :
|
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/
|
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
|
```bash
|
||||||
mkdir -p /var/log/uwsgi/
|
mkdir -p /var/log/uwsgi/
|
||||||
|
@ -131,7 +110,7 @@ sudo systemctl start api_hello
|
||||||
sudo systemctl status 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/
|
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 :
|
Si on veut supprimer le service :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
systemctl stop api_hello
|
systemctl stop api_redadeg
|
||||||
systemctl disable api_hello
|
systemctl disable api_redadeg
|
||||||
rm /etc/systemd/system/api_hello.service
|
rm /etc/systemd/system/api_redadeg.service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl reset-failed
|
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]
|
[uwsgi]
|
||||||
|
|
||||||
manage-script-name = true
|
manage-script-name = true
|
||||||
mount = /hello=wsgi:app
|
mount = /api=wsgi:app
|
||||||
|
|
||||||
master = true
|
master = true
|
||||||
processes = 5
|
processes = 5
|
||||||
|
|
||||||
socket = /tmp/hello.sock
|
socket = /tmp/api_redadeg.sock
|
||||||
chmod-socket = 660
|
chmod-socket = 660
|
||||||
|
|
||||||
vacuum = true
|
vacuum = true
|
|
@ -8,12 +8,14 @@ app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def hello():
|
def index():
|
||||||
return "<h1 style='color:blue'>Hello There!</h1>"
|
return "<h1 style='color:blue'>Ar Redadeg API</h1>"
|
||||||
|
pass
|
||||||
|
|
||||||
@app.route("/about/")
|
@app.route("/about/")
|
||||||
def about():
|
def about():
|
||||||
return "This is a simple Flask Python application"
|
return "This is a simple Flask Python application"
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.debug = True
|
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 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
|
||||||
from hello import app
|
from api_redadeg import app
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.run()
|
app.run()
|
||||||
|
|
Loading…
Reference in a new issue