Проблемы с восстановлением резервной копии: SiteSetting::Upload.s3_base_url не работает, так как enable_s3_uploads был установлен в базе данных

У меня есть резервная копия с сайта по умолчанию в мульти-сайтовой установке. Файлы загружаются в S3. Я успешно создал резервную копию с включённым параметром include_s3_uploads_in_backups (установлен в true).

При попытке восстановить эту копию из командной строки — либо на другой мульти-сайтовой установке (с S3), либо на свежей стандартной установке — возникает ошибка: Something went wrong while remapping uploads (Что-то пошло не так при переназначении файлов).

Я добавил несколько выводов puts в файл lib/backup_restore/uploads_restorer.rb и выяснил, что ошибку вызывает следующая строка:

  puts "base url #{SiteSetting::Upload.s3_base_url}"

Следующая строка, которая, похоже, вызывала сбой до начала отладки, выглядит так:

       current_s3_base_url = SiteSetting::Upload.enable_s3_uploads ? SiteSetting::Upload.s3_base_url : nil

Я пробовал закомментировать различные переменные S3 в файле discourse.conf, чтобы проверить, нет ли в базе данных каких-то некорректных значений, вызывающих проблему, но все они пусты.

Хм. А на чистой установке резервное копирование не удалось, и теперь сайт возвращает:

{
errors: [
"`s3_upload_bucket` site setting has to be set."
]
}

Возможно, в базе данных установлено какое-то другое значение настройки S3, которое я упустил. Да, параметр enable_s3_uploads установлен в базе данных. Я запутался во взаимосвязи между use_s3 и enable_s3_uploads

1 лайк

Итак, подтверждено: проблема заключалась в том, что несколько лет назад, когда я впервые настраивал S3, я установил enable_s3_uploads в базе данных. Из-за этого восстановление не работает, так как система пытается загрузить данные в S3, но у неё недостаточно информации. (Вздох. Но восстановление инстанса с мультисайтом/S3 тоже не удаётся, потому что некоторые файлы «не были перенесены в S3».)

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

Восстановленный на стандартную установку инстанс не показывает загрузки, потому что происходит следующее:

      Started GET "/uploads/short-url/puhaSNHeEy1S2knGFQIAZ8lprRy.pdf" for 68.11.35.109 at 2022-01-25 19:48:06 +0000
Processing by UploadsController#show_short as PDF
  Parameters: {"base62"=>"puhaSNHeEy1S2knGFQIAZ8lprRy", "extension"=>"pdf"}
Sent file /var/www/discourse/public/default/original/1X/b2a283b9381b837234e7d4830b.pdf (4.4ms)
Completed 500 Internal Server Error in 130ms (ActiveRecord: 0.0ms | Allocations: 10019)
ActionController::MissingFile (Cannot read file /var/www/discourse/public/default/original/1X/b2a283b9381b837234e7d4830.pdf)

Путь, который он ищет, — /var/www/discourse/public/default/original/1X/, а должен быть /var/www/discourse/public/uploads/default/original/1X/.

… . .

А всё потому, что я сделал переназначение, пытаясь исправить ссылки на бакет S3, и это сломало пути в локальных URL.

Кажется, это слишком детально и может быть бесполезно для кого-либо. Хотя я всё ещё считаю, что скрытие переменных загрузки S3 от интерфейса пользователя — хорошая идея.

3 лайка