更新/重建 Discourse 到最新版本会不可逆地破坏网站

嘿,我们最近遇到了一个非常棘手的错误,导致我们的整个网站都无法使用,似乎没有可行的解决方法。我们尝试了从重建到删除/添加插件的所有方法,但都无济于事。我们有一个几个月前的可用备份,但似乎任何尝试用新版本重建的尝试都会直接破坏网站。

显示的主要消息是:

糟糕
为这个讨论论坛提供动力的软件遇到了意外问题。我们对由此带来的不便深表歉意。

有关错误的详细信息已记录,并生成了自动通知。我们会对其进行查看。

无需进一步操作。但是,如果错误状况持续存在,您可以通过在网站的反馈类别中发布讨论主题来提供更多详细信息,包括重现错误的步骤。

这是一个通用的 Discourse 错误消息,在故障排除时不会产生任何实际结果。检查我们的 docker 日志,我发现了这个:

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'

所以,很自然地,我想到可以通过在第 501 行错误处实现一个 try/catch 来修复这个问题。这是相关的方法:

  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

虽然这确实恢复了网站的功能,但遗憾的是,它会导致整个网站上不加载任何图标或图像,所以最终并没有解决任何问题。

我们正在使用以下插件:

          - 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

据我所知,我们曾经使用过一些插件,例如 discourse-follow,在它们被官方支持之前,所以降级它们可能在过程中破坏了某些东西。

更新前的原始版本是 2.8.0.beta2,我们现在是 2.9.0.beta1。

我已经尝试了我能想到的一切,我不确定是否应该在这里发帖,因为我觉得这是一个过于通用的错误,没有人能提供帮助,但如果有人对导致此问题的原因有任何想法,我将不胜感激。

1 个赞

这可能是 Postgres 的一个问题,Postgres 正在尝试从版本 10 升级到版本 13。

检查日志,看看是否能看到任何与 postgres 相关的内容。

2 个赞

您是指 /shared/standalone/log/rails 中的日志吗?因为它们没有提到任何与 postgres 相关的内容。至于 /shared/standalone/log/var-log/postgres 中的日志,在错误发生时(19:51:08),有一个请求似乎没有异常。没有错误或任何看起来失败的东西。而在更新时,我认为这里没有记录。

您有什么特别需要我查找的东西吗?

确保您的 apt-get update | apt-get upgrade 是最新的
然后运行 ./launcher rebuild app

检查错误或查看 /var/discourse/shared/standalone/log/rails

1 个赞

我已经更新了 apt-get updateapt-get upgrade,进行了完整重建,但不幸的是仍然遇到同样的错误。从我所能看到的情况来看,没有任何改变。

1 个赞

一些问题:

  1. 重建是否会出错?
  2. 您是否尝试过通过安全模式加载网站?
  3. 您可以分享网站的网址,以便我们查看吗?
1 个赞
  1. 是的,重建没有出错。
  2. 是的,就像我修复了上面提到的错误一样,它会以一种“没有图标/图像”的模式启动网站,什么都加载不了。
  3. 是的,也不是,该网站包含一些露骨内容,我将不得不询问人们是否愿意让我分享它。

与此同时,我发现了一些其他情况,在安全模式下浏览网站时,我注意到 DiscoTOC 抛出了一个错误。禁用它后,网站可以正常运行,无需安全模式,但图标/图像仍然无法正常加载。

所有图像在控制台中都抛出 404 错误,大多数图标(如网站图标)都抛出 500 错误。
当然,它们之前都可以正常工作。

此外,是否可能是重建过程以某种方式清除了数据库中所有图像的引用?

为了让大家了解最新情况,我尝试了来自不同帖子的几项建议,仅举两例:

但这些建议均无效,rake posts:rebakerake posts:missing_uploadsrake uploads:recover_from_tombstone 都未能奏效。我也检查了 sidekiq 仪表板,但它也没有恢复任何内容。

如果您有任何关于如何恢复现已丢失的图片的建议,我将不胜感激。

经过大量的试错,我最终成功地恢复了图像,因此我认为这个问题已经解决。

1 个赞

有什么是您希望一开始就知道的吗?

3 个赞

也许从一开始就在安全模式下更彻底地查看网站会有所帮助。我也必须承认,在网站已经进行了一些工作之后,我才参与了网站的恢复工作,结果发现这些图片在一个单独的备份文件夹里,只需要移过去就可以了。

4 个赞

这可真够难猜的!很高兴你解决了。

1 个赞

此主题在上次回复后 30 天自动关闭。不再允许回复。