Atualizando / Reconstruindo Discourse para a versão mais recente quebra irreversivelmente o site

Olá, temos enfrentado um bug muito desagradável ultimamente que quebrou todo o nosso site, sem uma saída aparentemente viável. Tentamos de tudo, desde reconstruir até remover/adicionar plugins, sem sucesso. Temos um backup funcional de alguns meses atrás, mas parece que qualquer tentativa de reconstruir isso com uma versão mais recente simplesmente quebra o site.

A mensagem principal exibida diz:

Oops
O software que alimenta este fórum de discussão encontrou um problema inesperado. Pedimos desculpas pelo inconveniente.

Informações detalhadas sobre o erro foram registradas e uma notificação automática gerada. Daremos uma olhada.

Nenhuma ação adicional é necessária. No entanto, se a condição de erro persistir, você pode fornecer detalhes adicionais, incluindo os passos para reproduzir o erro, postando um tópico de discussão na categoria de feedback do site.

Esta é uma mensagem de erro genérica do Discourse que não produz resultados reais ao solucionar problemas. Verificando os logs do nosso docker, consegui encontrar isto:

Completed 500 Internal Server Error in 152ms (ActiveRecord: 0.0ms | Allocations: 17980)
ActionView::Template::Error (undefined method `[]' for nil:NilClass)
lib/svg_sprite/svg_sprite.rb:502:in `block in custom_icons'
lib/svg_sprite/svg_sprite.rb:500:in `each'
lib/svg_sprite/svg_sprite.rb:500:in `custom_icons'
lib/svg_sprite/svg_sprite.rb:275:in `block in all_icons'
lib/distributed_cache.rb:25:in `defer_get_set'
lib/svg_sprite/svg_sprite.rb:517:in `get_set_cache'
lib/svg_sprite/svg_sprite.rb:268:in `all_icons'
lib/svg_sprite/svg_sprite.rb:337:in `bundle'
lib/svg_sprite/svg_sprite.rb:285:in `block in version'
lib/distributed_cache.rb:25:in `defer_get_set'
lib/svg_sprite/svg_sprite.rb:517:in `get_set_cache'
lib/svg_sprite/svg_sprite.rb:284:in `version'
lib/svg_sprite/svg_sprite.rb:290:in `path'
app/helpers/application_helper.rb:586:in `client_side_setup_data'
app/views/layouts/application.html.erb:61
lib/topic_list_responder.rb:13:in `block (2 levels) in respond_with_list'
lib/topic_list_responder.rb:9:in `respond_with_list'
app/controllers/list_controller.rb:103:in `block (2 levels) in <class:ListController>'
app/controllers/application_controller.rb:387:in `block in with_resolved_locale'
app/controllers/application_controller.rb:387:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:356:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:198:in `call'

Então, naturalmente, pensei que poderia corrigir o problema simplesmente implementando um try/catch na linha 501, onde ocorre o erro. Este é o método em questão:

  def self.custom_icons(theme_id)
    # Automatically register icons in sprites added via themes or plugins
    icons = []
    custom_svg_sprites(theme_id).each do |item|
      begin
        svg_file = Nokogiri::XML(item[:sprite])
        svg_file.css('symbol').each do |sym|
          icons << sym.attributes['id'].value if sym.attributes['id'].present?
        end
      rescue Exception => e
        puts e
      end
    end
    icons
  end

Embora isso restaure a funcionalidade do site, infelizmente o faz sem carregar nenhum ícone ou imagem em todo o site, então, em última análise, isso não resolve nada.

Estamos usando os seguintes plugins:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/discourse/discourse-user-notes.git

Pelo que me lembro, usamos alguns plugins como o discourse-follow antes de serem oficialmente suportados, então talvez o downgrade deles tenha quebrado algo no processo.

A versão original antes da atualização era 2.8.0.beta2, agora estamos na 2.9.0.beta1.

Tentei praticamente tudo que consigo pensar, não tinha certeza se deveria postar aqui porque sinto que este é um bug muito genérico para alguém conseguir ajudar, mas se alguém tiver alguma ideia do que está causando isso, agradeceria a ajuda.

Pode haver um problema com o Postgres, onde ele está tentando fazer o upgrade da versão 10 para a 13.

Verifique os logs para ver se encontra algo relacionado ao Postgres.

Você está se referindo aos logs contidos em /shared/standalone/log/rails? Porque eles não mencionam nada relacionado ao postgres. Quanto aos logs contidos em /shared/standalone/log/var-log/postgres, por volta da hora do erro, 19:51:08, há uma solicitação que não parece fora do comum. Nenhum erro ou algo que pareça falhar. E por volta da hora da atualização, acho que isso não é registrado aqui.

Você tem algo em particular que eu possa procurar?

certifique-se de que seu apt-get update | apt-get upgrade esteja atualizado
e então execute ./launcher rebuild app

verifique se há erros ou procure em /var/discourse/shared/standalone/log/rails

Atualizei tanto o apt-get update quanto o apt-get upgrade, fiz uma reconstrução completa e, infelizmente, me deparo com os mesmos erros. Pelo que pude ver, nada mudou.

Algumas perguntas:

  1. A reconstrução é concluída sem erros?
  2. Você tentou carregar o site em modo de segurança?
  3. Você pode compartilhar o URL do site para que possamos dar uma olhada?
  1. Sim, a reconstrução é concluída sem erros.
  2. Sim, e de forma semelhante a quando corrijo o erro mencionado acima, ele inicia o site em uma espécie de modo “sem ícones / imagens” onde nada carrega.
  3. Sim e não, o site contém conteúdo explícito e terei que perguntar se as pessoas se sentem confortáveis para que eu o compartilhe.

Enquanto isso, descobri outra coisa: ao navegar no site em modo de segurança, notei que o DiscoTOC gera um erro. Ao desativá-lo, o site volta a funcionar normalmente sem a necessidade de modo de segurança, no entanto, os ícones/imagens ainda não carregam corretamente.

Todas as imagens estão gerando 404 no console, a maioria dos ícones como o favicon está gerando 500.
Naturalmente, todos eles estavam funcionando bem antes.

Para complementar, será que a reconstrução limpou de alguma forma o banco de dados de todas as referências de imagem?

Para manter todos atualizados, desde então experimentei várias sugestões de diferentes tópicos, mas apenas para citar duas:

Nenhuma das sugestões ajudou, rake posts:rebake, rake posts:missing_uploads e rake uploads:recover_from_tombstone não funcionaram, infelizmente. Também verifiquei o painel do sidekiq, mas isso também não está restaurando nada.

Para quem tiver alguma ideia de como restaurar as imagens agora ausentes, ficaria grato em ouvi-las.

Depois de muita tentativa e erro, consegui restaurar as imagens com sucesso, então considerarei este problema resolvido.

Havia algo que você gostaria de saber no início?

Talvez dar uma olhada mais completa no site em modo de segurança desde o início teria ajudado. Tenho que admitir também que só fui envolvido na restauração do site depois que algum trabalho já havia sido feito nele, e descobri que as imagens estavam em uma pasta separada de backup e só precisavam ser movidas.

Difícil para qualquer um adivinhar isso! Que bom que você descobriu.