Storage · modules/storage
Adapter listo para producciónObject 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.
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_PROVIDERrequeridaSet to s3
STORAGE_S3_BUCKETrequeridaSTORAGE_S3_REGIONrequeridaSTORAGE_S3_ACCESS_KEY_IDrequeridaSTORAGE_S3_SECRET_ACCESS_KEYrequeridaSTORAGE_S3_ENDPOINTopcionalR2 / MinIO / CEPH endpoint
STORAGE_S3_FORCE_PATH_STYLEopcionaltrue for MinIO
Dónde vive
apps/server/src/modules/storage/infrastructure/providers/s3-storage-provider.tsapps/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.