feat: optimizar .dockerignore y añadir documentación Docker
- Actualizar .dockerignore para excluir archivos innecesarios - Excluir documentación, backups, scripts y configuraciones no Docker - Reducir tamaño de imagen Docker - Mantener solo archivos esenciales para build y ejecución
This commit is contained in:
parent
0d99807b24
commit
c43e035593
398
DEPLOYMENT_DOCKER.md
Normal file
398
DEPLOYMENT_DOCKER.md
Normal file
|
|
@ -0,0 +1,398 @@
|
||||||
|
# 🐳 Guía de Despliegue con Docker
|
||||||
|
|
||||||
|
**Proyecto:** EMERGES TES - Protocolo Rápido
|
||||||
|
**Fecha:** 2024-12-19
|
||||||
|
**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:** 2024-12-19
|
||||||
Loading…
Reference in a new issue