Progetti/CartClin

Da GazziNet.
Vai alla navigazione Vai alla ricerca

CartClin

CartClin e' un'applicazione web Python/Flask pubblicata dietro reverse proxy come:

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=/opt
    • HOME=/opt/cartclin
    • XDG_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:

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:

  1. il client apre https://cartclin.gazzi.net/
  2. proxy01 riceve TLS e inoltra verso http://172.16.1.3:8082
  3. web01 inoltra verso gunicorn su 127.0.0.1:8090
  4. l'app Flask serve la login page o le route applicative

Verifiche rapide

Su web01:

Su proxy01:

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 web01 sia il reverse proxy su proxy01.