main content
< Volver a blog sobre aplicaciones móviles

Gestión archivos almacenamiento distribuido aplicación web a medida

Cómo implementar un sistema de gestión de archivos y almacenamiento distribuido en tu aplicación web a medida

Cualquier aplicación web que gestione documentos, imágenes, vídeos o cualquier tipo de fichero acaba enfrentándose al mismo problema tarde o temprano: el almacenamiento local no escala, los tiempos de carga se disparan y la gestión de permisos por archivo se convierte en una auténtica pesadilla. Si diseñas un sistema de gestión de archivos distribuido desde el principio, te ahorras reescrituras costosas cuando la aplicación crezca. Y créeme, va a crecer. Según estudios de IDC de 2025, el volumen de datos no estructurados (archivos, medios, documentos) crece un 28 % anual en empresas europeas, lo que hace que tener una arquitectura de almacenamiento robusta sea cada vez más importante.

En esta guía vamos a repasar las decisiones arquitectónicas clave, las tecnologías que tienes a tu disposición y las buenas prácticas para montar un sistema de archivos que escale de verdad con tu aplicación.

Requisitos típicos de un sistema de archivos empresarial

Antes de lanzarte a elegir tecnología, tómate un momento para definir los requisitos funcionales y no funcionales. Es la base de todo.

Funcionales

  • Subida y descarga de archivos de diversos tamaños (desde kilobytes hasta gigabytes).
  • Organización en carpetas o colecciones con metadatos personalizados.
  • Búsqueda por nombre, tipo, contenido, etiquetas o metadatos.
  • Versionado de archivos con posibilidad de restaurar versiones anteriores.
  • Previsualización de documentos (PDF, imágenes, vídeos) sin necesidad de descarga.
  • Compartición con enlaces temporales o permanentes, con o sin contraseña.
  • Control de acceso granular por usuario, rol o grupo.

No funcionales

  • Latencia de descarga inferior a 200 ms para archivos servidos desde CDN.
  • Disponibilidad del 99,95 % o superior.
  • Durabilidad del 99,999999999 % (eleven nines, el estándar de S3).
  • Cumplimiento RGPD: residencia de datos en la UE, cifrado en reposo y en tránsito, derecho al olvido.
  • Coste predecible que escale de forma lineal con el volumen almacenado.

Arquitectura de referencia

Un sistema de archivos distribuido moderno para aplicaciones web a medida se compone de varias capas. Vamos a verlas una por una.

Capa de ingesta

Aquí está uno de los trucos más importantes: el cliente (navegador o app móvil) sube los archivos directamente al almacenamiento de objetos mediante URLs presignadas. De esta forma el archivo no pasa por tu servidor de aplicación:

  1. El cliente solicita una URL de subida a tu API.
  2. Tu API genera una URL presignada con permisos y duración limitados.
  3. El cliente sube el archivo directamente al bucket (S3, GCS, Azure Blob).
  4. El almacenamiento notifica a tu API (webhook o evento) cuando la subida se completa.
  5. Tu API registra el archivo en la base de datos con sus metadatos.

¿Por qué hacerlo así? Porque evitas que tu servidor sea un cuello de botella para archivos grandes y reduces drásticamente el consumo de ancho de banda y CPU del backend. Es una de esas decisiones que te ahorran muchos quebraderos de cabeza.

Capa de procesamiento

Una vez subido, el archivo puede necesitar procesamiento asíncrono:

  • Imágenes: generación de thumbnails en múltiples tamaños, conversión a WebP/AVIF, extracción de metadatos EXIF.
  • Documentos: extracción de texto para búsqueda (OCR para imágenes de documentos), generación de previsualizaciones PDF.
  • Vídeos: transcodificación a múltiples resoluciones, generación de thumbnails, extracción de metadatos.
  • Archivos genéricos: escaneo antivirus, validación de formato, cálculo de hash para deduplicación.

Todo este procesamiento se ejecuta en workers asíncronos (AWS Lambda, Cloud Functions, workers en cola con Bull/BullMQ o RabbitMQ) para no bloquear la API. La clave aquí es que el usuario no se quede esperando mientras todo esto ocurre en segundo plano.

Capa de almacenamiento

Tecnología Uso principal Coste aproximado
Amazon S3 Almacenamiento de objetos universal 0,023 USD/GB/mes (estándar)
Google Cloud Storage Alternativa a S3 con integración en GCP 0,020 USD/GB/mes (estándar)
Azure Blob Storage Integración con ecosistema Microsoft 0,018 USD/GB/mes (hot tier)
MinIO S3-compatible, auto-alojado Coste de infraestructura propia
Backblaze B2 Almacenamiento barato para archivos fríos 0,005 USD/GB/mes

Capa de distribución (CDN)

Para servir archivos con baja latencia a usuarios de toda España y Europa, tienes varias opciones:

  • CloudFront (AWS): integración nativa con S3, edge locations en Madrid y Barcelona.
  • Cloud CDN (Google): integración con GCS, buena cobertura europea.
  • Cloudflare R2 + CDN: almacenamiento de objetos con CDN integrada y sin costes de egreso. Esto último es un punto muy a favor.
  • Bunny CDN: opción europea con precios competitivos y buena cobertura en España.

Capa de metadatos

Los metadatos de los archivos se almacenan en tu base de datos relacional o documental. Un esquema típico sería algo así:

files
├── id (UUID)
├── original_name (varchar)
├── storage_key (varchar) -- ruta en el bucket
├── mime_type (varchar)
├── size_bytes (bigint)
├── checksum_sha256 (varchar)
├── version (integer)
├── parent_folder_id (UUID, nullable)
├── owner_id (UUID)
├── visibility (enum: private, shared, public)
├── metadata (jsonb) -- etiquetas, dimensiones, duración, etc.
├── created_at (timestamp)
└── updated_at (timestamp)

Subida de archivos grandes: chunked upload

Para archivos de más de 10-50 MB, la subida en un solo request no es fiable: timeouts, cortes de conexión... ya sabes cómo va. La solución es implementar subida por chunks.

Multipart upload nativo de S3

S3 y los servicios compatibles soportan multipart upload de forma nativa:

  1. Iniciar el upload con CreateMultipartUpload.
  2. Subir cada parte (mínimo 5 MB) con UploadPart.
  3. Completar el upload con CompleteMultipartUpload.

La ventaja es clara: si la conexión se interrumpe, solo necesitas resubir la parte afectada, no el archivo completo. Un cambio enorme cuando trabajas con ficheros de cientos de megas.

Protocolo tus (open standard)

El protocolo tus es un estándar abierto para subidas resumibles. Librerías como tus-js-client (frontend) y tus-node-server o tusd (backend) implementan el protocolo completo. ¿Qué te aporta?

  • Reanudación automática tras cortes de conexión.
  • Barra de progreso precisa.
  • Compatible con cualquier almacenamiento de objetos.

Versionado de archivos

Estrategias de versionado

  • Versionado completo: cada versión es una copia entera del archivo. Simple pero costoso en almacenamiento, especialmente con archivos grandes.
  • Versionado nativo de S3: S3 soporta versionado a nivel de bucket. Cada sobreescritura crea una nueva versión automáticamente, sin que tú tengas que hacer nada.
  • Versionado por delta: solo almacena las diferencias entre versiones. Más complejo de implementar pero mucho más eficiente en espacio para documentos de texto.

Políticas de retención

Define reglas automáticas para gestionar el ciclo de vida de las versiones. Por ejemplo:

  • Mantener las 5 últimas versiones de cada archivo.
  • Mover versiones antiguas a almacenamiento frío (S3 Glacier, Archive) después de 90 días.
  • Eliminar versiones anteriores a 1 año, salvo las marcadas como "retención legal".

Control de acceso

Modelo de permisos recomendado

Implementa un modelo RBAC (Role-Based Access Control) con permisos a nivel de carpeta y archivo:

  • Owner: control total (leer, escribir, compartir, eliminar).
  • Editor: leer y escribir, pero no eliminar ni compartir externamente.
  • Viewer: solo lectura.
  • Commenter: lectura más capacidad de añadir comentarios.

Los permisos se heredan del padre (carpeta) salvo que se sobreescriban explícitamente en el archivo. Es un modelo que funciona bien y que los usuarios entienden de forma intuitiva.

Enlaces compartidos

Genera enlaces con token de acceso temporal para compartir archivos:

  • Duración configurable (1 hora, 24 horas, 7 días, permanente).
  • Protección opcional con contraseña.
  • Límite de descargas (máximo 10 descargas, por ejemplo).
  • Registro de accesos para auditoría. Siempre quieres saber quién ha descargado qué.

Búsqueda de archivos

Búsqueda por metadatos

Indexa los campos de la tabla de metadatos en tu base de datos. PostgreSQL con índices GIN sobre campos JSONB permite búsquedas muy eficientes por etiquetas y propiedades personalizadas. Si ya usas Postgres, aprovéchalo.

Búsqueda full-text en contenido

Para buscar dentro del contenido de los documentos, necesitas un pipeline de tres pasos:

  1. Extrae el texto de PDFs (pdftotext), documentos Office (Apache Tika) e imágenes (Tesseract OCR).
  2. Indexa el texto extraído en un motor de búsqueda (Elasticsearch, Meilisearch, Typesense).
  3. Ofrece búsqueda full-text con resaltado de coincidencias en la interfaz.

Seguridad y cumplimiento

Cifrado

  • En tránsito: TLS 1.3 obligatorio para todas las comunicaciones. Sin excepciones.
  • En reposo: cifrado del lado del servidor con claves gestionadas (SSE-S3, SSE-KMS) o cifrado del lado del cliente para máxima seguridad.
  • Claves de cifrado: rota las claves periódicamente y usa un servicio de gestión de claves (AWS KMS, Google Cloud KMS, HashiCorp Vault).

Cumplimiento RGPD

  • Residencia de datos: almacena los archivos en buckets ubicados en la UE (regiones de Madrid, Frankfurt, París).
  • Derecho al olvido: implementa una función de eliminación completa que borre el archivo, todas sus versiones, metadatos, thumbnails y entradas de búsqueda. Todo. No vale borrar a medias.
  • Registro de accesos: mantén un log auditable de quién accedió a cada archivo y cuándo.
  • DPA con proveedores: asegúrate de tener un Data Processing Agreement firmado con tu proveedor de almacenamiento cloud. Sin este documento, no cumples.

Prevención de malware

  • Escanea cada archivo subido con un motor antivirus (ClamAV, VirusTotal API) antes de hacerlo disponible para descarga. Nunca confíes ciegamente en lo que suben los usuarios.
  • Bloquea tipos de archivo peligrosos (.exe, .bat, .cmd) según tu política.
  • Valida que el tipo MIME declarado coincida con el contenido real del archivo (magic bytes). Un archivo que dice ser un JPEG pero tiene cabecera de ejecutable es una señal de alarma clara.

Optimización de costes

  • Lifecycle policies: mueve automáticamente archivos no accedidos en 30 días a almacenamiento de acceso infrecuente (S3 IA, Nearline) y en 90 días a almacenamiento frío (Glacier, Coldline). El ahorro es notable.
  • Deduplicación: calcula el hash SHA-256 de cada archivo y evita almacenar duplicados. Te sorprenderá la cantidad de espacio que ahorras.
  • Compresión: comprime archivos de texto y documentos antes de almacenarlos (gzip, brotli).
  • Eliminación de thumbnails huérfanos: limpia periódicamente los thumbnails y versiones procesadas de archivos que ya se eliminaron. Es fácil que se acumulen sin que te des cuenta.

Conclusión

Un sistema de gestión de archivos bien diseñado es invisible para el usuario final, pero es absolutamente crítico para la escalabilidad y seguridad de tu aplicación. Las decisiones que tomes sobre la arquitectura de almacenamiento, el procesamiento asíncrono y el control de acceso van a determinar si tu aplicación puede crecer sin reestructuraciones dolorosas. Vale la pena dedicarle tiempo a hacerlo bien desde el principio.

Si necesitas ayuda para diseñar e implementar el sistema de gestión de archivos de tu aplicación web a medida, contacta con Tangram Consulting y te ayudamos a construir una solución robusta y escalable.

Contacta con nosotros
Fila 1