Progetti/CartClin
Vai alla navigazione
Vai alla ricerca
CartClin
CartClin e' un'applicazione web Python/Flask pubblicata dietro reverse proxy come:
- URL pubblico:
https://cartclin.gazzi.net/ - host applicativo:
web01.gazzi.local - host proxy pubblico:
proxy01.gazzi.local
Architettura
La pubblicazione e' divisa in tre livelli:
- runtime applicativo su
web01 - backend HTTP interno su
web01 - reverse proxy e TLS su
proxy01
Runtime applicativo su web01
Il codice applicativo viene installato in:
/opt/cartclin
Componenti principali runtime:
- virtualenv Python:
/opt/cartclin/venv - database SQLite locale:
/opt/cartclin/cartclin.db - cache locale per WeasyPrint/fontconfig:
/opt/cartclin/.cache
Il servizio applicativo e' gestito da systemd:
- unit file:
/etc/systemd/system/cartclin.service - service name:
cartclin.service - utente runtime:
www-data - working directory:
/opt - variabili runtime rilevanti:
PYTHONPATH=/optHOME=/opt/cartclinXDG_CACHE_HOME=/opt/cartclin/.cache
Il servizio avvia:
gunicorn --workers 2 --bind 127.0.0.1:8090 cartclin.app:app
Backend HTTP interno su web01
Nginx locale su web01 pubblica l'app su una porta interna dedicata:
- vhost backend:
/etc/nginx/sites-available/cartclin-backend - symlink attivo:
/etc/nginx/sites-enabled/cartclin-backend - bind interno:
0.0.0.0:8082 - upstream applicativo:
http://127.0.0.1:8090
Test locale atteso su web01:
http://127.0.0.1:8090/risponde con redirect a/loginhttp://127.0.0.1:8082/risponde come proxy locale verso l'app
Reverse proxy e TLS su proxy01
La pubblicazione pubblica e' gestita da proxy01:
- vhost:
/etc/nginx/sites-available/cartclin - symlink attivo:
/etc/nginx/sites-enabled/cartclin - host pubblico:
cartclin.gazzi.net - upstream interno:
http://172.16.1.3:8082
Comportamento del vhost:
- su porta 80 esegue redirect verso HTTPS
- su porta 443 termina TLS e inoltra verso
web01:8082
Certificato TLS
Il certificato pubblico e' gestito con Let's Encrypt su proxy01:
- certificate path:
/etc/letsencrypt/live/cartclin.gazzi.net/fullchain.pem - private key path:
/etc/letsencrypt/live/cartclin.gazzi.net/privkey.pem - rinnovo automatico: gestito da Certbot
Flusso richieste
Percorso sintetico di una richiesta:
- il client apre
https://cartclin.gazzi.net/ proxy01riceve TLS e inoltra versohttp://172.16.1.3:8082web01inoltra versogunicornsu127.0.0.1:8090- l'app Flask serve la login page o le route applicative
Verifiche rapide
Su web01:
systemctl status cartclin.servicecurl -I http://127.0.0.1:8090/curl -I -H 'Host: web01.gazzi.local' http://127.0.0.1:8082/
Su proxy01:
nginx -tcurl -I --resolve cartclin.gazzi.net:443:127.0.0.1 https://cartclin.gazzi.net/ -kcertbot certificates
Note operative
- Non versionare segreti o password nel repository.
- Il file SQLite fa parte del runtime applicativo e va trattato come dato operativo, non come configurazione di proxy.
- Se si cambia host o porta interna, aggiornare sia il backend Nginx su
web01sia il reverse proxy suproxy01.