Como Ativar Hospedagem de Imagens em Subdomínio no Mastodon
🔍 WiseChecker

Como Ativar Hospedagem de Imagens em Subdomínio no Mastodon

As instâncias do Mastodon armazenam imagens enviadas pelos usuários no mesmo domínio da instância por padrão. Isso pode aumentar a carga do servidor e expor o domínio principal a riscos de segurança com uploads maliciosos. Separar a hospedagem de imagens para um subdomínio dedicado melhora o desempenho e a segurança ao isolar conteúdo estático. Este artigo explica como configurar sua instância do Mastodon para servir imagens exclusivamente de um subdomínio.

Principais Conclusões: Configurando Hospedagem de Imagens em Subdomínio no Mastodon

  • Variável de ambiente CDN_HOST: Define a URL do subdomínio para servir arquivos estáticos, incluindo imagens de usuários.
  • Proxy reverso Nginx ou Apache: Roteia requisições de imagem para o subdomínio correto, mantendo o domínio principal limpo.
  • Armazenamento de objetos (compatível com S3): Necessário para transferir imagens para um subdomínio com um bucket ou caminho separado.

ADVERTISEMENT

Por que Usar um Subdomínio para Hospedagem de Imagens no Mastodon

O Mastodon armazena imagens enviadas por usuários, avatares e cabeçalhos como arquivos estáticos. Quando esses arquivos são servidos do mesmo domínio da instância, cada requisição de imagem atinge o servidor web principal. Isso pode desacelerar a instância para outros usuários e torna o domínio vulnerável a ataques de cross-site scripting através de conteúdo enviado. Ao usar um subdomínio como media.suainstancia.social, você isola o conteúdo estático da lógica da aplicação. Isso também permite configurar uma rede de entrega de conteúdo ou uma camada de cache separada para imagens sem afetar o site principal.

A configuração do Mastodon depende da variável de ambiente CDN_HOST. Apesar do nome, essa variável controla o host usado para servir todos os arquivos estáticos, incluindo mídia enviada por usuários. Definir essa variável para uma URL de subdomínio instrui o Mastodon a gerar URLs de imagem apontando para esse subdomínio. Você também deve configurar seu servidor web ou proxy reverso para atender corretamente essas requisições. O armazenamento de objetos, como Amazon S3 ou um serviço compatível, é necessário porque o Mastodon não pode servir imagens apenas de subdomínio a partir do sistema de arquivos local com este método.

Pré-requisitos

Antes de começar, certifique-se de ter o seguinte:

  • Acesso root ou sudo ao servidor Mastodon
  • Um bucket de armazenamento de objetos compatível com S3 (ex.: AWS S3, DigitalOcean Spaces, MinIO)
  • Um registro DNS de subdomínio apontando para seu servidor Mastodon ou CDN
  • Mastodon versão 3.0 ou posterior (versões anteriores não possuem a variável CDN_HOST)

Passos para Ativar a Hospedagem de Imagens em Subdomínio

  1. Crie um registro DNS para o subdomínio
    Adicione um registro CNAME ou A para o subdomínio escolhido, como media.suainstancia.social. Aponte para o mesmo endereço IP do seu domínio principal do Mastodon ou para o endpoint da sua CDN. Aguarde a propagação do DNS antes de prosseguir.
  2. Configure um bucket de armazenamento de objetos compatível com S3
    Crie um novo bucket no seu serviço de armazenamento de objetos. Por exemplo, no AWS S3, crie um bucket chamado mastodon-media. Configure o bucket para acesso de leitura público. Anote a URL do endpoint do bucket, a chave de acesso e a chave secreta.
  3. Configure as variáveis de ambiente do Mastodon
    Edite o arquivo de ambiente do Mastodon, geralmente localizado em ~/mastodon/.env.production ou /etc/mastodon/.env.production. Adicione ou modifique as seguintes linhas:
    S3_ENABLED=true
    S3_BUCKET=mastodon-media
    S3_REGION=us-east-1
    S3_PROTOCOL=https
    S3_HOSTNAME=s3.us-east-1.amazonaws.com
    AWS_ACCESS_KEY_ID=sua-chave-de-acesso
    AWS_SECRET_ACCESS_KEY=sua-chave-secreta
    CDN_HOST=https://media.suainstancia.social
    Substitua os valores pela região, hostname e credenciais reais do seu bucket.
  4. Configure o servidor web para servir o subdomínio
    Na configuração do Nginx, adicione um novo bloco de servidor para o subdomínio. Exemplo:
    server {
        listen 443 ssl;
        server_name media.suainstancia.social;
        ssl_certificate /caminho/para/certificado.pem;
        ssl_certificate_key /caminho/para/chave.pem;
        location / {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    Se usar uma CDN, aponte o subdomínio para o endpoint da CDN.

  5. Migre a mídia existente para o armazenamento de objetos
    Execute o comando de migração de mídia do Mastodon para mover os uploads existentes para o bucket S3. Use:
    RAILS_ENV=production bin/tootctl media migrate
    Este comando copia todos os arquivos de mídia locais para o bucket S3 configurado. Aguarde a conclusão do processo.
  6. Reinicie os serviços do Mastodon
    Reinicie os processos web, streaming e sidekiq para aplicar as alterações. Execute:
    systemctl restart mastodon-web mastodon-streaming mastodon-sidekiq
    Ou use o gerenciador de serviços apropriado para sua configuração.
  7. Verifique a configuração
    Faça upload de uma imagem de teste a partir de uma conta do Mastodon. Inspecione a URL da imagem no navegador. Ela deve usar o subdomínio, por exemplo: https://media.suainstancia.social/media_attachments/files/123/456/789/original/abc.jpg. Se a URL ainda mostrar o domínio principal, verifique suas variáveis de ambiente e reinicie os serviços novamente.

ADVERTISEMENT

Erros Comuns e Limitações

URLs de Imagem Ainda Usam o Domínio Principal Após a Configuração

Isso geralmente acontece quando a variável CDN_HOST não é aplicada corretamente. Verifique se a variável está definida no arquivo de ambiente correto e se não há erros de digitação. Certifique-se também de que os serviços do Mastodon foram reiniciados após a alteração. Se você estiver usando um balanceador de carga ou proxy reverso, verifique se ele não está sobrescrevendo o cabeçalho Host.

Mídia Existente Não Servida do Subdomínio

O comando bin/tootctl media migrate apenas move arquivos para o armazenamento de objetos. Ele não atualiza as URLs da mídia já enviada no banco de dados. Para atualizar as URLs de mídia existentes, execute bin/tootctl media regenerate. Isso reprocessa os anexos de mídia e regenera as URLs usando o novo CDN_HOST.

Custos de Armazenamento de Objetos Aumentam Inesperadamente

Mover a mídia para o armazenamento de objetos transfere os custos de armazenamento do seu servidor para o provedor S3. Monitore o uso do seu bucket e configure alertas de faturamento. Você também pode configurar políticas de ciclo de vida para excluir mídia antiga ou não utilizada do bucket.

Hospedagem de Imagens em Subdomínio no Mastodon vs Armazenamento Local Padrão

Item Subdomínio com Armazenamento de Objetos Armazenamento Local Padrão
Padrão de URL da imagem https://media.instancia.social/... https://instancia.social/...
Carga do servidor para mídia Transferida para armazenamento de objetos ou CDN Manipulada pelo servidor web principal
Isolamento de segurança Subdomínio separado reduz risco de XSS Imagens servidas da mesma origem
Complexidade de configuração Requer DNS, bucket S3 e alterações de configuração Integrado, sem configuração extra
Custo Taxas de armazenamento de objetos se aplicam Usa apenas espaço em disco do servidor

Ativar a hospedagem de imagens em subdomínio separa o conteúdo estático da aplicação Mastodon. Isso reduz a carga do servidor e melhora a segurança. Após concluir os passos acima, teste a configuração enviando uma imagem e verificando a URL. Para configurações avançadas, considere adicionar uma CDN na frente do subdomínio para acelerar ainda mais a entrega de imagens em todo o mundo.

ADVERTISEMENT