Skip to content

Latest commit

 

History

History
162 lines (114 loc) · 5.81 KB

File metadata and controls

162 lines (114 loc) · 5.81 KB

Gestione Container Docker

Panoramica

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).

Servizi Docker Compose

Architettura dei container

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
Loading

Servizi

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

Sequenza di avvio

  1. MariaDB si avvia (healthcheck: mariadb-admin ping)
  2. Mailpit si avvia
  3. 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)
  4. FilmApiSeeder attende MariaDB healthy e FilmAPI ready, poi popola catalogo e programmazione
  5. 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.

Volumi

Volume Montato su Scopo
mariadb-data /var/lib/mysql (mariadb) Persistenza dati DB
media-uploads /app/wwwroot/media/covers (filmapi) Persistenza immagini caricate

Dockerfile

FilmAPI (backend/FilmAPI/Dockerfile)

Multi-stage build in 3 fasi:

  1. Restore: mcr.microsoft.com/dotnet/sdk:10.0 — copia solution e csproj per cache layer, dotnet restore
  2. Publish: copia sorgenti, dotnet publish -c Release -o /app/publish
  3. 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

FilmApiSeeder (backend/scripts/FilmApiSeeder/Dockerfile)

Multi-stage build analoga. Include ProjectReference a FilmAPI per accedere a DbContext e servizi. Nel container, i default sono:

  • DB_USE_AUTODETECT=false
  • DB_SERVER_VERSION=10.11.0-mariadb
  • SEED_SOURCE_MODE=snapshot
  • SEED_SNAPSHOT_FILE=/app/data/catalog-snapshot.json

CineBase.Web (frontend/CineBase.Web/Dockerfile)

Multi-stage build in 4 fasi:

  1. Assets: node:20-bookworm-slimnpm ci, build Tailwind CSS, copia vendor (Chart.js, Font Awesome, Inter font)
  2. Restore: mcr.microsoft.com/dotnet/sdk:10.0
  3. Publish: inietta assets dallo stage 1, dotnet publish, cleanup file di build
  4. Final: mcr.microsoft.com/dotnet/aspnet:10.0 — runtime minimale, utente non-root

Healthcheck: curl --fail http://localhost:8080/healthz

File Compose aggiuntivi

docker-compose.no-seeder.yml

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 -d

docker-compose.e2e.yml

Aggiunge 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 -d

docker-compose.debug.devcontainer-backend.yml

Espone MariaDB sulla porta 3307 e Mailpit SMTP sulla 1025 per permettere il debug locale del backend da devcontainer.

Development Container

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.

Comandi operativi

# 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

Port mapping

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)