# mockupAWS - Backend Profiler & Cost Estimator > **Versione:** 0.3.0 (Completata) > **Stato:** Database, Backend & Frontend Implementation Complete ## Panoramica `mockupAWS` Γ¨ una piattaforma di simulazione locale (homelab) progettata per **profilare il traffico e calcolare i driver di costo** dei servizi AWS (SQS, Lambda, Bedrock/LLM) prima del deploy in produzione. A differenza dei semplici calcolatori di costo online, mockupAWS permette di: - **Creare scenari di simulazione** isolati e tracciabili - **Inviare log reali** tramite HTTP API (compatibile Logstash) - **Storicizzare** tutte le metriche in database PostgreSQL - **Calcolare costi** usando prezzi AWS reali aggiornabili - **Generare report** PDF/CSV professionali - **Confrontare scenari** per decisioni data-driven - **Rilevare PII** nei log prima dell'invio al cloud ## Caratteristiche Principali ### 🎯 Gestione Scenari - Crea scenari di simulazione con nome, descrizione e tag - Isola completamente i dati tra scenari diversi - Stati dello scenario: `draft` β†’ `running` β†’ `completed` β†’ `archived` - Confronta scenari side-by-side con indicatori di delta costi ### πŸ’° Calcolo Costi AWS Reale - Tabella prezzi AWS configurabile per regione - Calcolo accurato basato su: - **SQS**: $0.40 per milione richieste (blocchi 64KB) - **Lambda**: $0.20 per milione richieste + $0.0000166667 per GB-second - **Bedrock**: Prezzi per token input/output (variano per modello) - Supporto multi-regione (us-east-1, eu-west-1, ecc.) ### πŸ“Š Interfaccia Web - Dashboard responsive con grafici in tempo reale - Dark/Light mode - Form guidato per creazione scenari - Vista dettaglio con metriche, costi, logs e PII detection - Export report PDF/CSV ### πŸ”’ Sicurezza - Rilevamento automatico email (PII) nei log - Hashing dei messaggi per privacy - Deduplicazione automatica per simulazione batching ottimizzato - Autenticazione JWT/API Keys (in sviluppo) ## Architettura ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Logstash β”‚ β”‚ React Web UI β”‚ β”‚ API Clients β”‚ β”‚ (o Client) β”‚ β”‚ (Dashboard) β”‚ β”‚ (CI/CD) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ HTTP POST β”‚ HTTPS β”‚ API Key β”‚ /ingest β”‚ /api/v1/* β”‚ /api/v1/* β–Ό β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ API LAYER (FastAPI + Uvicorn) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ /scenarios β”‚ β”‚ /ingest β”‚ β”‚ /reports β”‚ β”‚ /pricing β”‚ β”‚ β”‚ β”‚ /metrics β”‚ β”‚ (scenario) β”‚ β”‚ generate β”‚ β”‚ (admin) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DATABASE LAYER (PostgreSQL 15+) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ scenarios β”‚ β”‚scenario_logs β”‚ β”‚ aws_pricing β”‚ β”‚ β”‚ β”‚ scenario_ β”‚ β”‚ reports β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ metrics β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## Stack Tecnologico ### Backend - **FastAPI** (β‰₯0.110) - Framework web async ad alte prestazioni - **PostgreSQL** (β‰₯15) - Database relazionale con supporto JSON - **SQLAlchemy** (β‰₯2.0) - ORM moderno con supporto async/await - **Alembic** - Migrazioni database versionate - **Pydantic** (β‰₯2.7) - Validazione dati e serializzazione - **tiktoken** - Tokenizer ufficiale OpenAI per calcolo costi LLM - **python-jose** - JWT handling (preparato per v1.0.0) ### Frontend - **React** (β‰₯18) - UI library con hooks e functional components - **Vite** (β‰₯5.0) - Build tool ultra-veloce con HMR - **TypeScript** (β‰₯5.0) - Type safety e developer experience - **Tailwind CSS** (β‰₯3.4) - Utility-first CSS framework - **shadcn/ui** - Componenti UI accessibili e personalizzabili - **TanStack Query** (React Query) - Data fetching e caching - **Axios** - HTTP client con interceptors - **React Router** - Client-side routing - **Lucide React** - Icone moderne e consistenti ### DevOps - **Docker** & Docker Compose - Containerizzazione - **Nginx** - Reverse proxy (pronto per produzione) - **uv** - Package manager Python veloce e moderno - **Ruff** - Linter e formatter Python - **ESLint** & **Prettier** - Code quality frontend ## Requisiti - Docker & Docker Compose - Python 3.11+ (se sviluppo locale) - Node.js 20+ (se sviluppo frontend) - ~2GB RAM disponibili ## Installazione e Avvio ### Prerequisiti - Docker & Docker Compose - Python 3.11+ (per sviluppo locale) - Node.js 20+ (per sviluppo frontend) - PostgreSQL 15+ (se non usi Docker) ### Metodo 1: Docker Compose (Consigliato) ```bash # Clona il repository git clone cd mockupAWS # Avvia tutti i servizi (API + Database + Frontend) docker-compose up --build # L'applicazione sarΓ  disponibile su: # - Web UI: http://localhost:5173 (Vite dev server) # - API: http://localhost:8000 # - API Docs: http://localhost:8000/docs # - Database: localhost:5432 ``` ### Metodo 2: Sviluppo Locale **Step 1: Database** ```bash # Usa Docker solo per PostgreSQL docker-compose up -d postgres # oppure configura PostgreSQL localmente ``` **Step 2: Backend** ```bash # Installa dipendenze Python uv sync # Esegui migrazioni database uv run alembic upgrade head # Avvia server API uv run uvicorn src.main:app --reload --host 0.0.0.0 --port 8000 ``` **Step 3: Frontend (in un altro terminale)** ```bash cd frontend # Installa dipendenze npm install # Avvia server sviluppo npm run dev # L'app sarΓ  disponibile su http://localhost:5173 ``` ### Configurazione Ambiente Crea un file `.env` nella root del progetto: ```env # Database DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/mockupaws # API API_V1_STR=/api/v1 PROJECT_NAME=mockupAWS # Frontend (se necessario) VITE_API_URL=http://localhost:8000 ``` ## Utilizzo ### 1. Creare uno Scenario Via Web UI: 1. Apri http://localhost:3000 2. Clicca "Nuovo Scenario" 3. Inserisci nome, descrizione, seleziona regione AWS 4. Clicca "Crea e Avvia" Via API: ```bash curl -X POST http://localhost:8000/api/v1/scenarios \ -H "Content-Type: application/json" \ -d '{ "name": "Produzione Q2", "description": "Simulazione traffico produzione", "region": "us-east-1", "tags": ["production"] }' # Response: { "id": "uuid-scenario-123", ... } ``` ### 2. Inviare Log allo Scenario ```bash # Usa lo scenario ID ricevuto curl -X POST http://localhost:8000/ingest \ -H "Content-Type: application/json" \ -H "X-Scenario-ID: uuid-scenario-123" \ -d '{"message": "Error: connection timeout", "source": "api"}' ``` Oppure configura Logstash: ```ruby output { http { url => "http://localhost:8000/ingest" headers => ["X-Scenario-ID", "uuid-scenario-123"] content_type => "application/json" format => "json" } } ``` ### 3. Monitorare in Tempo Reale - Apri la Web UI http://localhost:3000 - Seleziona il tuo scenario - Osserva metriche in tempo reale: - Richieste totali - Costo stimato cumulativo - Blocchi SQS fatturabili - Token LLM contati - Violazioni PII rilevate ### 4. Generare Report Via Web UI: 1. Vai al tab "Report" dello scenario 2. Seleziona formato (PDF o CSV) 3. Clicca "Genera Report" 4. Scarica il file Via API: ```bash curl -X POST http://localhost:8000/api/v1/scenarios/uuid-scenario-123/reports \ -H "Content-Type: application/json" \ -d '{"format": "pdf", "include_logs": false}' ``` ### 5. Confrontare Scenari Nella Web UI: 1. Dalla lista scenari, seleziona 2+ scenari con i checkbox 2. Clicca "Confronta Selezionati" 3. Visualizza comparazione costi e metriche ## Struttura del Progetto ``` mockupAWS/ β”œβ”€β”€ src/ # Backend FastAPI β”‚ β”œβ”€β”€ main.py # Entry point applicazione β”‚ β”œβ”€β”€ api/ β”‚ β”‚ β”œβ”€β”€ deps.py # Dependencies (DB session, auth) β”‚ β”‚ └── v1/ # API v1 endpoints β”‚ β”‚ β”œβ”€β”€ scenarios.py # CRUD scenari β”‚ β”‚ β”œβ”€β”€ ingest.py # Ingestione log β”‚ β”‚ └── metrics.py # Metriche e costi β”‚ β”œβ”€β”€ core/ β”‚ β”‚ β”œβ”€β”€ config.py # Configurazione app β”‚ β”‚ β”œβ”€β”€ database.py # SQLAlchemy setup β”‚ β”‚ └── exceptions.py # Gestione errori β”‚ β”œβ”€β”€ models/ # SQLAlchemy models β”‚ β”‚ β”œβ”€β”€ scenario.py β”‚ β”‚ β”œβ”€β”€ scenario_log.py β”‚ β”‚ β”œβ”€β”€ scenario_metric.py β”‚ β”‚ β”œβ”€β”€ aws_pricing.py β”‚ β”‚ └── report.py β”‚ β”œβ”€β”€ schemas/ # Pydantic schemas β”‚ β”œβ”€β”€ repositories/ # Repository pattern β”‚ └── services/ # Business logic β”‚ β”œβ”€β”€ pii_detector.py β”‚ β”œβ”€β”€ cost_calculator.py β”‚ └── ingest_service.py β”œβ”€β”€ frontend/ # Frontend React β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ App.tsx # Root component β”‚ β”‚ β”œβ”€β”€ components/ β”‚ β”‚ β”‚ β”œβ”€β”€ layout/ # Header, Sidebar, Layout β”‚ β”‚ β”‚ └── ui/ # shadcn components β”‚ β”‚ β”œβ”€β”€ hooks/ # React Query hooks β”‚ β”‚ β”œβ”€β”€ lib/ β”‚ β”‚ β”‚ β”œβ”€β”€ api.ts # Axios client β”‚ β”‚ β”‚ └── utils.ts # Utility functions β”‚ β”‚ β”œβ”€β”€ pages/ # Page components β”‚ β”‚ β”‚ β”œβ”€β”€ Dashboard.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ ScenarioDetail.tsx β”‚ β”‚ β”‚ └── ScenarioEdit.tsx β”‚ β”‚ └── types/ β”‚ β”‚ └── api.ts # TypeScript types β”‚ β”œβ”€β”€ package.json β”‚ └── vite.config.ts β”œβ”€β”€ alembic/ # Database migrations β”‚ └── versions/ # Migration files β”œβ”€β”€ export/ # Documentazione progetto β”‚ β”œβ”€β”€ prd.md # Product Requirements β”‚ β”œβ”€β”€ architecture.md # Architettura sistema β”‚ β”œβ”€β”€ kanban.md # Task breakdown β”‚ └── progress.md # Progress tracking β”œβ”€β”€ docker-compose.yml # Docker orchestration β”œβ”€β”€ pyproject.toml # Python dependencies └── README.md # Questo file ``` ## Principi di Design ### πŸ” Safety First Validazione rigorosa dei payload e rilevamento PII prima di qualsiasi elaborazione. ### πŸ”„ Little Often Processamento a piccoli batch per simulare l'ottimizzazione Lambda e minimizzare costi. ### βœ“ Double Check Ogni calcolo (token count, billing blocks, costi) Γ¨ verificato. Target: >95% accuratezza vs AWS reale. ## Sviluppo ### Flusso di Lavoro (TDD) 1. **Spec-Driven**: Definisci input/output prima di implementare 2. **Test First**: Scrivi test che falliscono (Red) 3. **Implementa**: Codice minimo per far passare test (Green) 4. **Refactor**: Migliora codice mantenendo test passanti ### Convenzioni Git - **Conventional Commits**: `feat:`, `fix:`, `test:`, `docs:`, `chore:` - Commit atomici - Esempio: `feat: add scenario cost calculation with AWS pricing` ### Comandi Utili ```bash # Test uv run pytest # Tutti i test uv run pytest -v # Verbose uv run pytest --cov=src # Con coverage # Database uv run alembic revision --autogenerate -m "description" uv run alembic upgrade head uv run alembic downgrade -1 # Formattazione uv run ruff check src/ uv run ruff format src/ # Frontend cd frontend npm run lint npm run build ``` ## Roadmap ### v0.2.0 βœ… Completata - [x] API ingestion base - [x] Calcolo metriche (SQS, Lambda, Bedrock) - [x] Database PostgreSQL con SQLAlchemy 2.0 async - [x] Tabelle scenari e persistenza - [x] Tabella prezzi AWS (seed dati per us-east-1, eu-west-1) - [x] Migrazioni Alembic (6 migrations) - [x] Repository pattern + Services layer - [x] PII detection e cost calculation ### v0.3.0 βœ… Completata - [x] Frontend React 18 con Vite - [x] Dashboard responsive con Tailwind CSS - [x] Form creazione/modifica scenari - [x] Lista scenari con paginazione - [x] Pagina dettaglio scenario - [x] Integrazione API con Axios + React Query - [x] Componenti UI shadcn/ui ### v0.4.0 (Prossima Release) - [ ] Generazione report PDF/CSV - [ ] Confronto scenari - [ ] Grafici interattivi con Recharts - [ ] Dark/Light mode toggle ### v1.0.0 - [ ] Autenticazione JWT e autorizzazione - [ ] API Keys management - [ ] Backup automatico database - [ ] Documentazione API completa (OpenAPI) - [ ] Testing E2E ## Contributi Contributi sono benvenuti! Per favore: 1. Fork il repository 2. Crea un branch feature (`git checkout -b feature/amazing-feature`) 3. Commit le modifiche (`git commit -m 'feat: add amazing feature'`) 4. Push al branch (`git push origin feature/amazing-feature`) 5. Apri una Pull Request ## Licenza Distribuito sotto licenza MIT. Vedi `LICENSE` per dettagli. --- **MockupAWS** - Parte del progetto LogWhispererAI *Stima i costi AWS prima di spenderli davvero*