更新到3.3.0beta1后自定义头像“消失”

您好,

我最近将我们的测试论坛更新到了 3.3.0beta1。测试论坛的内容基本上是我们实时论坛的一个过时副本。我们使用它来测试更新和新功能。它使用与实时论坛相同的 Amazon S3 连接进行上传。

在将主机操作系统更新到最新的 Ubuntu 24.04 LTS 并将论坛更新到 3.3.0beta1 后,所有自定义头像都消失了,取而代之的是白色/灰色头像显示。

查看日志后,我发现类似这样的消息:

无法在位于 URL //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/6/9/69ca9110f27d91561axyz52a9cd9485a970fe9.jpeg 的存储中找到文件

尽管事实上该图像在该 URL 上存在并且运行良好。我尝试从服务器 wget 该文件,看看是否存在任何 DNS 问题或其他可能阻碍本地头像代理获取它的问题——但情况并非如此。

有什么想法可能是什么原因吗?

看起来这不仅发生在测试论坛上,而且在实时论坛上,头像也一块一块地消失,日志中出现了相同的错误。

我想知道测试论坛是否在清理 S3 存储桶中它不期望的东西,但你说东西就在存储桶里,所以不是那个原因。也许可以将数据库恢复到测试环境,然后查看 uploads 模型中的内容。

问题是——日志中的错误消息指出它无法加载某个图像,但该图像实际上是可用的。所以我猜有什么东西阻碍了论坛/头像代理加载该图像。

1 个赞

我刚刚在测试服务器(运行 3.3.0beta1)上上传了一个新的头像。它上传了,在预览中显示了,但之后又加载失败了。

/var/www/discourse/app/models/optimized_image.rb:81:in `block in create_for' 
/var/www/discourse/app/models/optimized_image.rb:19:in `block (2 levels) in lock' 
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize' 
/var/www/discourse/app/models/optimized_image.rb:19:in `block in lock' 
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize' 
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize' 
/var/www/discourse/app/models/optimized_image.rb:18:in `lock' 
/var/www/discourse/app/models/optimized_image.rb:73:in `create_for' 
/var/www/discourse/app/models/upload.rb:130:in `get_optimized_image' 
/var/www/discourse/app/controllers/user_avatars_controller.rb:218:in `get_optimized_image' 
/var/www/discourse/app/controllers/user_avatars_controller.rb:136:in `show_in_site' 
/var/www/discourse/app/controllers/user_avatars_controller.rb:89:in `block (2 levels) in show' 
/var/www/discourse/lib/hijack.rb:64:in `instance_eval' 
/var/www/discourse/lib/hijack.rb:64:in `block in hijack' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:797:in `call_callback' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve_with' 
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve' 
/var/www/discourse/lib/scheduler/defer.rb:115:in `block in do_work' 
rails_multisite-5.0.1/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-5.0.1/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/lib/scheduler/defer.rb:109:in `do_work' 
/var/www/discourse/lib/scheduler/defer.rb:97:in `block (2 levels) in start_thread' 

这是来自日志的消息。

那条日志消息是:

Could not find file in the store located at url: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/0/2/02832e36e27bbad791fda46e2290df31e5ee2dda.jpeg

(修改了 URL,所以它不会起作用,但真实的 URL 是可以工作的)

“block in hijack”让我很困惑。

我们在生产环境的服务器后面运行着 Cloudflare。测试服务器是“仅 DNS”,所以显然没有通过 Cloudflare 过滤。我们最近在主站上遇到了一些机器人问题,我们为此在 Cloudflare 过滤器上做了很多调整。

但为什么从 amazonaws.com URL 获取会成为问题呢?而且测试服务器根本没有通过 Cloudflare。

说实话,我现在有点困惑。

我在这上面卡住了。这个问题似乎同时影响了在线论坛和测试论坛——在线论坛仍在使用旧版本,而且问题似乎并不是随着更新开始的,而是几天前出现的,当时没有任何显著的变化。

所以发生的情况是,Discourse 正确地将新的自定义头像上传到 S3,并正确地设置了访问控制列表(ACL),文件也可以通过 Discourse 尝试用来拉取头像代理的 URL 公开访问——但它仍然无法做到这一点(参见上面的堆栈跟踪)。

有没有人对头像代理的工作原理有深入了解,或者能从堆栈跟踪中看出什么问题?

我从服务器上 wget 了图片的 URL,它们都能正常工作——所以应该没有什么能阻止访问该 URL。

您能从浏览器中获取它们吗?

啊是的,抱歉如果那不清楚。我可以在浏览器中访问它们(所以我假设是公开可用的),也可以从服务器访问它们(以排除是服务器在获取它们时遇到某种麻烦。实际上只是 discourse 由于某种原因未能获取它们(请参阅上面的堆栈跟踪)。

1 个赞

您找到了解决您问题的方法吗?我们在版本 3.2.1 上遇到了完全相同的问题。存储桶已阻止所有公共访问,但它仍然可以通过预签名 URL 工作。现在我遇到了完全相同的错误:

在存储中找不到位于 URL 的文件: