Armazenamento de Objetos no Mastodon: S3 vs Disco Local – Prós e Contras
🔍 WiseChecker

Armazenamento de Objetos no Mastodon: S3 vs Disco Local – Prós e Contras

Instâncias do Mastodon armazenam uploads de usuários como imagens, vídeos e arquivos. Todo operador de instância precisa escolher entre salvar esses arquivos no disco local do servidor ou usar um serviço de armazenamento de objetos como Amazon S3 ou uma alternativa compatível. A escolha afeta desempenho, custo, escalabilidade e durabilidade dos dados. Este artigo compara as duas abordagens e explica os prós e contras para administradores de instância.

Principais Conclusões: Armazenamento de Objetos S3 vs Disco Local para Mídia do Mastodon

  • Variável de ambiente S3_ENABLED: Defina como true para ativar o armazenamento compatível com S3 para uploads de usuários.
  • Variável de ambiente PAPERCLIP_ROOT_PATH: Define o caminho do disco local usado quando o armazenamento S3 está desabilitado.
  • Variável de ambiente S3_BUCKET: Especifica o nome do bucket S3 onde o Mastodon armazena arquivos de mídia.

Entendendo as Opções de Armazenamento de Mídia do Mastodon

O Mastodon usa a gem Paperclip para lidar com anexos de arquivos. Por padrão, o Paperclip salva os arquivos enviados no sistema de arquivos local do servidor. O caminho de armazenamento é definido pela variável de ambiente PAPERCLIP_ROOT_PATH. Essa abordagem é simples e não requer serviços adicionais.

Quando você ativa o armazenamento de objetos compatível com S3, o Mastodon redireciona o Paperclip para enviar arquivos a um bucket remoto. A instância então serve os arquivos diretamente da URL do armazenamento de objetos. Essa configuração requer definir S3_ENABLED=true e fornecer credenciais do bucket. Provedores compatíveis incluem Amazon S3, DigitalOcean Spaces, Wasabi, Backblaze B2 e qualquer serviço que ofereça uma API compatível com S3.

O Que é Armazenado

Ambos os métodos de armazenamento lidam com os mesmos tipos de arquivos: avatares de perfil, imagens de cabeçalho, anexos de mídia em toots, emojis personalizados e cartões de pré-visualização. O banco de dados da instância armazena apenas caminhos de arquivos ou URLs. Os dados binários reais residem no disco local ou no bucket de armazenamento de objetos.

Quando a Escolha Importa

A decisão tem maior impacto quando sua instância cresce além de um único servidor. Uma instância pessoal pequena com menos de 100 usuários ativos pode funcionar confortavelmente em disco local. Uma instância média ou grande com milhares de usuários rapidamente encherá um disco local e sobrecarregará a capacidade de I/O do servidor. O armazenamento de objetos se torna necessário para escalabilidade horizontal.

Comparando Armazenamento de Objetos S3 e Disco Local para Mastodon

Cada método de armazenamento tem vantagens e desvantagens claras. As seções a seguir detalham os principais prós e contras.

Desempenho e Latência

O disco local oferece a menor latência para leitura e escrita de arquivos. O servidor web lê diretamente da mesma máquina. O armazenamento de objetos adiciona viagens de ida e volta pela rede. Cada requisição de mídia precisa viajar da instância até o provedor de armazenamento de objetos e voltar. Isso adiciona de 10 a 50 milissegundos por requisição em condições normais. O cache com uma CDN pode reduzir o impacto para arquivos acessados com frequência.

Para operações de escrita, o armazenamento de objetos é mais lento porque cada upload requer uma requisição HTTP PUT completa. As escritas em disco local são quase instantâneas. A diferença é mais relevante durante operações em lote, como importar emojis personalizados ou processar uploads de vídeo.

Escalabilidade

O disco local não escala horizontalmente. Se você adicionar mais servidores de aplicação atrás de um balanceador de carga, cada servidor precisa ter sua própria cópia dos arquivos de mídia. Você precisaria de um sistema de arquivos compartilhado como NFS ou GlusterFS, o que adiciona complexidade e pode se tornar um gargalo. O armazenamento de objetos é inerentemente compartilhado. Cada servidor de aplicação pode ler e escrever no mesmo bucket sem configuração adicional.

Custo

O custo do disco local é previsível. Você paga uma vez pela capacidade de armazenamento do seu servidor. O custo por gigabyte geralmente é menor que o do armazenamento de objetos. No entanto, você também deve considerar os backups. Um backup completo do servidor que inclua arquivos de mídia pode ser grande e caro para armazenar.

O armazenamento de objetos cobra com base no uso. Você paga pelo armazenamento utilizado, pelos dados transferidos e pelas requisições à API. Os custos podem crescer rapidamente se sua instância servir muitos arquivos grandes. Alguns provedores oferecem egress gratuito dentro de seu ecossistema. Por exemplo, arquivos armazenados no DigitalOcean Spaces servidos a um Droplet DigitalOcean não incorrem em taxas de transferência.

Durabilidade e Redundância dos Dados

O disco local não oferece redundância por padrão. Se o disco falhar, todos os arquivos de mídia serão perdidos, a menos que você mantenha backups separados. Os provedores de armazenamento de objetos replicam dados em várias zonas de disponibilidade. O Amazon S3 Standard oferece 99,999999999% de durabilidade. Esse nível de proteção não exige esforço extra do operador da instância.

Esforço de Manutenção

O disco local requer manutenção manual. Você precisa monitorar o uso do disco, rotacionar logs e limpar arquivos de mídia antigos. A CLI de administração do Mastodon fornece comandos como tootctl media remove para excluir anexos não utilizados. Você também precisa gerenciar backups de disco por conta própria.

O armazenamento de objetos reduz o esforço de manutenção. O provedor lida com falhas de hardware e substituições de disco. Você ainda precisa gerenciar políticas de ciclo de vida para excluir arquivos antigos e controlar custos. A maioria dos serviços compatíveis com S3 permite definir regras de expiração automática no bucket.

Considerações de Segurança

Os arquivos em disco local são acessíveis apenas através do servidor web. Não há superfície de ataque externa para a camada de armazenamento. O armazenamento de objetos requer gerenciamento seguro de credenciais. Se suas chaves de acesso S3 vazarem, um invasor pode ler ou excluir todos os arquivos de mídia. Você deve usar funções IAM ou variáveis de ambiente com permissões restritas. Nunca codifique chaves no código-fonte.

Erros de Configuração Comuns e Limitações

Endpoint S3 Mal Configurado Causa Falhas no Upload

Se você definir S3_ENABLED=true mas fornecer uma URL de endpoint incorreta, o Mastodon falhará ao fazer upload de qualquer mídia. O erro aparece nos logs como Net::OpenTimeout ou Net::ReadTimeout. Verifique novamente o valor do endpoint. Para Amazon S3, use https://s3.REGION.amazonaws.com. Para DigitalOcean Spaces, use https://REGION.digitaloceanspaces.com.

Permissões do Bucket Bloqueiam Acesso Público

O Mastodon serve arquivos de mídia diretamente da URL do armazenamento de objetos. O bucket deve permitir acesso de leitura público. Se o bucket bloquear o acesso público, os usuários verão imagens quebradas. Defina uma política de bucket que conceda s3:GetObject a Principal: "*". Restrinja o acesso de escrita apenas à aplicação Mastodon.

Cabeçalhos CORS Ausentes para Uploads Diretos

Quando o Mastodon usa upload direto para S3, o navegador envia uma requisição de origem cruzada. Se o bucket não retornar os cabeçalhos CORS corretos, o upload falha silenciosamente. Configure a política CORS do bucket para permitir a origem da sua instância Mastodon e os métodos PUT, POST e GET.

Armazenamento em Disco Local Não Pode Ser Migrado Sem Indisponibilidade

Se você começar com disco local e depois migrar para S3, os arquivos de mídia existentes permanecem no servidor local. O Mastodon servirá novos uploads do S3, mas os arquivos antigos ainda virão do caminho local. Para migrar, você deve copiar todos os arquivos existentes para o bucket S3 e atualizar os registros do banco de dados. O processo de migração requer que a instância esteja em modo de manutenção para evitar inconsistência de dados.

Item Disco Local Armazenamento de Objetos S3
Latência de leitura Muito baixa (sistema de arquivos local) Moderada (viagem de rede)
Latência de escrita Muito baixa Moderada a alta
Escalabilidade horizontal Requer sistema de arquivos compartilhado Acesso compartilhado nativo
Custo de armazenamento Fixo por servidor Baseado no uso (cresce com o tráfego)
Durabilidade dos dados Dependente de backups Replicação gerenciada pelo provedor
Esforço de manutenção Alto (monitorar disco, limpar arquivos) Baixo (provedor cuida do hardware)
Risco de segurança Baixo (sem camada de armazenamento externa) Moderado (gerenciamento de credenciais)
Complexidade de migração N/A Baixa a média (copiar arquivos existentes)

Agora você tem uma visão clara dos prós e contras entre disco local e armazenamento de objetos S3 para sua instância Mastodon. Comece com disco local se você administra uma instância pequena de servidor único e deseja a configuração mais simples. Migre para armazenamento compatível com S3 quando precisar escalar além de um servidor ou quando quiser redundância automatizada. Use o comando tootctl media remove regularmente, independentemente da sua escolha de armazenamento, para manter o uso do disco sob controle.