# Dockerfile para SIDEL Manager Scripts con Miniconda # Compatible con las especificaciones del proyecto SIDEL ScriptsManager FROM continuumio/miniconda3:latest # Metadatos del container LABEL maintainer="SIDEL Manager Scripts" LABEL description="Multi-user script manager with conda environments" LABEL version="1.0.0" # Variables de entorno según especificaciones SIDEL ENV PYTHONUNBUFFERED=1 ENV CONDA_ENV_NAME=scriptsmanager ENV TSNET_ENV_NAME=tsnet ENV APP_HOME=/app ENV DATA_HOME=/app/data ENV BACKUP_HOME=/app/backup ENV LOGS_HOME=/app/logs # Variables específicas del proyecto SIDEL ENV SECRET_KEY=change-this-in-production ENV DEBUG=false ENV BASE_DATA_PATH=/app/data ENV PORT_RANGE_START=5200 ENV PORT_RANGE_END=5400 ENV MAX_PROJECTS_PER_USER=50 ENV BACKUP_ENABLED=true ENV DEFAULT_LANGUAGE=en # Actualizar sistema y instalar dependencias del sistema RUN apt-get update && apt-get install -y \ build-essential \ curl \ git \ sqlite3 \ vim \ nano \ htop \ procps \ wget \ unzip \ libsqlite3-dev \ && rm -rf /var/lib/apt/lists/* # Crear estructura de directorios según especificaciones SIDEL RUN mkdir -p $APP_HOME $DATA_HOME $BACKUP_HOME $LOGS_HOME && \ mkdir -p $DATA_HOME/script_groups \ $DATA_HOME/system \ $LOGS_HOME/executions \ $LOGS_HOME/system \ $LOGS_HOME/audit \ $BACKUP_HOME/daily # Establecer directorio de trabajo WORKDIR $APP_HOME # Copiar archivos de configuración de dependencias COPY requirements.txt requirements-dev.txt ./ COPY app/backend/script_groups/hammer/requirements.txt ./tsnet_requirements.txt # Crear entorno conda principal para SIDEL ScriptsManager (Frontend Flask) RUN conda create -n $CONDA_ENV_NAME python=3.12 -y # Activar entorno principal y configurar PATH RUN echo "source activate $CONDA_ENV_NAME" > ~/.bashrc ENV PATH /opt/conda/envs/$CONDA_ENV_NAME/bin:$PATH # Instalar dependencias Python en el entorno principal (ScriptsManager) RUN /opt/conda/envs/$CONDA_ENV_NAME/bin/pip install --no-cache-dir -r requirements.txt # Crear entorno específico para TSNet (Water Hammer Simulator) RUN conda create -n $TSNET_ENV_NAME python=3.12 -y # Instalar dependencias de TSNet en su entorno específico RUN /opt/conda/envs/$TSNET_ENV_NAME/bin/pip install --no-cache-dir -r tsnet_requirements.txt # Copiar código de la aplicación COPY . . # Crear estructura de directorios necesaria según especificaciones SIDEL RUN mkdir -p \ app/backend/script_groups/hammer \ app/backend/script_groups/data_processing \ app/backend/script_groups/system_utilities \ app/backend/logs/executions \ data/script_groups/group_2 \ data/script_groups/group_3 \ data/script_groups/group_5 \ data/script_groups/logs \ data/system \ instance \ logs/executions \ logs/system \ logs/audit \ backup/daily # Verificar que NO existe backend/script_groups/ (solo app/backend/script_groups/) RUN if [ -d "backend/script_groups" ]; then \ echo "ERROR: Found backend/script_groups/ - This should NOT exist!"; \ echo "All scripts must be in app/backend/script_groups/ only"; \ exit 1; \ fi # Establecer permisos correctos RUN chmod +x scripts/*.py && \ chown -R root:root $APP_HOME && \ chmod 755 $DATA_HOME $BACKUP_HOME $LOGS_HOME # Crear script de inicialización específico para SIDEL ScriptsManager RUN echo '#!/bin/bash\n\ set -e\n\ echo "=== SIDEL ScriptsManager Initialization ==="\n\ source activate scriptsmanager\n\ cd /app\n\ \n\ # Verificar estructura de directorios\n\ echo "Checking directory structure..."\n\ if [ ! -d "app/backend/script_groups" ]; then\n\ echo "ERROR: app/backend/script_groups directory not found!"\n\ exit 1\n\ fi\n\ \n\ # Inicializar base de datos SQLite\n\ echo "Initializing SQLite database..."\n\ python scripts/init_db.py\n\ \n\ # Verificar entornos conda\n\ echo "Available conda environments:"\n\ conda env list\n\ \n\ echo "ScriptsManager environment packages:"\n\ conda list -n scriptsmanager | grep -E "(flask|sqlalchemy)" || true\n\ \n\ echo "TSNet environment packages:"\n\ conda list -n tsnet | grep -E "(tsnet|numpy|matplotlib)" || true\n\ \n\ echo "=== Starting SIDEL ScriptsManager ==="\n\ 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 # Volúmenes para persistencia de datos VOLUME ["$DATA_HOME", "$BACKUP_HOME", "$LOGS_HOME"] # Punto de entrada ENTRYPOINT ["/app/docker-entrypoint.sh"] # Comando por defecto (usa el puerto correcto del frontend) CMD ["/opt/conda/envs/scriptsmanager/bin/python", "scripts/run_app.py"]