358 lines
10 KiB
Markdown
358 lines
10 KiB
Markdown
# 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:
|
|
|
|
```python
|
|
"""
|
|
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:
|
|
|
|
```python
|
|
# 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
|
|
|
|
```python
|
|
# 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:
|
|
|
|
```yaml
|
|
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:
|
|
|
|
```yaml
|
|
volumes:
|
|
- ./workspaces:/app/workspaces
|
|
```
|
|
|
|
## Migración de Scripts Existentes
|
|
|
|
### Pasos para Adaptar Scripts
|
|
|
|
1. **Eliminar Argumentos de Línea de Comandos**
|
|
```python
|
|
# 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**
|
|
```python
|
|
# 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**
|
|
```python
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# Desde el contenedor
|
|
source activate scriptsmanager
|
|
python scripts/migrate_proxy_system.py
|
|
```
|
|
|
|
### Testing del Sistema Proxy
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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! |