ToS3MigrationError: загрузки не перенесены в S3, что приводит к неработающим вложениям. Как исправить эту ошибку?

FileStore::ToS3MigrationError: 182 из 21512 загрузок не были перенесены в S3. Перенос в S3 для базы данных ‘default’ не удался.>
далее следует трассировка стека из ‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’, ‘block in migrate_to_s3_all_sites’

Я столкнулся с этими ошибками дважды при выполнении задачи uploads:migrate_to_s3. Около 1% файлов не были успешно перенесены, что привело к повреждению вложений на сайте после повторной обработки (rebake). Все они, похоже, относятся к более старым файлам, созданным в первые несколько месяцев после запуска моего экземпляра Discourse.

При изучении бакета S3 выяснилось, что файлы действительно были успешно загружены в S3, но после повторной обработки ссылки на них были установлены неверно.


Повторный запуск миграции (перед следующей повторной обработкой) по какой-то причине исправил проблему. Ошибка всё ещё возникает во время задачи migrate_to_s3.

Однако, если я снова выполню повторную обработку, ссылки на вложения снова ломаются.

Я не считаю эти сообщения ошибками, но приведу вывод, полученный во время повторной обработки:

/var/www/discourse/lib/file_store/base_store.rb:6: warning: already initialized constant FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: previously definition of UPLOAD_PATH_REGEX was here
/var/www/discourse/lib/file_store/base_store.rb:7: warning: already initialized constant FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: previous definition of OPTIMIZED_IMAGE_PATH_REGEX was here

Выполнение rake posts:missing_uploads или PostCustomField.where(name: Post::MISSING_UPLOADS) не выявляет никаких проблем, поэтому, похоже, это не связано с данной ситуацией.

Моя проблема может быть связана с этим вопросом: Migrate_to_S3 Fails on Rebake - #12 by evenif

Я посмотрю, что узнаю, и, возможно, закрою это обсуждение и перенесу разговор туда.

Старые битые вложения/файлы отображаются в исходном тексте поста как [{file name}|attachment](/uploads/default/original/2X/6/{sha1 hash + extension}). Это преобразуется в href="/uploads/default/original/2X/6/{sha1 hash + extension}", что ломает вложения файлов, но не изображения.

Позже рабочие вложения отображаются как [{file name}|attachment](upload://{sha1 to base62 + extension}) и преобразуются в href="/uploads/short-url/{sha1 to base62 + extension}.

Я написал небольшой код на Ruby, чтобы пройти по всем постам за проблемный период и заменить все старые URL загрузки на новую версию. Я использовал функцию base62_sha1 модели Upload, чтобы преобразовать хеш SHA1 в ожидаемое имя файла, которое ожидают короткие URL в Discourse.

Это заставило вложения работать. Затем я запустил ещё одну перепечку, чтобы подтвердить исправление, и кажется, что всё по-прежнему работает. Похоже, проблема заключалась только в Post.raw и не имела ничего общего с Upload.