Devora Cloud · Blog
S3 privado para tu app: imágenes y archivos fuera de la base de datos
Por qué guardar imágenes, PDF y vídeos en S3 y solo la clave en la base, cómo funciona el bucket privado por proyecto de Devora Cloud, las URL firmadas, el espacio incluido y los paquetes extra.
Todo sistema empieza pequeño: un formulario con subida de foto, un campo para adjuntar un PDF. La solución más rápida suele ser guardar el archivo en el disco del servidor o directamente en una columna de la base. Funciona el primer día, y se convierte en un problema en el primer despliegue, la primera réplica o la primera copia de seguridad gigante.
En esta guía te explicamos por qué los archivos deben vivir en un almacenamiento de objetos S3, cómo funciona el S3 privado de cada proyecto en Devora Cloud y cómo mostrar esos archivos a los visitantes sin dejar nada público.
Por qué no guardar archivos en la base ni en el disco
La base de datos es ideal para información estructurada: usuarios, pedidos, precios. Guardar el contenido binario de imágenes y vídeos en las tablas hace que la base crezca rápido, vuelve lentas las copias y restauraciones y compite por memoria con las consultas que importan.
El disco del contenedor tiene otro problema: no es permanente ni compartido. Cada despliegue crea un entorno limpio, y las réplicas de balanceo no ven el disco de las demás. Un archivo subido a una copia simplemente no existe en otra.
La regla práctica es sencilla:
- El archivo va a S3.
- La base guarda solo la referencia: la clave del objeto (por ejemplo, productos/123/foto.png), el nombre original, el tamaño, el tipo y el propietario.
- La aplicación genera el enlace en el momento de mostrarlo.
Un bucket privado por proyecto, con su propia clave
En Devora Cloud, cada proyecto puede tener su propio bucket S3 privado, con una clave de acceso propia. Esa clave solo funciona en ese bucket: un proyecto no puede leer ni borrar archivos de otro, aunque estén en la misma cuenta.
Al crear el almacenamiento, el proyecto recibe las variables de entorno listas:
- S3_ENDPOINT=https://s3.devoracloud.com
- S3_REGION=us-east-1
- S3_BUCKET, con el nombre del bucket del proyecto
- S3_ACCESS_KEY y S3_SECRET_KEY
- S3_FORCE_PATH_STYLE=true
Funciona cualquier SDK compatible con S3 — AWS SDK v3 en Node.js, boto3 en Python, el driver S3 de Laravel y otros —, siempre que use direccionamiento por ruta (path-style). Dentro del bucket creas las carpetas que quieras, como uploads/2026/ o facturas/.
Las credenciales se leen solo en el servidor. Nunca pongas la clave secreta en variables expuestas al navegador, como las que empiezan por NEXT_PUBLIC_.
URL firmadas: mostrar sin hacer público
Si el bucket es privado, ¿cómo ve el visitante la foto del producto? Con una URL firmada (presigned URL). La aplicación genera, en el servidor, un enlace temporal a un objeto concreto, por ejemplo válido durante una hora. Quien tiene el enlace descarga ese archivo hasta que caduca; después, el enlace deja de funcionar.
- Fotos de productos y avatares: genera la URL al montar la página.
- Facturas, contratos y análisis médicos: genera la URL solo después de comprobar que el usuario conectado tiene derecho al archivo.
- Logo, CSS e iconos del propio sitio: publícalos con el código, no en el bucket.
La clave de acceso nunca llega al navegador. El visitante solo recibe el enlace firmado, que caduca.
Cuánto espacio viene incluido
| Plan | Precio mensual | S3 incluido |
|---|---|---|
| Hobby | US$ 5 | 1 GB |
| Pro | US$ 20 | 5 GB |
| Enterprise | US$ 59 | 25 GB |
El espacio es de la cuenta, no de cada proyecto: lo comparten todos los proyectos de la cuenta. Si necesitas más, compra un paquete extra en el panel:
- 100 GB por US$ 3 al mes
- 250 GB por US$ 4 al mes
- 1 TB por US$ 12 al mes
Los paquetes de pago se suman al límite del plan. El pago es con tarjeta, o con Pix en reales para clientes en Brasil.
Qué pasa cuando se acaba el espacio
Cuando el uso llega al límite, se rechazan las nuevas subidas (S3 responde con el error QuotaExceeded). Los archivos que ya están guardados siguen ahí y accesibles; no se borra nada.
Para volver a subir, borra archivos que ya no uses, compra un paquete o cambia a un plan con más espacio. Conviene tratar ese error en el código y mostrar un mensaje claro al usuario en lugar de un fallo genérico.
Si usas el token de IA, tu IA consulta el uso de S3 antes de subir muchos archivos y te avisa cuando supera el 80%.
Checklist para llevar las subidas a S3
- Crea el almacenamiento S3 del proyecto en el panel, o pídeselo a tu IA.
- Sustituye la escritura en disco por la subida a S3 con las variables del proyecto.
- Crea en la base una columna para la clave del objeto y deja de guardar binarios en las tablas.
- Genera URL firmadas al mostrar archivos privados.
- Copia los archivos antiguos: añadir S3 no migra lo que ya existe.
- Si tu plan lo permite, prueba con dos réplicas para confirmar que nada depende del disco.
Preguntas frecuentes
¿El S3 de Devora funciona con los SDK de AWS?
Sí. Usa la API S3, así que funciona con los SDK habituales (AWS SDK, boto3, Laravel y otros) configurando el endpoint https://s3.devoracloud.com y el modo path-style.
¿Puedo hacer público un archivo?
El bucket es privado. Para mostrar archivos a los visitantes, genera URL firmadas temporales en la aplicación; nunca expongas la clave de acceso.
¿El espacio del plan es por proyecto?
No. El espacio incluido (1, 5 o 25 GB) y los paquetes extra se comparten entre todos los proyectos de la cuenta.
¿Pierdo archivos si se acaba el espacio?
No. Solo se detienen las nuevas subidas. Los archivos guardados siguen ahí hasta que liberes espacio o amplíes el límite.