Eu administro um site Discourse e gostaria de começar dizendo o quanto amo este software. Obrigado a toda a equipe pelo excelente trabalho; esta é uma ferramenta incrível.
Após uma atualização para a versão 2.5.0, enfrentei grandes problemas. Aqui está um resumo e a solução alternativa que implementei. Talvez isso leve a uma correção ainda melhor em versões futuras.
Alguns dos tópicos em nosso banco de dados contêm uploads corrompidos. Utilizamos o recurso “Uploads S3” e, por engano, excluímos o bucket. Sim, foi uma coisa muito estúpida de fazer, mas, bem, nós fizemos! O resultado foi que todas as imagens dos tópicos foram perdidas.
Exceto pelo fato de termos perdido muitas imagens, tudo estava bem: o Discourse exibia links quebrados para imagens inexistentes, mas o resto funcionava corretamente.
No entanto, quando tentamos atualizar para a versão 2.5.0, o sistema ficou instável: todos os usuários logados recebiam erros 500, enquanto visitantes anônimos conseguiam acessar o site normalmente.
Após investigar, percebi que o Discourse estava falhando devido a erros do tipo “No such file” (Arquivo não encontrado). Parece que ele estava tentando baixar esses arquivos. Fui obrigado a forçar o método local? para true em /var/www/discourse/app/models/upload.rb, e isso resolveu o problema. No entanto, estou um pouco preocupado com as próximas atualizações…
Isso é claramente algo novo, já que atualizações anteriores não causaram problemas.
A propósito, existe algum método que eu possa seguir para remover todos os links de imagens mortas que temos em nossos tópicos?
Claro, no meu log/production.log, eu tinha a seguinte exceção (quando o Discourse estava acessando o bucket S3 vazio (que eu recriei, esperando que isso resolvesse o problema).
Iniciado GET “/” para 86.246.127.170 em 2020-05-16 14:29:06 +0000
Processando por ListController#latest como HTML
Criando escopo :open. Sobrescrevendo método existente Poll.open.
Concluído 500 Internal Server Error em 3638ms (ActiveRecord: 0.0ms | Alocações: 135090)
NoMethodError (método path não definido para nil:NilClass)
/var/www/discourse/lib/file_store/base_store.rb:150:in `cache_file’
Posso confirmar que isso não é causado por um plugin: reproduzi o mesmo bug com uma instalação limpa + restauração do meu último backup e sem plugins instalados, exceto o docker_manager.
O primeiro rastreamento de pilha que obtive foi:
Conclusão do erro 500 Internal Server Error em 4169ms (ActiveRecord: 0.0ms | Alocações: 72058)
NoMethodError (método path' não definido para nil:NilClass) /var/www/discourse/lib/file_store/base_store.rb:150:in cache_file’
if file.nil?
return
end
FileUtils.cp(file.path, path)
O que levou a um segundo erro (o que mencionei em minha postagem inicial):
Início do GET “/” para 86.246.127.170 em 2020-05-18 07:37:40 +0000
Processamento por CategoriesController#index como HTML
Conclusão do erro 500 Internal Server Error em 4342ms (ActiveRecord: 0.0ms | Alocações: 60478)
NoMethodError (método path' não definido para nil:NilClass) /var/www/discourse/app/models/upload.rb:193:in fix_dimensions!’
O que corrigi forçando local? para true:
def local?
return true
!(url =~ /^(https?:)?///)
end
Sim, eu fiz. Mas, em seguida, o bucket foi excluído. E eu voltei para o armazenamento local (com links de imagens mortas em tópicos anteriores, obviamente).
Sim, eu concordo, mas estou receoso de executar esse “nuke” manualmente no banco de dados. Alguma sugestão para fazer isso de forma “adequada”? Ou devo fazer realmente “manualmente”?
Além disso, tenho a impressão que essa mudança de comportamento do Discourse é um pouco preocupante. Significa que, pelo que posso ver, se em algum momento houver um link de imagem morto em algum lugar, o aplicativo vai travar.
Não era assim antes. Eu sugeriria torná-lo mais robusto em situações como essa.
Sim, isso parece ser o mesmo problema. @sukria, se você atualizar para a versão mais recente com testes aprovados, incluí uma correção que torna o processo mais robusto para uploads corrompidos (embora você ainda deva tentar limpar as referências aos uploads corrompidos).
Obrigado @david, confirmo que uma nova compilação contra tests-passed funcionou sem problemas. Obrigado!
Alguma sugestão sobre uma maneira adequada/fácil de se livrar desses links mortos nos tópicos?