Extensão Storage

Object storage S3-compatible para o seu app, pronto para o Active Storage do Rails em poucos minutos.

O que a Extensão entrega

Ao ativar a Extensão Storage, o Jataí provisiona um bucket S3-compatible privado, exclusivo do app, no storage do Jataí. O bucket não é público: só quem tem a credencial consegue ler ou escrever nele.

Junto com o bucket, o app recebe uma credencial própria — uma service account isolada, sem acesso a nenhum outro recurso da conta. Se essa credencial vazar, revogá-la não afeta mais nada além do bucket do app.

Instale a Extensão pela aba Extensões do app no dashboard.

Variáveis de ambiente injetadas

No provisionamento, o Jataí injeta automaticamente as variáveis abaixo no app — nenhuma configuração manual é necessária.

Variável Descrição
STORAGE_BUCKET Nome do bucket dedicado ao app
STORAGE_ENDPOINT Endpoint S3 da região, no formato https://<região>.magaluobjects.com
STORAGE_ACCESS_KEY Access key da credencial do app
STORAGE_SECRET_KEY Secret key da credencial do app
STORAGE_REGION Região do bucket (ex: br-se1)

Rode jatai env list a qualquer momento para conferir os valores atuais.

Configurando o Active Storage

Adicione o serviço jatai ao config/storage.yml do seu app, lendo as variáveis injetadas:

jatai:
  service: S3
  endpoint: <%= ENV["STORAGE_ENDPOINT"] %>
  access_key_id: <%= ENV["STORAGE_ACCESS_KEY"] %>
  secret_access_key: <%= ENV["STORAGE_SECRET_KEY"] %>
  region: <%= ENV["STORAGE_REGION"] %>
  bucket: <%= ENV["STORAGE_BUCKET"] %>
  force_path_style: true

force_path_style: true é obrigatório: o endpoint resolve o bucket pelo caminho da URL, não por subdomínio.

Depois, aponte o ambiente de produção para o novo serviço em config/environments/production.rb:

config.active_storage.service = :jatai

Funciona com qualquer SDK S3-compatible

O Active Storage é só um caminho — o bucket é S3-compatible de verdade, então qualquer SDK que fale o protocolo S3 funciona (boto3, AWS SDK para Node/Go, MinIO client, etc.), desde que aponte para o STORAGE_ENDPOINT injetado e use path-style em vez de virtual-hosted-style:

endpoint_url = ENV["STORAGE_ENDPOINT"]
aws_access_key_id = ENV["STORAGE_ACCESS_KEY"]
aws_secret_access_key = ENV["STORAGE_SECRET_KEY"]
path_style = true  # obrigatório — o bucket é resolvido pelo caminho da URL

URLs assinadas

O bucket é privado, então url_for do Active Storage gera URLs assinadas com expiração — não links públicos permanentes. Se o app usa o modo redirect para servir imagens em páginas públicas (ex: rails_blob_path), cada carregamento de página gera uma URL assinada nova — funciona normalmente, mas não cacheie a URL em si além do prazo de expiração, ou o link para de funcionar.

Franquia do plano e comportamento de quota

Cada plano da Extensão Storage tem uma franquia de armazenamento. Ao ultrapassar o limite contratado, a plataforma pausa apenas os uploads — a credencial do app perde a permissão de escrita (PutObject). Leitura e exclusão de arquivos continuam funcionando normalmente, então dá para liberar espaço apagando o que não precisa mais sem precisar de suporte.

Assim que o uso volta a ficar abaixo do limite do plano, os uploads são restaurados automaticamente — sem intervenção manual.

Saída de dados (egress)

A saída de dados (egress) ainda não é medida por bucket — o uso é regido por fair-use: consumo compatível com o uso normal de um app não sofre restrição. Um plano de uso medido de egress está no roadmap.