# 🐳 Guía de Despliegue con Docker

**Proyecto:** EMERGES TES - Protocolo Rápido  
**Fecha:** 2025-12-23  
**Puerto:** 8607

---

## 📋 Requisitos Previos

- **Docker** 20.10+ instalado
- **Docker Compose** 2.0+ instalado
- **Git** instalado
- **Puerto 8607** disponible

---

## 🚀 Despliegue Rápido

### Opción 1: Script de Deploy Automático (Recomendado)

```bash
# Ejecutar script de deploy con Docker
./deploy-docker.sh
```

Este script:
1. ✅ Actualiza código desde GitHub
2. ✅ Construye imagen Docker
3. ✅ Inicia contenedores
4. ✅ Verifica que todo funciona

---

### Opción 2: Comandos Manuales

#### Desarrollo

```bash
# Construir e iniciar contenedores
docker-compose up --build

# O en modo detached (background)
docker-compose up -d --build

# Ver logs
docker-compose logs -f

# Detener
docker-compose down
```

#### Producción

```bash
# Usar archivo de producción
docker-compose -f docker-compose.prod.yml up -d --build

# Ver logs
docker-compose -f docker-compose.prod.yml logs -f

# Detener
docker-compose -f docker-compose.prod.yml down
```

---

## 📁 Archivos Docker

### Dockerfile

**Ubicación:** `Dockerfile`

**Características:**
- Multi-stage build (optimizado)
- Node.js 18 Alpine (imagen ligera)
- Build de producción con Vite
- Servidor `serve` en puerto 8607
- Healthcheck configurado

**Etapas:**
1. **Dependencies:** Instala dependencias npm
2. **Build:** Construye aplicación con Vite
3. **Production:** Imagen final con solo archivos necesarios

---

### docker-compose.yml (Desarrollo)

**Ubicación:** `docker-compose.yml`

**Servicios:**
- `emerges-tes`: Aplicación principal
  - Puerto: `8607:8607`
  - Volúmenes: Código fuente montado (hot reload)
  - Red: `emerges-network`

**Uso:**
```bash
docker-compose up --build
```

---

### docker-compose.prod.yml (Producción)

**Ubicación:** `docker-compose.prod.yml`

**Características:**
- Sin volúmenes (imagen optimizada)
- Restart policy: `always`
- Healthcheck activado
- Logs configurados

**Uso:**
```bash
docker-compose -f docker-compose.prod.yml up -d --build
```

---

## 🔧 Configuración

### Variables de Entorno

Crear archivo `.env` (opcional):

```env
NODE_ENV=production
PORT=8607
```

O usar variables en `docker-compose.yml`:

```yaml
environment:
  - NODE_ENV=production
  - PORT=8607
```

---

## 📊 Comandos Útiles

### Gestión de Contenedores

```bash
# Ver contenedores corriendo
docker ps

# Ver logs en tiempo real
docker-compose logs -f emerges-tes

# Ver logs de las últimas 100 líneas
docker-compose logs --tail=100 emerges-tes

# Reiniciar contenedor
docker-compose restart emerges-tes

# Detener y eliminar contenedores
docker-compose down

# Detener y eliminar contenedores + volúmenes
docker-compose down -v

# Eliminar imágenes también
docker-compose down --rmi all
```

### Build y Rebuild

```bash
# Rebuild sin caché
docker-compose build --no-cache

# Rebuild solo un servicio
docker-compose build emerges-tes

# Ver tamaño de imágenes
docker images | grep emerges-tes
```

### Inspección

```bash
# Ver configuración del servicio
docker-compose config

# Ver procesos dentro del contenedor
docker-compose exec emerges-tes ps aux

# Entrar al contenedor (shell)
docker-compose exec emerges-tes sh

# Ver uso de recursos
docker stats emerges-tes
```

---

## 🔄 Auto-Deploy desde GitHub

### Opción 1: GitHub Actions con Docker

Actualizar `.github/workflows/deploy.yml`:

```yaml
name: Auto Deploy Docker

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: false
          tags: emerges-tes:latest
      
      - name: Deploy to server
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            cd ${{ secrets.APP_PATH }}
            ./deploy-docker.sh
```

---

### Opción 2: Webhook con Docker

Actualizar `webhook-deploy.sh`:

```bash
#!/bin/bash
cd /ruta/a/tu/app
./deploy-docker.sh
```

---

## 🐛 Solución de Problemas

### Error: "Port 8607 is already in use"

```bash
# Ver qué proceso usa el puerto
sudo lsof -i :8607
# O
sudo netstat -tlnp | grep 8607

# Detener contenedor Docker
docker-compose down

# O cambiar puerto en docker-compose.yml
ports:
  - "8608:8607"  # Puerto externo diferente
```

### Error: "Cannot connect to Docker daemon"

```bash
# Verificar que Docker está corriendo
sudo systemctl status docker

# Iniciar Docker
sudo systemctl start docker

# Añadir usuario al grupo docker (si es necesario)
sudo usermod -aG docker $USER
# Luego cerrar sesión y volver a entrar
```

### Error: "Build failed"

```bash
# Rebuild sin caché
docker-compose build --no-cache

# Ver logs detallados
docker-compose build --progress=plain

# Verificar Dockerfile
docker build -t test-image .
```

### Contenedor se detiene inmediatamente

```bash
# Ver logs del contenedor
docker-compose logs emerges-tes

# Verificar healthcheck
docker inspect emerges-tes | grep -A 10 Health

# Ejecutar comando manualmente
docker-compose run --rm emerges-tes sh
```

---

## 📈 Optimización

### Tamaño de Imagen

**Estrategias:**
- ✅ Multi-stage build (ya implementado)
- ✅ Alpine Linux (imagen base ligera)
- ✅ Solo archivos necesarios en imagen final
- ✅ .dockerignore configurado

**Verificar tamaño:**
```bash
docker images | grep emerges-tes
```

### Caché de Build

Docker usa caché automáticamente. Para forzar rebuild completo:

```bash
docker-compose build --no-cache
```

---

## 🔒 Seguridad

### Buenas Prácticas

1. ✅ No exponer credenciales en Dockerfile
2. ✅ Usar variables de entorno para secrets
3. ✅ Usar usuario no-root en contenedor (si es posible)
4. ✅ Mantener imágenes actualizadas
5. ✅ Escanear imágenes con `docker scan`

### Escanear Vulnerabilidades

```bash
docker scan emerges-tes:latest
```

---

## 📝 Checklist de Despliegue

- [ ] Docker y Docker Compose instalados
- [ ] Puerto 8607 disponible
- [ ] Archivo `.env` configurado (opcional)
- [ ] `docker-compose.yml` revisado
- [ ] Build exitoso: `docker-compose build`
- [ ] Contenedor inicia: `docker-compose up -d`
- [ ] App accesible: `http://localhost:8607`
- [ ] Logs sin errores: `docker-compose logs`
- [ ] Healthcheck OK: `docker inspect`
- [ ] Auto-deploy configurado (opcional)

---

## 🆚 Comparación: Docker vs PM2

| Característica | Docker | PM2 |
|---------------|--------|-----|
| Aislamiento | ✅ Completo | ❌ No |
| Portabilidad | ✅ Alta | ⚠️ Media |
| Gestión | ✅ docker-compose | ✅ PM2 |
| Recursos | ⚠️ Más uso | ✅ Menos uso |
| Escalabilidad | ✅ Fácil | ⚠️ Manual |
| Dependencias | ✅ Incluidas | ❌ Requiere Node |

**Recomendación:** Usar Docker para producción, PM2 para desarrollo rápido.

---

## 📞 Soporte

Si tienes problemas:
1. Revisar logs: `docker-compose logs -f`
2. Verificar configuración: `docker-compose config`
3. Rebuild sin caché: `docker-compose build --no-cache`
4. Verificar puerto: `netstat -tlnp | grep 8607`

---

**Última actualización:** 2025-12-23
