Piattaforma SaaS con dashboard operativa real-time
Una piattaforma multi-tenant per la gestione operativa di team distribuiti. Il requisito principale: dati in tempo reale, visibilità sullo stato di task e risorse, accesso role-based per ruoli diversi (admin, manager, operatore). Il tutto self-hosted, nessun vendor lock-in su servizi cloud.
Architettura
Backend Django
Il backend è Django 4.2 con Django REST Framework. Il modello dati ruota attorno a tre entità principali: Organization, Team, Task. Ogni organization ha il proprio schema di dati isolato via row-level security su PostgreSQL — i tenant non si vedono tra loro a livello di database.
Le API sono RESTful per le operazioni CRUD standard. Per gli aggiornamenti real-time, invece di polling, è stato implementato un layer WebSocket con Django Channels + Redis come channel layer.
Client <-> WebSocket (Channels) <-> Redis <-> Worker
Quando un task cambia stato, il worker pubblica un evento su Redis. Channels lo riceve e fa push ai client connessi con i permessi corretti.

Frontend Next.js
Il frontend è Next.js 14 con App Router. Le pagine pubbliche (login, signup, landing) sono server-rendered. Il dashboard vero e proprio è client-side con React Query per la gestione dello stato server.
La connessione WebSocket è gestita da un custom hook useRealtimeEvents che:
- Apre la connessione al boot del componente
- Si riconnette automaticamente in caso di drop
- Invalida le query React Query sugli eventi ricevuti
Il risultato: l'utente vede le modifiche dei colleghi in tempo reale senza refresh manuale.
Autenticazione e permessi
L'autenticazione usa JWT con refresh token rotation. I permessi sono a tre livelli:
- Organization admin: gestisce tutto, crea/elimina team e utenti
- Team manager: gestisce i task del proprio team, vede i report
- Operatore: vede e aggiorna solo i task assegnati a sé
I permessi sono applicati sia lato API (DRF permissions) sia lato frontend (rendering condizionale).

Database e performance
PostgreSQL con indici parziali sui task aperti (quelli chiusi vengono archiviati in una tabella separata dopo 90 giorni). Le query del dashboard principale sono ottimizzate con select_related e prefetch_related per evitare N+1.
Per i report aggregati (conteggi, medie, trend), viste materializzate ricalcolate ogni 15 minuti via task Celery.
Deployment
Docker Compose con sei service:
web: Django + Gunicornworker: Celery workerbeat: Celery beat per i task periodicichannels: Daphne per WebSocketdb: PostgreSQLredis: Redis
Nginx davanti come reverse proxy con terminazione SSL. Il deploy aggiornato via docker compose pull && docker compose up -d senza downtime grazie al rolling restart.
Risultati
- Latenza media API: <80ms sul p95
- WebSocket: aggiornamenti ricevuti entro 200ms dalla modifica
- Zero downtime negli ultimi 8 mesi di produzione
- Costo infrastruttura: VPS dedicato da 20€/mese, nessun servizio managed esterno