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.

Configuração Rápida
- Crie um Perfil de Integração (tipo Storage, escolha um provedor) em Settings → Integration Profiles
- Preencha os campos de configuração do provedor (tabelas abaixo)
- Vá em Settings → Configurations → File Storage e defina Storage Profile para ele
- 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
- Um arquivo é enviado através de qualquer endpoint que chama
FileService.upload() - O
FileServicelê a configuraçãofile-storage-profile-idpara encontrar o Perfil de Integração ativo (tipostorage) - Ele mapeia o JSON
configespecí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) - O arquivo é gravado via o adaptador, um registro é salvo na tabela
filecom 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
| Provedor | Slug integration_provider | Descrição |
|---|---|---|
| Local | local | Armazena arquivos no próprio filesystem do servidor |
| Amazon S3 | s3 | Armazenamento de objetos da AWS |
| Google Cloud Storage | gcs | Armazenamento de objetos do GCP |
| Azure Blob Storage | azure-blob | Armazenamento de objetos do Microsoft Azure |
| Compatível com S3 | s3-compatible | MinIO, Wasabi, DigitalOcean Spaces e qualquer outro serviço compatível com a API do S3 |
Configurando
- Vá em Settings → Integration Profiles → New → Tipo Storage, escolha um provedor e preencha seus campos de configuração (tabela abaixo)
- Vá em Settings → Configurations → File Storage e defina o campo Storage Profile (
file-storage-profile-id) para esse perfil - Os uploads passam a usar o novo provedor imediatamente — os registros
fileexistentes 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ção | Descrição |
|---|---|
base_path | Diretó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ção | Descrição |
|---|---|
access_key_id | AWS access key ID |
secret_access_key | AWS secret access key |
region | Região AWS (padrão us-east-1 se deixado vazio) |
bucket | Nome 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ção | Descrição |
|---|---|
key_file_json | O 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 |
bucket | Nome 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ção | Descrição |
|---|---|
account | Nome da conta de armazenamento |
key | Chave de acesso da conta de armazenamento |
container | Nome 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ção | Descrição |
|---|---|
access_key_id | Access key do serviço |
secret_access_key | Secret key do serviço |
region | Identificador de região que o serviço espera (ex.: nyc3 para DigitalOcean Spaces) |
bucket | Nome do bucket / Space |
endpoint | URL 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
| Sintoma | Causa provável |
|---|---|
No file storage profile configured | file-storage-profile-id não está definido, ou aponta para um perfil excluído |
Integration profile X is not a storage profile | Perfil errado selecionado — seu tipo não é storage |
Provider <slug> not found | A 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á 404 | Para 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 provedor | Esperado — o Hedhog nunca migra arquivos existentes entre backends automaticamente |