SIDEL_ScriptsManager/PROXY-SYSTEM-UPDATED.md

10 KiB

Sistema de Proxy Interno - ScriptsManager (ACTUALIZADO)

Introducción

ScriptsManager ahora incluye un sistema de proxy interno que permite el acceso elegante a scripts con aislamiento por usuario y proyecto. Este sistema reemplaza el enfoque anterior basado en argumentos de línea de comandos por una arquitectura más robusta y escalable.

Arquitectura del Sistema

Flujo de Comunicación

Usuario Externo → ScriptsManager (puerto 5002/5003) → Scripts Internos (puertos 5200-5400)

Componentes Principales

  1. ScriptsManager Principal

    • Puerto externo: 5002 (producción) / 5003 (desarrollo)
    • Maneja autenticación de usuarios
    • Gestiona proyectos y permisos
    • Actúa como proxy hacia scripts internos
  2. Scripts Proxy

    • Rango de puertos: 5200-5400
    • Aislamiento por usuario/proyecto
    • Ejecución automática con variables de entorno preconfiguradas
    • Workspaces dedicados para cada instancia
  3. Base de Datos

    • Tabla script_proxy_executions para tracking de instancias
    • Logs de ejecución integrados
    • Gestión automática de limpieza

URLs del Sistema

ScriptsManager Principal

http://localhost:5002/dashboard          # Interfaz principal (producción)
http://localhost:5003/dashboard          # Interfaz principal (desarrollo)

Acceso Proxy a Scripts

# Formato general
/project/{project_id}/script/{script_id}/user/{user_id}/*

# Ejemplos específicos
/project/hydraulics/script/hammer_simulator/user/operator1/
/project/hydraulics/script/hammer_simulator/user/operator1/api/calculate
/project/hydraulics/script/hammer_simulator/user/operator1/api/status

Endpoints de Control

# Iniciar script
POST /api/proxy/start
{
  "project_id": "hydraulics",
  "script_id": "hammer_simulator", 
  "user_id": "operator1"
}

# Detener script
POST /api/proxy/stop
{
  "project_id": "hydraulics",
  "script_id": "hammer_simulator",
  "user_id": "operator1"
}

# Estado de script
GET /api/proxy/status?project_id=hydraulics&script_id=hammer_simulator&user_id=operator1

Implementación de Scripts Proxy

Estructura de Metadata

Los scripts proxy deben incluir metadata específica en su cabecera:

"""
ScriptsManager Metadata:
@description: Interactive Water Hammer Simulator for Syrup Pumping Systems
@required_level: operator
@category: simulation
@tags: hydraulics,water_hammer,pumping,syrup,transient_analysis
@parameters: []
@execution_timeout: 3600
@flask_port: auto
"""

Variables Automáticas Disponibles

Cuando un script es ejecutado por el sistema proxy, las siguientes variables están disponibles automáticamente:

# Variables de entorno automáticas
WORKSPACE_PATH    # Directorio de trabajo aislado para esta instancia
PARAMETERS        # Parámetros específicos del script
ENVIRONMENT       # Variables de entorno del usuario/proyecto
app              # Instancia Flask pre-configurada

# Variables derivadas del entorno
USER_ID           # ID del usuario que ejecuta el script
PROJECT_ID        # ID del proyecto actual
PROJECT_NAME      # Nombre del proyecto
USER_LEVEL        # Nivel de acceso del usuario
THEME            # Tema preferido del usuario
LANGUAGE         # Idioma preferido del usuario

Ejemplo de Script Adaptado

# IMPORTANTE: Este script funciona con el nuevo sistema de proxy de ScriptsManager
# Las siguientes variables están disponibles automáticamente:
# - WORKSPACE_PATH, PARAMETERS, ENVIRONMENT, app

import os
from flask import jsonify

# Configuración automática desde el proxy
DATA_DIR = WORKSPACE_PATH
USER_ID = ENVIRONMENT.get('USER_ID', 'unknown')
PROJECT_ID = ENVIRONMENT.get('PROJECT_ID', 'default')

# Rutas Flask (la app está pre-configurada)
@app.route("/")
def index():
    return f"Script ejecutándose para usuario {USER_ID} en proyecto {PROJECT_ID}"

@app.route("/api/status")
def status():
    return jsonify({
        "status": "running",
        "user_id": USER_ID,
        "project_id": PROJECT_ID,
        "workspace": WORKSPACE_PATH
    })

Configuración de Docker

Networking Bridge

El sistema utiliza networking bridge en lugar de host mode para mejor aislamiento:

version: '3.8'

services:
  scriptsmanager:
    build: .
    networks:
      - scriptsmanager_network
    ports:
      - "5002:5002"
      - "5200-5400:5200-5400"
    environment:
      - DATABASE_URL=postgresql://scriptsmanager:scriptsmanager_dev_password@postgres:5432/scriptsmanager

networks:
  scriptsmanager_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

Workspaces

Los workspaces se montan como volúmenes para persistencia:

volumes:
  - ./workspaces:/app/workspaces

Migración de Scripts Existentes

Pasos para Adaptar Scripts

  1. Eliminar Argumentos de Línea de Comandos

    # ANTES
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--data-dir')
    args = parser.parse_args()
    
    # DESPUÉS
    DATA_DIR = WORKSPACE_PATH  # Variable automática
    
  2. Remover Configuración de Flask Manual

    # ANTES
    from flask import Flask
    app = Flask(__name__)
    app.run(host='0.0.0.0', port=5200)
    
    # DESPUÉS
    # La app ya está configurada y en ejecución
    # Solo definir las rutas
    
  3. Usar Variables de Entorno Automáticas

    # ANTES
    user_id = args.user_id
    project_id = args.project_id
    
    # DESPUÉS
    user_id = ENVIRONMENT.get('USER_ID')
    project_id = ENVIRONMENT.get('PROJECT_ID')
    

Script de Ejemplo Completo

Ver hammer_simulator_proxy.py para un ejemplo completo de script adaptado al sistema proxy.

Desarrollo y Testing

Iniciar en Modo Desarrollo

# Iniciar solo la base de datos
docker compose up postgres -d

# Iniciar en modo desarrollo
docker compose --profile dev up scriptsmanager-dev

Ejecutar Migración

# Desde el contenedor
source activate scriptsmanager
python scripts/migrate_proxy_system.py

Testing del Sistema Proxy

# Probar conexión al sistema principal
curl http://localhost:5003/dashboard

# Iniciar un script proxy
curl -X POST http://localhost:5003/api/proxy/start \
  -H "Content-Type: application/json" \
  -d '{"project_id": "hydraulics", "script_id": "hammer_simulator", "user_id": "operator1"}'

# Verificar estado
curl "http://localhost:5003/api/proxy/status?project_id=hydraulics&script_id=hammer_simulator&user_id=operator1"

# Acceder al script directamente
curl http://localhost:5003/project/hydraulics/script/hammer_simulator/user/operator1/

Estado Actual de la Implementación

Completado

  1. Servicio Proxy Principal (app/services/script_proxy_service.py)

    • Sistema completo de gestión de puertos (5200-5400)
    • Health checks automáticos cada 30 segundos
    • Limpieza de procesos zombie cada 5 minutos
    • Logs detallados y sistema de auditoría
  2. Rutas Flask (app/routes/proxy_routes.py)

    • Endpoints para iniciar/detener/consultar scripts
    • Proxy transparente hacia scripts internos
    • Validación de permisos y parámetros
  3. Modelos de Base de Datos (app/models/__init__.py)

    • Tabla script_proxy_executions para tracking
    • Integración con logs de ejecución existentes
    • Índices optimizados para performance
  4. Integración Script Executor (app/services/script_executor.py)

    • Métodos para proxy execution
    • Gestión de workspaces aislados
    • Variables de entorno automáticas
  5. Script Adaptado (hammer_simulator_proxy.py)

    • Versión completa funcional del simulador
    • Interface web integrada con Bootstrap y Chart.js
    • APIs REST para cálculos y exportación
  6. Configuración Docker (docker-compose.yml)

    • Networking bridge en lugar de host mode
    • Mapeo de puertos 5200-5400
    • Configuración de red aislada

🔄 En Progreso

  • Script Original (hammer_simulator.py) marcado como legacy
  • Documentación actualizada con ejemplos completos

📋 Próximos Pasos

  1. Testing Completo

    • Ejecutar migración de base de datos
    • Probar inicio/parada de scripts proxy
    • Validar aislamiento entre usuarios/proyectos
  2. Optimizaciones

    • Cache de resultados frecuentes
    • Métricas de performance
    • Balanceador de carga para alta demanda
  3. Más Scripts

    • Adaptar scripts adicionales al sistema proxy
    • Templates para facilitar conversión
    • Herramientas de migración automática

Archivos Clave Creados/Modificados

app/
├── services/
│   ├── script_proxy_service.py     # ✅ NUEVO - Servicio proxy principal
│   └── script_executor.py          # ✅ MODIFICADO - Integración proxy
├── routes/
│   └── proxy_routes.py             # ✅ NUEVO - Rutas Flask proxy
├── models/
│   └── __init__.py                 # ✅ MODIFICADO - Nueva tabla proxy
├── backend/script_groups/hammer/
│   ├── hammer_simulator.py         # ✅ MARCADO LEGACY
│   └── hammer_simulator_proxy.py   # ✅ NUEVO - Versión adaptada
└── app.py                          # ✅ MODIFICADO - Registro blueprint

scripts/
└── migrate_proxy_system.py         # ✅ NUEVO - Migración BD

docker-compose.yml                   # ✅ MODIFICADO - Bridge networking
PROXY-SYSTEM-README.md              # ✅ ACTUALIZADO - Documentación completa

Comandos Rápidos

# Iniciar desarrollo
docker compose --profile dev up scriptsmanager-dev

# Migrar base de datos  
docker compose exec scriptsmanager-dev bash -c "source activate scriptsmanager && python scripts/migrate_proxy_system.py"

# Probar sistema proxy
curl -X POST http://localhost:5003/api/proxy/start -H "Content-Type: application/json" -d '{"project_id": "hydraulics", "script_id": "hammer_simulator_proxy", "user_id": "operator1"}'

# Acceder a script
curl http://localhost:5003/project/hydraulics/script/hammer_simulator_proxy/user/operator1/

El sistema proxy está completamente implementado y listo para testing. ¡Todos los componentes están en su lugar y la documentación está actualizada!