# Docker - mensajes360-8.2

Entorno de desarrollo local con PHP 8.2 + Apache + Xdebug 3.

## Requisitos

- Docker Desktop (Windows/macOS) o Docker Engine + Compose plugin (Linux).
- IP local en la whitelist del firewall del servidor MySQL remoto.

## Primer arranque

```bash
# 1. Copiar plantillas y rellenar valores
cp .env.example .env
cp main/.env.example main/.env
cp amco/.env.example amco/.env
cp c21hogar/.env.example c21hogar/.env
cp demo/.env.example demo/.env

# 2. Editar .env (mínimo: DB_HOST, DB_USER, DB_PASSWORD)
#    En LOCAL: DB_HOST = IP pública del MySQL gestionado.
#    En PROD : DB_HOST = IP privada interna.

# 3. Construir y arrancar
docker compose up -d --build

# 4. Verificar
curl http://localhost:8080/                 # debe responder el index.html
docker compose logs -f web                   # ver logs en tiempo real
docker compose exec web php -v               # confirmar PHP 8.2
docker compose exec web php -m | head -30    # listar módulos cargados
```

## ⚠ Cuándo basta con `restart` y cuándo hace falta `down` + `up`

Resumen rápido:

| Cambias… | Comando |
|---|---|
| Código PHP de la aplicación | nada (montado en vivo) |
| `docker/php.ini` o `docker/xdebug.ini` | `docker compose restart web` |
| `.env` (raíz o sub-app) | `docker compose down && docker compose up -d` |
| `Dockerfile` o `docker-compose.yml` | `docker compose up -d --build` |

**Por qué los `.env` necesitan recrear:** `env_file` solo se lee al CREAR
el contenedor, no al hacer `restart`. Si modificas `.env` y solo reinicias,
el process env del contenedor sigue con los valores antiguos. El loader
`bootstrap/env.php` usa `Dotenv::createImmutable`, que respeta esos valores
ya inyectados, así que tus nuevas variables no se aplican hasta que
recreas el contenedor.

**Por qué los `.ini` solo necesitan `restart`:** desde Entregable A, los
ficheros `docker/php.ini` y `docker/xdebug.ini` se montan como volumen
sobre `/usr/local/etc/php/conf.d/`. Apache relee la configuración al
arrancar, así que basta con reiniciar el servicio.

## Comandos útiles

```bash
# Reiniciar tras cambiar .env o php.ini
docker compose restart web

# Ejecutar composer dentro del contenedor (desde el directorio main/)
docker compose exec web bash -lc "cd main && composer install"

# Abrir shell
docker compose exec web bash

# Ver estado del healthcheck
docker compose ps

# Parar y limpiar
docker compose down
```

## Xdebug

Por defecto Xdebug está instalado pero **inactivo** (`XDEBUG_MODE=off`).
Para depurar paso a paso:

1. Edita `.env` y pon `XDEBUG_MODE=debug`.
2. `docker compose restart web`.
3. En VS Code/PhpStorm, usa el path mapping:
   - Servidor: `/var/www/html`
   - Local: la raíz de este repo.
4. Empieza una sesión Xdebug enviando la cookie `XDEBUG_SESSION=VSCODE`
   (la mayoría de IDEs lo hacen automáticamente).

## Logs

Los logs de Apache, PHP errors y Xdebug van a `docker/logs/` en el host
(montado como volumen). Útil para `tail -f docker/logs/error.log`.

## Producción

Esta imagen está pensada para desarrollo. Para producción:

- Construye la imagen con `XDEBUG_MODE=off` y eliminando o no instalando
  Xdebug.
- En vez de `env_file: .env`, inyecta las variables desde el orquestador
  (vhost de Apache, systemd, k8s secret, etc.).
- Sube el `display_errors = Off` y `APP_DEBUG=false`.
- Considera `opcache.validate_timestamps=0` para máximo rendimiento.
