# Despliegue con Podman — cootrasaravitabotcliente

Guia para levantar el bot de WhatsApp (API + workers BullMQ + Redis) en produccion con Podman Compose.

## Requisitos

- **Podman** 4.x+ con el plugin **podman-compose** / `podman compose` (o Docker Compose compatible).
- Acceso a **MySQL/MariaDB** en el mismo servidor (o remoto) con credenciales en `.env`.
- Credenciales de **Meta WhatsApp Cloud API**.
- Tokens de bridge (`OPERATOR_BRIDGE_TOKEN`, `DRIVER_BRIDGE_TOKEN`, `CENTRAL_BRIDGE_TOKEN`) y URL de la API central.
- Puerto libre en el host (por defecto **3000**) para exponer el webhook.

En el host:

```bash
podman --version
podman compose version
```

## Arquitectura del stack

| Servicio | Rol |
|----------|-----|
| `redis` | Colas BullMQ (solo red interna; sin puerto publicado) |
| `bot` | API Express (webhook Meta, operator, driver). `RUN_EMBEDDED_WORKERS=false` |
| `worker` | Procesos BullMQ (`node dist/jobs/worker.main.js`) |

La imagen se construye con `Containerfile` (Node 20 Alpine, multi-stage). Misma imagen para `bot` y `worker`.

## Variables de entorno

1. Copia el ejemplo y edita secretos reales:

```bash
cp .env.example .env
```

2. Completa al menos:

| Variable | Notas |
|----------|--------|
| `EMPRESA_ID` | ID numerico de empresa |
| `DB_*` | Host (`host.containers.internal` si MySQL esta en el host), usuario, password, nombre; `DB_SSL_ENABLED=false` en conexion local |
| `META_*` | Phone Number ID, access token, verify token, app secret |
| `OPERATOR_BRIDGE_TOKEN` / `DRIVER_BRIDGE_TOKEN` | Tokens seguros (no uses valores de ejemplo) |
| `CENTRAL_API_BASE_URL` | URL valida (https://...) |
| `CENTRAL_BRIDGE_TOKEN` | Token hacia la API central |
| `PORT` | Puerto publicado en el host (default 3000) |

**Importante:** en Compose, `REDIS_HOST=redis`, `REDIS_PORT=6379` y `REDIS_PASSWORD=""` se fuerzan para el Redis del stack. No hace falta Redis en el host.

Los contenedores `bot` y `worker` incluyen `extra_hosts: host.containers.internal:host-gateway` para alcanzar MySQL/MariaDB del host sin exponer el puerto 3306 a Internet.

No subas `.env` al repositorio (esta en `.dockerignore` / `.gitignore`).

## Construccion

Desde la raiz del proyecto:

```bash
podman compose build
```

Equivale a construir `localhost/cootrasaravitabotcliente:latest` con `Containerfile`.

Verificacion opcional:

```bash
podman images | grep cootrasaravitabotcliente
```

## Arranque

```bash
podman compose up -d
```

Estado y logs:

```bash
podman compose ps
podman compose logs -f bot
podman compose logs -f worker
podman compose logs -f redis
```

Healthcheck del bot (desde el host):

```bash
curl -s http://127.0.0.1:3000/health
```

## Parar, iniciar y reiniciar

```bash
# Detener contenedores (conserva volumen redis-data)
podman compose stop

# Volver a iniciar
podman compose start

# Reiniciar todos los servicios
podman compose restart

# Bajar el stack (contenedores; el volumen persiste)
podman compose down

# Bajar y eliminar volumen de Redis (borra colas/persistencia AOF)
podman compose down -v
```

## Puertos y red

- **Publicado:** `${PORT:-3000}:3000` solo en el servicio `bot`.
- **Redis:** no publica puerto; solo accesible en la red `bot-net` como hostname `redis`.
- El proceso escucha en `0.0.0.0:3000` dentro del contenedor (necesario para trafico externo).
- Para webhooks de Meta en internet: proxy inverso (nginx/Caddy) o tunel con TLS hacia el puerto del host.

## Procedimiento de actualizacion

1. Obtener el codigo nuevo (`git pull` o copiar artefactos).
2. Revisar cambios en `.env.example` y actualizar `.env` si hay variables nuevas.
3. Reconstruir e recrear contenedores:

```bash
podman compose build
podman compose up -d
```

4. Verificar health y logs:

```bash
curl -s http://127.0.0.1:${PORT:-3000}/health
podman compose logs --tail=100 bot worker
```

Si solo cambio el `.env` (sin codigo):

```bash
podman compose up -d --force-recreate bot worker
```

## Guia paso a paso (produccion)

1. **Instalar Podman** y comprobar `podman compose`.
2. **Clonar** el repositorio en el servidor y entrar al directorio del proyecto.
3. **Crear `.env`** desde `.env.example` y rellenar secretos (DB, Meta, bridges, central).
4. **Comprobar conectividad** del host hacia MySQL (usuario, privilegios, `bind-address`) y que Meta pueda alcanzar tu URL publica del webhook.
5. **`podman compose build`** — espera a que termine sin errores.
6. **`podman compose up -d`** — deben quedar healthy/started `redis`, `bot` y `worker`.
7. **Probar** `GET /health` en el puerto publicado.
8. **Configurar** el webhook de Meta hacia `https://tu-dominio/...` (ruta de webhook del bot) con `META_VERIFY_TOKEN`.
9. **Monitorear** logs las primeras horas; reiniciar con `podman compose restart` si hace falta.
10. En cada release, seguir el **procedimiento de actualizacion** anterior.

## Archivos relacionados

- `Containerfile` — imagen de produccion
- `compose.yml` / `docker-compose.yml` — stack Podman/Docker
- `.dockerignore` / `.containerignore` — contexto de build
- `.env.example` — plantilla de variables

## Solucion de problemas breve

- **Bot unhealthy:** revisa logs; valida que `/health` responda y que no fallen migraciones/arrancado por env invalidas.
- **Worker no procesa jobs:** confirma que Redis esta healthy y que `REDIS_HOST=redis` en los contenedores.
- **Error de variables de entorno:** el proceso sale si falta alguna requerida por `src/config/env.ts` (incluye `CENTRAL_*`).
- **No responde desde fuera:** confirma bind `0.0.0.0`, mapeo de puertos y firewall del host.