Tus medios, tuyos: S3 por app y grabaciones
Cada app graba en su propio bucket S3 con sus propias credenciales. Cómo funciona el pipeline de grabación a VOD y por qué el límite de almacenamiento es por app.
Tus grabaciones, tu bucket
Cuando StreamHub graba una sala, el MP4 terminado no se queda en el servidor — se sube al propio bucket S3 de la app, usando las propias credenciales de la app. Cada app apunta al almacenamiento de objetos que prefieras: AWS S3, MinIO, Backblaze B2, Cloudflare R2, cualquier endpoint compatible con S3. El medio vive donde vos decidís, no donde decide un proveedor.
El pipeline grabación → S3 → VOD
Vale la pena entender el camino crítico porque es el mismo para una grabación puntual o una cámara siempre encendida:
- Inicio —
recording/startle dice a egress de LiveKit que escribaapps/<app>/recordings/<slug>.mp4. Se inserta una fila VOD constatus=recording. - Subida — cuando egress termina, un job en segundo plano sube el archivo local al S3 de la app, construye una URL pública o prefirmada y (opcionalmente) borra la copia local.
- Finalización — el job genera una captura, guarda metadatos (duración, resolución, códec), pone
status=readyy dispara el webhookvod_ready.
Si la subida falla, el archivo local se conserva y dispara recording_failed — nunca perdés una grabación en silencio.
Split y captura
Dos perillas de configuración moldean la salida:
split_minutescorta grabaciones largas en partes — cada parte es su propio MP4 y su propio VOD, indexado por separado. Ideal para cámaras 24/7.snapshot_secondscaptura una miniatura JPEG periódica durante la grabación, subida asnapshots/.
Configurar el S3 de una app
curl -X PUT $BASE/apps/live/s3 -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"provider": "aws",
"bucket": "mis-grabaciones-live",
"region": "us-east-1",
"accessKeyId": "AKIA...",
"secretAccessKey": "..."
}'
Las credenciales se guardan en data/secrets.json y se referencian desde la config de la app — nunca en la base de datos, nunca en un log.
Por qué importa el almacenamiento por app
Un bucket por app significa multi-tenancy limpia: podés darle a un cliente su propio bucket, cumplir un requisito de residencia de datos eligiendo la región, y dar de baja limpiamente revocando un solo juego de credenciales. El pipeline de grabación es idéntico sin importar el proveedor al que apuntes — a StreamHub solo le importa que hable S3.