← Volver al blog

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.

2 min de lectura
Read in English

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:

  1. Iniciorecording/start le dice a egress de LiveKit que escriba apps/<app>/recordings/<slug>.mp4. Se inserta una fila VOD con status=recording.
  2. 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.
  3. Finalización — el job genera una captura, guarda metadatos (duración, resolución, códec), pone status=ready y dispara el webhook vod_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_minutes corta grabaciones largas en partes — cada parte es su propio MP4 y su propio VOD, indexado por separado. Ideal para cámaras 24/7.
  • snapshot_seconds captura una miniatura JPEG periódica durante la grabación, subida a snapshots/.

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.