Cómo funciona
Vision es un plano de control sobre Cesbo Alta. Alta ingiere y entrega los streams de las cámaras; Vision administra cámaras, usuarios, grabaciones y alertas, y hace de proxy del video hacia el navegador.
Binario único
Sección titulada «Binario único»El servidor es un único binario de Go con la interfaz web en Vue 3 y el motor de base de datos SQLite integrados. La interfaz se incorpora en tiempo de compilación mediante //go:embed, por lo que no hay nada más que instalar — ni Node.js, ni un servidor web aparte, ni una base de datos externa. El estado vive en un único archivo SQLite (modo WAL); las migraciones del esquema se ejecutan automáticamente al iniciar.
Integración con Alta
Sección titulada «Integración con Alta»Vision se comunica con cada servidor Alta mediante REST para el CRUD y el estado de las cámaras, y gestiona el video para el navegador:
sequenceDiagram
participant B as Browser
participant V as Vision
participant A as Cesbo Alta
B->>V: Open camera
V->>A: Negotiate stream (signed token)
B-->>A: WHEP (WebRTC) — low latency
Note over B,A: falls back to HLS if WebRTC fails
A-->>B: Live video
Cada llamada saliente a Alta está envuelta con reintentos, un circuit breaker y un bulkhead que limita la concurrencia. Si un servidor Alta deja de ser accesible, Vision descarta la carga de ese servidor únicamente y sigue atendiendo al resto — un Alta degradado nunca derriba el proceso. El video en vivo tiene su propio breaker por servidor, de modo que una ráfaga de solicitudes de video fallidas nunca pausa PTZ, el archivo ni las comprobaciones de estado.
Una breve interrupción de conectividad o un reinicio rápido de Alta se distinguen de una caída prolongada: Vision corrobora una falla sospechada en dos comprobaciones consecutivas — y, en caso de reinicio, contra el ID de instancia y el uptime reportados por Alta — antes de poner las cámaras fuera de línea. Las interrupciones breves no hacen oscilar las cámaras, las caídas reales se detectan en pocos segundos, y un servidor que oscila repetidamente se reporta como caído una sola vez en lugar de como una tormenta de eventos.
Streaming
Sección titulada «Streaming»La reproducción usa WHEP (WebRTC) primero por su baja latencia, y recurre a HLS automáticamente. Una cámara puede tener un segundo stream Sub de baja resolución: Alta obtiene un segundo receptor en el mismo canal, y los videowalls densos reproducen el Sub mientras que las vistas grandes reproducen el Main — consulta Streams Main y Sub. El acceso al stream se autoriza con JWT HS256 de corta duración firmados por separado para cada servidor Alta, de modo que las solicitudes de lista de reproducción y de WebRTC no pueden reutilizarse indefinidamente.
Workers en segundo plano
Sección titulada «Workers en segundo plano»El trabajo que no debe bloquear las solicitudes se ejecuta en workers, cada uno de los cuales se degrada de forma independiente: health_server (estado del servidor Alta y detección de desviaciones de configuración), health_camera (estado de las cámaras), alta_prober (sondeo rápido de disponibilidad), clips (exportación con ffmpeg), alerts, notifications, reconcile (limpieza de recursos huérfanos de Alta) y cleanup (retención). El conjunto habilitado es configurable.
Las capturas de pantalla manuales se inician desde el navegador. El antiguo nombre de worker screenshots no es válido; io se ha retirado del conjunto predeterminado y solo se mantiene como opción voluntaria por compatibilidad.
La entrega de alertas y notificaciones es duradera: las entregas pendientes se persisten y se reintentan con espera progresiva, y sobreviven a un reinicio.
El worker reconcile solo elimina un recurso que pueda demostrar que Vision creó — un registro de propiedad escrito en el momento de la creación, no una suposición a partir del nombre del recurso — de modo que dos instalaciones que comparten un mismo servidor Alta nunca pueden eliminarse recursos entre sí. Consulta Conectar un servidor Alta para ver la perspectiva orientada al operador.
Seguridad
Sección titulada «Seguridad»- Autenticación con sesiones JWT; contraseñas con hash Argon2id.
- Control de acceso basado en roles — administrador global más operador/observador por grupo.
- Cifrado en reposo (AES-256-GCM) para campos sensibles como las credenciales de Alta, con soporte de rotación de claves.
- Refuerzo de seguridad — CSP estricta y HSTS en producción, límite de tasa por usuario, y un usuario de sistema dedicado sin inicio de sesión cuando se instala como servicio.
Observabilidad
Sección titulada «Observabilidad»El servidor expone /healthz, /readyz y /metrics de Prometheus, emite logs JSON estructurados y propaga un X-Request-ID en cada solicitud y en cada llamada saliente a Alta para la trazabilidad de extremo a extremo.