Migrate_to_s3 因 logo 图片而失败

我正在按照此指南将现有站点从本地存储上传文件迁移到 S3 存储。新上传的文件工作正常,我已手动检查确认它们已显示在 S3 中。但是,当我尝试运行 rake uploads:migrate_to_s3 时,我收到以下输出:

请注意,迁移到 S3 目前是不可逆的!
[CTRL+c] 取消,[ENTER] 继续

正在为 'default' 迁移上传到 S3...
一些上传未迁移到新方案。正在运行迁移,这可能需要一段时间...
rake 中断!
FileStore::ToS3MigrationError: 一些上传无法迁移到新方案。您需要手动修复此问题。
/var/www/discourse/lib/file_store/to_s3_migration.rb:162:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:127:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(运行任务时显示 --trace 以查看完整跟踪)

查看错误源文件 lib/file_store/to_s3_migration.rb,我看到它似乎正在对 uploads 表运行一个检查,其中 url NOT LIKE '//%' AND url NOT LIKE '/%#{seeded_image_url}%'。在我的情况下,我假设 seeded_image_url 解析为 uploads/default/original/_X/

我手动对数据库运行了相同的检查,并发现了以下内容:


我不担心下面两个,我猜那些只是切换过程中的偶然伪影——如果它们没有 url,那么站点就不知道在哪里找到它们,所以可以安全地删除它们。我更关心的是徽标。这些是默认徽标,我们实际上仍在继续使用它们,但它们是随代码库分发的,而不是上传的。

to_s3_migration.rb 的第 146 行添加第三个条件,该条件也忽略 URL 列以 /images/ 开头的上传,是否安全?或者我应该删除那些行,因为那些文件现在是独立于上传处理的,而这只是旧版本 Discourse 的伪影?或者我误解了这个任务的作用(我对 Rails 不太熟悉),问题是别的东西?

1 个赞

第二天回来又试了一次,迁移任务就正常工作了。我想 logo 图片从来都不是问题,只是那两个多余的图片。大概是某种周期性任务把它们清理掉了,因为我现在看它们已经不见了。

回想起来,上传任务通过以下方式检查无效的上传 URL:

Upload.by_users.where("url NOT LIKE '//%' AND url NOT LIKE '/%#{seeded_image_url}%'").exists?

大概是 by_users 导致它忽略了 logo 图片,因为那些没有有效的 user_id

3 个赞