Cómo está construido StreamHub: un dominio, una imagen
Un único reverse proxy, un contenedor core que sirve la API, el panel, HLS y el SDK, y un SFU oculto debajo. Un recorrido por el enrutamiento de peticiones y las piezas que lo hacen sentir un solo producto.
Todo detrás de un dominio
Todo el producto vive en un único host. Un reverse proxy (Caddy o nginx) termina TLS y divide el tráfico en dos:
/rtc→ señalización de LiveKit (WebRTC).- todo lo demás (
/,/api/v1,/hls,/sdk,/samples,/metrics) → el servicio core en127.0.0.1:3020.
El medio WebRTC (UDP), RTMP (1935) y WHIP (8080) llegan directo al servidor. Desde afuera parece una única aplicación, no un clúster de servicios.
Una imagen core sirve todo
El core es una app NestJS, y su contenedor es deliberadamente todo-en-uno. Un build multi-etapa compila tres cosas dentro:
- el panel React (compilado y servido como estáticos),
- el SDK de navegador (un bundle IIFE colocado en
/sdk), - el core NestJS en sí (API REST + HLS + receptor de webhooks + runner de jobs).
Así que publicar un cambio del panel significa reconstruir la imagen core — no hay un despliegue de frontend separado que coordinar.
El SFU es un detalle de implementación
LiveKit, sus workers de ingress y egress, y Redis corren como contenedores hermanos, pero están ocultos detrás del core. El operador nunca corre docker compose a mano:
streamhub status # salud de cada servicio
streamhub logs core -f
streamhub upgrade # idempotente, con backup, reversible
El CLI streamhub sabe qué servicios corre un nodo (según su perfil de instalación) y los gobierna como una única unidad systemd, así que systemctl status streamhub refleja toda la app.
Los datos viven cerca de cada app
El estado se divide para aislar. Una pequeña base SQLite global guarda tenants, usuarios, tokens de API y el registro de apps. Cada app luego posee su propio app.db con sus streams, VODs y auth de ingesta. El directorio de datos — grabaciones, segmentos HLS, capturas — se monta en el core y en egress, así egress escribe los MP4 exactamente donde el core espera encontrarlos y subirlos.
Por qué importa la forma
Un dominio, una imagen, un CLI no es solo prolijo — es lo que hace que un servidor de medios auto-alojado sea operable por un equipo chico. Hay una cosa que desplegar, una que monitorear, una que actualizar, y una costura limpia (el reverse proxy) entre el SFU y la capa de gestión encima.