# Не удается перенести загрузки в S3

**URL:** https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533
**Category:** Support
**Tags:** s3
**Created:** [09.Май.2025 20:15:07 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533 "2025-05-09T20:15:07Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![stanski](https://avatars.discourse-cdn.com/v4/letter/s/d26b3c/32.png) [@stanski](https://meta.discourse.org/u/stanski)
#### Post date: [09.Май.2025 20:15:07 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/1 "2025-05-09T20:15:07Z")

</div>

Привет, мы настроили хостинг для загрузки файлов (используя настройки S3) на Backblaze.  
Новые загрузки работают (после исправления заголовка `x-amz-checksum-crc32`), однако попытка мигрировать существующие загрузки с помощью `uploads:migrate_to_s3` завершается ошибкой сразу же.

Это происходит в последней версии Discourse (3.5.0.beta5-dev).  
Вот полный вывод:

```plaintext
root@goactuary-app:/var/www/discourse# rake uploads:migrate_to_s3 --trace                                                                                                                  
** Invoke uploads:migrate_to_s3 (first_time)                                                                                                                                               
** Invoke environment (first_time)                                                                                                                                                         
** Execute environment                                                                                                                                                                     
** Execute uploads:migrate_to_s3                                                                                                                                                           
Пожалуйста, обратите внимание: миграция на S3 в настоящее время необратима!                                                                                                                              
[CTRL+c] для отмены, [ENTER] для продолжения                                                                                                                                                    
                                                                                                                                                                                           
Миграция загрузок на S3 для 'default'...
Некоторые загрузки не были перенесены на новую схему. Запуск миграции, это может занять некоторое время...
rake aborted!                                                                                                                                                                              
FileStore::ToS3MigrationError: Некоторые загрузки не удалось перенести на новую схему. Вам нужно исправить это вручную. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'       
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'                                                                                                                       
/var/www/discourse/lib/tasks/uploads.rake:126: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.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21: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>'                                                                                                                         
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke' 
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load' 
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [10.Май.2025 03:54:59 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/3 "2025-05-10T03:54:59Z")

</div>

> [@stanski](#):
>
> используя настройки S3

Вам нужно добавить их в ваш app.yml, как описано в статье [Настройка совместимого с S3 провайдера объектного хранилища для загрузки файлов](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916)

> [@stanski](#):
>
> после исправления заголовка `x-amz-checksum-crc32`

Вы имеете в виду, что добавили код в ваш app.yml, чтобы откатить библиотеку AWS к версии, которая работает с Backblaze?

---

<div class="post-metadata">

### Author: ![stanski](https://avatars.discourse-cdn.com/v4/letter/s/d26b3c/32.png) [@stanski](https://meta.discourse.org/u/stanski)
#### Post date: [11.Май.2025 14:26:53 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/4 "2025-05-11T14:26:53Z")

</div>

> [@pfaffman](#):
>
> Вам нужно добавить их в ваш app.yml, как описано в статье [Настройка провайдера объектного хранилища, совместимого с S3, для загрузки файлов](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916)

Да, они уже есть в app.yml, и я пересобрал приложение.  
Я подтвердил, что новые загружаемые файлы сохраняются туда.

> [@pfaffman](#):
>
> Вы имеете в виду, что добавили код в ваш app.yml для возврата библиотеки AWS к версии, совместимой с Backblaze?

Не совсем. Я использую следующие переменные окружения:

```plaintext
  AWS_REQUEST_CHECKSUM_CALCULATION: WHEN_REQUIRED
  AWS_RESPONSE_CHECKSUM_VALIDATION: WHEN_REQUIRED

```

Они решили проблему невозможности загрузки новых файлов после изменения настроек.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [11.Май.2025 16:46:36 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/5 "2025-05-11T16:46:36Z")

</div>

> [@stanski](#):
>
> ```plaintext
> Некоторые файлы не были перенесены на новую схему. Запуск миграции, это может занять некоторое время...
> rake aborted!
> 
> ```

Скорее всего, вам придётся найти их самостоятельно.

В Rails можно выполнить:

```
 Upload.pluck(:url)

```

А затем проверить, какие именно файлы вызывают проблему.

> [@stanski](#):
>
> Я использую следующие переменные окружения:

По моему опыту, этого было недостаточно, но вы говорите, что у вас всё работает.

---

<div class="post-metadata">

### Author: ![stanski](https://avatars.discourse-cdn.com/v4/letter/s/d26b3c/32.png) [@stanski](https://meta.discourse.org/u/stanski)
#### Post date: [11.Май.2025 22:43:13 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/6 "2025-05-11T22:43:13Z")

</div>

Ручное понижение версий aws-гемов в контейнере позволило задаче `uploads:migrate_to_s3` фактически загрузить изображения, так что, как вы и отметили, переменных окружения было недостаточно.

Однако процесс завершился ошибкой на другом этапе:

```plaintext
FileStore::ToS3MigrationError: 2 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'. (FileStore::ToS3MigrationError)

```

Это будет отдельное приключение по устранению неполадок.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12.Май.2025 10:44:56 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/7 "2025-05-12T10:44:56Z")

</div>

Возможно, это связано с тем, что у вас есть однобокс, ссылающийся на локальные посты. Я создавал тему по этому поводу, но детали уже не помню.

Если их всего два, вы можете просто проигнорировать это, но в Rails можно найти все загрузки, в которых нет вашего нового бакета. Думаю, список будет пустым?

Думаю, проблема в том, что у вас есть два поста с каким-то неожиданным путём в обработанном тексте поста.

Нашёл!  
[Невозможно восстановить резервную копию, если она содержит ссылку на Discourse onebox](https://meta.discourse.org/t/cant-restore-a-backup-if-it-includes-link-to-discourse-onebox/329071)

Редактирование: похоже, у вас два поста с локальными onebox. Думаю, вам просто нужно найти эти посты и переобработать их.

---

<div class="post-metadata">

### Author: ![tobiaseigen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tobiaseigen/32/539204_2.png) [@tobiaseigen](https://meta.discourse.org/u/tobiaseigen)
#### Post date: [22.Май.2025 00:14:13 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/8 "2025-05-22T00:14:13Z")

</div>

> [@pfaffman](#):
>
> [Невозможно восстановить резервную копию, если она содержит ссылку на Discourse onebox](https://meta.discourse.org/t/cant-restore-a-backup-if-it-includes-link-to-discourse-onebox/329071)
> 
> Редактирование: похоже, у вас есть два поста с локальными onebox. Думаю, вам нужно просто найти эти посты и пересобрать их.

@stanski, это решило вашу проблему?

---

<div class="post-metadata">

### Author: ![stanski](https://avatars.discourse-cdn.com/v4/letter/s/d26b3c/32.png) [@stanski](https://meta.discourse.org/u/stanski)
#### Post date: [12.Июнь.2025 22:50:09 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/9 "2025-06-12T22:50:09Z")

</div>

Извините, закрутился и забыл обновить это.  
После повторной обработки всех постов при повторной попытке миграции я получил другое сообщение об ошибке.  
К сожалению, я больше не могу найти трассировку стека.

Я понял, что, несмотря на ошибку, похоже, что загрузки были перенесены в Backblaze, а посты обновлены.  
Я заархивировал локальные загрузки и переместил их в другое место, и с тех пор никаких жалоб не поступало.

Так что в заключение: да, моя проблема решена.  
Спасибо @pfaffman за постоянные предложения.

Теперь у меня есть жалоба на то, что различные брандмауэры блокируют загрузки, размещенные на Backblaze, но это уже другая история.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12.Июнь.2025 23:28:33 UTC](https://meta.discourse.org/t/cant-migrate-uploads-to-s3/365533/10 "2025-06-12T23:28:33Z")

</div>

> [@stanski](#):
>
> Теперь у меня есть жалоба на то, что различные брандмауэры блокируют загрузки, размещённые на серверах Backblaze, но это уже другая история.

Я думаю, вам действительно стоит использовать CDN.
