Storage · modules/storage

Adapter listo para producción

Object storage
compatible con S3.

El módulo de storage es dueño de los uploads de archivos detrás de un port IStorageProvider. El adapter de S3 corre sobre el SDK de AWS y — como AWS, Cloudflare R2 y MinIO hablan el mismo protocolo — el mismo código sirve a los tres, diferenciándose solo en unas pocas env vars.

AWS, R2 o MinIO — el mismo adapter

Las únicas diferencias entre AWS S3, Cloudflare R2 y MinIO son el endpoint, el direccionamiento path-style y la URL base pública — todo manejado por env. Apuntá el mismo S3StorageProvider a cualquiera de ellos.

apps/server/.env
 1  STORAGE_PROVIDER=s3
 2  STORAGE_S3_BUCKET=my-bucket
 3  STORAGE_S3_REGION=auto
 4  STORAGE_S3_ACCESS_KEY_ID=...
 5  STORAGE_S3_SECRET_ACCESS_KEY=...
 6  # R2 / MinIO only:
 7  STORAGE_S3_ENDPOINT=https://<accountid>.r2.cloudflarestorage.com
 8  STORAGE_S3_FORCE_PATH_STYLE=true   # MinIO

Lo que viene listo

URLs presignadas

Los uploads y downloads usan URLs presignadas vía @aws-sdk/s3-request-presigner — los bytes nunca pasan por tu servidor.

Keys content-addressed

Las keys de avatar son avatars/{userId}-{sha256:16}.{ext}, así el header de cache inmutable de un año es seguro entre re-uploads — un archivo nuevo escribe una key nueva.

Un port, cinco proveedores

STORAGE_PROVIDER selecciona null / s3 / local / uploadthing / supabase detrás de la misma interfaz IStorageProvider.

Público o firmado

Seteá una URL base pública (CDN / bucket público de R2) o dejá que getPublicUrl caiga a una URL firmada de larga duración.

Referencia de configuración

Variables de entorno

  • STORAGE_PROVIDERrequerida

    Set to s3

  • STORAGE_S3_BUCKETrequerida
  • STORAGE_S3_REGIONrequerida
  • STORAGE_S3_ACCESS_KEY_IDrequerida
  • STORAGE_S3_SECRET_ACCESS_KEYrequerida
  • STORAGE_S3_ENDPOINTopcional

    R2 / MinIO / CEPH endpoint

  • STORAGE_S3_FORCE_PATH_STYLEopcional

    true for MinIO

Dónde vive

  • apps/server/src/modules/storage/infrastructure/providers/s3-storage-provider.ts
  • apps/server/src/modules/storage/infrastructure/providers/index.ts

Un adapter de storage, cualquier backend S3.

Shippeá uploads en AWS S3, Cloudflare R2 o MinIO sin tocar el código de tu aplicación.