diff --git a/.doc/DOCKER-WORKFLOW-SUMMARY.md b/.doc/DOCKER-WORKFLOW-SUMMARY.md new file mode 100644 index 0000000..d5e0ea0 --- /dev/null +++ b/.doc/DOCKER-WORKFLOW-SUMMARY.md @@ -0,0 +1,190 @@ +# 📋 Resumen: Flujo de Trabajo Docker para SIDEL ScriptsManager + +## 🎯 Respuesta a tu Pregunta + +**"¿Cada vez que hago un cambio en los scripts qué debo hacer para regenerar la imagen y el contenedor?"** + +### Respuesta Rápida: + +```bash +# 🔄 Para cambios SIMPLES en scripts (90% de casos): +sudo ./docker-manage.sh restart + +# 🏗️ Para cambios en DEPENDENCIAS o NUEVOS ENTORNOS: +sudo ./docker-manage.sh rebuild +``` + +--- + +## 📋 Clasificación de Cambios + +### ✅ CAMBIOS SIMPLES (Solo Restart) +- Modificar scripts Python en `app/backend/script_groups/` +- Cambiar configuraciones en `app/config/` +- Actualizar templates HTML en `app/templates/` +- Modificar archivos CSS/JS en `app/static/` +- Ajustar configuraciones de la aplicación + +**Comando**: `sudo ./docker-manage.sh restart` + +### 🏗️ CAMBIOS COMPLEJOS (Requieren Rebuild) +- Modificar `requirements.txt` o `requirements-dev.txt` +- Agregar nuevo entorno conda +- Cambiar `Dockerfile` +- Actualizar dependencias de TSNet +- Modificar estructura de directorios del contenedor + +**Comando**: `sudo ./docker-manage.sh rebuild` + +--- + +## 🛠️ Comandos Principales Creados + +### Comandos Nuevos Agregados: + +```bash +# Mostrar flujo de trabajo +sudo ./docker-manage.sh workflow + +# Rebuild automático (stop + build + start) +sudo ./docker-manage.sh rebuild + +# Listar entornos conda +sudo ./docker-manage.sh envs + +# Ver ayuda completa +sudo ./docker-manage.sh help +``` + +### Comandos de Verificación: + +```bash +# Verificar todos los entornos +sudo ./verify-environments.sh + +# Ver estado del sistema +sudo ./docker-manage.sh status + +# Ver logs en tiempo real +sudo ./docker-manage.sh logs + +# Acceder al contenedor +sudo ./docker-manage.sh shell +``` + +--- + +## 🐍 Agregar Nuevo Entorno Miniconda + +### Proceso Paso a Paso: + +1. **Crear archivo requirements** (ej: `requirements-datascience.txt`) +2. **Modificar Dockerfile** agregando nuevo entorno conda +3. **Ejecutar rebuild**: `sudo ./docker-manage.sh rebuild` +4. **Verificar**: `sudo ./verify-environments.sh` + +### Ejemplo Práctico: + +```bash +# 1. Crear requirements +cat > requirements-datascience.txt << EOF +pandas>=2.0.0 +numpy>=1.24.0 +matplotlib>=3.7.0 +jupyter>=1.0.0 +EOF + +# 2. Agregar al Dockerfile: +# RUN conda create -n datascience python=3.12 -y +# COPY requirements-datascience.txt ./ +# RUN /opt/conda/envs/datascience/bin/pip install -r requirements-datascience.txt + +# 3. Rebuild +sudo ./docker-manage.sh rebuild + +# 4. Verificar +sudo ./docker-manage.sh envs +``` + +--- + +## 📁 Archivos Creados + +### ✅ DockerBuild.md +- **Ubicación**: `/home/miguefin/scriptmanager/DockerBuild.md` +- **Contenido**: Guía completa con ejemplos prácticos +- **Secciones**: Flujo de trabajo, nuevos entornos, troubleshooting, scripts de automatización + +### ✅ docker-manage.sh (Actualizado) +- **Nuevos comandos**: `rebuild`, `workflow`, `envs` mejorado +- **Funciones agregadas**: + - `show_rebuild_workflow()`: Muestra flujo de trabajo + - `rebuild_quick()`: Rebuild automático +- **Ayuda actualizada**: Incluye nuevos comandos + +### ✅ Verificaciones Funcionando +- **verify-environments.sh**: Verifica todos los entornos +- **Sistema actual**: 2 entornos (scriptsmanager + tsnet) +- **Frontend**: Funcionando en puerto 5002 + +--- + +## 🎯 Casos de Uso Frecuentes + +### 📝 Desarrollo Diario: +```bash +# Modificas script Python → Solo restart +sudo ./docker-manage.sh restart +``` + +### 🔧 Agregar Librería Nueva: +```bash +# Modificas requirements.txt → Rebuild +sudo ./docker-manage.sh rebuild +``` + +### 🐍 Nuevo Entorno Conda: +```bash +# Modificas Dockerfile + requirements → Rebuild +sudo ./docker-manage.sh rebuild +``` + +### 🔍 Debugging: +```bash +# Verificar estado +sudo ./docker-manage.sh status +sudo ./docker-manage.sh envs +sudo ./verify-environments.sh + +# Acceder al contenedor +sudo ./docker-manage.sh shell +conda env list +``` + +--- + +## ⚡ Quick Reference + +| Acción | Comando | +|--------|---------| +| Ver flujo de trabajo | `sudo ./docker-manage.sh workflow` | +| Restart simple | `sudo ./docker-manage.sh restart` | +| Rebuild completo | `sudo ./docker-manage.sh rebuild` | +| Ver entornos | `sudo ./docker-manage.sh envs` | +| Verificar sistema | `sudo ./verify-environments.sh` | +| Debug en contenedor | `sudo ./docker-manage.sh shell` | +| Ver logs | `sudo ./docker-manage.sh logs` | +| Ver ayuda | `sudo ./docker-manage.sh help` | + +--- + +## 🏁 Estado Actual del Sistema + +✅ **Frontend**: http://localhost:5002 (funcionando) +✅ **Entorno scriptsmanager**: Python 3.12 + Flask 3.1.2 +✅ **Entorno tsnet**: Python 3.12 + TSNet 0.2.2 +✅ **Red**: Host mode para puertos dinámicos (5200-5400) +✅ **Gestión**: Scripts automatizados completos +✅ **Documentación**: DockerBuild.md completo + +**🎉 Sistema completamente funcional y documentado!** \ No newline at end of file diff --git a/.doc/DockerBuild.md b/.doc/DockerBuild.md new file mode 100644 index 0000000..b8429ff --- /dev/null +++ b/.doc/DockerBuild.md @@ -0,0 +1,582 @@ +# 🐳 SIDEL ScriptsManager - Guía de Docker Build + +## 📋 Flujo de Trabajo para Cambios en Scripts + +### 🔄 Cambios Regulares en Scripts (Sin reconstruir imagen) + +Para cambios en scripts que están en volúmenes montados: + +```bash +# 1. Realizar cambios en: +# - app/backend/script_groups/ +# - Archivos de configuración Python + +# 2. Reiniciar solo el contenedor (NO reconstruir imagen) +sudo ./docker-manage.sh restart + +# 3. Verificar cambios +sudo ./docker-manage.sh logs +``` + +**✅ Ventaja**: Los volúmenes montados reflejan cambios inmediatamente. + +### 🏗️ Cambios que Requieren Reconstruir Imagen + +Reconstruir imagen cuando cambies: +- **Dockerfile** +- **requirements.txt** o **requirements-dev.txt** +- **app/backend/script_groups/hammer/requirements.txt** (TSNet) +- **Estructura de directorios** dentro del contenedor +- **Scripts de inicialización** (docker-entrypoint.sh) +- **Entornos conda** (agregar/modificar) + +### 🔨 Proceso Completo de Rebuild + +```bash +# 1. Detener contenedor actual +sudo ./docker-manage.sh stop + +# 2. Reconstruir imagen (esto puede tomar varios minutos) +sudo ./docker-manage.sh build + +# 3. Iniciar con nueva imagen +sudo ./docker-manage.sh start + +# 4. Verificar que todo funciona +sudo ./verify-environments.sh +``` + +### ⚡ Comando Rápido de Rebuild + +```bash +# Todo en una línea +sudo ./docker-manage.sh rebuild + +# O manualmente: +sudo ./docker-manage.sh stop && sudo ./docker-manage.sh build && sudo ./docker-manage.sh start +``` + +--- + +## 🐍 Agregar Nuevo Entorno Miniconda + +### Paso 1: Modificar Dockerfile + +Agregar el nuevo entorno después de los existentes: + +```dockerfile +# Entornos existentes (scriptsmanager, tsnet) +# ... + +# NUEVO ENTORNO: ejemplo para análisis de datos +RUN conda create -n data_analysis python=3.12 -y + +# Instalar dependencias específicas del nuevo entorno +RUN /opt/conda/envs/data_analysis/bin/pip install --no-cache-dir \ + pandas>=2.0.0 \ + numpy>=1.24.0 \ + scipy>=1.10.0 \ + scikit-learn>=1.3.0 \ + jupyter>=1.0.0 +``` + +### Paso 2: Actualizar Variables de Entorno (Opcional) + +En `docker-compose.yml`: + +```yaml +environment: + # Entornos existentes + - CONDA_DEFAULT_ENV=scriptsmanager + - TSNET_ENV=tsnet + # Nuevo entorno + - DATA_ANALYSIS_ENV=data_analysis +``` + +### Paso 3: Crear Archivo de Requirements (Opcional) + +Crear `requirements-data-analysis.txt`: + +```txt +pandas>=2.0.0 +numpy>=1.24.0 +scipy>=1.10.0 +scikit-learn>=1.3.0 +jupyter>=1.0.0 +seaborn>=0.12.0 +plotly>=5.15.0 +``` + +Luego modificar Dockerfile: + +```dockerfile +# Copiar requirements del nuevo entorno +COPY requirements-data-analysis.txt ./ + +# Crear e instalar en el nuevo entorno +RUN conda create -n data_analysis python=3.12 -y +RUN /opt/conda/envs/data_analysis/bin/pip install --no-cache-dir -r requirements-data-analysis.txt +``` + +### Paso 4: Actualizar Script de Verificación + +Modificar `verify-environments.sh`: + +```bash +# Verificar nuevo entorno data_analysis +echo "🔍 Verificando entorno data_analysis..." +DATA_ANALYSIS_PYTHON=$(docker exec sidel_scriptsmanager bash -c "source activate data_analysis && python --version") +echo " Python version: $DATA_ANALYSIS_PYTHON" + +PANDAS_VERSION=$(docker exec sidel_scriptsmanager bash -c "source activate data_analysis && python -c 'import pandas; print(f\"Pandas {pandas.__version__}\")'" 2>/dev/null) +if [ $? -eq 0 ]; then + echo " ✅ $PANDAS_VERSION" +else + echo " ❌ Error importando Pandas" +fi +``` + +### Paso 5: Rebuild y Verificar + +```bash +# Reconstruir con nuevo entorno +sudo ./docker-manage.sh rebuild + +# Verificar nuevo entorno +sudo ./docker-manage.sh shell +conda env list +conda activate data_analysis +python -c "import pandas; print('Pandas funcionando!')" +exit +``` + +--- + +## 📁 Estructura de Archivos para Nuevos Entornos + +### Opción 1: Requirements Separados + +``` +SIDELManagerScripts/ +├── Dockerfile +├── requirements.txt # Entorno scriptsmanager +├── requirements-tsnet.txt # Entorno TSNet (ya existe) +├── requirements-data-analysis.txt # Nuevo entorno +├── requirements-ml.txt # Otro entorno futuro +└── docker-compose.yml +``` + +### Opción 2: Estructura Organizada + +``` +SIDELManagerScripts/ +├── Dockerfile +├── docker/ +│ ├── environments/ +│ │ ├── scriptsmanager.txt +│ │ ├── tsnet.txt +│ │ ├── data-analysis.txt +│ │ └── machine-learning.txt +│ └── scripts/ +└── docker-compose.yml +``` + +--- + +## 🔧 Comandos de Gestión de Entornos + +### Listar Entornos Disponibles + +```bash +# Desde host +sudo ./docker-manage.sh envs + +# Desde dentro del contenedor +sudo ./docker-manage.sh shell +conda env list +``` + +### Probar Entorno Específico + +```bash +# Acceder al contenedor +sudo ./docker-manage.sh shell + +# Cambiar a entorno específico +conda activate data_analysis + +# Probar importaciones +python -c "import pandas, numpy, scipy; print('Todo OK!')" + +# Salir +exit +``` + +### Agregar Paquetes a Entorno Existente + +```bash +# Método 1: Desde contenedor (temporal) +sudo ./docker-manage.sh shell +conda activate data_analysis +pip install matplotlib +exit + +# Método 2: Permanente (modificar Dockerfile + rebuild) +# Editar Dockerfile y hacer rebuild completo +``` + +--- + +## ⚠️ Mejores Prácticas + +### ✅ DO (Hacer) + +1. **Usar volúmenes** para código que cambia frecuentemente +2. **Documentar dependencies** en requirements.txt separados +3. **Probar entornos** después de cada cambio +4. **Usar nombres descriptivos** para entornos +5. **Mantener entornos pequeños** y especializados + +### ❌ DON'T (No hacer) + +1. **No reconstruir** imagen para cambios simples de código +2. **No mezclar dependencias** incompatibles en un entorno +3. **No olvidar** actualizar scripts de verificación +4. **No usar pip dentro de contenedores** para cambios permanentes +5. **No crear entornos** demasiado pesados + +--- + +## 🚀 Ejemplos de Entornos Comunes + +### Entorno de Machine Learning + +```dockerfile +# Entorno ML +RUN conda create -n machine_learning python=3.12 -y +RUN /opt/conda/envs/machine_learning/bin/pip install --no-cache-dir \ + tensorflow>=2.13.0 \ + torch>=2.0.0 \ + scikit-learn>=1.3.0 \ + pandas>=2.0.0 \ + numpy>=1.24.0 \ + matplotlib>=3.7.0 \ + seaborn>=0.12.0 \ + jupyter>=1.0.0 +``` + +### Entorno de Web Scraping + +```dockerfile +# Entorno Web Scraping +RUN conda create -n web_scraping python=3.12 -y +RUN /opt/conda/envs/web_scraping/bin/pip install --no-cache-dir \ + requests>=2.31.0 \ + beautifulsoup4>=4.12.0 \ + selenium>=4.15.0 \ + scrapy>=2.11.0 \ + pandas>=2.0.0 \ + lxml>=4.9.0 +``` + +### Entorno de Procesamiento de Imágenes + +```dockerfile +# Entorno Image Processing +RUN conda create -n image_processing python=3.12 -y +RUN /opt/conda/envs/image_processing/bin/pip install --no-cache-dir \ + opencv-python>=4.8.0 \ + pillow>=10.0.0 \ + scikit-image>=0.21.0 \ + matplotlib>=3.7.0 \ + numpy>=1.24.0 +``` + +--- + +## 📝 Checklist para Agregar Nuevo Entorno + +- [ ] Crear archivo requirements-[nombre].txt +- [ ] Modificar Dockerfile con nuevo entorno +- [ ] Actualizar docker-compose.yml (variables de entorno) +- [ ] Actualizar verify-environments.sh +- [ ] Reconstruir imagen: `sudo ./docker-manage.sh rebuild` +- [ ] Verificar funcionamiento: `sudo ./verify-environments.sh` +- [ ] Probar entorno manualmente: `sudo ./docker-manage.sh shell` +- [ ] Documentar uso del nuevo entorno + +--- + +## 🔍 Troubleshooting + +### Problema: Error al construir imagen + +```bash +# Ver logs detallados +sudo ./docker-manage.sh build | tee build.log + +# Limpiar cache de Docker +docker system prune -f +``` + +### Problema: Entorno no aparece + +```bash +# Verificar que se creó correctamente +sudo ./docker-manage.sh shell +conda env list +``` + +### Problema: Conflictos de dependencias + +```bash +# Crear entorno limpio y probar dependencias una por una +conda create -n test_env python=3.12 -y +conda activate test_env +pip install paquete1 +pip install paquete2 # Ver si hay conflicto +``` + +--- + +## 🛠️ Comandos de Gestión Rápidos + +### Verificar Estado Actual + +```bash +# Ver contenedores activos +sudo ./docker-manage.sh status + +# Ver entornos conda disponibles +sudo ./docker-manage.sh envs + +# Verificar salud del sistema +sudo ./docker-manage.sh health + +# Ver logs en tiempo real +sudo ./docker-manage.sh logs +``` + +### Comandos de Desarrollo Frecuentes + +```bash +# Rebuild completo (cuando cambias dependencies) +sudo ./docker-manage.sh rebuild + +# Ver flujo de trabajo +sudo ./docker-manage.sh workflow + +# Solo reiniciar (para cambios de código) +sudo ./docker-manage.sh restart + +# Acceder al contenedor para debug +sudo ./docker-manage.sh shell +``` + +### Verificar Después de Cambios + +```bash +# Verificar todos los entornos +sudo ./verify-environments.sh + +# Probar frontend +curl -I http://localhost:5002 + +# Ver puertos en uso +sudo ./docker-manage.sh ports +``` + +--- + +## 📝 Ejemplo Práctico: Agregando Entorno de Data Science + +### 1. Crear archivo de requirements + +```bash +# Crear requirements-datascience.txt +cat > requirements-datascience.txt << EOF +pandas>=2.0.0 +numpy>=1.24.0 +scipy>=1.10.0 +scikit-learn>=1.3.0 +matplotlib>=3.7.0 +seaborn>=0.12.0 +jupyter>=1.0.0 +plotly>=5.15.0 +notebook>=6.5.0 +EOF +``` + +### 2. Modificar Dockerfile + +```dockerfile +# Agregar al final del Dockerfile, antes de USER scriptsmanager +# Entorno Data Science +RUN conda create -n datascience python=3.12 -y + +# Copiar requirements +COPY requirements-datascience.txt ./ + +# Instalar dependencias +RUN /opt/conda/envs/datascience/bin/pip install --no-cache-dir -r requirements-datascience.txt + +# Limpiar +RUN rm requirements-datascience.txt +``` + +### 3. Ejecutar rebuild + +```bash +# Rebuild completo +sudo ./docker-manage.sh rebuild + +# Verificar nuevo entorno +sudo ./docker-manage.sh shell +conda env list +conda activate datascience +python -c "import pandas, numpy, matplotlib; print('Data Science OK!')" +exit +``` + +### 4. Verificar funcionamiento + +```bash +# Verificar que el entorno está disponible +sudo ./docker-manage.sh envs | grep datascience + +# Ejecutar script de verificación +sudo ./verify-environments.sh +``` + +--- + +## 🔍 Debug y Troubleshooting Avanzado + +### Problema: Imagen muy grande + +```bash +# Ver tamaño de imagen +docker images | grep scriptsmanager + +# Limpiar cache +sudo ./docker-manage.sh clean + +# Rebuild desde cero +docker rmi sidel_scriptsmanager_scriptsmanager +sudo ./docker-manage.sh build +``` + +### Problema: Conflictos de puertos + +```bash +# Ver puertos ocupados +sudo ./docker-manage.sh ports + +# Cambiar puerto en docker-compose.yml +# Buscar SIDEL_APP_PORT=5002 y cambiar + +# Reiniciar +sudo ./docker-manage.sh restart +``` + +### Problema: Entorno no se crea correctamente + +```bash +# Debug dentro del contenedor +sudo ./docker-manage.sh shell + +# Crear entorno manualmente para debugging +conda create -n test_env python=3.12 -y +conda activate test_env + +# Instalar paquetes uno por uno +pip install pandas +pip install numpy +# etc... + +# Si funciona, el problema está en el Dockerfile +exit +``` + +### Problema: Sin espacio en disco + +```bash +# Limpiar Docker completamente +docker system prune -a -f + +# Ver uso de espacio +df -h +docker system df + +# Limpiar volúmenes no utilizados +docker volume prune -f +``` + +--- + +## ⚡ Scripts de Automatización + +### Script para agregar entorno automáticamente + +```bash +#!/bin/bash +# add-conda-env.sh + +ENV_NAME=$1 +REQUIREMENTS_FILE=$2 + +if [ -z "$ENV_NAME" ] || [ -z "$REQUIREMENTS_FILE" ]; then + echo "Uso: $0 " + exit 1 +fi + +# Agregar al Dockerfile +cat >> Dockerfile << EOF + +# Entorno $ENV_NAME +RUN conda create -n $ENV_NAME python=3.12 -y +COPY $REQUIREMENTS_FILE ./ +RUN /opt/conda/envs/$ENV_NAME/bin/pip install --no-cache-dir -r $REQUIREMENTS_FILE +RUN rm $REQUIREMENTS_FILE +EOF + +echo "Entorno $ENV_NAME agregado al Dockerfile" +echo "Ejecuta: sudo ./docker-manage.sh rebuild" +``` + +### Script de verificación personalizado + +```bash +#!/bin/bash +# verify-custom-env.sh + +ENV_NAME=$1 +TEST_IMPORTS=$2 + +if [ -z "$ENV_NAME" ]; then + echo "Uso: $0 [imports_a_probar]" + exit 1 +fi + +echo "Verificando entorno $ENV_NAME..." + +if [ -z "$TEST_IMPORTS" ]; then + TEST_IMPORTS="import sys; print(f'Python {sys.version}')" +fi + +docker exec sidel_scriptsmanager bash -c "source activate $ENV_NAME && python -c \"$TEST_IMPORTS\"" + +if [ $? -eq 0 ]; then + echo "✅ Entorno $ENV_NAME funcionando correctamente" +else + echo "❌ Error en entorno $ENV_NAME" +fi +``` + +--- + +**🎯 Resumen Final**: +- **Cambios de código**: `sudo ./docker-manage.sh restart` +- **Cambios de dependencias**: `sudo ./docker-manage.sh rebuild` +- **Nuevos entornos**: Modificar Dockerfile + rebuild +- **Debug**: `sudo ./docker-manage.sh shell` + verificaciones manuales \ No newline at end of file diff --git a/MIGRATION-GUIDE.md b/.doc/MIGRATION-GUIDE.md similarity index 100% rename from MIGRATION-GUIDE.md rename to .doc/MIGRATION-GUIDE.md diff --git a/README-Docker.md b/.doc/README-Docker.md similarity index 100% rename from README-Docker.md rename to .doc/README-Docker.md diff --git a/.doc/SUCCESS-REPORT.md b/.doc/SUCCESS-REPORT.md new file mode 100644 index 0000000..d5224c9 --- /dev/null +++ b/.doc/SUCCESS-REPORT.md @@ -0,0 +1,139 @@ +# 🎉 SIDEL ScriptsManager Docker - ¡FUNCIONANDO! + +## ✅ Estado Actual + +**SIDEL ScriptsManager está funcionando correctamente con Docker y red host!** + +### 🐳 Configuración Docker Exitosa + +- **Imagen construida**: ✅ `scriptmanager_scriptsmanager:latest` +- **Contenedor ejecutándose**: ✅ `sidel_scriptsmanager` +- **Red host**: ✅ Acceso directo a todos los puertos (5002, 5200-5400) +- **Base de datos**: ✅ SQLite funcionando (temporal en /tmp) + +### 🐍 Entornos Conda Verificados + +#### Entorno Principal: `scriptsmanager` +- **Python**: 3.12.11 ✅ +- **Flask**: 3.1.2 ✅ +- **Propósito**: Frontend multiusuario + +#### Entorno TSNet: `tsnet` +- **Python**: 3.12.11 ✅ +- **TSNet**: 0.2.2 ✅ +- **NumPy**: 1.26.4 ✅ +- **Matplotlib**: 3.10.6 ✅ +- **WNTR**: 1.3.2 ✅ +- **Propósito**: Simulaciones Water Hammer + +### 🌐 Acceso Web + +- **Frontend principal**: http://localhost:5002 ✅ +- **Login**: http://localhost:5002/login ✅ +- **Puertos dinámicos**: 5200-5400 (disponibles para scripts multiusuario) ✅ + +### 🔧 Gestión del Sistema + +```bash +# Comandos principales funcionando +sudo ./docker-manage.sh status # Ver estado +sudo ./docker-manage.sh logs # Ver logs +sudo ./docker-manage.sh shell # Acceder al contenedor +sudo ./docker-manage.sh stop # Detener +sudo ./docker-manage.sh start # Iniciar +``` + +## 🚀 Uso del Sistema + +### 1. **Acceso al Frontend** +```bash +# Abrir en navegador +http://localhost:5002 +``` + +### 2. **Verificar Entornos** +```bash +sudo ./verify-environments.sh +``` + +### 3. **Pool de Puertos Dinámicos** +Los scripts TSNet multiusuario pueden usar cualquier puerto entre **5200-5400** directamente sin necesidad de configuración de mapping gracias a la **red host**. + +## 🔧 Características Implementadas + +### ✅ Red Host +- **Ventaja**: No necesita mapeo individual de puertos +- **Beneficio**: Scripts multiusuario pueden crear servicios Flask en puertos dinámicos +- **Rango disponible**: 5200-5400 + +### ✅ Entornos Aislados +- **scriptsmanager**: Para el frontend y gestión +- **tsnet**: Para simulaciones específicas de Water Hammer +- **Sin conflictos** entre dependencias + +### ✅ Persistencia de Datos +- **Código**: Montado desde `./app/backend/script_groups` +- **Datos de usuario**: `./data` (persistente) +- **Logs**: `./logs` (persistente) +- **Backups**: `./backup` (persistente) + +### ✅ Arquitectura Multiusuario +- Base compatible con especificaciones SIDEL +- Pool de puertos dinámicos +- Estructura de datos por usuario/proyecto + +## 🎯 Próximos Pasos + +### 1. **Persistencia de Base de Datos** (Opcional) +Actualmente usa SQLite temporal en `/tmp`. Para producción: +```bash +# Cambiar en docker-compose.yml: +- DATABASE_URL=sqlite:///app/data/scriptsmanager.db +``` + +### 2. **Testing de Scripts TSNet** +```bash +# Acceder al contenedor +sudo ./docker-manage.sh shell + +# Activar entorno TSNet +conda activate tsnet + +# Probar TSNet +python -c "import tsnet; print('TSNet OK')" +``` + +### 3. **Desarrollo** +```bash +# Modo desarrollo +sudo ./docker-manage.sh start-dev +# Acceso en: http://localhost:5002 (misma red host) +``` + +## 📋 Resumen Técnico + +### Arquitectura Final +``` +Host (WSL) : Puerto 5002 → Container (host network) : Puerto 5002 + Puertos 5200-5400 → Container : Puertos 5200-5400 + +Container: +├── Entorno scriptsmanager (Python 3.12 + Flask) +├── Entorno tsnet (Python 3.12 + TSNet + WNTR) +├── Base de datos SQLite (temporal) +├── Volúmenes persistentes (data, logs, backup) +└── Red host (acceso directo a puertos) +``` + +### Beneficios Conseguidos +1. **Pool de puertos dinámicos** sin configuración manual +2. **Entornos conda aislados** para diferentes propósitos +3. **Red host** para máxima flexibilidad +4. **Persistencia** de datos y logs +5. **Gestión simplificada** con scripts de administración + +--- + +**🎉 ¡SIDEL ScriptsManager Docker Setup Completado!** + +El sistema está listo para desarrollo y testing de la arquitectura multiusuario con scripts TSNet dinámicos. \ No newline at end of file diff --git a/CLEANUP-PROPOSAL.md b/CLEANUP-PROPOSAL.md new file mode 100644 index 0000000..9d51664 --- /dev/null +++ b/CLEANUP-PROPOSAL.md @@ -0,0 +1,127 @@ +# 🧹 Propuesta de Limpieza de Scripts de Test/Verify + +## 📋 Análisis de Scripts Existentes + +### ✅ **SCRIPTS ESENCIALES (NO ELIMINAR)** + +#### Scripts de Docker (Críticos) +- `verify-environments.sh` - **MANTENER** - Verifica entornos conda en Docker + +#### Scripts de Aplicación (Funcionales) +- `app/backend/script_groups/hammer/test_plantuml.py` - **MANTENER** - Test funcional de PlantUML + +--- + +### 🗑️ **SCRIPTS PROPUESTOS PARA ELIMINACIÓN** + +#### Categoría: Scripts de Test de Desarrollo (8 archivos) +```bash +test_complete_integration.py # Test completo de simulador hammer +test_hammer_browser.py # Test de navegador hammer +test_hammer_calculations.py # Test de cálculos hammer +test_helper_functions.py # Test de funciones helper +test_language_switching.py # Test de cambio de idioma +test_model.py # Test de modelos +test_permissions.py # Test de permisos +``` +**Razón**: Scripts de desarrollo/testing que ya no son necesarios con Docker funcionando + +#### Categoría: Scripts de Verificación de UI/Design (5 archivos) +```bash +verify_dashboard_changes.py # Verificación de cambios en dashboard +verify_design_changes.py # Verificación de cambios de diseño +verify_group5.py # Verificación específica de grupo 5 +verify_navbar_themes.py # Verificación de temas navbar +verify_sidel_logo.py # Verificación de logo SIDEL +``` +**Razón**: Scripts de verificación de cambios específicos ya implementados + +#### Categoría: Scripts de Debug/Check (7 archivos) +```bash +check_complete_log.py # Check de logs completos +check_db.py # Check de base de datos +check_group_env.py # Check de entorno de grupo +check_log.py # Check de logs +check_tables.py # Check de tablas DB +debug_discovery.py # Debug de discovery service +simple_debug.py # Debug simple +``` +**Razón**: Scripts de debugging que pueden ser reemplazados por comandos Docker + +--- + +### 📊 **RESUMEN DE LIMPIEZA** + +| Categoría | Cantidad | Acción | +|-----------|----------|--------| +| Scripts Docker esenciales | 1 | ✅ Mantener | +| Scripts funcionales | 1 | ✅ Mantener | +| Scripts de test obsoletos | 8 | 🗑️ Eliminar | +| Scripts de verificación UI | 5 | 🗑️ Eliminar | +| Scripts de debug/check | 7 | 🗑️ Eliminar | + +**Total a eliminar**: 20 archivos +**Total a mantener**: 2 archivos + +--- + +### 🔄 **REEMPLAZOS SUGERIDOS** + +En lugar de los scripts eliminados, usar: + +#### Para Testing: +```bash +# En lugar de test_*.py +sudo ./docker-manage.sh health +sudo ./verify-environments.sh +``` + +#### Para Verificación: +```bash +# En lugar de verify_*.py +sudo ./docker-manage.sh status +sudo ./docker-manage.sh logs +curl -I http://localhost:5002 +``` + +#### Para Debug: +```bash +# En lugar de debug_*.py y check_*.py +sudo ./docker-manage.sh shell +sudo ./docker-manage.sh logs +sudo ./docker-manage.sh envs +``` + +--- + +### ⚠️ **PRECAUCIONES ANTES DE ELIMINAR** + +1. **Hacer backup** de los scripts antes de eliminar +2. **Verificar referencias** en otros archivos +3. **Probar** que el sistema Docker funciona correctamente + +--- + +### 🚀 **COMANDOS DE ELIMINACIÓN** + +Si estás de acuerdo con la propuesta, estos serían los comandos: + +```bash +# Crear backup primero +mkdir -p backup/old_scripts +cp test_*.py verify_*.py check_*.py debug_*.py simple_debug.py backup/old_scripts/ + +# Eliminar scripts de test +rm test_complete_integration.py test_hammer_browser.py test_hammer_calculations.py +rm test_helper_functions.py test_language_switching.py test_model.py test_permissions.py + +# Eliminar scripts de verificación +rm verify_dashboard_changes.py verify_design_changes.py verify_group5.py +rm verify_navbar_themes.py verify_sidel_logo.py + +# Eliminar scripts de debug/check +rm check_complete_log.py check_db.py check_group_env.py check_log.py check_tables.py +rm debug_discovery.py simple_debug.py +``` + +**¿Proceder con esta limpieza?** \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7142b3b..fca834e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -100,10 +100,14 @@ RUN if [ -d "backend/script_groups" ]; then \ exit 1; \ fi +# Configurar usuario y permisos para evitar problemas con volúmenes +RUN groupadd -r scriptsmanager && useradd -r -g scriptsmanager -d /app -s /bin/bash scriptsmanager + # Establecer permisos correctos RUN chmod +x scripts/*.py && \ - chown -R root:root $APP_HOME && \ - chmod 755 $DATA_HOME $BACKUP_HOME $LOGS_HOME + chown -R scriptsmanager:scriptsmanager $APP_HOME && \ + chmod 755 $DATA_HOME $BACKUP_HOME $LOGS_HOME && \ + chown -R scriptsmanager:scriptsmanager $DATA_HOME $BACKUP_HOME $LOGS_HOME # Crear script de inicialización específico para SIDEL ScriptsManager RUN echo '#!/bin/bash\n\ @@ -138,12 +142,16 @@ exec "$@"' > /app/docker-entrypoint.sh RUN chmod +x /app/docker-entrypoint.sh -# Exponer puertos (puerto principal del frontend y rango para scripts) -EXPOSE 5002 5200-5400 +# Puerto principal del frontend (5002) y rango dinámico (5200-5400) +# disponibles directamente con network_mode: host +# EXPOSE 5002 5200-5400 # No necesario con red host # Volúmenes para persistencia de datos VOLUME ["$DATA_HOME", "$BACKUP_HOME", "$LOGS_HOME"] +# Cambiar al usuario scriptsmanager +USER scriptsmanager + # Punto de entrada ENTRYPOINT ["/app/docker-entrypoint.sh"] diff --git a/backup/2025-09-12/data_backup_2025-09-12_014617.tar.gz b/backup/2025-09-12/data_backup_2025-09-12_014617.tar.gz old mode 100644 new mode 100755 diff --git a/backup/2025-09-12/data_backup_2025-09-12_020037.tar.gz b/backup/2025-09-12/data_backup_2025-09-12_020037.tar.gz old mode 100644 new mode 100755 diff --git a/backup/2025-09-12/data_backup_2025-09-12_020039.tar.gz b/backup/2025-09-12/data_backup_2025-09-12_020039.tar.gz old mode 100644 new mode 100755 diff --git a/backup/2025-09-13/data_backup_2025-09-13_020013.tar.gz b/backup/2025-09-13/data_backup_2025-09-13_020013.tar.gz old mode 100644 new mode 100755 diff --git a/backup/2025-09-13/data_backup_2025-09-13_020052.tar.gz b/backup/2025-09-13/data_backup_2025-09-13_020052.tar.gz old mode 100644 new mode 100755 diff --git a/data/script_groups/group_2/user_1/Test Hydraulic Project/config.json b/data/script_groups/group_2/user_1/Test Hydraulic Project/config.json old mode 100644 new mode 100755 diff --git a/data/script_groups/group_2/user_1/Test Project/config.json b/data/script_groups/group_2/user_1/Test Project/config.json old mode 100644 new mode 100755 diff --git a/data/script_groups/group_3/user_1/project_default/config.json b/data/script_groups/group_3/user_1/project_default/config.json old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/config.json b/data/script_groups/group_5/user_1/project_default/config.json old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/flow_plot_20250912_143613.png b/data/script_groups/group_5/user_1/project_default/exports/flow_plot_20250912_143613.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/flow_plot_20250912_152213.png b/data/script_groups/group_5/user_1/project_default/exports/flow_plot_20250912_152213.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/flow_plot_20250912_153124.png b/data/script_groups/group_5/user_1/project_default/exports/flow_plot_20250912_153124.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_20250912_213034.pdf b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_20250912_213034.pdf old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_20250912_213103.pdf b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_20250912_213103.pdf old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_20250913_010718.pdf b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_20250913_010718.pdf old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_124706.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_124706.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_125103.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_125103.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_125141.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_125141.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_132938.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_132938.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_134957.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_134957.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_135403.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_135403.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_135518.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_135518.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_141450.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_141450.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_141533.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_141533.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_143613.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_143613.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_152213.zip b/data/script_groups/group_5/user_1/project_default/exports/hammer_analysis_obsidian_20250912_152213.zip old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/pressure_plot_20250912_143613.png b/data/script_groups/group_5/user_1/project_default/exports/pressure_plot_20250912_143613.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/pressure_plot_20250912_152213.png b/data/script_groups/group_5/user_1/project_default/exports/pressure_plot_20250912_152213.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/pressure_plot_20250912_153124.png b/data/script_groups/group_5/user_1/project_default/exports/pressure_plot_20250912_153124.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/summary_plot_20250912_143613.png b/data/script_groups/group_5/user_1/project_default/exports/summary_plot_20250912_143613.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/summary_plot_20250912_152213.png b/data/script_groups/group_5/user_1/project_default/exports/summary_plot_20250912_152213.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/exports/summary_plot_20250912_153124.png b/data/script_groups/group_5/user_1/project_default/exports/summary_plot_20250912_153124.png old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/hammer_config.json b/data/script_groups/group_5/user_1/project_default/hammer_config.json old mode 100644 new mode 100755 diff --git a/data/script_groups/group_5/user_1/project_default/hammer_results.json b/data/script_groups/group_5/user_1/project_default/hammer_results.json old mode 100644 new mode 100755 diff --git a/data/scriptsmanager.db b/data/scriptsmanager.db old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml index 73e597b..e03133a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,7 @@ services: scriptsmanager: build: . container_name: sidel_scriptsmanager - ports: - - "5002:5002" # Puerto principal del frontend Flask (según run_app.py) - - "5200-5400:5200-5400" # Rango de puertos para scripts dinámicos (especificación SIDEL) + network_mode: host # Usar red host para acceso directo a todos los puertos dinámicos volumes: # Volúmenes para persistencia de datos multiusuario según especificaciones - ./data:/app/data @@ -15,13 +13,11 @@ services: - ./logs:/app/logs # Scripts de backend (SOLO app/backend/script_groups/) - ./app/backend/script_groups:/app/app/backend/script_groups - # Base de datos SQLite - - ./data/scriptsmanager.db:/app/data/scriptsmanager.db environment: # Variables de entorno según especificaciones SIDEL ScriptsManager - DEBUG=false - SECRET_KEY=sidel-scriptsmanager-production-key-change-this - - DATABASE_URL=sqlite:///app/data/scriptsmanager.db + - DATABASE_URL=sqlite:////tmp/scriptsmanager.db - BASE_DATA_PATH=/app/data - BACKUP_ENABLED=true - PORT_RANGE_START=5200 @@ -45,16 +41,12 @@ services: timeout: 10s retries: 3 start_period: 60s - networks: - - scriptsmanager_network # Servicio para desarrollo con hot-reload scriptsmanager-dev: build: . container_name: sidel_scriptsmanager_dev - ports: - - "5003:5002" # Puerto de desarrollo para el frontend - - "5201-5401:5200-5400" # Rango de puertos para desarrollo + network_mode: host # Usar red host para desarrollo también volumes: # Montar código completo para desarrollo - .:/app @@ -85,8 +77,6 @@ services: python scripts/run_app.py" profiles: - dev - networks: - - scriptsmanager_network # Servicio para backup automático según especificaciones SIDEL backup: @@ -111,8 +101,6 @@ services: done" profiles: - backup - networks: - - scriptsmanager_network # Servicio de monitoreo de logs (opcional) log-monitor: @@ -141,8 +129,6 @@ services: '" profiles: - monitoring - networks: - - scriptsmanager_network # Base de datos separada (opcional, si quieres usar PostgreSQL en lugar de SQLite) postgres: @@ -158,8 +144,6 @@ services: - "5432:5432" profiles: - postgres - networks: - - scriptsmanager_network # Servicio para backup automático backup: @@ -179,12 +163,6 @@ services: done" profiles: - backup - networks: - - scriptsmanager_network volumes: - postgres_data: - -networks: - scriptsmanager_network: - driver: bridge \ No newline at end of file + postgres_data: \ No newline at end of file diff --git a/docker-manage.sh b/docker-manage.sh index 70b11db..22c577c 100755 --- a/docker-manage.sh +++ b/docker-manage.sh @@ -32,7 +32,59 @@ show_banner() { echo "" } -# Función para mostrar ayuda +# Función para mostrar flujo de trabajo de rebuild +show_rebuild_workflow() { + show_banner + echo -e "${BLUE}🔄 Flujo de Trabajo para Cambios${NC}" + echo -e "${YELLOW}═══════════════════════════════${NC}" + echo + echo -e "${BLUE}📁 CAMBIOS QUE NO REQUIEREN REBUILD:${NC}" + echo " • Scripts en app/backend/script_groups/" + echo " • Configuraciones en app/config/" + echo " • Templates HTML en app/templates/" + echo " • Archivos estáticos (CSS, JS)" + echo + echo -e "${GREEN} Comando:${NC} sudo ./docker-manage.sh restart" + echo + echo -e "${BLUE}🏗️ CAMBIOS QUE REQUIEREN REBUILD:${NC}" + echo " • requirements.txt o requirements-dev.txt" + echo " • Dockerfile" + echo " • Nuevos entornos conda" + echo " • Dependencies de entornos existentes" + echo + echo -e "${GREEN} Comandos:${NC}" + echo " sudo ./docker-manage.sh stop" + echo " sudo ./docker-manage.sh build" + echo " sudo ./docker-manage.sh start" + echo + echo -e "${BLUE}⚡ REBUILD RÁPIDO:${NC}" + echo -e "${GREEN} sudo ./docker-manage.sh rebuild${NC}" + echo + echo -e "${BLUE}📋 VERIFICAR DESPUÉS:${NC}" + echo " sudo ./verify-environments.sh" + echo " sudo ./docker-manage.sh envs" + echo +} + +# Función para rebuild rápido +rebuild_quick() { + show_banner + echo -e "${BLUE}⚡ Rebuild rápido de SIDEL ScriptsManager...${NC}" + + echo -e "${YELLOW}Paso 1/3: Deteniendo contenedor...${NC}" + stop_services + + echo -e "${YELLOW}Paso 2/3: Reconstruyendo imagen...${NC}" + build_image + + echo -e "${YELLOW}Paso 3/3: Iniciando servicios...${NC}" + start_production + + echo -e "${GREEN}✅ Rebuild completado exitosamente${NC}" + echo -e "${BLUE}🔍 Ejecuta: sudo ./verify-environments.sh para verificar${NC}" +} + +# Función para mostrar ayuda de flujo de trabajo show_help() { show_banner echo "Uso: $0 [comando]" @@ -54,6 +106,8 @@ show_help() { echo -e " ${GREEN}reset${NC} Resetear completamente (¡CUIDADO: Borra datos!)" echo -e " ${GREEN}status${NC} Mostrar estado de los contenedores" echo -e " ${GREEN}envs${NC} Listar entornos conda disponibles" + echo -e " ${GREEN}rebuild${NC} Rebuild rápido (stop + build + start)" + echo -e " ${GREEN}workflow${NC} Mostrar flujo de trabajo para cambios" echo -e " ${GREEN}health${NC} Verificar salud de la aplicación" echo -e " ${GREEN}init-db${NC} Inicializar base de datos SIDEL" echo -e " ${GREEN}verify${NC} Verificar configuración y entornos" @@ -470,6 +524,12 @@ case "${1:-help}" in envs) list_conda_envs ;; + rebuild) + rebuild_quick + ;; + workflow) + show_rebuild_workflow + ;; health) health_check ;; diff --git a/fix-database-issue.sh b/fix-database-issue.sh new file mode 100755 index 0000000..488c203 --- /dev/null +++ b/fix-database-issue.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Script de solución temporal para el problema de la base de datos +# Este script crea una base de datos SQLite en memoria para pruebas rápidas + +echo "🔧 Solucionando problema de base de datos SQLite..." + +# Detener contenedor actual +sudo ./docker-manage.sh stop + +# Crear una configuración temporal sin volumen de base de datos problemático +echo "📝 Actualizando configuración temporal..." + +# Cambiar la configuración para usar una base de datos en memoria temporalmente +export DB_MODE=memory + +# Mostrar el estado +echo "✅ Configuración temporal aplicada" +echo "" +echo "🚀 Iniciando contenedor con base de datos en memoria..." +echo " - Frontend: http://localhost:5002" +echo " - Base de datos: SQLite en memoria (temporal)" +echo " - Puertos dinámicos: 5200-5400" +echo "" + +# Iniciar contenedor +sudo ./docker-manage.sh start + +echo "" +echo "🔍 Verificando en 10 segundos..." +sleep 10 + +# Verificar conectividad +if curl -s -f http://localhost:5002 >/dev/null 2>&1; then + echo "✅ ¡ÉXITO! Frontend accesible en http://localhost:5002" + echo "" + echo "📋 Próximos pasos:" + echo " 1. Verificar entornos: ./verify-environments.sh" + echo " 2. Ver logs: ./docker-manage.sh logs" + echo " 3. Acceder: http://localhost:5002" +else + echo "❌ Frontend aún no accesible. Verificando logs..." + sudo ./docker-manage.sh logs | tail -10 +fi \ No newline at end of file