Quando a fila de federação do Mastodon trava, novas postagens de outras instâncias param de aparecer na sua timeline federada. Mensagens de saída para servidores remotos também falham. Este problema é quase sempre causado por um processo worker no Sidekiq que está processando um job que nunca termina. Este artigo explica por que a fila congela e fornece os passos exatos para limpar o job travado e reiniciar a federação normal.
Principais Conclusões: Recuperando uma Fila de Federação Travada no Mastodon
- Sidekiq Web UI > aba Busy: Identifique o job específico que está rodando há mais de 10 minutos e bloqueando a fila.
- systemctl restart mastodon-sidekiq: Reinicia todos os processos Sidekiq após matar manualmente o job travado para limpar a fila.
- RAILS_ENV=production bin/tootctl accounts unfollow: Remove uma conta remota problemática que pode estar causando jobs travados repetidos.
Por que a Fila de Federação Para no Sidekiq
O Mastodon usa o Sidekiq para processar jobs em segundo plano, incluindo todas as tarefas de federação. Cada job representa uma ação como entregar um status a um servidor remoto ou processar uma mensagem ActivityPub recebida. O Sidekiq executa múltiplas threads worker, mas a fila de federação é processada por um processo sidekiq dedicado chamado sidekiq_federation por padrão.
Quando um job nesta fila encontra um erro que não consegue tratar, o job pode entrar em um loop de retry ou ficar travado em estado de execução. Uma causa comum é um payload ActivityPub malformado de uma instância remota mal configurada. O job tenta desserializar o payload, encontra uma exceção não tratada e tenta novamente indefinidamente. Como o Sidekiq processa jobs sequencialmente dentro de uma fila, este único job travado bloqueia todos os outros jobs de federação atrás dele.
Outra causa é um timeout de rede que nunca se resolve. Se um servidor remoto está offline mas não fecha a conexão TCP, o worker do Sidekiq espera o timeout expirar. O timeout padrão no Mastodon é de 10 segundos por requisição HTTP. Se o worker fica travado esperando uma resposta que nunca chega, toda a fila de federação congela até que você intervenha manualmente.
Passos para Limpar uma Fila de Federação Travada
Execute estes passos no servidor que roda o Mastodon. Você precisa de acesso SSH e privilégios sudo.
- Acesse a Interface Web do Sidekiq
Abrahttps://sua-instancia.exemplo.com/sidekiqem um navegador. Se você não configurou a interface web do Sidekiq, pode habilitá-la adicionando a gemsidekiqao seu Gemfile e montando a rota emconfig/routes.rb. As credenciais padrão são as mesmas do seu login de admin do Mastodon se você usar a integraçãorequire 'sidekiq/web'. - Identifique o job travado na aba Busy
Clique na aba Busy. Procure por um job que está rodando há mais de 10 minutos. Um job de federação normal completa em menos de 5 segundos. O job travado mostrará um tempo decorrido longo, frequentemente excedendo 30 minutos. Anote o ID do job, que é uma string de caracteres hexadecimais. - Mate o job travado pela linha de comando
Conecte-se via SSH ao seu servidor Mastodon. Execute o seguinte comando para matar o processo Sidekiq específico que está lidando com o job travado:sudo systemctl kill -s SIGTERM mastodon-sidekiq
Isso envia um sinal de terminação graciosa para todos os workers Sidekiq. O job travado será interrompido e movido para a fila de retry. Se o job não parar, usesudo systemctl kill -s SIGKILL mastodon-sidekiqpara forçar a parada. Em seguida, reinicie o Sidekiq comsudo systemctl restart mastodon-sidekiq. - Delete o job travado da fila de retry
Após reiniciar, abra novamente a interface web do Sidekiq e clique na aba Retries. Encontre o job que você matou. Clique no botão Delete ao lado dele para removê-lo permanentemente. Não tente novamente o job, pois ele provavelmente falhará novamente com o mesmo erro. - Verifique os logs para encontrar a causa raiz
Executesudo journalctl -u mastodon-sidekiq -n 100para ver as últimas 100 linhas de log. Procure por mensagens de erro relacionadas ao job travado. Erros comuns incluem falhas doActivityPub::DeliveryWorkercom timeout HTTP ou falhas doActivityPub::ProcessingWorkercom erros de parsing JSON. Anote o domínio do servidor remoto mencionado no log de erro. - Remova a conta remota problemática
Se o erro envolver repetidamente uma conta remota específica, remova essa conta da sua instância. Use o seguinte comando:RAILS_ENV=production bin/tootctl accounts unfollow@
Isso remove todos os follows e interrompe futuras tentativas de federação com essa conta.
Se a Fila de Federação Ainda Parar Após a Recuperação
Job travado reaparece após reinicialização
Se o mesmo job reaparecer na fila de retry depois de deletá-lo, a instância remota está enviando dados malformados repetidamente. Bloqueie toda a instância remota. Execute RAILS_ENV=production bin/tootctl domain block . Isso impede qualquer federação futura com esse domínio. Após o bloqueio, reinicie o Sidekiq novamente com sudo systemctl restart mastodon-sidekiq.
Fila de federação cresce mas nunca diminui
Se o tamanho da fila aumenta mas os jobs não estão sendo concluídos, você pode ter um problema de memória. Verifique o uso de memória do Sidekiq com sudo systemctl status mastodon-sidekiq e procure pela coluna de memória. Se o uso de memória exceder 500 MB por worker, aumente o número de workers ou reduza a configuração de concorrência. Edite .env.production e adicione SIDEKIQ_CONCURRENCY=5 para limitar threads concorrentes. Reinicie o Sidekiq após a alteração.
Interface Web do Sidekiq não mostra aba Busy mas a fila está travada
Se a interface web do Sidekiq não mostrar workers ocupados mas a fila de federação não está se movendo, o processo sidekiq pode ter travado silenciosamente. Verifique o status do processo com ps aux | grep sidekiq. Se nenhum processo sidekiq estiver rodando, inicie-os com sudo systemctl start mastodon-sidekiq. Em seguida, monitore os logs para ver se a fila começa a processar.
Fila de Federação do Sidekiq vs Fila Padrão do Sidekiq
| Item | Fila de Federação | Fila Padrão |
|---|---|---|
| Propósito | Entregar e receber mensagens ActivityPub de e para instâncias remotas | Processar tarefas locais como enviar e-mails, gerar miniaturas e atualizar timelines |
| Nome do processo worker | sidekiq_federation |
sidekiq_default |
| Duração típica do job | Menos de 5 segundos | Menos de 2 segundos |
| Bloqueado por um único job travado | Sim, porque processa jobs sequencialmente | Geralmente não, porque múltiplos workers rodam em paralelo |
| Ação de recuperação | Matar o job travado e deletá-lo dos retries | Reiniciar o processo sidekiq ou aumentar o número de workers |
Agora você pode identificar e limpar uma fila de federação travada no Mastodon usando a interface web do Sidekiq e as ferramentas de linha de comando. Após remover o job ofensor e opcionalmente bloquear a instância remota problemática, a fila de federação deve retomar o processamento normal. Como dica avançada, considere configurar um alerta de monitoramento que notifique se algum job do Sidekiq rodar por mais de 60 segundos. Use uma ferramenta como Prometheus com a métrica sidekiq_job_duration_seconds para automatizar essa verificação.