97 lines
3.8 KiB
YAML
97 lines
3.8 KiB
YAML
# ==============================================================================
|
|
# docker-compose.override.yml — Sviluppo locale
|
|
# Attivo automaticamente con: docker compose up -d
|
|
# → avvia l'intero stack di sviluppo: Vite dev server (HMR) + backend
|
|
# (artisan serve) + db + redis + docs + mailpit, dietro Traefik.
|
|
#
|
|
# In produzione si usa SOLO il compose base (niente override, niente Traefik):
|
|
# docker compose -f docker-compose.yml up -d
|
|
#
|
|
# Prerequisiti dev:
|
|
# - rete traefik: docker network create traefik-network
|
|
# - dyncoll-dev.local in /etc/hosts
|
|
#
|
|
# NB router/service Traefik = `dyncoll-dev` per non collidere con la v1 (`dyncoll`).
|
|
# ==============================================================================
|
|
|
|
services:
|
|
|
|
# Frontend: in dev gira il dev server di Vite (HMR), non l'nginx statico.
|
|
frontend:
|
|
build:
|
|
target: development # stage Vite, non lo stage nginx di produzione
|
|
ports:
|
|
- "${APP_FRONTEND_DEVPORT}:5173"
|
|
volumes:
|
|
- ./frontend:/app # sorgente live → HMR su ogni modifica
|
|
- /app/node_modules # volume anonimo: i node_modules musl dell'immagine
|
|
# schermano quelli glibc dell'host (mai bind-montati)
|
|
networks:
|
|
- internal
|
|
- traefik-network
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.dyncoll-dev.rule=Host(`dyncoll-dev.local`)"
|
|
- "traefik.http.routers.dyncoll-dev.entrypoints=websecure"
|
|
- "traefik.http.routers.dyncoll-dev.tls=true"
|
|
- "traefik.http.services.dyncoll-dev.loadbalancer.server.port=5173"
|
|
- "traefik.docker.network=traefik-network"
|
|
|
|
# Backend: in dev usa `artisan serve` (errori leggibili, niente supervisord/nginx).
|
|
backend:
|
|
build:
|
|
target: development
|
|
command: ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
|
|
# db-test si avvia insieme al backend (merge col depends_on del compose base:
|
|
# db + redis). Così `make test` trova sempre il DB di test pronto senza doverlo
|
|
# accendere a mano. È in override → presente solo in dev/CI, mai in produzione.
|
|
depends_on:
|
|
db-test:
|
|
condition: service_healthy
|
|
|
|
# DB dedicato ai test (SOLO dev/CI — sta qui in override, non nel compose base
|
|
# né in produzione). Isolamento FISICO dal db di sviluppo: la suite punta qui
|
|
# (DB_HOST=db-test, vedi target `make test`), così nessun RefreshDatabase può
|
|
# raggiungere e azzerare `dyncoll`. tmpfs = dati in RAM → effimeri e veloci.
|
|
# Non è una replica dei DATI: i test ricostruiscono lo schema dalle migration e
|
|
# vogliono un DB vuoto; serve solo lo stesso motore (mysql:8.4) del db di sviluppo.
|
|
db-test:
|
|
image: mysql:8.4
|
|
container_name: dyncoll_db_test
|
|
restart: unless-stopped
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
|
MYSQL_DATABASE: dyncoll_test
|
|
MYSQL_USER: ${DB_USERNAME}
|
|
MYSQL_PASSWORD: ${DB_PASSWORD}
|
|
tmpfs:
|
|
- /var/lib/mysql
|
|
networks:
|
|
- internal
|
|
healthcheck:
|
|
# Stessa logica del db dev (docker-compose.yml): $$ = $ letterale espanso a
|
|
# runtime dalla shell del container; password quotata per i caratteri speciali.
|
|
test: ["CMD-SHELL", "mysqladmin ping -h localhost -u \"$$MYSQL_USER\" -p\"$$MYSQL_PASSWORD\""]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
labels:
|
|
- "com.docker.compose.project=dyncoll-project"
|
|
|
|
# Mailpit: SMTP sink di sviluppo. Cattura tutte le mail (nessuna spedizione reale).
|
|
# SMTP su 1025 (raggiungibile dal backend come host `mailpit`), Web UI su 8025.
|
|
mailpit:
|
|
image: axllent/mailpit:latest
|
|
container_name: dyncoll_mailpit
|
|
restart: unless-stopped
|
|
networks:
|
|
- internal
|
|
ports:
|
|
- "127.0.0.1:8025:8025" # Web UI: http://localhost:8025
|
|
labels:
|
|
- "com.docker.compose.project=dyncoll-project"
|
|
|
|
networks:
|
|
traefik-network:
|
|
external: true
|