La Mia Risposta al Rifare

Se hai letto la mia introduzione, conosci il mio mantra: odio ricostruire. Ogni volta che iniziavo un nuovo progetto da zero — configurare autenticazione, JWT, Docker, gestione utenti, role guard — non stavo costruendo il prodotto. Stavo ricostruendo l'impalcatura che avevo già costruito una dozzina di volte prima.

RAD-System è la mia risposta a questo problema. È un framework full-stack che ho costruito per me stesso, open source su GitHub, che elimina tutto ciò che chiamo "rumore di fondo dello sviluppo" — in modo che dal minuto zero, possa concentrarmi esclusivamente sulla logica di business.

Non è destinato a essere il framework per tutti. È costruito attorno al modo in cui penso e ai pattern che mi fido dopo 40 anni di costruzione di sistemi. Se condividi questo approccio, potrebbe funzionare anche per te.

Cos'è

RAD-System è uno stack completo NestJS + Angular, containerizzato con Docker, deliberatamente opinato. Non è un boilerplate che configuri una volta e dimentichi. È un'architettura viva con due astrazioni fondamentali che fanno la maggior parte del lavoro pesante.

1. Backend: Due Astrazioni Che Fanno il 90% del Lavoro

L'intera filosofia del backend si basa su due classi astratte.

BaseEntity — ogni entità di database estende questa. Gestisce automaticamente le colonne di audit (createdAt, updatedAt, deletedAt) tramite TypeORM, inclusa la soft-delete nativa. La chiave primaria è lasciata all'entità concreta in modo da poter scegliere UUID o integer a seconda del contesto.

BaseService — una classe generica che implementa tutte le operazioni CRUD standard. La decisione di progettazione chiave qui è il metodo astratto checkOwnership(): ogni servizio che lo estende deve implementare la validazione della proprietà. Non puoi dimenticartene accidentalmente. La sicurezza non è un livello che aggiungi dopo — è costruita nella fondazione.

2. Frontend: Angular Senza Cerimonia

Il frontend utilizza componenti Angular standalone — nessun NgModules, nessuna dichiarazione di moduli boilerplate. La gestione dello stato è gestita da un leggero StoreService che ho scritto io stesso, supportato da BehaviorSubject e browser storage. Sostituisce NgRx per la stragrande maggioranza delle applicazioni senza l'overhead e la curva di apprendimento.

Un pattern di interceptor funzionale gestisce l'iniezione JWT, lo spinner di caricamento globale e il refresh del token 401 in un unico posto. Ogni chiamata HTTP passa attraverso un ApiService centralizzato che aggiunge automaticamente l'URL API runtime.

3. Infrastruttura: Docker-Native Fin Dal Primo Giorno

L'intero stack viene eseguito in Docker:

  • PostgreSQL 16 — con postgresql.conf personalizzato, script di auto-inizializzazione e persistenza dei dati tramite volumi denominati
  • Backend NestJS — immagine Node 22 compilata, in esecuzione come utente non-root
  • Frontend Angular — servito tramite Nginx con compressione Gzip e intestazioni di sicurezza

La strategia di deployment è basata su artifact: creo un tarball versionato localmente, lo estraggo nel volume sul server e riavvio il container. Nessun Node.js sul server di produzione. Rollback istantaneo estraendo il tarball precedente.

Gli articoli seguenti approfondono ogni livello. Inizia dal backend se vuoi comprendere il modello di astrazione, o vai direttamente a Docker se vuoi vedere come funziona il deployment in pratica.