Tres proveedores, nueve piezas, y el camino que hace cada request — desde la pantalla colgada en un local hasta la base de datos.
Arrastrá para mover · pinza o rueda para zoom · doble toque para acercar · Esc para cerrar
Pantallas → API v3. Un latido cada 300 s, la playlist que les toca y qué versión de app deberían tener. Son las 409 pantallas × 300 s = los 1,3 req/s de toda la plataforma.
Pantallas → R2 + CDN. Bajan el video y las imágenes del borde. Nunca descargan durante la reproducción: por eso la caída de agosto no apagó una sola pantalla.
Pantallas y paneles → Reverb. Un WebSocket abierto y permanente. Es lo que hace que un cambio en el panel se vea en la pantalla al instante, sin esperar el latido.
Navegadores → Pages. El HTML y el JS de los dos fronts, servidos del CDN. Antes esto se buildeaba dentro del servidor de producción.
Panel → API v3. Toda la operación del CMS. Es el único que siente la latencia; las pantallas no la notan.
Panel → Static v2. La subida de media: hoy un POST con el archivo entero.
Panel → R2, directo. Subida prefirmada, sin pasar por la app. Pendiente: es lo último que falta para que producción acepte media nueva.
Static → API v3. El static no tiene usuarios propios: valida cada token preguntándole a la API. Va cacheado, porque estaba en el camino de todo upload.
Los tres → MySQL y Valkey. Base y caché gestionados, en el mismo datacenter. La base son 3 GB, de los cuales 3 son logs que nadie consulta.
API v3 → Reverb. La API publica el evento y Reverb lo reparte al parque.
ffmpeg → Static v2. La caja pide trabajo, avisa cuando terminó y avisa si falló. Sólo tres rutas HTTP: no ve la base, no ve la red interna.
ffmpeg ↔ R2. Baja el original del bucket y sube las versiones convertidas. Los GB de video nunca pasan por la aplicación.
Static v2 ↔ R2. Escribe lo que sube el panel, y cuando alguien pide un archivo devuelve un redirect al CDN. El servidor no sirve bytes: por eso su CPU está en 0,15%.
Conexiones 2 · 12 · 13
Conexiones 11 · 3
Diseño del player
La carga es diminuta. Lo que se gana migrando es redundancia y disciplina operativa, no capacidad.
2 VPS gestionadas con Laravel Forge · un solo proveedor
Laravel Cloud (AWS) · DigitalOcean · Cloudflare
No es preferencia de herramientas. Cada pieza está donde está porque un límite medido la empuja ahí — y el disparador del proyecto fue justamente depender de un solo proveedor y de una sola máquina por servicio.
Los dos backends, la base y el caché
Reverb y ffmpeg, en máquinas propias
ws.apiv3.signboox.com está horneado en la app de las 409 pantallas, que
no tiene actualización remota. Cambiarlo es tocar el parque uno por uno.DNS, los archivos y los dos fronts
| Concepto | USD/mes |
|---|---|
| Laravel Cloud — producción | |
| Plan Growth | $20 |
| API v3 — web (2 réplicas) | $14 |
| API v3 — Horizon | $28 |
| Static — web (2 réplicas) | $14 |
| Static — Horizon | $14 |
| MySQL gestionada + backups | $18 |
| Valkey ×2 | $12 |
| Laravel Cloud — staging medido | $55 |
| DigitalOcean | |
| Caja de Reverb | $12 |
| Caja de ffmpeg | $24 |
| Cloudflare · monitoreo | |
| R2 — 53 GiB de media | $1 |
| Pages + DNS + CDN | $0 |
| Better Stack — monitoreo | $0 |
| Total plataforma nueva | ~$212 |
Staging es un tercio de la factura — y es lo que permite probar antes de tocar producción. Apagarlo entre releases baja el total a ~$157.
| Cómo leer el número | Confianza |
|---|---|
| Staging, gasto real de 7 días extrapolado | medido |
| DigitalOcean, precio público | firme |
| Cloudflare R2, 45 GB facturables × $0,015 | firme |
| Producción en Laravel Cloud, precio de lista por recurso | de lista |
Producción cuesta más que staging por tres cosas concretas, no por tamaño: no hiberna (staging duerme a los 5 min), lleva el doble de réplicas y su worker de colas es más grande.
| El dimensionado no es un presupuesto inflado |
|---|
| El web de producción usa 1,2-1,4% de un vCPU. Lo que decide el tamaño es la estampida de 264 reconexiones tras un deploy — y ahí la palanca son réplicas, no RAM. |
| La base pesa 3,07 GB, de los cuales 3,0 son logs de dispositivo que nadie consulta. El working set caliente son ~40 MB. |
| El Redis de producción usa 3,3 MB, con pico de 7,7. Se contrató 250 MB: 32× el pico. |
| Tres tamaños bajaron respecto del plan original, después de medir las máquinas viejas. |
| Pieza | Staging | Producción nueva | Donweb |
|---|---|---|---|
| API v3 + Static | ✓ corriendo | ✓ desplegado, con dominio propio y HTTPS | ● vivo y congelado, atiende al parque |
| Los datos (60 tenants · 409 pantallas) | ✓ | ✓ importados y verificados | ● fuente |
| Los archivos (53 GiB) en R2 | ✓ | ✓ 33.402 archivos, arqueo de bytes exacto | ● los sirve él |
| Reverb · ffmpeg | ✓ | ✓ las dos cajas, verificadas desde internet | ● Reverb atiende al parque |
| Panel · Menu App | ✓ deploy en cada push | ✓ sirviendo la app real | ● siguen ahí |
Lo que falta es el corte, y es DNS. La plataforma
nueva está entera y se está ejercitando sobre un árbol de dominios propio
(next.signboox.com). El día del cutover se apuntan los dominios finales y se apaga el
tráfico a Donweb. No se borra nada en Donweb: queda como red de seguridad.