# CXP Docker en produccion

Este despliegue esta pensado para un servidor legacy con muchos sitios en `/var/www/html`, Apache en el host y `PHP 5.6` instalado para sistemas viejos. CXP no debe usar ese PHP del host. La forma correcta es una sola imagen Docker de CXP y un stack por cliente.

## Decision tecnica

- Si, usa Docker para CXP.
- No conviene correr CXP con el PHP del host porque el host esta en `PHP 5.6`.
- No conviene publicar CXP bajo `/mbcxp` como opcion principal. La app esta mucho mas segura y estable en subdominio propio.
- Si te obligan a usar `/mbcxp`, deja eso como excepcion y usa la plantilla `deploy/templates/apache-vhost.path.conf.template` bajo tu responsabilidad.

Recomendado:

- `manuales-cxp.sistemasmb.com`
- `sally-cxp.sistemasmb.com`
- `masamadre-cxp.sistemasmb.com`

## Arquitectura

- Una sola imagen: `sistemasmb/cxp-app:<tag>`
- Un stack Docker por cliente:
  - `app`: PHP 8.2 FPM con Symfony
  - `web`: Nginx publico solo en `127.0.0.1:<puerto>`
- Apache del host hace reverse proxy al puerto local del cliente
- Una base MySQL por cliente
- Dos bases plantilla:
  - `cxpEstructura`
  - `cxpInstalacion`

## Estructura esperada en el servidor

```text
/var/www/html/
  manuales/
    mbcxp/
      .env
      docker-compose.yml
      nginx.conf
  sally/
    mbcxp/
      .env
      docker-compose.yml
      nginx.conf
```

## Flujo de produccion

### 1. Publicar imagen

Desde tu maquina o CI:

```bash
export DOCKER_REGISTRY=docker.io/sistemasmb
bash deploy/scripts/build-image.sh push v1.0.0
```

En produccion:

```bash
docker pull docker.io/sistemasmb/cxp-app:v1.0.0
```

### 2. Generar bases plantilla

```bash
bash deploy/scripts/generate-templates.sh 132.226.40.48 3310 christian
```

Esto genera:

- `sql/cxpEstructura.sql`
- `sql/cxpInstalacion.sql`

`cxpInstalacion.sql` deja solo catalogos y un bootstrap limpio con usuario `mb`.

### 3. Crear un cliente

```bash
export CXP_IMAGE_DEFAULT=docker.io/sistemasmb/cxp-app:v1.0.0
sudo bash deploy/scripts/new-client.sh manuales 8081 manuales-cxp.sistemasmb.com
```

El script hace esto:

- crea base `cxp_manuales`
- crea usuario MySQL `cxp_manuales`
- importa `sql/cxpInstalacion.sql`
- crea `/var/www/html/manuales/mbcxp`
- crea `.env`, `docker-compose.yml` y `nginx.conf`
- levanta contenedores
- crea vhost Apache y recarga servicio

### 4. Verificar

```bash
curl http://127.0.0.1:8081/health
curl -H "Host: manuales-cxp.sistemasmb.com" http://127.0.0.1/
cd /var/www/html/manuales/mbcxp && docker compose logs --tail=100
```

### 5. Actualizar clientes

```bash
docker pull docker.io/sistemasmb/cxp-app:v1.0.1
sudo bash deploy/scripts/update-all.sh docker.io/sistemasmb/cxp-app:v1.0.1
```

## Riesgos concretos

- Si publicas bajo `/mbcxp`, el riesgo real es romper rutas, assets o redirects del framework.
- Si reutilizas una BD cliente entre demos, mezclas datos y pierdes aislamiento.
- Si `cxpInstalacion.sql` se genera desde un cliente base incorrecto, arrastras impuestos o catalogos equivocados a todos los clientes nuevos.
- Si actualizas `latest` sin tag versionado, te quedas sin rollback limpio.

## Archivos clave

- `Dockerfile.prod`
- `deploy/scripts/build-image.sh`
- `deploy/scripts/generate-templates.sh`
- `deploy/scripts/new-client.sh`
- `deploy/scripts/update-all.sh`
- `deploy/templates/docker-compose.client.yml`
- `deploy/templates/apache-vhost.conf.template`
- `deploy/templates/apache-vhost.path.conf.template`

## Checklist hoy

- Docker instalado en produccion
- `docker pull` de la imagen versionada
- `cxpEstructura.sql` generado
- `cxpInstalacion.sql` generado y revisado
- DNS del cliente creado
- cliente creado con `new-client.sh`
- `/health` respondiendo `200`
- login con usuario `mb`
- backup inicial tomado
- tag anterior guardado para rollback
