# Docker conventions

L'environnement local doit pouvoir cohabiter avec les autres instances déjà actives sur la machine. On réserve la **plage de ports 8180–8199** pour VIIZIA.

## Plan de ports VIIZIA

| Port | Service | Conteneur |
|---|---|---|
| 8180 | HTTP nginx (web) | `viizia-nginx` |
| 8181 | MySQL (exposition locale uniquement) | `viizia-mysql` |
| 8182 | phpMyAdmin | `viizia-phpmyadmin` |
| 8183 | SMTP MailHog | `viizia-mailhog` |
| 8184 | UI MailHog | `viizia-mailhog` |
| 8185 | (réservé) workers / Supervisor UI éventuel | — |
| 8186-8189 | (réservé) services additionnels (Redis, MinIO…) | — |
| 8190 | (réservé) HTTPS local éventuel | — |

> **Règle** : aucun port en dehors de la plage 8180-8199 ne doit être exposé par VIIZIA. Avant tout ajout, vérifier la disponibilité avec `lsof -iTCP -sTCP:LISTEN -n -P | grep 81`.

## Naming

- Tous les conteneurs préfixés `viizia-`.
- Toutes les images locales : `viizia/<service>:<tag>`.
- Réseau Docker : `viizia_net` (bridge dédié, pas de `default`).
- Volumes Docker :
  - `viizia_db` (données MySQL persistantes)
  - `viizia_uploads` (fichiers importés)
  - `viizia_var` (cache/logs Symfony si besoin de persister)

## Structure attendue du dépôt

```
.
├── docker/
│   ├── nginx/
│   │   └── default.conf
│   ├── php/
│   │   ├── Dockerfile
│   │   └── php.ini
│   └── mysql/
│       └── my.cnf
├── compose.yaml             # Compose v2 spec
└── .env.docker.example      # Variables d'env attendues
```

## Variables d'environnement

Toutes les valeurs sensibles ou variables passent par `.env.local` (jamais committé). Un `.env.docker.example` est versionné comme référence.

Variables clés :
```
APP_ENV=dev
APP_SECRET=change-me
DATABASE_URL="mysql://viizia:viizia@viizia-mysql:3306/viizia?serverVersion=8.0"
MAILER_DSN=smtp://viizia-mailhog:1025
MESSENGER_TRANSPORT_DSN=doctrine://default
VIZ_HTTP_PORT=8180
VIZ_DB_PORT=8181
VIZ_PMA_PORT=8182
VIZ_MAIL_SMTP_PORT=8183
VIZ_MAIL_UI_PORT=8184
```

Les ports sont **paramétrables** dans `.env.local` pour ajuster sans toucher à `compose.yaml`.

## Squelette `compose.yaml` cible

```yaml
services:
  viizia-nginx:
    image: nginx:1.27-alpine
    container_name: viizia-nginx
    ports:
      - "${VIZ_HTTP_PORT:-8180}:80"
    volumes:
      - ./public:/var/www/html/public:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - viizia-php
    networks: [viizia_net]

  viizia-php:
    build: ./docker/php
    container_name: viizia-php
    volumes:
      - .:/var/www/html
      - viizia_uploads:/var/www/html/uploads
    environment:
      DATABASE_URL: ${DATABASE_URL}
      APP_ENV: ${APP_ENV:-dev}
    depends_on:
      - viizia-mysql
    networks: [viizia_net]

  viizia-mysql:
    image: mysql:8.0
    container_name: viizia-mysql
    ports:
      - "${VIZ_DB_PORT:-8181}:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: viizia
      MYSQL_USER: viizia
      MYSQL_PASSWORD: viizia
    volumes:
      - viizia_db:/var/lib/mysql
    networks: [viizia_net]

  viizia-phpmyadmin:
    image: phpmyadmin:5
    container_name: viizia-phpmyadmin
    ports:
      - "${VIZ_PMA_PORT:-8182}:80"
    environment:
      PMA_HOST: viizia-mysql
      PMA_USER: root
      PMA_PASSWORD: rootpw
    networks: [viizia_net]

  viizia-mailhog:
    image: mailhog/mailhog:latest
    container_name: viizia-mailhog
    ports:
      - "${VIZ_MAIL_SMTP_PORT:-8183}:1025"
      - "${VIZ_MAIL_UI_PORT:-8184}:8025"
    networks: [viizia_net]

  viizia-worker:
    build: ./docker/php
    container_name: viizia-worker
    command: php bin/console messenger:consume async --time-limit=3600 --memory-limit=256M
    volumes:
      - .:/var/www/html
      - viizia_uploads:/var/www/html/uploads
    depends_on:
      - viizia-mysql
    networks: [viizia_net]

networks:
  viizia_net:
    driver: bridge

volumes:
  viizia_db:
  viizia_uploads:
```

## Migrations Doctrine (commande projet)

Référence demandée pour le dépôt : à chaque fichier de migration, appliquer le schéma avec **exactement** l’une des deux formes ci‑dessous.

**Déjà dans le conteneur PHP** (répertoire du projet = racine Symfony) :

```bash
php bin/console doctrine:migrations:migrate --no-interaction
```

**Depuis la machine hôte** (sans `docker compose exec` interactif préalable) :

```bash
docker compose exec viizia-php php bin/console doctrine:migrations:migrate --no-interaction
```

(`-n` équivaut à `--no-interaction`.)

## Workflow local

```bash
# Premier démarrage
cp .env.docker.example .env.local
docker compose up -d --build
docker compose exec viizia-php composer install
docker compose exec viizia-php php bin/console doctrine:migrations:migrate --no-interaction
docker compose exec viizia-php bin/console doctrine:fixtures:load -n

# Au quotidien
docker compose up -d
docker compose logs -f viizia-php
docker compose exec viizia-php php bin/console <commande>

# Arrêt complet
docker compose down

# Reset BDD (destructif)
docker compose down -v
```

## Bonnes pratiques

- Aucun `latest` en image dépendance critique : on tag explicitement.
- Builds reproductibles : `composer.lock` versionné, `--no-dev` en build prod.
- Ne pas exposer MySQL en dehors de localhost (`127.0.0.1:8181:3306` plutôt que `8181:3306`) en environnements partagés.
- Healthchecks à ajouter sur les services critiques avant prod.
