GprFlow
ONLINEPiattaforma di crypto trading
Dati di mercato live, portafoglio con profitti e perdite, statistiche con grafici, pagamenti Stripe e chatbot Gemini. JWT in cookie HttpOnly e gateway con rate limiting.
Il mio ruolo: Progetto personale, dall’architettura al deploy.
- React
- Redux
- Spring Cloud Gateway
- PostgreSQL
- Stripe
Il problema
Volevo un progetto personale che affrontasse quello che un’app reale deve gestire: soldi, autenticazione, dati esterni in tempo reale e un deploy vero. I pagamenti Stripe della demo sono in modalità test, quindi nessun denaro reale si muove.
Architettura
Nata come monolite Spring Boot, oggi è divisa in servizi dietro uno Spring Cloud Gateway, con un frontend React e Redux.
- Servizi: coin, chatbot, ledger, auth e user, più il monolite residuo
- Un solo PostgreSQL, con uno schema separato per ogni servizio
- Ospitata su un mio server Ubuntu ed esposta con un Cloudflare Tunnel, senza porte aperte sul router
- Deploy automatico con GitHub Actions: controlli su frontend e backend, poi rilascio via Tailscale e SSH
Scelte tecniche
- Migrazione per fasi: prima test di integrazione con Testcontainers come rete di sicurezza, poi un dominio alla volta (Coin e Chatbot, poi Ledger, infine Auth e User)
- Sicurezza al gateway: JWT in cookie HttpOnly validato una sola volta, identità passata ai servizi tramite header, rate limiting per IP, limite di 1 MB sulle richieste e Cloudflare Turnstile su login, registrazione e reset password
- Correttezza sui soldi: chiusi accessi ai dati di altri utenti (IDOR), importi negativi o nulli, riuso dei codici OTP ed errori di precisione nel wallet; il prezzo di acquisto è una media ponderata quando ricompri lo stesso asset
Cosa ho imparato
- Come funzionano e come si usano le pipeline di CI/CD, dai controlli automatici al rilascio in produzione
- Come si fa il deploy su un server Linux, compresa l’esposizione dell’app con cloudflared
- Come comunicano tra loro i container di uno stack Docker Compose



