SIDEL_ScriptsManager/docker-manage.sh

496 lines
17 KiB
Bash
Executable File

#!/bin/bash
# Script de gestión Docker para SIDEL ScriptsManager
# Compatible con las especificaciones del proyecto
# Uso: ./docker-manage.sh [comando]
set -e
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
# Variables del proyecto SIDEL
SIDEL_APP_PORT=5002
SIDEL_DEV_PORT=5003
SIDEL_SCRIPT_PORT_RANGE="5200-5400"
SIDEL_CONTAINER_NAME="sidel_scriptsmanager"
SIDEL_DEV_CONTAINER_NAME="sidel_scriptsmanager_dev"
# Función para mostrar banner SIDEL
show_banner() {
echo -e "${BLUE}================================================================${NC}"
echo -e "${BLUE} SIDEL ScriptsManager - Docker Management ${NC}"
echo -e "${BLUE}================================================================${NC}"
echo -e "${PURPLE}Multi-User Script Manager with Conda Environments${NC}"
echo -e "${PURPLE}Frontend Port: ${SIDEL_APP_PORT} | Script Ports: ${SIDEL_SCRIPT_PORT_RANGE}${NC}"
echo -e "${BLUE}================================================================${NC}"
echo ""
}
# Función para mostrar ayuda
show_help() {
show_banner
echo "Uso: $0 [comando]"
echo ""
echo "Comandos disponibles:"
echo -e " ${GREEN}build${NC} Construir la imagen Docker"
echo -e " ${GREEN}start${NC} Iniciar SIDEL ScriptsManager en producción"
echo -e " ${GREEN}start-dev${NC} Iniciar en modo desarrollo con hot-reload"
echo -e " ${GREEN}start-backup${NC} Iniciar servicio de backup automático"
echo -e " ${GREEN}start-monitoring${NC} Iniciar servicio de monitoreo de logs"
echo -e " ${GREEN}stop${NC} Detener todos los contenedores"
echo -e " ${GREEN}restart${NC} Reiniciar el contenedor principal"
echo -e " ${GREEN}logs${NC} Mostrar logs del contenedor principal"
echo -e " ${GREEN}logs-dev${NC} Mostrar logs del contenedor de desarrollo"
echo -e " ${GREEN}shell${NC} Abrir shell en el contenedor principal"
echo -e " ${GREEN}shell-dev${NC} Abrir shell en el contenedor de desarrollo"
echo -e " ${GREEN}backup${NC} Ejecutar backup manual del sistema"
echo -e " ${GREEN}clean${NC} Limpiar contenedores e imágenes no utilizadas"
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}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"
echo -e " ${GREEN}ports${NC} Mostrar puertos en uso"
echo -e " ${GREEN}users${NC} Gestionar usuarios (requiere shell activo)"
echo ""
echo "Servicios opcionales (perfiles):"
echo -e " ${YELLOW}--profile dev${NC} Modo desarrollo"
echo -e " ${YELLOW}--profile backup${NC} Backup automático"
echo -e " ${YELLOW}--profile monitoring${NC} Monitoreo de logs"
echo ""
echo "Ejemplos:"
echo " $0 build && $0 start"
echo " $0 start-dev"
echo " $0 logs -f"
echo " $0 verify"
}
# Función para verificar si docker-compose está disponible
check_docker_compose() {
# Verificar permisos de Docker primero
if ! docker ps &> /dev/null; then
echo -e "${RED}Error: No tienes permisos para acceder a Docker${NC}"
echo -e "${YELLOW}Soluciones posibles:${NC}"
echo "1. Reinicia tu terminal/WSL después de agregar tu usuario al grupo docker"
echo "2. O ejecuta: sudo usermod -aG docker \$USER && newgrp docker"
echo "3. O usa sudo: sudo ./docker-manage.sh [comando]"
echo "4. O ejecuta: su - \$USER (para recargar grupos)"
exit 1
fi
if command -v docker-compose &> /dev/null; then
DOCKER_COMPOSE="docker-compose"
elif docker compose version &> /dev/null; then
DOCKER_COMPOSE="docker compose"
else
echo -e "${RED}Error: docker-compose no está disponible${NC}"
echo -e "${YELLOW}Instalando docker-compose...${NC}"
# Intentar instalar docker-compose
if command -v apt &> /dev/null; then
sudo apt update && sudo apt install -y docker-compose
elif command -v yum &> /dev/null; then
sudo yum install -y docker-compose
else
echo "Por favor instala docker-compose manualmente"
exit 1
fi
# Verificar nuevamente
if command -v docker-compose &> /dev/null; then
DOCKER_COMPOSE="docker-compose"
else
exit 1
fi
fi
}
# Función para construir la imagen
build_image() {
show_banner
echo -e "${BLUE}Construyendo imagen Docker para SIDEL ScriptsManager...${NC}"
check_docker_compose
# Verificar estructura de directorios antes de construir
if [ -d "backend/script_groups" ]; then
echo -e "${RED}❌ ERROR: Encontrado directorio incorrecto 'backend/script_groups/'${NC}"
echo -e "${RED} Según especificaciones SIDEL, los scripts deben estar en 'app/backend/script_groups/' únicamente${NC}"
exit 1
fi
if [ ! -d "app/backend/script_groups" ]; then
echo -e "${YELLOW}⚠️ Creando directorio app/backend/script_groups/...${NC}"
mkdir -p app/backend/script_groups/hammer
mkdir -p app/backend/script_groups/data_processing
mkdir -p app/backend/script_groups/system_utilities
fi
$DOCKER_COMPOSE build scriptsmanager
echo -e "${GREEN}✅ Imagen SIDEL ScriptsManager construida exitosamente${NC}"
}
# Función para iniciar en producción
start_production() {
show_banner
echo -e "${BLUE}Iniciando SIDEL ScriptsManager en modo producción...${NC}"
check_docker_compose
# Crear directorios necesarios según especificaciones SIDEL
echo -e "${BLUE}Preparando estructura de directorios...${NC}"
mkdir -p data/script_groups data/system
mkdir -p logs/executions logs/system logs/audit
mkdir -p backup/daily
mkdir -p instance
# Copiar archivo de entorno si no existe
if [ ! -f .env ]; then
echo -e "${YELLOW}Creando archivo .env desde .env.example${NC}"
cp .env.example .env
echo -e "${YELLOW}¡IMPORTANTE: Edita el archivo .env con tus configuraciones de producción!${NC}"
fi
$DOCKER_COMPOSE up -d scriptsmanager
echo -e "${GREEN}✅ SIDEL ScriptsManager iniciado en http://localhost:${SIDEL_APP_PORT}${NC}"
echo -e "${BLUE}📊 Dashboard multiusuario disponible${NC}"
echo -e "${BLUE}🔧 Scripts TSNet en puertos ${SIDEL_SCRIPT_PORT_RANGE}${NC}"
}
# Función para iniciar en desarrollo
start_development() {
show_banner
echo -e "${BLUE}Iniciando SIDEL ScriptsManager en modo desarrollo...${NC}"
check_docker_compose
mkdir -p data/script_groups data/system
mkdir -p logs/executions logs/system logs/audit
mkdir -p backup/daily
if [ ! -f .env ]; then
cp .env.example .env
fi
$DOCKER_COMPOSE --profile dev up -d scriptsmanager-dev
echo -e "${GREEN}✅ SIDEL ScriptsManager (desarrollo) iniciado en http://localhost:${SIDEL_DEV_PORT}${NC}"
echo -e "${BLUE}🔄 Hot-reload activado para desarrollo${NC}"
}
# Función para iniciar backup automático
start_backup_service() {
show_banner
echo -e "${BLUE}Iniciando servicio de backup automático...${NC}"
check_docker_compose
$DOCKER_COMPOSE --profile backup up -d backup
echo -e "${GREEN}✅ Servicio de backup automático iniciado${NC}"
echo -e "${BLUE}📦 Backups diarios programados${NC}"
}
# Función para iniciar monitoreo
start_monitoring() {
show_banner
echo -e "${BLUE}Iniciando servicio de monitoreo de logs...${NC}"
check_docker_compose
$DOCKER_COMPOSE --profile monitoring up -d log-monitor
echo -e "${GREEN}✅ Servicio de monitoreo iniciado${NC}"
echo -e "${BLUE}📊 Monitoreo de logs multiusuario activado${NC}"
}
# Función para detener contenedores
stop_containers() {
echo -e "${BLUE}Deteniendo contenedores...${NC}"
check_docker_compose
$DOCKER_COMPOSE down
echo -e "${GREEN}Contenedores detenidos${NC}"
}
# Función para reiniciar
restart_container() {
echo -e "${BLUE}Reiniciando contenedor principal...${NC}"
check_docker_compose
$DOCKER_COMPOSE restart scriptsmanager
echo -e "${GREEN}Contenedor reiniciado${NC}"
}
# Función para mostrar logs
show_logs() {
check_docker_compose
$DOCKER_COMPOSE logs "${@:2}" scriptsmanager
}
# Función para mostrar logs de desarrollo
show_dev_logs() {
check_docker_compose
$DOCKER_COMPOSE logs "${@:2}" scriptsmanager-dev
}
# Función para abrir shell
open_shell() {
check_docker_compose
echo -e "${BLUE}Abriendo shell en el contenedor...${NC}"
$DOCKER_COMPOSE exec scriptsmanager bash
}
# Función para abrir shell de desarrollo
open_dev_shell() {
check_docker_compose
echo -e "${BLUE}Abriendo shell en el contenedor de desarrollo...${NC}"
$DOCKER_COMPOSE exec scriptsmanager-dev bash
}
# Función para backup manual
manual_backup() {
echo -e "${BLUE}Ejecutando backup manual...${NC}"
check_docker_compose
$DOCKER_COMPOSE exec scriptsmanager bash -c "source activate scriptsmanager && python -c 'from app.services.backup_service import BackupService; BackupService().create_backup()'"
echo -e "${GREEN}Backup completado${NC}"
}
# Función para limpiar Docker
clean_docker() {
echo -e "${YELLOW}Limpiando contenedores e imágenes no utilizadas...${NC}"
docker system prune -f
echo -e "${GREEN}Limpieza completada${NC}"
}
# Función para reset completo
reset_all() {
echo -e "${RED}¡ADVERTENCIA! Esto eliminará todos los datos y contenedores.${NC}"
read -p "¿Estás seguro? (escribe 'yes' para continuar): " -r
if [[ $REPLY == "yes" ]]; then
check_docker_compose
$DOCKER_COMPOSE down -v
docker system prune -af
sudo rm -rf data/* backup/* logs/*
echo -e "${GREEN}Reset completado${NC}"
else
echo -e "${YELLOW}Operación cancelada${NC}"
fi
}
# Función para mostrar estado
show_status() {
echo -e "${BLUE}Estado de los contenedores:${NC}"
check_docker_compose
$DOCKER_COMPOSE ps
}
# Función para listar entornos conda
list_conda_envs() {
echo -e "${BLUE}Entornos conda disponibles:${NC}"
check_docker_compose
$DOCKER_COMPOSE exec scriptsmanager bash -c "conda env list"
}
# Función para verificar salud
health_check() {
echo -e "${BLUE}Verificando salud de SIDEL ScriptsManager...${NC}"
if curl -f http://localhost:${SIDEL_APP_PORT}/health >/dev/null 2>&1; then
echo -e "${GREEN}✓ Aplicación saludable en puerto ${SIDEL_APP_PORT}${NC}"
else
echo -e "${RED}✗ Aplicación no responde en puerto ${SIDEL_APP_PORT}${NC}"
exit 1
fi
}
# Función para inicializar base de datos SIDEL
init_database() {
show_banner
echo -e "${BLUE}Inicializando base de datos SIDEL ScriptsManager...${NC}"
check_docker_compose
if ! docker ps | grep -q $SIDEL_CONTAINER_NAME; then
echo -e "${YELLOW}Contenedor no está ejecutándose. Iniciando temporalmente...${NC}"
$DOCKER_COMPOSE up -d scriptsmanager
sleep 10
fi
$DOCKER_COMPOSE exec scriptsmanager bash -c "source activate scriptsmanager && python scripts/init_sidel_db.py"
echo -e "${GREEN}✅ Base de datos SIDEL inicializada${NC}"
}
# Función para verificar configuración completa
verify_configuration() {
show_banner
echo -e "${BLUE}Verificando configuración SIDEL ScriptsManager...${NC}"
echo -e "${BLUE}📁 Verificando estructura de directorios...${NC}"
# Verificar directorios críticos
if [ ! -d "app/backend/script_groups" ]; then
echo -e "${RED}❌ app/backend/script_groups/ no encontrado${NC}"
return 1
else
echo -e "${GREEN}✅ app/backend/script_groups/ correcto${NC}"
fi
if [ -d "backend/script_groups" ]; then
echo -e "${RED}❌ backend/script_groups/ existe (NO debería existir)${NC}"
return 1
else
echo -e "${GREEN}✅ backend/script_groups/ no existe (correcto)${NC}"
fi
# Verificar archivos de configuración
if [ -f "requirements.txt" ]; then
echo -e "${GREEN}✅ requirements.txt encontrado${NC}"
else
echo -e "${RED}❌ requirements.txt no encontrado${NC}"
fi
if [ -f "app/backend/script_groups/hammer/requirements.txt" ]; then
echo -e "${GREEN}✅ TSNet requirements.txt encontrado${NC}"
else
echo -e "${RED}❌ TSNet requirements.txt no encontrado${NC}"
fi
# Verificar contenedor si está ejecutándose
if docker ps | grep -q $SIDEL_CONTAINER_NAME; then
echo -e "${BLUE}🐳 Verificando entornos conda en contenedor...${NC}"
# Verificar entornos conda
echo -e "${BLUE}📋 Entornos conda disponibles:${NC}"
$DOCKER_COMPOSE exec scriptsmanager conda env list
echo -e "${BLUE}🔍 Verificando paquetes en entorno scriptsmanager:${NC}"
$DOCKER_COMPOSE exec scriptsmanager bash -c "source activate scriptsmanager && python -c 'import flask, flask_socketio; print(f\"Flask: {flask.__version__}, SocketIO: {flask_socketio.__version__}\")'"
echo -e "${BLUE}🔍 Verificando paquetes en entorno tsnet:${NC}"
$DOCKER_COMPOSE exec scriptsmanager bash -c "source activate tsnet && python -c 'import numpy, matplotlib; print(f\"NumPy: {numpy.__version__}, Matplotlib: {matplotlib.__version__}\")'"
# Verificar puertos
echo -e "${BLUE}🔌 Verificando puertos:${NC}"
if curl -s http://localhost:${SIDEL_APP_PORT} >/dev/null; then
echo -e "${GREEN}✅ Puerto ${SIDEL_APP_PORT} (frontend) accesible${NC}"
else
echo -e "${YELLOW}⚠️ Puerto ${SIDEL_APP_PORT} (frontend) no accesible${NC}"
fi
else
echo -e "${YELLOW}⚠️ Contenedor no está ejecutándose${NC}"
echo -e "${BLUE}💡 Ejecuta: $0 start${NC}"
fi
echo -e "${GREEN}✅ Verificación completada${NC}"
}
# Función para mostrar puertos en uso
show_ports() {
show_banner
echo -e "${BLUE}Estado de puertos SIDEL ScriptsManager:${NC}"
echo ""
echo -e "${BLUE}Puerto Frontend:${NC} ${SIDEL_APP_PORT}"
echo -e "${BLUE}Puerto Desarrollo:${NC} ${SIDEL_DEV_PORT}"
echo -e "${BLUE}Rango Scripts:${NC} ${SIDEL_SCRIPT_PORT_RANGE}"
echo ""
if command -v netstat >/dev/null 2>&1; then
echo -e "${BLUE}Puertos actualmente en uso:${NC}"
netstat -tlnp 2>/dev/null | grep -E ":(5002|5003|520[0-9]|53[0-9][0-9]|5400)" || echo "Ningún puerto SIDEL en uso"
elif command -v ss >/dev/null 2>&1; then
echo -e "${BLUE}Puertos actualmente en uso:${NC}"
ss -tlnp | grep -E ":(5002|5003|520[0-9]|53[0-9][0-9]|5400)" || echo "Ningún puerto SIDEL en uso"
else
echo -e "${YELLOW}⚠️ netstat/ss no disponible para verificar puertos${NC}"
fi
}
# Función para gestión de usuarios
manage_users() {
show_banner
echo -e "${BLUE}Gestión de usuarios SIDEL ScriptsManager${NC}"
if ! docker ps | grep -q $SIDEL_CONTAINER_NAME; then
echo -e "${RED}❌ El contenedor no está ejecutándose${NC}"
echo -e "${BLUE}💡 Ejecuta: $0 start${NC}"
return 1
fi
echo -e "${BLUE}Abriendo shell para gestión de usuarios...${NC}"
echo -e "${YELLOW}Comandos útiles:${NC}"
echo " - python scripts/create_admin.py --username <user> --password <pass>"
echo " - python scripts/list_users.py"
echo " - python scripts/manage_users.py"
echo ""
$DOCKER_COMPOSE exec scriptsmanager bash -c "source activate scriptsmanager && bash"
}
# Script principal
case "${1:-help}" in
build)
build_image
;;
start)
start_production
;;
start-dev)
start_development
;;
start-backup)
start_backup_service
;;
start-monitoring)
start_monitoring
;;
stop)
stop_containers
;;
restart)
restart_container
;;
logs)
show_logs "$@"
;;
logs-dev)
show_dev_logs "$@"
;;
shell)
open_shell
;;
shell-dev)
open_dev_shell
;;
backup)
manual_backup
;;
clean)
clean_docker
;;
reset)
reset_all
;;
status)
show_status
;;
envs)
list_conda_envs
;;
health)
health_check
;;
init-db)
init_database
;;
verify)
verify_configuration
;;
ports)
show_ports
;;
users)
manage_users
;;
help|--help|-h)
show_help
;;
*)
echo -e "${RED}Comando desconocido: $1${NC}"
show_help
exit 1
;;
esac