Armazenamento de objetos para uploads de usuários: pare de encher o disco do seu servidor
Toda aplicação acaba aceitando um arquivo: um avatar, uma fatura em PDF, uma foto de produto. O primeiro instinto é gravá-lo em uma pasta no servidor — e é exatamente esse instinto que enche o seu disco, quebra os seus deploys e trava a sua escalabilidade. Avatares, PDFs e imagens não pertencem ao disco do seu servidor de aplicação. Um bucket do Nest Storage os torna duráveis, baratos e prontos para CDN, e este guia mostra como chegar lá.
Por que o disco local te deixa na mão
Uma pasta cheia de uploads funciona bem até o dia em que para de funcionar. O disco enche silenciosamente em segundo plano, e o primeiro sintoma costuma ser o banco de dados ou os logs falhando porque a pasta de uploads devorou o último gigabyte. Pior: muitas configurações de deploy substituem o diretório de release inteiro — um deploy, e todos os arquivos que os seus usuários confiaram a você desaparecem.
Depois vem a escalabilidade. No momento em que você adiciona um segundo servidor atrás de um balanceador de carga, metade das requisições cai em uma máquina que não tem o arquivo. Sessões fixas e gambiarras com rsync só adiam o problema. Arquivos que vivem no disco de uma única máquina são, por definição, um ponto único de falha.
O fluxo de upload que funciona
O padrão é simples: o cliente envia o arquivo para a sua API (ou direto para o bucket com uma URL pré-assinada), a sua API o coloca em um bucket do Nest Storage, e o bucket devolve uma chave de objeto. É essa chave — não o arquivo — que você guarda no banco de dados.
O seu banco de dados continua pequeno e rápido, os seus servidores continuam sem estado, e o arquivo em si vive em um lugar feito para durabilidade. Aqui está o fluxo inteiro em duas linhas:
const { key } = await nest.upload("avatars", file);
await db.user.update({ id, avatarKey: key });Buckets privados vs. públicos
Nem todo arquivo merece o mesmo tratamento. Logos, imagens de produto e outros assets do site podem viver em um bucket público e ser servidos diretamente — idealmente por um CDN com domínio personalizado. Qualquer um pode lê-los, e essa é justamente a ideia.
Documentos de usuários são outra história. Faturas, contratos e documentos de identidade pertencem a um bucket privado, e a sua API concede acesso gerando URLs assinadas que expiram em poucos minutos. O arquivo nunca fica acessível publicamente; apenas o link que você acabou de criar.
- Bucket público para imagens e assets estáticos
- Bucket privado com URLs assinadas que expiram para documentos
- Buckets separados por ambiente, para que o staging nunca toque nos arquivos de produção
Nomenclatura, versionamento e limpeza
As chaves de objeto são o seu sistema de arquivamento, então escolha os prefixos com cuidado: avatars/{userId}/… ou invoices/2026/04/… tornam fácil listar, migrar e excluir arquivos por usuário ou por data. Um URI nest:// com uma estrutura de chaves limpa se documenta sozinho.
Ative o versionamento nos buckets em que uma sobrescrita acidental faria estrago — a versão antiga fica a uma chamada de API de distância, em vez de perdida para sempre. E adicione regras de ciclo de vida para varrer arquivos órfãos: uploads cuja linha no banco foi excluída, ou arquivos temporários com mais de uma semana, são limpos automaticamente em vez de custar dinheiro para sempre.
Quanto custa
Com o Nest Storage você paga apenas por duas coisas: o armazenamento que realmente usa e a largura de banda que realmente serve. Sem cobrança por requisição, sem itens surpresa na fatura — os preços são em ₹, previsíveis e fáceis de calcular antes de você se comprometer.
Há um nível gratuito generoso o bastante para projetos pessoais, então o recurso de upload de avatar que você construir neste fim de semana não custa nada até os usuários de verdade chegarem. E quando chegarem, o mesmo bucket, a mesma API e as mesmas chaves continuam funcionando — só que com uma cota maior.
Pronto para colocar em prática?
Coloque no ar um servidor, um banco de dados ou um bucket — planos gratuitos incluídos.