Portale Clienti Toscana Stampaggi.
Ho progettato e sviluppato da solo il portale clienti di Toscana Stampaggi: un backend Django e PostgreSQL che serve il backoffice Unfold per gli operatori, il portale web per i clienti e un'API a token per l'app Flutter, tutto in produzione su VPS con Docker, HTTPS e monitoraggio.

- Periodo
- 2026 - In corso
- Ruolo
- Full Stack Developer
- Ambito
- Portale clienti e app mobile
- Cliente
- Toscana Stampaggi
01 / Il progetto
Da dove siamo partiti.
- 01
Contesto
Lo stato degli ordini veniva comunicato ai clienti per telefono o via email. L'azienda voleva un accesso riservato, sempre disponibile, in cui ogni cliente vedesse solo i propri ordini, consegne e cantieri; nella prima versione gli ordini vengono inseriti dagli operatori, senza collegamento diretto al gestionale.
- 02
Obiettivo
Costruire un unico backend che alimentasse tre canali (backoffice, portale web, app mobile) con le stesse regole di dominio e gli stessi numeri, mantenendo l'architettura pronta per una futura integrazione con il gestionale aziendale.
- 03
Sfida
L'isolamento dei dati tra clienti doveva essere strutturale e non affidato alle singole viste: un cliente non deve poter vedere ordini di un'altra azienda nemmeno manipolando URL, ID o parametri. Allo stesso tempo, concetti come "in ritardo", "urgente" o "imminente" dovevano essere calcolati in un solo punto, perché dashboard, liste, calendario, API e app restassero sempre allineati.
02 / Il mio contributo
Cosa ho realizzato.
- 01
Ho impostato il backend Django a livelli: le viste non contengono logica di dominio e la chiedono a selector (letture già filtrate per utente), services (scritture con controllo permessi e storico), policies (chi può accedere a cosa) e rules (regole di dominio).
- 02
Ho scritto le regole degli ordini in due forme equivalenti, un filtro Q per le query e una funzione sul singolo ordine, con soglie configurabili da settings (ORDER_RULES) e validate da system check di Django all'avvio, così un refuso blocca l'avvio invece di falsare i contatori.
- 03
Ho garantito l'isolamento facendo partire ogni lettura da un'unica policy che restituisce solo gli ordini delle aziende collegate all'utente: il selettore azienda risponde 403 su aziende non collegate, i filtri ignorano cantieri di altri clienti e ogni vista o endpoint ha il suo test di isolamento.
- 04
Ho modellato i dati con utenti personalizzati e ruoli separati (staff o cliente, mai entrambi, imposto dai manager ORM), aziende con più utenti collegati, cantieri, allegati e uno storico immutabile delle modifiche, di cui il cliente vede solo stato, date e allegati.
- 05
Ho personalizzato il backoffice con Django Unfold, con dashboard per gli operatori, e realizzato il portale clienti con template Django, grafici SVG generati lato server, tema chiaro/scuro e JavaScript usato solo come miglioramento progressivo.
- 06
Ho sviluppato l'API REST per l'app mobile con Django REST Framework e token Knox (revoca, logout da tutti i dispositivi, limite di dispositivi per utente) e l'app Flutter per iOS e Android, che non ricalcola le regole ma usa quelle del backend; un test verifica che la dashboard dell'API restituisca gli stessi numeri del portale.
- 07
Ho curato la sicurezza: password Argon2, django-axes contro i tentativi ripetuti di login (blocco per username, risposta 429), allegati serviti solo da una vista che controlla i permessi e mai direttamente dal web server, header di sicurezza e HSTS in produzione.
- 08
Ho messo il progetto in produzione su VPS con Docker Compose (gunicorn, PostgreSQL e Caddy su reti separate, solo Caddy esposto con HTTPS Let's Encrypt), con rilasci per tag, backup automatico prima di ogni deploy e rollback alla versione precedente.
- 09
Ho aggiunto il monitoraggio con Prometheus, Grafana, Loki e Alloy (metriche di macchina, container, Caddy e PostgreSQL, controllo del login e del certificato, avvisi e log centralizzati), raggiungibile solo dalla rete Tailscale.
- 10
Ho coperto il codice con circa 250 test pytest, lint con Ruff, una CI su GitHub Actions e una collection Postman con report HTML per testare l'API.
03 / Stack utilizzato
- Python
- Django
- Django REST
- PostgreSQL
- Flutter
- Docker
- Caddy
- Prometheus
- Grafana
Approfondisci:Python Django REST PostgreSQL Docker
04 / Risultati
Cosa è cambiato.
- I clienti consultano in autonomia stato degli ordini, consegne e cantieri, da browser o smartphone.
- L'isolamento tra aziende è garantito dall'architettura e verificato da test automatici su ogni vista ed endpoint.
- Portale web, API e app mostrano sempre gli stessi numeri, perché le regole di dominio vivono in un solo punto.
- Piattaforma in produzione con rilasci ripetibili, backup, avvisi e log centralizzati per intervenire rapidamente.