# Migrate\_to\_s3 因 logo 图片而失败

**URL:** <https://meta.discourse.org/t/migrate-to-s3-fails-because-of-logo-images/262313>\
**Category:** Self-hosting\
**Tags:** s3\
**Created:** [2023年四月19日 18:17 UTC](https://meta.discourse.org/t/migrate-to-s3-fails-because-of-logo-images/262313 "2023-04-19T18:17:03Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![jfmontanaro](https://avatars.discourse-cdn.com/v4/letter/j/f14d63/32.png) [@jfmontanaro](https://meta.discourse.org/u/jfmontanaro)\
**Post date:** [2023年四月19日 18:17 UTC](https://meta.discourse.org/t/migrate-to-s3-fails-because-of-logo-images/262313/1 "2023-04-19T18:17:03Z")

</div>

我正在按照[此指南](https://meta.discourse.org/t/set-up-file-and-image-uploads-to-s3/7229)将现有站点从本地存储上传文件迁移到 S3 存储。新上传的文件工作正常，我已手动检查确认它们已显示在 S3 中。但是，当我尝试运行 `rake uploads:migrate_to_s3` 时，我收到以下输出：

```plaintext
请注意，迁移到 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/`。

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

 ![image](https://global.discourse-cdn.com/meta/original/4X/8/c/5/8c57c4ef781020ce888111f6f9c12d6bc1111d07.png)  
我不担心下面两个，我猜那些只是切换过程中的偶然伪影——如果它们没有 `url`，那么站点就不知道在哪里找到它们，所以可以安全地删除它们。我更关心的是徽标。这些是默认徽标，我们实际上仍在继续使用它们，但它们是随代码库分发的，而不是上传的。

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

---

<div class="post-metadata">

**Author:** ![jfmontanaro](https://avatars.discourse-cdn.com/v4/letter/j/f14d63/32.png) [@jfmontanaro](https://meta.discourse.org/u/jfmontanaro)\
**Post date:** [2023年四月20日 17:23 UTC](https://meta.discourse.org/t/migrate-to-s3-fails-because-of-logo-images/262313/2 "2023-04-20T17:23:27Z")

</div>

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

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

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

```

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