Progetti
DjangoNext.jsPostgreSQLWebSocketRedisDocker

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.

Architettura backend: Django + Channels + Redis + PostgreSQL

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:

  1. Apre la connessione al boot del componente
  2. Si riconnette automaticamente in caso di drop
  3. 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).

Schema permessi: tre ruoli con accesso progressivamente ristretto

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 + Gunicorn
  • worker: Celery worker
  • beat: Celery beat per i task periodici
  • channels: Daphne per WebSocket
  • db: PostgreSQL
  • redis: 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