Storage · modules/storage
Adapter pronto para produçãoObject storage
compatível com S3.
O módulo de storage é dono dos uploads de arquivos atrás de um port IStorageProvider. O adapter S3 roda sobre o SDK da AWS e — como AWS, Cloudflare R2 e MinIO falam o mesmo protocolo — o mesmo código serve os três, diferindo apenas em algumas env vars.
AWS, R2 ou MinIO — o mesmo adapter
As únicas diferenças entre AWS S3, Cloudflare R2 e MinIO são o endpoint, o endereçamento path-style e a URL base pública — tudo guiado por env. Aponte o mesmo S3StorageProvider para qualquer um deles.
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
O que vem pronto
URLs pré-assinadas
Uploads e downloads usam URLs pré-assinadas via @aws-sdk/s3-request-presigner — os bytes nunca passam pelo seu servidor.
Keys content-addressed
As keys de avatar são avatars/{userId}-{sha256:16}.{ext}, então o header de cache imutável de um ano é seguro entre re-uploads — um arquivo novo escreve uma key nova.
Um port, cinco providers
STORAGE_PROVIDER seleciona null / s3 / local / uploadthing / supabase atrás da mesma interface IStorageProvider.
Público ou assinado
Sete uma URL base pública (CDN / bucket público do R2) ou deixe getPublicUrl cair para uma URL assinada de longa duração.
Referência de configuração
Variáveis de ambiente
STORAGE_PROVIDERobrigatóriaSet to s3
STORAGE_S3_BUCKETobrigatóriaSTORAGE_S3_REGIONobrigatóriaSTORAGE_S3_ACCESS_KEY_IDobrigatóriaSTORAGE_S3_SECRET_ACCESS_KEYobrigatóriaSTORAGE_S3_ENDPOINTopcionalR2 / MinIO / CEPH endpoint
STORAGE_S3_FORCE_PATH_STYLEopcionaltrue for MinIO
Onde ele vive
apps/server/src/modules/storage/infrastructure/providers/s3-storage-provider.tsapps/server/src/modules/storage/infrastructure/providers/index.ts
Um adapter de storage, qualquer backend S3.
Publique uploads em AWS S3, Cloudflare R2 ou MinIO sem tocar no código da sua aplicação.