CRI Hub — gestionale a microservizi con SSO
Sette servizi .NET, una PWA React offline e un controllo accessi su ESP32.
- .NET 8
- PostgreSQL
- React PWA
- TypeScript
- API Gateway
- Docker
- GitHub Actions
- ESP32
Il problema
Un'organizzazione di volontariato gestiva turni, mezzi, anagrafiche e comunicazioni su fogli di calcolo e gruppi di messaggistica. Serviva un sistema unico, con identità condivisa fra più applicazioni, utilizzabile da un telefono in mezzo a un intervento — quindi anche senza rete.
Risultato
Sette servizi in esecuzione dietro un gateway, due frontend distinti (operatori e amministratori) che condividono un design system, autenticazione centralizzata e deploy automatico a ogni push.
L’architettura
Il sistema è diviso per responsabilità, non per comodità di sviluppo:
| Servizio | Ruolo |
|---|---|
sso |
Identità unica: registrazione, login, emissione e rinnovo dei token |
api-gateway |
Punto d’ingresso unico: routing, rate limiting, log delle richieste |
cri-hub-be |
Dominio applicativo: turni, mezzi, anagrafiche, permessi |
notification-be |
Notifiche push e comunicazioni verso gli utenti |
cri-fe |
PWA React per gli operatori |
admin-cri |
Pannello di amministrazione |
cri-ui |
Design system condiviso dai due frontend |
I servizi comunicano sulla rete interna di Docker; solo il gateway è esposto. È una scelta di sicurezza prima che di architettura: un servizio che non ha un indirizzo pubblico non ha una superficie d’attacco pubblica.
Le decisioni che contano
Single Sign-On vero, non login duplicato. L’autenticazione vive in un servizio separato che emette token firmati; gli altri servizi li verificano senza mai vedere una password. Aggiungere un’applicazione al sistema significa insegnarle a verificare un token, non a gestire utenti.
Offline come requisito, non come rifinitura. Il frontend è una Progressive Web App: chi la usa spesso è in movimento, con connettività discontinua. L’applicazione si installa sul telefono, continua a funzionare senza rete e sincronizza quando torna.
Notifiche push al posto delle chat di gruppo. Un avviso che arriva come notifica di sistema si legge; un messaggio in un gruppo si perde.
Un design system condiviso. I due frontend usano la stessa libreria di componenti. Il pannello amministrativo e l’app operatore non divergono nel tempo perché non hanno due copie dei bottoni.
Controllo accessi su ESP32
Il progetto include un modulo hardware basato su ESP32 che apre gli accessi validando le stesse identità del sistema web. La parte interessante non è il microcontrollore: è che la porta e l’applicazione web condividono un’unica fonte di verità su chi è autorizzato a entrare.
Deploy
Ogni repository ha la sua pipeline GitHub Actions su runner self-hosted. Un push su main ricostruisce
l’immagine e riavvia il servizio interessato, senza toccare gli altri. Nginx davanti a tutto, con
certificati Let’s Encrypt e rinnovo automatico.