Процесс восстановления отменен на этапе миграции загрузок в S3

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

Итак, я попытался восстановить резервную копию размером 2,2 ГБ и получил следующее сообщение об ошибке: восстановление не удалось:

ИСКЛЮЧЕНИЕ: 44 сообщения не были переназначены на новый URL загрузки S3. Миграция S3 не удалась для базы данных ‘default’.

Я использую версию 2.6b6, то есть довольно свежую. Сам сайт старый, создан в 2016 году.

Время от времени мы сталкиваемся с резервными копиями, где автоматическое переназначение и миграция в S3 не удаются по разным причинам.

Это старая тема, поэтому есть ли какие-либо рекомендации по исправлению ситуации? Наличие резервной копии, которую я не могу использовать для восстановления, вызывает у меня беспокойство.

Редактирование: Я только что понял, что, возможно, оказался не в той ветке, так как это похоже на ту же проблему

@gerhard

Я снова попробовал, но всё ещё получаю ошибку «restore to the 44 posts are not remapped».

Временное отключение загрузки в S3 перед резервным копированием (предложенное @RGJ) не решает проблему, и в данный момент у меня нет рабочей схемы резервного копирования, что довольно серьёзно.

Есть ли какие-либо предложения, что можно попробовать?

Ладно, это самый странный случай, с которым я сталкивался на данный момент. Я наткнулся на этот пост.

https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/160?u=ljpp

После того как я уже потратил на это часы, я для интереса определил DISCOURSE_CDN_URL — функцию, которую мой сайт не использует. Резервная копия была восстановлена успешно.

Каково значение этого параметра в данной ситуации? @Falco @pfaffman

РЕДАКТИРОВАНИЕ:

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

ИСКЛЮЧЕНИЕ: rake posts:missing_uploads выявил 3 проблемы. Миграция S3 не удалась для базы данных «default».

РЕДАКТИРОВАНИЕ 2:

Итак, я продолжил копаться в базе данных и нашёл эти 3 поста.

  • Два были очень старыми изображениями, которые сначала были опубликованы, но затем модератор заменил их на модифицированные версии. Они датированы 2016 и 2018 годами.
  • Но последний был странным. Это был очень свежий пост, опубликованный мной всего пару недель назад, содержащий oneboxed https:// ссылку на сервер разработки, который больше не существует. Таким образом, битая ссылка нарушает процесс восстановления.

Я просто удалил эти посты вручную.

Теперь, снова, тестовый запуск показывает, что резервное копирование может на самом деле завершиться успешно. Посмотрим.

@ljpp Похоже, я столкнулся с похожей ситуацией: восстановление завершается ошибкой

EXCEPTION: 1 пост не переназначен на новый URL загрузки S3. Миграция S3 для базы данных ‘default’ не удалась.

Можете подробнее рассказать, как вы нашли и удалили проблемные посты? Какие команды использовались?

Он удалил спорные посты.

Но ты переустановил систему, так что ты не можешь этого сделать, верно?

У меня эта проблема при восстановлении базы данных. Как вы нашли проблемные посты?

Кажется, код, который выполняет проверку, находится здесь:

Так что, думаю, это:

prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"
base_url = File.join(SiteSetting.Upload.s3_base_url, prefix)
bad = Upload.by_users.where("url NOT LIKE '#{base_url}%'")

А для уверенности:

good = Upload.by_users.where("url LIKE '#{base_url}%'")

Дайте знать, если это сработает для вас, и я займусь созданием темы.

discourse(prod)> prefix = @migrate_to_multisite ? “uploads/#{RailsMultisite::ConnectionManagement.current_db}/original/” : “original/”
discourse(prod)> base_url = File.join(SiteSetting.Upload.s3_base_url, prefix)
discourse(prod)> bad_uploads = Upload.by_users.where(“url NOT LIKE ‘#{base_url}%’”)
discourse(prod)> bad_uploads.count
=> 0

Эта проверка дала мне 0 ошибок

Вы сделали это на оригинальном сервере? Или нужно выполнить это после восстановления базы данных, до проведения этой проверки, используя флаг --pause

Я делал это на старом сервере.
При восстановлении я получил ту же ошибку:

[2026-01-16 13:45:52] EXCEPTION: 3 поста не перенаправлены на новый URL загрузки S3. Миграция S3 не удалась для базы данных «default».
[2026-01-16 13:45:52] /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log’

Ну, чёрт. Не знаю, что ещё тебе сказать.

Нашла ли команда good твои загрузки?

Я бы, наверное, просто использовал переключатель --pause и остановил восстановление до того, как она выполнит эту проверку.

Сделай то, что сказал Ричард.

Я не уверен в вашей конкретной ситуации, но, возможно, вам стоит просто отключить загрузку в S3, создать резервную копию, восстановить данные и снова включить её. Это спасало меня множество раз.

Значит, мне нужно отключить эту опцию, верно?

image

Верно.

  • Снимите галочку с пункта «Включить загрузки S3».
  • Создайте резервную копию или скачайте данные.
  • Загрузите или восстановите данные.
  • Установите галочку в пункте «Включить загрузки S3».

При включении пункта «Включить загрузку в S3» возникла ошибка

Я не говорю по-итальянски, если речь не о еде… Может, вы сможете сделать нам всем одолжение и скопировать/вставить это в Google Translate :slight_smile:

Извините.

Включить загрузку в S3

Хранение загруженных файлов на дисковом пространстве Amazon S3. ВАЖНО: необходимо предоставить действительные учетные данные S3 (как идентификатор ключа доступа, так и секретный ключ доступа).

Вы не можете включить загрузку в S3, так как она уже включена глобально. Включение загрузки в S3 на уровне сайта может вызвать критические проблемы с загрузкой файлов.

Я предполагаю, что вы уже сделали это в app.yml.
Загрузка (новых) файлов работает корректно? Если да, то проблем нет.

В app.yml у меня настроен S3, верно.

Так что мне нужно сделать для безопасного резервного копирования и восстановления без проверки загрузок?

Просто снять галочку «включить загрузку в S3» не помогает