Descrizione del corso
- Architettura di Deployment
- Stateless Agent API vs Stateful Agent Service
- Modal e Deploy serverless di Agenti Python con @app.function, @app.cls e cron jobs
- Scalabilità con Modal, Concorrenza, GPU access per Embedding ed ottimizzazione Cold Start
- Railway e Deploy di servizi Stateful ( PostgreSQL, Redis e Langfuse ) con un Click
- Docker multi-stage Builds per Agenti con Immagine leggera e dipendenze ottimizzate
- Environment Management, Secrets, Config per Environment ( Sviluppo/Staging/Produzione )
- CI/CD Pipeline per Agenti, GitHub Actions, Test automatici e strategie di Rollback
- Monitoring in produzione con Health checks, Uptime ed integrazione con Langfuse e Sentry
- Introduzione al Project Work finale
- Esercizio 66.01 – Prendere uno degli Agent costruiti nei moduli precedenti e scrivere un Dockerfile multi-stage
- Esercizio 66.02 – Primo stage con tutte le dipendenze di build
- Esercizio 66.03 – Secondo stage con solo il necessario per il runtime, ottenendo un’immagine finale inferiore a 200MB
- Esercizio 66.04 – Configurare tre file .env distinti per sviluppo, staging e produzione con variabili diverse per API keys, database URL, log level e feature flags
- Esercizio 66.05 – Implementare una funzione di configurazione in Python che legge le variabili d’ambiente e valida che tutte quelle obbligatorie siano presenti al momento dell’avvio
- Esercizio 66.06 – Usare Docker secrets per le variabili più sensibili invece delle variabili d’ambiente plain text e verificare che non siano visibili nei log
- Esercizio 66.07 – Buildare l’immagine per tre architetture diverse con docker buildx: linux/amd64, linux/arm64 e verificare che funzioni correttamente su entrambe
- Esercizio 66.08 – Pubblicare l’immagine su GitHub Container Registry con tag semantici: latest, versione specifica e hash del commit Git
- Esercizio 66.09 – Deploy serverless su Modal
- Esercizio 66.10 – Installare Modal CLI, autenticarsi e creare la prima app con @app.function che espone l’agente come funzione invocabile remotamente
- Esercizio 66.11 – Configurare i secrets su Modal per API keys e variabili sensibili e verificare che siano accessibili dentro la funzione senza essere nei log
- Esercizio 66.12 – Implementare un endpoint HTTP con @app.function(allow_concurrent_inputs=10) che gestisce fino a 10 richieste contemporanee e misurare la latenza sotto carico
- Esercizio 66.13 – Aggiungere un @app.cls per un agente stateful che mantiene una connessione al DB aperta tra una invocazione e l’altra, evitando il costo di reconnessione ad ogni Request
- Esercizio 66.14 – Configurare un cron job con @app.function(schedule=modal.Period(hours=1)) che ogni ora esegue un task di manutenzione
- Esercizio 66.15 – Ottimizzare il cold start: misurare il tempo di avvio a freddo, identificare le dipendenze più pesanti e usare modal.Image con layer pre-buildati
- Esercizio 66.16 – Creare un progetto Railway e deployare PostgreSQL con pgvector abilitato, configurando backup automatici giornalieri e retention di 7 giorni
- Esercizio 66.17 – Aggiungere Redis come secondo servizio e configurare la persistenza con AOF per evitare perdita di dati in caso di restart
- Esercizio 66.18 – Deployare Langfuse self-hosted come terzo servizio collegandolo al PostgreSQL già presente nel progetto
- Esercizio 66.19 – Configurare le variabili d’ambiente condivise tra i servizi usando il sistema di riferimenti interni di Railway: ${{Postgres.DATABASE_URL}} invece di hardcodare i valori
- Esercizio 66.20 – Testare la connettività tra i servizi dall’interno della rete privata di Railway e verificare che nessun servizio sia esposto pubblicamente tranne gli endpoint necessari