Un viaggio tecnico tra architetture moderne, sicurezza avanzata e sviluppo software professionale
In questo articolo vi parlo dello sviluppo di un backend completo e containerizzato per la gestione dei piani di navigazione di un drone marino autonomo. Questo progetto non è solo un esercizio universitario, ma una vera e propria simulazione di software production-ready, che utilizza tecnologie moderne e pattern architetturali tipici dello sviluppo enterprise.
In questo articolo voglio raccontarti cosa abbiamo realizzato, quali tecnologie abbiamo scelto e soprattutto perché: ogni componente ha uno scopo preciso e contribuisce a creare un sistema robusto, scalabile e sicuro.
🧭 Obiettivo del progetto
L’applicazione si occupa di gestire:
- richieste di piani di navigazione,
- percorsi geolocalizzati con waypoint,
- valutazione di aree vietate,
- autorizzazioni/verifiche da parte di operatori,
- ricariche token da parte di amministratori.
Il sistema implementa tre ruoli:
- User → crea e cancella richieste, visualizza i propri piani
- Operator → crea/gestisce le aree vietate e valuta le richieste
- Admin → ricarica il credito degli utenti
Ogni operazione è protetta tramite JWT RS256, con permessi controllati tramite RBAC (Role-Based Access Control).
🔧 Tecnologie scelte e perché
🟦 Node.js 22 + TypeScript
Il cuore dell’applicazione.
TypeScript garantisce tipizzazione, sicurezza e manutenibilità. Node 22 offre performance moderne, API aggiornate e pieno supporto ES modules.
✔ leggibilità
✔ grande ecosistema
✔ ottimo per API REST ad alta concorrenza
🚀 Express
Il framework più semplice e affidabile per esporre API REST.
Usato insieme ai middleware per implementare:
- autenticazione
- controllo ruoli
- logging richieste
- gestione errori centralizzata
- validazioni e filtri sulle rotte
La struttura è stata suddivisa in router modulari per mantenere il codice organizzato: public, areas, requests.
🛢️ PostgreSQL 16 + Sequelize ORM
Abbiamo scelto PostgreSQL per affidabilità, tipi avanzati e compatibilità con Docker.
Sequelize ci permette di:
- definire modelli ad oggetti,
- generare migrazioni versionate,
- gestire transazioni atomiche (importantissime nel progetto),
- semplificare CRUD e relazioni.
Per esempio, la creazione di una richiesta usa una transazione: prima si addebitano token, poi si salva la richiesta, tutto in “tutto o niente”.
🐳 Docker + Docker Compose
È la tecnologia che dà portabilità assoluta al progetto: chiunque può avviare l’app senza installare Node, Postgres o librerie.
I container utilizzati:
api→ backend Node/TSdb→ PostgreSQL con volume persistenteadminer→ GUI DB (facoltativa)
Per Michela, per me, per qualsiasi studente o professore:
👉 funziona allo stesso modo su Windows, Mac, Ubuntu e anche su distro molto vecchie.
🔐 JWT RS256 + Docker Secrets
La sicurezza del sistema è robusta:
- firma dei token con chiave privata,
- verifica con chiave pubblica,
- chiavi memorizzate come secrets, non nel codice,
- issuer e audience verificati con precisione,
- validazioni e scadenze corrette.
Il controllo accessi è basato su ruoli (RBAC):
- solo gli operatori possono accettare/rifiutare,
- solo gli admin possono ricaricare token,
- gli user vedono solo le richieste proprie.
📡 Esportazione JSON + XML (Strategy Pattern)
Una delle funzionalità richieste è l’esportazione dei dati in JSON e XML.
Noi abbiamo implementato:
- JSON → default
- XML → tramite
fast-xml-parser
A livello architetturale questa parte segue lo Strategy Pattern: il controller sceglie la strategia di export basandosi su format=json|xml.
🗺️ Validazioni “geometriche” con TypeScript
Una parte interessante del progetto è l’analisi delle rotte:
- un piano è valido solo se il percorso è chiuso (primo punto = ultimo)
- il percorso non deve attraversare aree vietate
- la partenza deve essere almeno 48h avanti rispetto all’orario di richiesta
Questa logica è stata incapsulata in funzioni dedicate in utils/geo.ts, con gestione di:
- rettangoli (aree vietate),
- segmenti del percorso,
- rilevamento di intersezioni.
⚙️ Migrazioni, Seed e Deployment
Abbiamo creato un sistema completo di:
- migrazioni (tabelle, pgcrypto, vincoli),
- seed iniziali (utenti e aree),
- database versionato,
- comandi pronti all’uso:
docker compose run --rm api npm run db:migrate
docker compose run --rm api npm run db:seed
🧪 Testing manuale tramite cURL e JWT generati dal container
Durante lo sviluppo abbiamo testato:
- ruoli,
- parametri,
- errori,
- edge cases (timestamp, rotta non chiusa, collisioni).
I token JWT vengono generati direttamente dal container con un comando come:
docker compose exec -T api node -e "/* firma JWT qui */"
Questo garantisce che il test utilizzi esattamente le chiavi correnti del sistema.
🎯 Conclusione
Questo progetto è stato un lavoro estremamente formativo per me e Michela.
Abbiamo applicato concetti di:
- architettura software,
- sicurezza,
- validazioni,
- ORM avanzati,
- containerizzazione,
- progettazione REST,
- pattern enterprise (Unit of Work, Strategy, CoR, Layered Architecture).
Il risultato è un backend completo, professionale e pronto per essere esteso verso un vero sistema di controllo autonomo.
One response to “Progetto Drone Marino Autonomo”
-
È stato un progetto molto interessante e dinamico, mi è piaciuto molto seguire questo progetto! Soprattutto, sono molto contenta di aver imparato nuove cose e di aver scoperto il mondo di Node e Typescript, a cui volevo già avvicinarmi da un po’.
Grazie della bella esperienza 😊
"Mi piace"Piace a 1 persona
Lascia un commento