CineBase è completamente containerizzato con Docker e orchestrato tramite Docker Compose. Il sistema è progettato per essere clone-and-run: un singolo docker compose up -d avvia l'intero stack (database, backend, seeder, frontend, mailpit).
graph TD
subgraph "Docker Network"
MARIADB[(MariaDB 10.11)]
MAILPIT[Mailpit SMTP]
FILMAPI[FilmAPI Backend API]
SEEDER[FilmApiSeeder Job one-shot]
WEB[CineBase.Web Frontend]
end
Browser[Browser]
MARIADB -->|healthcheck: mariadb-admin ping| MARIADB
FILMAPI -->|depends_on: healthy| MARIADB
FILMAPI -->|depends_on: started| MAILPIT
FILMAPI -->|/api/health/ready| FILMAPI
SEEDER -->|depends_on: healthy| MARIADB
SEEDER -->|depends_on: healthy| FILMAPI
WEB -->|depends_on: healthy| FILMAPI
WEB -->|depends_on: completed| SEEDER
Browser -->|5001:8080| WEB
Browser -->|5000:8080| FILMAPI
Browser -->|8025:8025| MAILPIT
| Servizio | Immagine | Porta host | Porta container | Avvio |
|---|---|---|---|---|
mariadb |
mariadb:10.11 |
(interna) | 3306 | Servizio persistente |
mailpit |
axllent/mailpit |
8025 | 8025 (UI), 1025 (SMTP) | Servizio persistente |
filmapi |
Build da backend/FilmAPI/Dockerfile |
5000 | 8080 | Servizio persistente |
seeder |
Build da backend/scripts/FilmApiSeeder/Dockerfile |
(nessuna) | (nessuna) | Job one-shot (restart: "no") |
cinebase-web |
Build da frontend/CineBase.Web/Dockerfile |
5001 | 8080 | Servizio persistente |
- MariaDB si avvia (healthcheck:
mariadb-admin ping) - Mailpit si avvia
- FilmAPI attende MariaDB healthy e Mailpit, poi:
- Esegue
MigrateAsync()(migrazioni EF Core) - Esegue
DataSeeder.SeedAsync()(admin user) - Segnala readiness via
/api/health/ready(200 OK)
- Esegue
- FilmApiSeeder attende MariaDB healthy e FilmAPI ready, poi popola catalogo e programmazione
- CineBase.Web attende FilmAPI ready e Seeder completato, poi serve le pagine
Questo garantisce che il frontend sia disponibile solo quando l'intero stack è operativo.
| Volume | Montato su | Scopo |
|---|---|---|
mariadb-data |
/var/lib/mysql (mariadb) |
Persistenza dati DB |
media-uploads |
/app/wwwroot/media/covers (filmapi) |
Persistenza immagini caricate |
Multi-stage build in 3 fasi:
- Restore:
mcr.microsoft.com/dotnet/sdk:10.0— copia solution e csproj per cache layer,dotnet restore - Publish: copia sorgenti,
dotnet publish -c Release -o /app/publish - Final:
mcr.microsoft.com/dotnet/aspnet:10.0— runtime minimale, copia binari, porta 8080, utente non-root$APP_UID
Healthcheck: curl --fail http://localhost:8080/api/health/ready
Multi-stage build analoga. Include ProjectReference a FilmAPI per accedere a DbContext e servizi. Nel container, i default sono:
DB_USE_AUTODETECT=falseDB_SERVER_VERSION=10.11.0-mariadbSEED_SOURCE_MODE=snapshotSEED_SNAPSHOT_FILE=/app/data/catalog-snapshot.json
Multi-stage build in 4 fasi:
- Assets:
node:20-bookworm-slim—npm ci, build Tailwind CSS, copia vendor (Chart.js, Font Awesome, Inter font) - Restore:
mcr.microsoft.com/dotnet/sdk:10.0 - Publish: inietta assets dallo stage 1,
dotnet publish, cleanup file di build - Final:
mcr.microsoft.com/dotnet/aspnet:10.0— runtime minimale, utente non-root
Healthcheck: curl --fail http://localhost:8080/healthz
Overlay che sposta il seeder sotto il profile with-seeder. Il frontend si avvia senza attendere il seeder. Utile per sviluppo quando non serve popolare il catalogo.
docker compose -f docker-compose.yml -f docker-compose.no-seeder.yml up -dAggiunge un container Playwright per test browser end-to-end. Usa alias di rete Docker (api.cinebase.test, app.cinebase.test) per risolvere il problema SameSite=Strict con i container (le richieste tra container sono same-site grazie agli alias).
docker compose -f docker-compose.yml -f docker-compose.e2e.yml up -dEspone MariaDB sulla porta 3307 e Mailpit SMTP sulla 1025 per permettere il debug locale del backend da devcontainer.
Il progetto include una configurazione .devcontainer/ per VS Code che fornisce:
- .NET SDK 10
- Node.js 20
- Docker CLI
- Estensioni VS Code (C#, Docker, ESLint, Playwright)
Il devcontainer non sostituisce lo stack Docker Compose, ma fornisce un ambiente di sviluppo consistente. Lo stack applicativo rimane nei container Docker.
# Avvio completo
docker compose up -d
# Avvio senza seeder (più veloce per sviluppo)
docker compose -f docker-compose.yml -f docker-compose.no-seeder.yml up -d
# Reset completo (cancella volumi)
docker compose down -v && docker compose up -d
# Ricostruzione dopo modifiche
docker compose build --no-cache filmapi && docker compose up -d filmapi
# Log di un servizio
docker compose logs -f filmapi
# Esecuzione seeder manuale (con reset programmazione)
docker compose run --rm seeder --reset-shows --force
# Test E2E con browser containerizzato
docker compose -f docker-compose.yml -f docker-compose.e2e.yml up --abort-on-container-exit| Porta host | Servizio | Descrizione |
|---|---|---|
| 5000 | filmapi | API backend |
| 5001 | cinebase-web | Frontend |
| 8025 | mailpit | Interfaccia email di test |
| (nessuna) | mariadb | Database (solo rete interna Docker) |