Un backend realtime scalabile costruito con NestJS, Socket.IO, Redis e MongoDB. Progettato per gestire sessioni di karaoke collaborative, code dinamiche e interazioni realtime a bassa latenza.
- Realtime State: Gestione stato sessioni e code con latenza minima via WebSocket.
- Scalabile: Architettura stateless (eccetto Redis) pronta per il scaling orizzontale.
- Resiliente: Riconnessione automatica e gestione "graceful" delle disconnessioni (host/participant).
- Persistenza: Storico sessioni e utenti salvato su MongoDB.
- Docker Ready: Setup locale immediato con Docker Compose e Dockerfile ottimizzato per produzione.
Il sistema si basa su 3 componenti principali:
- NestJS Server: Gestisce la logica di business e le connessioni WebSocket.
- Redis: Memoria volatile per lo stato realtime (chiavi sessione, code, lock distribuiti).
- MongoDB: Database persistente per storage a lungo termine (analitiche, storico).
- Docker & Docker Compose
- Node.js 20+ (opzionale, per sviluppo locale senza container)
-
Clona il repository
git clone <repo-url> cd karaoke-server
-
Configura l'ambiente
cp .env.example .env
-
Avvia con Docker
docker-compose up --build
Il server sarà accessibile su http://localhost:3000.
Socket.IO ascolta sul namespace /karaoke.
Per sviluppare localmente senza containerizzare l'app Node:
- Avvia solo i servizi di infrastruttura:
docker-compose up -d mongodb redis redis-commander
- Installa dipendenze e avvia server:
npm install npm run start:dev
Redis Commander è disponibile su http://localhost:8081 per ispezionare lo stato Redis.
Il server è stateless e può essere deployato facilmente su piattaforme che supportano container.
Si consiglia l'uso di Railway per la sua semplicità nella gestione di volumi persistenti e servizi collegati.
-
Servizi Necessari:
- 1x Node.js Service (dal Dockerfile).
- 1x Redis Service.
- 1x MongoDB Service.
-
Variabili d'ambiente (Produzione):
NODE_ENV=productionMONGO_URI: Stringa di connessione completa.REDIS_HOST,REDIS_PORT,REDIS_PASSWORD.ALLOWED_ORIGINS: Dominio del frontend (es.https://my-karaoke-app.com).SOCKET_CORS_ORIGIN: Come sopra.
L'architettura attuale NON richiede sticky sessions se si usa il transport websocket (default consigliato per i client moderni). Se si necessita di fallback a polling long-running, configurare il load balancer per sticky sessions basate su IP o cookie.
- Persistenza Coda: La coda corrente risiede in Redis. Se Redis perde i dati (non persistente), la sessione attiva viene resettata (ma non persa in MongoDB se già salvata). Assicurarsi di usare Redis con AOF/RDB in produzione.
- Scaling: Per scalare oltre 1 istanza server, è necessario un Adapter Redis per Socket.IO (già predisposto ma da configurare se si usa cluster mode).
- Fork del repository
- Crea un branch (
git checkout -b feature/amazing-feature) - Commit (
git commit -m 'feat: Add amazing feature') - Push (
git push origin feature/amazing-feature) - Apri una Pull Request