Receta: gestionar una agencia de streaming multi-tenant
Un servidor, una app por cliente, un token acotado por cada uno, cuotas por tenant y un firewall de IP. Cómo dividir un nodo StreamHub en tenants aislados que podés facturar, limitar y asegurar por separado.
Por qué multi-tenant
Si revendés streaming — a clientes, a franquiciados, a departamentos internos — necesitás paredes limpias entre tenants: datos separados, credenciales separadas, límites separados, y una forma de dar de baja a uno sin tocar a los demás. StreamHub está hecho justamente para esto. Un nodo sostiene muchas apps, cada una un tenant aislado, y cada costura (tokens, cuotas, reglas de red) es por app.
La arquitectura en palabras
Cada cliente obtiene una app con su propia config, bucket S3, base de datos y espacio de nombres de salas. Generás un token acotado a la app por cliente, así una credencial filtrada solo expone a ese cliente. Las cuotas se aplican por tenant (apps, streams concurrentes, minutos de grabación, egress, almacenamiento), y una capa de seguridad de red aplica listas de IP permitidas/bloqueadas y auto-baneo antes de que cualquier petición llegue a la autenticación.
1. Crear una app por cliente
export BASE="https://your-server.example.com/api/v1"
export TOKEN="sk_...." # un token global
curl -s -X POST $BASE/apps -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"name":"acme","displayName":"ACME Corp"}'
Las salas se nombran bajo el prefijo de la app, así la sala launch de acme es acme-launch — sin colisión con el launch de otro cliente.
2. Generar un token acotado por cliente
curl -s -X POST $BASE/tokens -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"name":"acme-integration","scope":"app","appId":"acme","allowedIps":["203.0.113.0/24"]}'
El token en texto plano se devuelve una sola vez — guardalo de inmediato. La lista allowedIps opcional (IP exacta o CIDR) restringe desde dónde se puede usar el token. Entregale este token al cliente; nunca puede tocar los datos de otro tenant.
3. Fijar cuotas por tenant
RBAC y cuotas comparten un único interruptor de aplicación, STREAMHUB_AUTHZ_ENFORCE (off | log | on; las instalaciones frescas arrancan en on). Los defaults del plan gratis son deliberadamente chicos — maxApps 2, maxConcurrentStreams 2, maxRecordingMinutesMonth 300, maxEgressGbMonth 5, maxStorageGb 5. Subí a un cliente que paga a un plan más grande:
curl -s -X PATCH $BASE/tenants/<tenantId>/quotas -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"plan":"broadcaster"}'
Las llamadas por encima del límite se rechazan con 429 quota_exceeded (con metric, limit, used), y el uso es visible en GET /tenants/<tenantId>/usage y como los gauges Prometheus streamhub_tenant_quota / streamhub_tenant_usage.
4. Blindar la red
Encendé la capa de IP y, opcionalmente, el auto-baneo:
STREAMHUB_IP_ACCESS_MODE=enforce
STREAMHUB_AUTOBAN_ENABLED=true
STREAMHUB_AUTOBAN_MAX_OFFENSES=10
STREAMHUB_AUTOBAN_WINDOW_S=300
Gestioná las reglas por la API de seguridad (solo superadmin):
curl -s -X POST $BASE/security/ip-rules -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"cidr":"198.51.100.7/32","action":"block","note":"scraper abusivo"}'
La precedencia corre permitir-antes-que-bloquear, con loopback y rangos privados siempre habilitados; una IP en la lista de permitidos también queda blindada de baneos. Fallos de auth repetidos disparan un baneo acotado en el tiempo que persiste entre reinicios.
Qué deberías ver
Cada cliente opera en su propia app con su token y su bucket, invisible a los demás. Un cliente que alcanza el límite de su plan recibe un 429 limpio; ves el uso de cada tenant contra su cuota en un solo lugar; y las IPs bloqueadas o baneadas se rechazan antes de siquiera llegar a la autenticación.
Resolución de problemas
- Un cliente ve los datos de otro — verificá que el token se haya generado con
scope: "app"y elappIdcorrecto; un token global saltea el acotamiento por tenant por diseño. - Cuotas no aplicadas — confirmá
STREAMHUB_AUTHZ_ENFORCE=on(o corrélogprimero en staging para previsualizar las denegaciones); superadmin y tokens sin ámbito nunca se limitan. - Tráfico legítimo recibe 403/429 — el middleware de seguridad no cubre los montajes estáticos
/hls,/samples,/sdky/live; la protección de puertos de medios (RTMP, WHIP, WebRTC UDP) es tarea de tu reverse proxy y el firewall del SO. Detrás de un proxy, asegurate de quetrust proxyesté seteado para que la IP del cliente se lea bien.
Cierre
Un solo nodo StreamHub se vuelve una plataforma multi-tenant limpia que podés facturar, limitar y asegurar por cliente — sin que nada del medio salga de tu control. Si estás montando una agencia o una oferta de reventa, nuestro equipo hace el modelo de tenants, los ganchos de facturación y el endurecimiento como servicio de ops gestionadas o consultoría.