# Arquitectura e implantación ## Arquitectura limpia (monitor Python) Bajo `monitor/src/adn_monitor/`: - **Dominio** — entidades, errores, `Result`, opcodes, `UserSession`. - **Aplicación** — `MonitorState`, casos de uso (auth, self-service, informes, dashboard), puertos (`AuthRepository`, `HttpFetcherPort`, …). - **Infraestructura** — YAML, FastAPI (REST + `/ws`), ingest TCP (Twisted en hilo) o MQTT, MySQL, decodificadores de informes. El **composition root** está en `infrastructure/fastapi/composition.py` (`build_monitor_api`). ```mermaid flowchart TD INF["Infraestructura
YAML · FastAPI /ws · ingest TCP/MQTT
MySQL · decodificadores pickle/JSON"] APP["Aplicación
MonitorState · informes/dashboard
auth · self-service · alias"] DOM["Dominio
objetos de valor · errores · opcodes
UserSession · Result"] INF --> APP --> DOM ``` ## Proceso unificado (`monitor.py`) Un solo proceso uvicorn/FastAPI: | Ruta / rol | Contenido | |------------|-----------| | `/api/*` | Config dashboard, auth, self-service, proxy alias/status | | `/ws` | Protocolo `conf,` — CTABLE, Last Heard, voz | | Ingest (fondo) | `MONITOR_APP.INGEST`: `tcp` (cliente a `ADN_CONNECTION`) **o** `mqtt` (tópicos `state` + `voice_event`) | | Alias (fondo) | Descarga → `FILES.PATH`; import con **staging + RENAME** (commits cada 10k en staging; swap breve); merge con commits cada 2k; **PK en `id`** | ## Protocolo de informes (desde el peer server) Modos de ingest según el peer: legacy (pickle), v1 HELLO, v2 slim (`dashboard_state` + `voice_event`). Ver [Monitor e informes](../server/user-guide/monitoring.md). ## Frontend - **Vite + React** en `frontend/`; build → `frontend/dist/`. - Desarrollo: Vite hace proxy de `/api` y `/ws` a `MONITOR_APP.LISTEN_PORT` (p. ej. 8080). - Producción: Nginx sirve estáticos y proxifica `/api` + `/ws` al mismo puerto FastAPI. ## Proxy hotspot **Integrado (predeterminado):** `adn-server.py` con `PROXY` + `SELF_SERVICE` en `adn-server.yaml`. Ver [Proxy hotspot integrado](../server/user-guide/hotspot-proxy.md). El proceso **`adn-proxy`** independiente se eliminó del repositorio **adn-monitor**; usa solo **`PROXY`** integrado. ## Topología típica ```mermaid flowchart TD HS[Hotspots] -->|UDP HBP| PROXY[adn-server PROXY] PROXY --> MASTER[MASTER inyectado] PROXY --> DB[(MySQL Clients)] MASTER --> REPORT[REPORTS listener] REPORT <-->|TCP o MQTT| ING[monitor.py ingest] ING --> APP[FastAPI /api /ws] APP --> DB BR[Navegador] -->|HTTPS| FE[Nginx o SERVE_STATIC] FE --> APP ``` --- ## Ver también - [Inicio de la documentación](../README.md) - [Configuración](configuration.md) - [Self-service](self-service.md)