Manual Técnico & Arquitectura del Software
Documentación de bajo nivel sobre el desacoplamiento de componentes, proxies inversos, persistencia en SQLite (WAL), indexación concurrente en Python y protocolos de comunicación TR-069 CWMP.
🏗️ 1. Topología del Sistema
La suite opera bajo un patrón de Microservicios Desacoplados en ejecución nativa sobre el sistema operativo Linux (Bare-Metal). Los microservicios de backend no están expuestos a Internet y se comunican a través de un proxy inverso autenticado.
Navegador del Usuario / Cliente
Tráfico Web Externo AutenticadoServidor Nginx + PHP-FPM 8.3/8.4 (IoPlay Customers)
Enrutador MVC & Puerta de Enlace de Seguridad Unificada (Puerto 5540)IoPlay DCM (Puerto 5541)
Visor Documental & Indexador- Runtime: Python 3.12 (Gunicorn 3w / PM2)
- Motor: Flask + Watchdog (Tiempo Real)
- Base de Datos: facturas_index.db (SQLite)
- Almacenamiento: /cableexito y /infobox
IoPlay ACS (Puerto 5542)
Gestión TR-069 & Control WiFi- Runtime: Python 3.12 (Gunicorn 3w / PM2)
- Motor: Flask + Requests Proxy
- Concentrador: GenieACS (15.235.32.113:5502)
- Protocolo: CWMP / TR-069 Bearer Token
🔌 2. Microservicios, Runtime y Puertos
| Componente | Runtime / Framework | Puerto / Socket | Aislamiento |
|---|---|---|---|
| IoPlay Customers | PHP 8.3/8.4-FPM + Nginx | 0.0.0.0:5540 |
Público (Portal Web Autenticado) |
| IoPlay DCM | Python 3.12 (Gunicorn 3w / PM2) | 127.0.0.1:5541 |
Privado / Loopback Estricto |
| IoPlay ACS | Python 3.12 (Gunicorn 3w / PM2) | 127.0.0.1:5542 |
Privado / Loopback Estricto |
| Reservado / Soporte | Microservicio / Tooling | 127.0.0.1:5543 |
Privado / Diagnóstico |
| Servidor IoACS | GenieACS Remote API | 15.235.32.113:5502 |
Conexión Tokenizada Backend-to-Backend |
🗄️ 3. Esquema de Bases de Datos SQLite 3 (WAL Mode)
La suite no requiere servidores MySQL ni bases de datos externas pesadas; utiliza motores SQLite 3 embebidos configurados con PRAGMA journal_mode = WAL; y PRAGMA synchronous = NORMAL; para soportar lecturas y escrituras concurrentes sin bloqueo de hilos.
A. Base de Datos de Facturas e Indexador (facturas_index.db)
B. Base de Datos de Usuarios y Auditoría
ioplay-customers/data/users.db: Almacena usuarios administrativos y contraseñas hasheadas con algoritmo BCRYPT (password_hash).ioplay-customers/data/audit.db: Registro inmutable de consultas realizadas por operadores (IP, suscriptor consultado, fecha/hora, acción).
🔄 4. Proxy Inverso y Enrutamiento Seguro (PHP)
Para evitar que el navegador del usuario tenga que acceder a múltiples puertos o servidores, ProxyController.php actúa como puerta de enlace unificada:
El controlador reescribe al vuelo las cabeceras, rutas relativas y llamadas API en el HTML/JS resultante para garantizar que el navegador siempre mantenga la sesión bajo el mismo dominio y puerto 5540.
⚙️ 5. Motor de Indexación DCM (Python)
El motor ioplay-dcm monitorea recursivamente hasta 9 rutas físicas de almacenamiento documental (ej: /var/www/html/cableexito/documentosdigitales y /var/www/html/infobox/documentosdigitales):
- Watchdog Observer: Detecta eventos de creación y modificación de archivos en el sistema de archivos del servidor.
- Extractor Regex de Metadatos: Parsea el nombre del archivo PDF para extraer automáticamente el número de abonado/cédula, tipo documental (Factura, Contrato, Orden), año y mes.
- Upsert Atómico: Realiza inserciones con cláusula
ON CONFLICT(file_relative_path) DO UPDATEpara actualizar modificaciones sin generar duplicados.
📡 6. Motor TR-069 & GenieACS (IoPlay ACS)
El microservicio ioplay-acs se comunica con el concentrador TR-069 remoto utilizando tokens Bearer y manejando normalización de seriales de fabricantes:
Esto permite buscar equipos indistintamente si el CRM o el usuario ingresa el serial en formato ASCII (OPTI4B5B715B) o en formato Hexadecimal (4F5054494B5B715B).
🛡️ 7. Mecanismos de Seguridad y Hardening
- Aislamiento de Raíz Web: Nginx solo sirve la carpeta
/public. Los directorios de código, scripts y bases de datos.dbson inaccesibles por HTTP. - Consultas Parametrizadas: 100% de las consultas SQL en PHP (PDO) y Python (sqlite3) usan parámetros vinculados, neutralizando cualquier intento de inyección SQL.
- Ocultamiento de Credenciales: Los tokens de CRM y TR-069 residen en los archivos
.envy nunca se transmiten al cliente.