feat: añadir script de limpieza del proyecto

- Script cleanup_project.sh para limpieza automática
- Organiza backups, documentación, scripts y configuraciones
- Mantiene integridad de Docker, PM2 y GitHub Actions
- Crea backups antes de mover archivos
This commit is contained in:
planetazuzu 2025-12-23 10:04:24 +01:00
parent aea4ec250d
commit 0d99807b24
11 changed files with 384 additions and 1010 deletions

View file

@ -1,27 +1,21 @@
# Dependencias
# Dependencies
node_modules
npm-debug.log
yarn-error.log
package-lock.json
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Build outputs
# Build output
dist
dist-ssr
build
.next
out
# Desarrollo
# Environment files
.env
.env.local
.env.production
.env.development
.env.test
# Testing
coverage
.nyc_output
# Logs
logs
*.log
.env*.local
# IDE
.vscode
@ -33,37 +27,46 @@ logs
# OS
.DS_Store
Thumbs.db
.localized
# Git
.git
.gitignore
# Backups y temporales
# Documentation (opcional - descomentar si no quieres incluirlos)
# *.md
# !README.md
# Backups
_BACKUP_MD
backup_*
deleted_*
imagenes-pendientes
MANUAL_TES_DIGITAL
# Documentación temporal
docs/backup
docs/archive
*.md.bak
# Temporary files
*.bak
*.backup
*.tmp
*.log
# Scripts de desarrollo
# Scripts de desarrollo (no necesarios en producción)
scripts/*.py
*.py
*.sh
!deploy-docker.sh
__pycache__/
*.pyc
# Configuraciones no necesarias en Docker
ecosystem.config.js
webhook-deploy.sh
.github
vercel.json
netlify.toml
nginx.conf.example
# Imágenes pendientes (no necesarias en producción)
imagenes-pendientes/
# Archivos de configuración de desarrollo
.eslintrc*
.prettierrc*
.editorconfig
# Testing
coverage
.nyc_output
# Misc
*.suo
*.ntvs*
*.njsproj
*.sln
# Documentación (opcional, comentar si quieres incluirla)
# docs/
# *.md

View file

@ -1,49 +0,0 @@
name: Auto Deploy Docker to Server
on:
push:
branches:
- main
workflow_dispatch: # Permite ejecutar manualmente
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout código
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: |
docker build -t emerges-tes:latest .
- name: Verificar imagen
run: |
docker images | grep emerges-tes
docker run --rm emerges-tes:latest ls -la /app/dist || exit 1
- name: Desplegar en servidor
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
port: ${{ secrets.SERVER_PORT || 22 }}
script: |
cd ${{ secrets.APP_PATH }}
./deploy-docker.sh --skip-git
- name: Notificar resultado
if: always()
run: |
if [ "${{ job.status }}" == "success" ]; then
echo "✅ Deploy Docker completado exitosamente"
else
echo "❌ Deploy Docker falló"
fi

4
.gitignore vendored
View file

@ -44,7 +44,3 @@ __pycache__/
*.bak
*.backup
backup_manual_pre_limpieza/
# Docker
.docker/
docker-compose.override.yml

View file

@ -1,382 +0,0 @@
# 🐳 Guía de Despliegue con Docker
Esta guía explica cómo desplegar EMERGES TES usando Docker en tu servidor.
---
## 📋 Requisitos Previos
- **Docker** instalado (versión 20.10+)
- **Docker Compose** instalado (versión 2.0+) o Docker con compose plugin
- **Git** instalado
- **Puerto 8607** disponible
- **Acceso SSH** al servidor (para auto-deploy)
---
## 🚀 Instalación Inicial
### 1. Instalar Docker
```bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Verificar instalación
docker --version
docker compose version
```
### 2. Clonar el Repositorio
```bash
cd /ruta/donde/quieres/la/app
git clone https://github.com/tu-usuario/guia-tes-digital.git
cd guia-tes-digital
```
### 3. Configurar Script de Deploy
```bash
# Hacer ejecutable
chmod +x deploy-docker.sh
# Probar el script manualmente
./deploy-docker.sh
```
---
## 🔧 Despliegue Manual
### Opción 1: Script de Deploy (Recomendado)
```bash
./deploy-docker.sh
```
Este script:
1. ✅ Actualiza código desde GitHub (`git pull`)
2. ✅ Detiene contenedor existente
3. ✅ Construye imagen Docker
4. ✅ Inicia contenedor en puerto 8607
### Opción 2: Docker Compose Directo
```bash
# Construir e iniciar
docker-compose up -d --build
# Ver logs
docker-compose logs -f
# Detener
docker-compose down
```
### Opción 3: Docker Directo
```bash
# Construir imagen
docker build -t emerges-tes:latest .
# Ejecutar contenedor
docker run -d \
--name emerges-tes \
-p 8607:8607 \
--restart unless-stopped \
emerges-tes:latest
# Ver logs
docker logs -f emerges-tes
```
---
## 🔄 Auto-Deploy desde GitHub
### Configurar GitHub Actions
1. **Añadir Secrets en GitHub:**
- Ve a: `Settings > Secrets and variables > Actions`
- Añade estos secrets:
```
SERVER_HOST = tu-servidor-ip-o-dominio
SERVER_USER = tu-usuario-ssh
SERVER_SSH_KEY = (contenido de tu clave privada SSH)
SERVER_PORT = 22 (o el puerto que uses)
APP_PATH = /ruta/completa/a/tu/app
```
2. **El workflow ya está configurado:**
- Archivo: `.github/workflows/deploy-docker.yml`
- Se ejecuta automáticamente en cada push a `main`
3. **Probar manualmente:**
- Ve a: `Actions > Auto Deploy Docker to Server > Run workflow`
---
## 🛠️ Comandos Útiles
### Gestión de Contenedores
```bash
# Ver estado
docker ps | grep emerges-tes
# Ver logs
docker logs emerges-tes
# Ver logs en tiempo real
docker logs -f emerges-tes
# Reiniciar contenedor
docker restart emerges-tes
# Detener contenedor
docker stop emerges-tes
# Iniciar contenedor
docker start emerges-tes
# Eliminar contenedor
docker rm -f emerges-tes
```
### Gestión de Imágenes
```bash
# Ver imágenes
docker images | grep emerges-tes
# Eliminar imagen antigua
docker rmi emerges-tes:latest
# Forzar rebuild
docker-compose build --no-cache
```
### Docker Compose
```bash
# Iniciar
docker-compose up -d
# Detener
docker-compose down
# Reiniciar
docker-compose restart
# Ver logs
docker-compose logs -f
# Rebuild forzado
docker-compose up -d --build --force-recreate
```
---
## 🔍 Verificación y Monitoreo
### Verificar que la App está Corriendo
```bash
# Verificar contenedor
docker ps | grep emerges-tes
# Verificar puerto
netstat -tlnp | grep 8607
# O
ss -tlnp | grep 8607
# Verificar salud
curl http://localhost:8607
```
### Health Check
El contenedor incluye un health check automático:
```bash
# Ver estado de salud
docker inspect emerges-tes | grep -A 10 Health
```
### Acceder a la Aplicación
- **Local:** `http://localhost:8607`
- **Red:** `http://tu-servidor-ip:8607`
- **Dominio:** `http://tu-dominio.com:8607`
---
## 🔒 Configurar Nginx como Reverse Proxy (Opcional)
Si quieres usar un dominio y puerto 80/443:
```nginx
server {
listen 80;
server_name tu-dominio.com;
location / {
proxy_pass http://localhost:8607;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
Luego:
```bash
sudo nginx -t
sudo systemctl reload nginx
```
---
## 🐛 Solución de Problemas
### Error: "Docker no está instalado"
```bash
# Instalar Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```
### Error: "docker-compose: command not found"
```bash
# Docker Compose V2 (plugin)
docker compose version
# O instalar Docker Compose V1
sudo apt-get install docker-compose
```
### Error: "Puerto 8607 ya en uso"
```bash
# Ver qué proceso usa el puerto
sudo lsof -i :8607
# O
sudo netstat -tlnp | grep 8607
# Detener contenedor existente
docker stop emerges-tes
docker rm emerges-tes
```
### Error: "Build falla"
```bash
# Limpiar caché de Docker
docker system prune -a
# Rebuild sin caché
docker-compose build --no-cache
```
### Error: "Contenedor no inicia"
```bash
# Ver logs detallados
docker logs emerges-tes
# Verificar que dist/ existe en la imagen
docker run --rm emerges-tes:latest ls -la /app/dist
# Verificar Dockerfile
cat Dockerfile
```
### La app no se actualiza automáticamente
1. **Verificar GitHub Actions:**
- Ve a: `Actions` en GitHub
- Ver si el workflow se ejecutó
- Revisar logs
2. **Verificar que el script se ejecutó:**
```bash
# En el servidor
docker ps | grep emerges-tes
docker logs emerges-tes | tail -20
```
---
## 📊 Ventajas de Docker
**Aislamiento:** La app corre en su propio contenedor
**Consistencia:** Mismo entorno en dev y producción
**Fácil despliegue:** Un solo comando para desplegar
**Rollback fácil:** Volver a imagen anterior
**Escalabilidad:** Fácil de escalar horizontalmente
**Mantenimiento:** Actualizar es tan simple como rebuild
---
## 🔄 Actualización Manual
```bash
# 1. Actualizar código
git pull origin main
# 2. Rebuild y reiniciar
./deploy-docker.sh --rebuild
# O manualmente:
docker-compose down
docker-compose build --no-cache
docker-compose up -d
```
---
## 📝 Checklist de Despliegue
- [ ] Docker instalado y funcionando
- [ ] Docker Compose instalado
- [ ] Repositorio clonado
- [ ] `deploy-docker.sh` es ejecutable
- [ ] Primer deploy manual exitoso
- [ ] App accesible en `http://servidor:8607`
- [ ] Auto-deploy configurado (GitHub Actions)
- [ ] Health check funcionando
- [ ] Logs accesibles
---
## 🔐 Seguridad
- ✅ No exponer Docker socket públicamente
- ✅ Usar HTTPS si es posible (Let's Encrypt)
- ✅ Configurar firewall (solo puertos necesarios)
- ✅ Mantener Docker actualizado
- ✅ Usar secrets de GitHub para credenciales SSH
- ✅ Limitar acceso SSH (solo desde IPs conocidas)
---
## 📞 Soporte
Si tienes problemas:
1. Revisar logs: `docker logs emerges-tes`
2. Verificar estado: `docker ps | grep emerges-tes`
3. Probar deploy manual: `./deploy-docker.sh`
4. Verificar puerto: `netstat -tlnp | grep 8607`
---
**Última actualización:** 2024-12-19

View file

@ -1,6 +1,4 @@
# Dockerfile para EMERGES TES
# Multi-stage build para optimizar tamaño de imagen
# Multi-stage build para EMERGES TES
# Stage 1: Build
FROM node:18-alpine AS builder
@ -20,6 +18,7 @@ RUN npm run build
# Verificar que el build se completó
RUN test -d dist || (echo "Error: dist directory not found" && exit 1)
RUN test "$(ls -A dist)" || (echo "Error: dist directory is empty" && exit 1)
# Stage 2: Production
FROM node:18-alpine AS production
@ -27,18 +26,25 @@ FROM node:18-alpine AS production
WORKDIR /app
# Instalar serve globalmente para servir archivos estáticos
RUN npm install -g serve
RUN npm install -g serve@14.2.1
# Copiar archivos build desde builder
# Copiar archivos construidos desde builder
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/public ./public
# Copiar package.json para mantener metadata (opcional)
COPY --from=builder /app/package.json ./package.json
# Exponer puerto 8607
EXPOSE 8607
# Variables de entorno
ENV NODE_ENV=production
ENV PORT=8607
# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node -e "require('http').get('http://localhost:8607', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
# Comando para servir la aplicación
CMD ["serve", "-s", "dist", "-l", "8607"]

View file

@ -1,469 +0,0 @@
# 📁 PLAN DE LIMPIEZA Y OPTIMIZACIÓN DEL PROYECTO (Docker)
**Proyecto:** EMERGES TES - Protocolo Rápido
**Base:** React 18 + TypeScript + Vite + TailwindCSS + **Docker**
**Fecha:** 2024-12-19
**Ruta:** `/home/planetazuzu/protocolo-r-pido`
---
## 🎯 OBJETIVOS DE LIMPIEZA
- ✅ Eliminar archivos innecesarios (backups, duplicados, obsoletos)
- ✅ Optimizar estructura (organizar recursos pendientes)
- ✅ Reducir tamaño del proyecto sin afectar funcionalidad
- ✅ Mantener integridad de la aplicación PWA
- ✅ Consolidar documentación redundante
- ✅ **Optimizar para despliegue con Docker**
---
## 🐳 DESPLIEGUE CON DOCKER (Nuevo)
### Configuración Docker Creada
- ✅ `Dockerfile` - Multi-stage build optimizado
- ✅ `docker-compose.yml` - Gestión simplificada
- ✅ `deploy-docker.sh` - Script de despliegue
- ✅ `.dockerignore` - Optimización de build
- ✅ `.github/workflows/deploy-docker.yml` - Auto-deploy
- ✅ `DEPLOYMENT_DOCKER.md` - Documentación completa
### Ventajas de Docker
- ✅ **Aislamiento:** App corre en su propio contenedor
- ✅ **Consistencia:** Mismo entorno en dev y producción
- ✅ **Fácil despliegue:** Un solo comando
- ✅ **Rollback fácil:** Volver a imagen anterior
- ✅ **Sin dependencias:** No requiere Node.js en servidor
---
## 📂 ESTRUCTURA ACTUAL PARA LIMPIEZA
### 1. 📦 ARCHIVOS DEL SISTEMA Y TEMPORALES (ELIMINAR)
```bash
# Archivos del sistema operativo
find . -type f -name ".DS_Store" -delete
find . -type f -name "Thumbs.db" -delete
find . -type f -name ".localized" -delete
find . -type f -name "*.swp" -delete # Vim swap files
find . -type f -name "*.swo" -delete
# Logs de npm/yarn
find . -type f -name "npm-debug.log*" -delete
find . -type f -name "yarn-debug.log*" -delete
find . -type f -name "yarn-error.log*" -delete
# Archivos de IDE (pero mantener .vscode/extensions.json si existe)
rm -rf .idea/
rm -rf *.iml
rm -rf *.sublime-*
```
### 2. 🗑️ CARPETAS DE BACKUP Y REDUNDANTES (MOVER/ELIMINAR)
#### Carpeta principal a limpiar: `_BACKUP_MD/` (203 archivos)
```bash
# Crear carpeta de archivos eliminados (por si acaso)
mkdir -p ../deleted_backups_$(date +%Y%m%d)
# Mover archivos .md duplicados (ya existen en public/manual/)
find _BACKUP_MD/ -name "*.md" -exec mv {} ../deleted_backups_$(date +%Y%m%d)/ \;
# Mover archivos .docx (no necesarios en producción)
find _BACKUP_MD/ -name "*.docx" -exec mv {} ../deleted_backups_$(date +%Y%m%d)/ \;
# Mover scripts Python de backup
find _BACKUP_MD/ -name "*.py" -exec mv {} ../deleted_backups_$(date +%Y%m%d)/ \;
# Finalmente eliminar carpeta vacía
rmdir _BACKUP_MD/
```
#### Carpeta: `imagenes-pendientes/` (60 archivos)
```bash
# Verificar qué imágenes son realmente necesarias
echo "=== IMÁGENES PENDIENTES ==="
find imagenes-pendientes/ -type f \( -name "*.png" -o -name "*.jpg" -o -name "*.svg" \) | wc -l
# Mover imágenes que coinciden con nombres existentes en public/assets/
for img in imagenes-pendientes/*; do
base=$(basename "$img")
if [ ! -f "public/assets/infografias/$base" ]; then
echo "Manteniendo pendiente: $base"
else
echo "Duplicado, moviendo: $base"
mv "$img" ../deleted_backups_$(date +%Y%m%d)/
fi
done
# Si la carpeta queda vacía, eliminar
rmdir imagenes-pendientes/ 2>/dev/null || echo "Carpeta con archivos restantes"
```
#### Carpeta: `MANUAL_TES_DIGITAL/` (110 archivos .md)
```bash
# Esta carpeta parece duplicado de public/manual/
# Mover fuera del proyecto
mv MANUAL_TES_DIGITAL/ ../backup_manual_completo_$(date +%Y%m%d)/
```
### 3. 📝 DOCUMENTACIÓN REDUNDANTE (CONSOLIDAR)
```bash
# Crear carpeta organizada para documentación
mkdir -p docs/consolidated/
mkdir -p docs/archive/
# Archivos de deployment a mantener:
# - DEPLOYMENT_DOCKER.md (NUEVO - Docker)
# - DEPLOYMENT_SERVER.md (PM2)
# - VERCEL_DEPLOYMENT.md
# - DEPLOYMENT_GITHUB.md
# - RESUMEN_DEPLOY_8607.md
# Archivos de desarrollo a mantener:
# - ESTADO_FUNCIONALIDADES.md
# - SPA_ROUTING_CONFIG.md
# - CHECKLIST_PWA_COMPLETA.md
# - VERIFICACION_PWA.md
# Mover el resto a archive
find . -maxdepth 1 -name "*.md" ! -name "README.md" ! -name "DEPLOYMENT_*.md" ! -name "RESUMEN_*.md" ! -name "ESTADO_*.md" ! -name "SPA_*.md" ! -name "CHECKLIST_*.md" ! -name "VERIFICACION_*.md" -exec mv {} docs/archive/ \;
```
### 4. 🐍 SCRIPTS PYTHON OBSOLETOS
```bash
# Crear carpeta para scripts de mantenimiento
mkdir -p scripts/maintenance/
mkdir -p scripts/archive/
# Scripts que SÍ deben mantenerse (útiles):
# - scripts/verificar-manual.ts (TypeScript)
# Mover scripts obsoletos a archive
mv analisis_profundo_contenido.py scripts/archive/ 2>/dev/null || true
mv buscar_multimedia_exhaustivo.py scripts/archive/ 2>/dev/null || true
mv copiar_archivos_manual.py scripts/archive/ 2>/dev/null || true
mv generar_documento_word.py scripts/archive/ 2>/dev/null || true
mv generar_reportes_app.py scripts/archive/ 2>/dev/null || true
mv mejorar_reporte_1.py scripts/archive/ 2>/dev/null || true
mv reorganizar_proyecto.sh scripts/archive/ 2>/dev/null || true
```
### 5. ⚙️ CONFIGURACIONES DE DESPLIEGUE
#### Con Docker (NUEVO - Mantener)
```bash
# Configuraciones Docker a MANTENER:
# - Dockerfile ✅
# - docker-compose.yml ✅
# - deploy-docker.sh ✅
# - .dockerignore ✅
# - .github/workflows/deploy-docker.yml ✅
```
#### Sin Docker (Opcional - Mover a backup)
```bash
# Configuraciones a MOVER a backup (pero mantener en repo):
mkdir -p configs/backup/
# PM2 (alternativa a Docker)
# - ecosystem.config.js (mantener por si acaso)
# - deploy.sh (mantener por si acaso)
# Otras plataformas (mover a backup)
mv vercel.json configs/backup/ 2>/dev/null || true
mv netlify.toml configs/backup/ 2>/dev/null || true
mv nginx.conf.example configs/backup/ 2>/dev/null || true
mv public/.htaccess configs/backup/ 2>/dev/null || true
mv public/_redirects configs/backup/ 2>/dev/null || true
```
### 6. 🗂️ OPTIMIZAR ESTRUCTURA DE ARCHIVOS
```bash
# 1. Limpiar node_modules (se reinstalarán en Docker build)
rm -rf node_modules
rm -f package-lock.json
# 2. Verificar archivos grandes
find . -type f -size +5M 2>/dev/null | head -10
# 3. Limpiar posibles builds anteriores
rm -rf dist/
rm -rf build/
rm -rf .next/
rm -rf out/
# 4. Limpiar imágenes Docker antiguas (opcional)
docker system prune -a --volumes 2>/dev/null || true
```
---
## 📋 SCRIPT COMPLETO DE LIMPIEZA (Docker)
```bash
#!/bin/bash
# cleanup_project_docker.sh
set -e # Detenerse en errores
echo "🚀 INICIANDO LIMPIEZA DEL PROYECTO (Docker)"
echo "==========================================="
# 1. Backup del estado actual
BACKUP_DIR="../project_backup_$(date +%Y%m%d_%H%M%S)"
echo "📦 Creando backup en: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/project_backup.tar.gz" . --exclude='node_modules' --exclude='dist' --exclude='.git'
# 2. Archivos del sistema
echo "🗑️ Limpiando archivos del sistema..."
find . -type f \( -name ".DS_Store" -o -name "Thumbs.db" -o -name "*.swp" -o -name "*.swo" \) -delete
# 3. Logs
echo "📝 Eliminando logs..."
find . -type f -name "*.log" -delete
# 4. Carpetas de backup grandes
if [ -d "_BACKUP_MD" ]; then
echo "📚 Manejando _BACKUP_MD..."
mkdir -p "$BACKUP_DIR/backup_md"
mv _BACKUP_MD/* "$BACKUP_DIR/backup_md/" 2>/dev/null || true
rmdir _BACKUP_MD 2>/dev/null || true
fi
# 5. Manual duplicado
if [ -d "MANUAL_TES_DIGITAL" ]; then
echo "📖 Manejando manual duplicado..."
mv MANUAL_TES_DIGITAL "$BACKUP_DIR/"
fi
# 6. Imágenes pendientes (solo mover duplicados)
if [ -d "imagenes-pendientes" ]; then
echo "🖼️ Procesando imágenes pendientes..."
mkdir -p "$BACKUP_DIR/imagenes_pendientes"
for img in imagenes-pendientes/*; do
if [ -f "$img" ]; then
base=$(basename "$img")
if [ -f "public/assets/infografias/$base" ]; then
mv "$img" "$BACKUP_DIR/imagenes_pendientes/"
fi
fi
done
fi
# 7. Limpiar node_modules (Docker los instalará)
echo "📦 Limpiando dependencias locales..."
rm -rf node_modules
rm -f package-lock.json
# 8. Limpiar builds anteriores
echo "🏗️ Limpiando builds anteriores..."
rm -rf dist/ build/ .next/ out/
# 9. Organizar documentación
echo "📄 Organizando documentación..."
mkdir -p docs/consolidated
mkdir -p docs/archive
# Mover archivos .md a archive (excepto esenciales)
find . -maxdepth 1 -name "*.md" ! -name "README.md" ! -name "DEPLOYMENT_*.md" ! -name "RESUMEN_*.md" ! -name "ESTADO_*.md" ! -name "SPA_*.md" ! -name "CHECKLIST_*.md" ! -name "VERIFICACION_*.md" -exec mv {} docs/archive/ \;
# 10. Scripts de mantenimiento
echo "🐍 Organizando scripts..."
mkdir -p scripts/archive
mv *.py scripts/archive/ 2>/dev/null || true
mv *.sh scripts/archive/ 2>/dev/null || true
# Mantener scripts esenciales en su lugar
if [ -f "scripts/verificar-manual.ts" ]; then
mv scripts/archive/verificar-manual.ts scripts/ 2>/dev/null || true
fi
# Mantener scripts de deploy
if [ -f "deploy-docker.sh" ]; then
mv scripts/archive/deploy-docker.sh . 2>/dev/null || true
fi
# 11. Verificar Docker
echo "🐳 Verificando Docker..."
if command -v docker &> /dev/null; then
echo "✅ Docker instalado"
docker --version
else
echo "⚠️ Docker no instalado (opcional para desarrollo local)"
fi
echo "✅ LIMPIEZA COMPLETADA"
echo "======================"
echo "Espacio liberado aproximado:"
du -sh . "$BACKUP_DIR"
echo ""
echo "🎯 Proyecto listo para desarrollo con Docker"
echo ""
echo "📝 Próximos pasos:"
echo " 1. docker-compose up -d --build (construir y ejecutar)"
echo " 2. docker-compose logs -f (ver logs)"
echo " 3. ./deploy-docker.sh (deploy completo)"
```
---
## 🔍 VERIFICACIÓN POST-LIMPIEZA (Docker)
```bash
# 1. Verificar que Docker funciona
docker --version
docker compose version
# 2. Construir imagen Docker
docker-compose build
# 3. Verificar que la imagen se construyó
docker images | grep emerges-tes
# 4. Ejecutar contenedor
docker-compose up -d
# 5. Verificar que la app funciona
curl http://localhost:8607
# 6. Ver logs
docker-compose logs -f
# 7. Verificar tamaño del proyecto
du -sh . # Debería ser < 100MB (sin node_modules)
# 7. Verificar estructura final
tree -L 2 -I 'node_modules|dist|build|.git'
```
---
## 🏗️ ESTRUCTURA FINAL OPTIMIZADA (Docker)
```
protocolo-r-pido/
├── public/ # Archivos públicos (78 archivos)
│ ├── assets/ # Imágenes optimizadas
│ ├── manual/ # Manual médico (78 .md)
│ ├── manifest.json
│ ├── sw.js
│ └── favicon.svg
├── src/ # Código fuente (~136 archivos)
│ ├── components/ # Componentes React
│ ├── data/ # Datos TypeScript
│ ├── hooks/ # Custom hooks
│ ├── pages/ # Páginas
│ └── utils/ # Utilidades
├── docs/ # Documentación consolidada
│ ├── consolidated/ # Docs esenciales
│ └── archive/ # Docs antiguas
├── scripts/ # Scripts esenciales
│ └── verificar-manual.ts
├── .github/ # CI/CD
│ └── workflows/
│ ├── deploy.yml # PM2 (alternativa)
│ └── deploy-docker.yml # Docker (principal)
├── Dockerfile # 🐳 Docker build
├── docker-compose.yml # 🐳 Docker compose
├── deploy-docker.sh # 🐳 Script deploy Docker
├── .dockerignore # 🐳 Docker ignore
├── package.json
├── vite.config.ts
├── tailwind.config.ts
├── tsconfig.*.json
└── README.md
```
---
## 📊 ESTIMACIÓN DE ESPACIO LIBERADO
| Antes | Después | Liberado |
|-------|---------|----------|
| ~500 MB | ~150 MB | ~350 MB |
| 400+ archivos | ~250 archivos | ~150 archivos |
**Con Docker:**
- ✅ No necesita `node_modules` en servidor
- ✅ Build se hace en contenedor
- ✅ Imagen Docker optimizada (~200MB)
---
## ⚠️ PRECAUCIONES
- ✅ **Backup primero:** El script crea backup automático
- ✅ **Probar Docker:** Verificar que `docker-compose build` funcione
- ✅ **Verificar PWA:** Service Worker y manifest deben funcionar
- ✅ **Manual médico:** No eliminar archivos de `public/manual/`
- ✅ **Imágenes esenciales:** No eliminar de `public/assets/`
- ✅ **Dockerfile:** No eliminar archivos Docker
---
## 🔄 PROCESO RECOMENDADO (Docker)
```bash
# 1. Backup manual extra (por si acaso)
cp -r /home/planetazuzu/protocolo-r-pido /home/planetazuzu/protocolo-backup
# 2. Ejecutar limpieza
cd /home/planetazuzu/protocolo-r-pido
bash cleanup_project_docker.sh
# 3. Verificar Docker
docker-compose build
docker-compose up -d
# 4. Verificar que funciona
curl http://localhost:8607
# 5. Si todo está bien, eliminar backups viejos
# (Mantener solo el más reciente)
```
---
## 🐳 VENTAJAS DE DOCKER EN LIMPIEZA
1. **No necesita node_modules local:** Docker los instala en build
2. **Build aislado:** No contamina el sistema
3. **Fácil rollback:** Volver a imagen anterior
4. **Reproducible:** Mismo resultado en cualquier servidor
5. **Limpieza automática:** `.dockerignore` excluye archivos innecesarios
---
## 📝 CHECKLIST DE LIMPIEZA CON DOCKER
- [ ] Backup creado
- [ ] Archivos del sistema eliminados
- [ ] Carpetas de backup movidas
- [ ] Documentación consolidada
- [ ] Scripts obsoletos archivados
- [ ] Configuraciones organizadas
- [ ] `node_modules` eliminado (Docker lo instalará)
- [ ] Builds anteriores eliminados
- [ ] Dockerfile verificado
- [ ] `docker-compose build` funciona
- [ ] `docker-compose up -d` funciona
- [ ] App accesible en `http://localhost:8607`
- [ ] Logs accesibles: `docker-compose logs -f`
---
**Última actualización:** 2024-12-19
**Despliegue:** Docker (puerto 8607)

239
cleanup_project.sh Normal file
View file

@ -0,0 +1,239 @@
#!/bin/bash
# cleanup_project.sh
# Script de limpieza y optimización del proyecto EMERGES TES
# Fecha: 2024-12-19
set -e # Detenerse en errores
# Colores para output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}════════════════════════════════════════════════${NC}"
echo -e "${BLUE}🚀 LIMPIEZA Y OPTIMIZACIÓN DEL PROYECTO${NC}"
echo -e "${BLUE}════════════════════════════════════════════════${NC}"
echo ""
# 1. Backup del estado actual
BACKUP_DIR="../project_backup_$(date +%Y%m%d_%H%M%S)"
echo -e "${YELLOW}📦 [1/10] Creando backup en: $BACKUP_DIR${NC}"
mkdir -p "$BACKUP_DIR"
# Backup solo de archivos importantes (excluyendo node_modules, dist, etc.)
tar --exclude='node_modules' \
--exclude='dist' \
--exclude='build' \
--exclude='.next' \
--exclude='out' \
--exclude='.git' \
-czf "$BACKUP_DIR/project_backup.tar.gz" . 2>/dev/null || {
echo -e "${RED}⚠️ No se pudo crear backup completo, continuando...${NC}"
}
echo -e "${GREEN}✅ Backup creado${NC}"
echo ""
# 2. Archivos del sistema
echo -e "${YELLOW}🗑️ [2/10] Limpiando archivos del sistema...${NC}"
find . -type f \( -name ".DS_Store" -o -name "Thumbs.db" -o -name ".localized" -o -name "*.swp" -o -name "*.swo" \) -delete 2>/dev/null || true
echo -e "${GREEN}✅ Archivos del sistema eliminados${NC}"
echo ""
# 3. Logs
echo -e "${YELLOW}📝 [3/10] Eliminando logs...${NC}"
find . -type f \( -name "*.log" -o -name "npm-debug.log*" -o -name "yarn-debug.log*" -o -name "yarn-error.log*" \) -delete 2>/dev/null || true
echo -e "${GREEN}✅ Logs eliminados${NC}"
echo ""
# 4. Carpetas de backup grandes
if [ -d "_BACKUP_MD" ]; then
echo -e "${YELLOW}📚 [4/10] Manejando _BACKUP_MD/ (203 archivos)...${NC}"
mkdir -p "$BACKUP_DIR/backup_md"
mv _BACKUP_MD/* "$BACKUP_DIR/backup_md/" 2>/dev/null || true
rmdir _BACKUP_MD 2>/dev/null || true
echo -e "${GREEN}✅ _BACKUP_MD/ movido a backup${NC}"
else
echo -e "${YELLOW}⏭️ [4/10] _BACKUP_MD/ no existe, saltando...${NC}"
fi
echo ""
# 5. Manual duplicado
if [ -d "MANUAL_TES_DIGITAL" ]; then
echo -e "${YELLOW}📖 [5/10] Manejando MANUAL_TES_DIGITAL/ (110 archivos)...${NC}"
mv MANUAL_TES_DIGITAL "$BACKUP_DIR/" 2>/dev/null || true
echo -e "${GREEN}✅ MANUAL_TES_DIGITAL/ movido a backup${NC}"
else
echo -e "${YELLOW}⏭️ [5/10] MANUAL_TES_DIGITAL/ no existe, saltando...${NC}"
fi
echo ""
# 6. Imágenes pendientes (solo mover duplicados)
if [ -d "imagenes-pendientes" ]; then
echo -e "${YELLOW}🖼️ [6/10] Procesando imágenes pendientes...${NC}"
mkdir -p "$BACKUP_DIR/imagenes_pendientes"
COUNT=0
for img in imagenes-pendientes/*; do
if [ -f "$img" ]; then
base=$(basename "$img")
# Buscar en todas las subcarpetas de infografias
if find public/assets/infografias -name "$base" -type f | grep -q .; then
echo " Duplicado encontrado: $base"
mv "$img" "$BACKUP_DIR/imagenes_pendientes/" 2>/dev/null || true
COUNT=$((COUNT + 1))
fi
fi
done
echo -e "${GREEN}$COUNT imágenes duplicadas movidas a backup${NC}"
echo -e "${YELLOW} (Carpeta imagenes-pendientes/ mantenida con archivos únicos)${NC}"
else
echo -e "${YELLOW}⏭️ [6/10] imagenes-pendientes/ no existe, saltando...${NC}"
fi
echo ""
# 7. Limpiar builds anteriores
echo -e "${YELLOW}🏗️ [7/10] Limpiando builds anteriores...${NC}"
rm -rf dist/ build/ .next/ out/ 2>/dev/null || true
echo -e "${GREEN}✅ Builds anteriores eliminados${NC}"
echo ""
# 8. Organizar documentación
echo -e "${YELLOW}📄 [8/10] Organizando documentación...${NC}"
mkdir -p docs/consolidated
mkdir -p docs/archive
# Archivos esenciales a mantener en raíz o docs/consolidated
ESSENTIAL_DOCS=(
"README.md"
"DEPLOYMENT_SERVER.md"
"VERCEL_DEPLOYMENT.md"
"DEPLOYMENT_GITHUB.md"
"RESUMEN_DEPLOY_8607.md"
"VERIFICACION_PWA.md"
"ESTADO_FUNCIONALIDADES.md"
"SPA_ROUTING_CONFIG.md"
"CHECKLIST_PWA_COMPLETA.md"
"ANALISIS_TECNOLOGICO_PROYECTO.md"
"PLAN_ESTRUCTURA_PSIQUIATRIA.md"
"FASE_1_FALTANTE_DETALLADO.md"
"SISTEMA_MEDIOS_VISUALES.md"
)
# Mover todos los .md a archive primero
find . -maxdepth 1 -name "*.md" -type f | while read -r file; do
basename_file=$(basename "$file")
is_essential=false
for essential in "${ESSENTIAL_DOCS[@]}"; do
if [ "$basename_file" == "$essential" ]; then
is_essential=true
break
fi
done
if [ "$is_essential" = false ]; then
mv "$file" docs/archive/ 2>/dev/null || true
fi
done
# Mover archivos esenciales a consolidated (excepto README.md)
for doc in "${ESSENTIAL_DOCS[@]}"; do
if [ -f "$doc" ] && [ "$doc" != "README.md" ]; then
mv "$doc" docs/consolidated/ 2>/dev/null || true
fi
done
echo -e "${GREEN}✅ Documentación organizada${NC}"
echo -e "${BLUE} - Esenciales en: docs/consolidated/${NC}"
echo -e "${BLUE} - Archivados en: docs/archive/${NC}"
echo ""
# 9. Scripts de mantenimiento
echo -e "${YELLOW}🐍 [9/10] Organizando scripts...${NC}"
mkdir -p scripts/archive
# Scripts esenciales a mantener
ESSENTIAL_SCRIPTS=(
"deploy.sh"
"deploy-docker.sh"
"webhook-deploy.sh"
"scripts/verificar-manual.ts"
)
# Mover scripts Python y shell de la raíz a archive
for script in *.py *.sh 2>/dev/null; do
if [ -f "$script" ]; then
basename_script=$(basename "$script")
is_essential=false
for essential in "${ESSENTIAL_SCRIPTS[@]}"; do
if [ "$basename_script" == "$(basename "$essential")" ]; then
is_essential=true
break
fi
done
if [ "$is_essential" = false ]; then
mv "$script" scripts/archive/ 2>/dev/null || true
fi
fi
done
echo -e "${GREEN}✅ Scripts organizados${NC}"
echo -e "${BLUE} - Esenciales mantenidos en raíz${NC}"
echo -e "${BLUE} - Otros movidos a: scripts/archive/${NC}"
echo ""
# 10. Configuraciones de despliegue redundantes
echo -e "${YELLOW}⚙️ [10/10] Organizando configuraciones...${NC}"
mkdir -p configs/backup
# Configuraciones a mantener (Docker, PM2, GitHub Actions)
# Configuraciones a mover a backup (pero mantener en repo)
CONFIGS_TO_BACKUP=(
"vercel.json"
"netlify.toml"
"nginx.conf.example"
)
for config in "${CONFIGS_TO_BACKUP[@]}"; do
if [ -f "$config" ]; then
# Crear carpeta si no existe
mkdir -p configs/backup
# Mover pero mantener referencia en .gitignore si es necesario
mv "$config" configs/backup/ 2>/dev/null || true
fi
done
# Mover .htaccess y _redirects si existen
if [ -f "public/.htaccess" ]; then
mkdir -p configs/backup
mv public/.htaccess configs/backup/ 2>/dev/null || true
fi
if [ -f "public/_redirects" ]; then
mkdir -p configs/backup
mv public/_redirects configs/backup/ 2>/dev/null || true
fi
echo -e "${GREEN}✅ Configuraciones organizadas${NC}"
echo -e "${BLUE} - Docker, PM2, GitHub Actions mantenidos${NC}"
echo -e "${BLUE} - Otras configuraciones en: configs/backup/${NC}"
echo ""
# Resumen final
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
echo -e "${GREEN}✅ LIMPIEZA COMPLETADA${NC}"
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
echo ""
echo -e "${BLUE}📊 Resumen:${NC}"
echo -e " Backup creado en: ${YELLOW}$BACKUP_DIR${NC}"
echo ""
echo -e "${BLUE}📁 Estructura optimizada:${NC}"
echo -e " ✅ Documentación esencial: ${GREEN}docs/consolidated/${NC}"
echo -e " ✅ Documentación archivada: ${YELLOW}docs/archive/${NC}"
echo -e " ✅ Scripts esenciales: ${GREEN}raíz del proyecto${NC}"
echo -e " ✅ Scripts archivados: ${YELLOW}scripts/archive/${NC}"
echo -e " ✅ Configuraciones: ${GREEN}Docker, PM2, GitHub Actions${NC}"
echo ""
echo -e "${YELLOW}⚠️ IMPORTANTE:${NC}"
echo -e " 1. Verificar que el proyecto funciona: ${BLUE}npm run build${NC}"
echo -e " 2. Verificar Docker: ${BLUE}docker-compose up --build${NC}"
echo -e " 3. Si todo está bien, puedes eliminar backups antiguos"
echo ""
echo -e "${GREEN}🎯 Proyecto listo para desarrollo${NC}"

View file

@ -1,9 +1,8 @@
#!/bin/bash
# Script de deploy con Docker para EMERGES TES
# Uso: ./deploy-docker.sh [--skip-git] [--rebuild]
# Requisitos: docker, docker-compose
# Puerto: 8607
# Uso: ./deploy-docker.sh [--rebuild] [--stop] [--logs]
# Requisitos: Docker, Docker Compose
set -e # Salir si hay error
@ -15,55 +14,83 @@ BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuración
PORT=8607
CONTAINER_NAME="emerges-tes"
IMAGE_NAME="emerges-tes"
PORT=8607
COMPOSE_FILE="docker-compose.yml"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo -e "${BLUE}🐳 Deploy Docker de EMERGES TES (Puerto $PORT)${NC}"
echo -e "${BLUE}🐳 Deploy Docker de EMERGES TES${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
# Verificar Docker
if ! command -v docker &> /dev/null; then
echo -e "${RED}❌ Error: Docker no está instalado${NC}"
echo -e "${YELLOW} Instala Docker: https://docs.docker.com/get-docker/${NC}"
exit 1
fi
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
echo -e "${RED}❌ Error: docker-compose no está instalado${NC}"
echo -e "${RED}❌ Error: Docker Compose no está instalado${NC}"
exit 1
fi
# Detectar comando docker-compose
if docker compose version &> /dev/null; then
DOCKER_COMPOSE="docker compose"
# Detectar comando de compose (docker-compose o docker compose)
if command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
DOCKER_COMPOSE="docker-compose"
COMPOSE_CMD="docker compose"
fi
# Verificar si se debe saltar git pull
SKIP_GIT=false
echo -e "${GREEN}✅ Docker detectado: $(docker --version)${NC}"
echo -e "${GREEN}✅ Docker Compose detectado${NC}"
echo ""
# Procesar argumentos
REBUILD=false
STOP=false
LOGS=false
SKIP_GIT=false
for arg in "$@"; do
case $arg in
--skip-git)
SKIP_GIT=true
shift
;;
--rebuild)
REBUILD=true
shift
;;
*)
--stop)
STOP=true
shift
;;
--logs)
LOGS=true
shift
;;
--skip-git)
SKIP_GIT=true
shift
;;
*)
# Argumento desconocido
;;
esac
done
# Si se solicita detener
if [ "$STOP" = true ]; then
echo -e "${YELLOW}🛑 Deteniendo contenedor...${NC}"
$COMPOSE_CMD down
echo -e "${GREEN}✅ Contenedor detenido${NC}"
exit 0
fi
# Si se solicitan logs
if [ "$LOGS" = true ]; then
echo -e "${YELLOW}📋 Mostrando logs...${NC}"
$COMPOSE_CMD logs -f
exit 0
fi
# 1. Actualizar código desde git (si no se salta)
if [ "$SKIP_GIT" = false ]; then
echo -e "${YELLOW}📥 [1/4] Actualizando código desde git...${NC}"
@ -76,57 +103,59 @@ else
echo -e "${YELLOW}⏭️ [1/4] Saltando actualización de git (--skip-git)${NC}"
fi
# 2. Detener contenedor existente (si existe)
echo -e "${YELLOW}🛑 [2/4] Deteniendo contenedor existente...${NC}"
$DOCKER_COMPOSE down 2>/dev/null || true
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
echo -e "${GREEN}✅ Contenedor detenido${NC}"
# 2. Verificar que Dockerfile existe
echo -e "${YELLOW}🔍 [2/4] Verificando Dockerfile...${NC}"
if [ ! -f "Dockerfile" ]; then
echo -e "${RED}❌ Error: Dockerfile no encontrado${NC}"
exit 1
fi
if [ ! -f "$COMPOSE_FILE" ]; then
echo -e "${RED}❌ Error: $COMPOSE_FILE no encontrado${NC}"
exit 1
fi
echo -e "${GREEN}✅ Archivos Docker encontrados${NC}"
# 3. Construir imagen Docker
echo -e "${YELLOW}🔨 [3/4] Construyendo imagen Docker...${NC}"
# 3. Construir imagen (si es necesario)
if [ "$REBUILD" = true ]; then
echo -e "${YELLOW} Forzando rebuild completo (--rebuild)${NC}"
$DOCKER_COMPOSE build --no-cache
echo -e "${YELLOW}🔨 [3/4] Reconstruyendo imagen Docker...${NC}"
$COMPOSE_CMD build --no-cache
echo -e "${GREEN}✅ Imagen reconstruida${NC}"
else
$DOCKER_COMPOSE build
echo -e "${YELLOW}🔨 [3/4] Construyendo/actualizando imagen Docker...${NC}"
$COMPOSE_CMD build
echo -e "${GREEN}✅ Imagen lista${NC}"
fi
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Imagen construida exitosamente${NC}"
else
echo -e "${RED}❌ Error al construir imagen${NC}"
exit 1
fi
# 4. Iniciar contenedor
# 4. Iniciar/Reiniciar contenedor
echo -e "${YELLOW}🚀 [4/4] Iniciando contenedor...${NC}"
$DOCKER_COMPOSE up -d
$COMPOSE_CMD up -d
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Contenedor iniciado${NC}"
else
echo -e "${RED}❌ Error al iniciar contenedor${NC}"
exit 1
fi
# Esperar un momento para que el contenedor inicie
# Esperar a que el contenedor esté listo
echo -e "${YELLOW}⏳ Esperando a que el contenedor esté listo...${NC}"
sleep 3
# Verificar estado
echo ""
echo -e "${GREEN}✅ Deploy completado exitosamente${NC}"
echo -e "${BLUE}📊 Estado del contenedor:${NC}"
docker ps | grep "$CONTAINER_NAME" || docker ps -a | grep "$CONTAINER_NAME"
echo ""
echo -e "${GREEN}🌐 Aplicación disponible en: http://localhost:$PORT${NC}"
echo -e "${GREEN}📝 Logs: docker logs $CONTAINER_NAME${NC}"
echo -e "${GREEN}📊 Logs en tiempo real: docker logs -f $CONTAINER_NAME${NC}"
echo -e "${GREEN}🛑 Detener: docker-compose down${NC}"
echo -e "${GREEN}🔄 Reiniciar: docker-compose restart${NC}"
if docker ps | grep -q "$CONTAINER_NAME"; then
echo -e "${GREEN}✅ Contenedor iniciado correctamente${NC}"
else
echo -e "${RED}❌ Error: El contenedor no está corriendo${NC}"
echo -e "${YELLOW}📋 Últimos logs:${NC}"
$COMPOSE_CMD logs --tail=50
exit 1
fi
# Mostrar información
echo ""
echo -e "${GREEN}════════════════════════════════════════${NC}"
echo -e "${GREEN}🎉 Deploy Docker completado!${NC}"
echo -e "${GREEN}════════════════════════════════════════${NC}"
echo ""
echo -e "${BLUE}📊 Estado del contenedor:${NC}"
docker ps | grep "$CONTAINER_NAME" || true
echo ""
echo -e "${GREEN}🌐 Aplicación disponible en: http://localhost:$PORT${NC}"
echo -e "${GREEN}📝 Logs: $COMPOSE_CMD logs -f${NC}"
echo -e "${GREEN}📊 Estado: docker ps | grep $CONTAINER_NAME${NC}"
echo -e "${GREEN}🛑 Detener: $COMPOSE_CMD down${NC}"
echo ""

View file

@ -43,3 +43,4 @@ services:
networks:
emerges-network:
driver: bridge

View file

@ -5,14 +5,13 @@ services:
build:
context: .
dockerfile: Dockerfile
target: production
container_name: emerges-tes
ports:
- "8607:8607"
restart: unless-stopped
environment:
- NODE_ENV=production
- PORT=8607
restart: unless-stopped
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://localhost:8607', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"]
interval: 30s
@ -20,11 +19,12 @@ services:
retries: 3
start_period: 5s
labels:
- "com.emerges-tes.description=EMERGES TES - Protocolo Rápido"
- "com.emerges-tes.version=1.0"
- "com.emerges.app=emerges-tes"
- "com.emerges.version=1.0"
networks:
- emerges-network
networks:
emerges-network:
driver: bridge

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB