Skip to content
← Todos os guias

Devora Cloud · Blog

S3 privado para o seu app: imagens e arquivos fora do banco

Por que guardar imagens, PDFs e vídeos no S3 e só a chave no banco, como funciona o bucket privado por projeto da Devora Cloud, URLs assinadas, espaço incluído e pacotes extras.

Seu appS3_BUCKETPostgreSQLimage_key =produtos/foto.pngo banco guarda só a chaveBucket privadodc-loja-1a2b3cuploads/produtos/docs/Espaço da conta1 · 5 · 25 GBURL assinada…/foto.png?X-Amz-Expires=3600expira em 1 horaVisitantevê só o que você libera
Ilustração técnica. Recursos e regiões dependem do plano, da disponibilidade e da compatibilidade do projeto.

Todo sistema começa pequeno: um formulário com upload de foto, um campo para anexar um PDF. A solução mais rápida costuma ser gravar o arquivo no disco do servidor ou direto numa coluna do banco. Funciona no primeiro dia — e vira problema no primeiro deploy, na primeira réplica ou no primeiro backup gigante.

Neste guia explicamos por que arquivos devem morar num armazenamento de objetos S3, como funciona o S3 privado de cada projeto na Devora Cloud e como mostrar esses arquivos aos visitantes sem deixar nada público.

Por que não guardar arquivos no banco nem no disco

O banco de dados é ótimo para informações estruturadas: usuários, pedidos, preços. Gravar o conteúdo binário de imagens e vídeos nas tabelas faz o banco crescer rápido, deixa backups e restaurações lentos e disputa memória com as consultas que realmente importam.

O disco do contêiner tem outro problema: ele não é permanente nem compartilhado. Um novo deploy cria um ambiente limpo, e as réplicas de load balance não enxergam o disco umas das outras. Um arquivo enviado para uma cópia simplesmente não existe na outra.

A regra prática é simples:

  • O arquivo vai para o S3.
  • O banco guarda só a referência: a chave do objeto (por exemplo, produtos/123/foto.png), o nome original, o tamanho, o tipo e o dono.
  • A aplicação gera o link na hora de exibir.

Um bucket privado por projeto, com chave própria

Na Devora Cloud, cada projeto pode ter o seu próprio bucket S3 privado, com uma chave de acesso própria. Essa chave só funciona naquele bucket: um projeto não consegue ler nem apagar arquivos de outro, mesmo dentro da mesma conta.

Ao criar o armazenamento, o projeto recebe as variáveis de ambiente prontas:

  • S3_ENDPOINT=https://s3.devoracloud.com
  • S3_REGION=us-east-1
  • S3_BUCKET, com o nome do bucket do projeto
  • S3_ACCESS_KEY e S3_SECRET_KEY
  • S3_FORCE_PATH_STYLE=true

Qualquer SDK compatível com S3 funciona — AWS SDK v3 no Node.js, boto3 no Python, o driver S3 do Laravel e outros —, desde que use o endereçamento por caminho (path-style). Dentro do bucket você cria as pastas que quiser, como uploads/2026/ ou notas-fiscais/.

As credenciais devem ser lidas só no servidor. Nunca coloque a chave secreta em variáveis expostas ao navegador, como as que começam com NEXT_PUBLIC_.

URLs assinadas: mostrar sem deixar público

Se o bucket é privado, como o visitante vê a foto do produto? Com uma URL assinada (presigned URL). A aplicação gera, no servidor, um link temporário para um objeto específico — por exemplo, válido por uma hora. Quem tem o link baixa aquele arquivo até o prazo vencer; depois, o link para de funcionar.

  • Fotos de produtos e avatares: gere a URL ao montar a página.
  • Notas fiscais, contratos e exames: gere a URL só depois de conferir se o usuário logado tem direito ao arquivo.
  • Logo, CSS e ícones do próprio site: publique junto com o código, não no bucket.

A chave de acesso nunca vai para o navegador. O visitante recebe apenas o link assinado, que expira.

Quanto espaço vem incluído

PlanoPreço mensalS3 incluído
HobbyUS$ 51 GB
ProUS$ 205 GB
EnterpriseUS$ 5925 GB

O espaço é da conta, não de cada projeto: ele é compartilhado por todos os projetos da conta. Se precisar de mais, compre um pacote extra no painel:

  • 100 GB por US$ 3 por mês
  • 250 GB por US$ 4 por mês
  • 1 TB por US$ 12 por mês

Os pacotes pagos somam ao limite do plano. No Brasil, o pagamento é por Pix em reais; nos demais países, por cartão.

O que acontece quando o espaço acaba

Quando o uso chega ao limite, novos uploads são recusados (o S3 responde com o erro QuotaExceeded). Os arquivos que já estão lá continuam guardados e acessíveis; nada é apagado.

Para voltar a enviar, apague arquivos que não usa mais, compre um pacote ou mude para um plano com mais espaço. Vale tratar esse erro no código, mostrando uma mensagem clara ao usuário em vez de uma falha genérica.

Se você usa o token de IA, a sua IA consulta o uso do S3 antes de enviar muitos arquivos e avisa quando ele passa de 80%.

Checklist para levar os uploads para o S3

  • Crie o armazenamento S3 do projeto no painel, ou peça à sua IA.
  • Troque a gravação em disco pelo envio ao S3 usando as variáveis do projeto.
  • Crie no banco uma coluna para a chave do objeto e pare de gravar binários nas tabelas.
  • Gere URLs assinadas ao exibir arquivos privados.
  • Copie os arquivos antigos: adicionar o S3 não migra o que já existe.
  • Se o plano permitir, teste com duas réplicas para confirmar que nada depende do disco.

Perguntas frequentes

O S3 da Devora funciona com os SDKs da AWS?

Sim. Ele usa a API S3, então funciona com os SDKs comuns (AWS SDK, boto3, Laravel e outros) configurando o endpoint https://s3.devoracloud.com e o modo path-style.

Posso deixar um arquivo público?

O bucket é privado. Para mostrar arquivos a visitantes, gere URLs assinadas temporárias na aplicação; nunca exponha a chave de acesso.

O espaço do plano é por projeto?

Não. O espaço incluído (1, 5 ou 25 GB) e os pacotes extras são compartilhados por todos os projetos da conta.

Perco arquivos se o espaço acabar?

Não. Só os novos uploads param. Os arquivos guardados continuam lá até você liberar espaço ou aumentar o limite.

S3 privado para o seu app: imagens e arquivos fora do banco · Devora Cloud