Logotipo Hedhog

Receba novidades do Hedhog no seu e-mail

Novos lançamentos, receitas e breaking changes — sem spam.

Armazenamento de Arquivos

O Hedhog lida com uploads de arquivos através do FileService do @hed-hog/core. Todo conteúdo enviado passa por um único adaptador de armazenamento, selecionado uma vez via um Perfil de Integração. Troque o provedor mais tarde sem tocar no código da aplicação ou reenviar arquivos existentes.

Status: ✅ Totalmente implementado — Local, S3, GCS, Azure Blob e provedores compatíveis com S3 funcionam.

Provedores Local, S3, GCS, Azure Blob e compatíveis com S3 alimentando o FileService.upload()

Configuração Rápida

  1. Crie um Perfil de Integração (tipo Storage, escolha um provedor) em Settings → Integration Profiles
  2. Preencha os campos de configuração do provedor (tabelas abaixo)
  3. Vá em Settings → Configurations → File Storage e defina Storage Profile para ele
  4. Faça upload de um arquivo de teste em qualquer lugar do admin (ex.: seu próprio avatar) e confirme que a URL retornada realmente carrega

Como Funciona

  1. Um arquivo é enviado através de qualquer endpoint que chama FileService.upload()
  2. O FileService lê a configuração file-storage-profile-id para encontrar o Perfil de Integração ativo (tipo storage)
  3. Ele mapeia o JSON config específico do provedor desse perfil para o adaptador que a classe de provedor correspondente espera (disco local, S3, GCS, Azure Blob ou um serviço compatível com S3)
  4. O arquivo é gravado via o adaptador, um registro é salvo na tabela file com a URL/chave resultante e metadados, e a URL pública é retornada ao cliente

Se nenhum perfil de armazenamento estiver configurado ainda, o servidor ainda sobe normalmente — ele apenas registra um aviso na inicialização, e qualquer tentativa de upload falha com No file storage profile configured até você definir um. Este é o estado esperado logo após uma instalação nova.

Provedores Suportados

ProvedorSlug integration_providerDescrição
LocallocalArmazena arquivos no próprio filesystem do servidor
Amazon S3s3Armazenamento de objetos da AWS
Google Cloud StoragegcsArmazenamento de objetos do GCP
Azure Blob Storageazure-blobArmazenamento de objetos do Microsoft Azure
Compatível com S3s3-compatibleMinIO, Wasabi, DigitalOcean Spaces e qualquer outro serviço compatível com a API do S3

Configurando

  1. Vá em Settings → Integration ProfilesNew → Tipo Storage, escolha um provedor e preencha seus campos de configuração (tabela abaixo)
  2. Vá em Settings → Configurations → File Storage e defina o campo Storage Profile (file-storage-profile-id) para esse perfil
  3. Os uploads passam a usar o novo provedor imediatamente — os registros file existentes e suas URLs não são migrados ou reescritos, já que o Hedhog não tem como saber se os arquivos antigos devem ser movidos

Local

Armazena arquivos no filesystem do servidor. Adequado para desenvolvimento ou implantações de servidor único — não recomendado quando você roda mais de uma instância da API, já que uploads gravados por uma instância não ficarão visíveis para as outras.

Campo de configuraçãoDescrição
base_pathDiretório (relativo ao processo da API, ou absoluto) onde os arquivos são gravados. Padrão storage se deixado vazio

Certifique-se de que o processo da API tem permissão de escrita nesse diretório, e que ele sobrevive a deploys/reinícios (não o aponte para dentro de um diretório que seu pipeline de deploy apaga).


Amazon S3

Campo de configuraçãoDescrição
access_key_idAWS access key ID
secret_access_keyAWS secret access key
regionRegião AWS (padrão us-east-1 se deixado vazio)
bucketNome do bucket S3

Permissões IAM necessárias, restritas ao bucket:

{
  "Effect": "Allow",
  "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
  "Resource": "arn:aws:s3:::your-bucket/*"
}

Decida de antemão se o bucket serve arquivos publicamente ou via signed URLs — essa é uma decisão de política de bucket feita no console do S3, não uma configuração do Hedhog.


Google Cloud Storage

Campo de configuraçãoDescrição
key_file_jsonO conteúdo completo de uma chave JSON de service account do GCP, colado como string — não um caminho de arquivo. O processo da API nunca lê do disco para este provedor
bucketNome do bucket GCS

Crie a service account em IAM & Admin → Service Accounts, conceda a ela os papéis Storage Object Creator e Storage Object Viewer, depois Keys → Add Key → JSON e cole o conteúdo do arquivo baixado em key_file_json.


Azure Blob Storage

Campo de configuraçãoDescrição
accountNome da conta de armazenamento
keyChave de acesso da conta de armazenamento
containerNome do container de blob

Encontre o nome da conta e a chave no portal do Azure em Storage account → Access keys. O container precisa já existir — o Hedhog não o cria automaticamente.


Compatível com S3 (MinIO, Wasabi, DigitalOcean Spaces, …)

Use este provedor para qualquer coisa que fale a API do S3 mas não seja a própria AWS.

Campo de configuraçãoDescrição
access_key_idAccess key do serviço
secret_access_keySecret key do serviço
regionIdentificador de região que o serviço espera (ex.: nyc3 para DigitalOcean Spaces)
bucketNome do bucket / Space
endpointURL de endpoint personalizada completa, ex.: https://nyc3.digitaloceanspaces.com para Spaces, ou https://minio.your-domain.com para um MinIO auto-hospedado

Sem endpoint definido, as requisições vão para os próprios endpoints da AWS e falharão contra qualquer serviço não-AWS — este é o único campo que as pessoas mais esquecem ao trocar do S3 para um provedor compatível.


Verifique se Funcionou

  • Faça upload de um arquivo em qualquer lugar do admin (um avatar de usuário funciona bem) e confirme que uma nova linha aparece em file
  • Abra a URL retornada diretamente em uma aba do navegador — ela deve carregar o arquivo, não dar 404 ou travar

Solução de Problemas

SintomaCausa provável
No file storage profile configuredfile-storage-profile-id não está definido, ou aponta para um perfil excluído
Integration profile X is not a storage profilePerfil errado selecionado — seu tipo não é storage
Provider <slug> not foundA linha de seed file_provider para aquele provedor está ausente — geralmente significa que uma migration não foi executada após adicionar o suporte de armazenamento
Os uploads têm sucesso mas a URL dá 404Para armazenamento Local, o servidor web/proxy que serve os arquivos não está apontado para base_path; para S3/GCS/Azure, o bucket/container não é público e nenhum fluxo de signed URL está configurado
Arquivos antigos quebraram após trocar de provedorEsperado — o Hedhog nunca migra arquivos existentes entre backends automaticamente