Ошибка восстановления - резервная копия S3 (совместимая)

Итак, я пытаюсь восстановить резервную копию, но получаю ошибки. Похоже, проблема связана с резервными копиями S3.

Важно отметить, что используется совместимый с S3 сервис (Scaleway). Однако я не уверен, специфична ли эта ошибка для совместимого сервиса или нет: настройка прошла очень гладко, и сервис работал исправно. Если проблема именно в Scaleway, то я, скорее всего, откажусь от их услуг, так как понимаю, что официально поддерживается только AWS S3.

Для настройки я использовал это руководство: Configure an S3 compatible object storage provider for uploads, поэтому конфигурация находится в файле app.yml.

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

Для Scaleway я использовал ту же конфигурацию в файле app.yml (не настраивал это в админ-панели, так как это казалось ненужным): конфигурация Scaleway

Я пробовал запускать восстановление как из админ-панели, так и через командную строку на текущем сервере, а также настроил новый сервер (скопировав туда app.yml) и выполнял восстановление через командную строку. Ошибки были одинаковыми.

[ЗАПУЩЕНО]
'system' начал восстановление!
Восстановление помечено как запущенное...
Проверка существования /var/www/discourse/tmp/restores/default/2020-07-16-131434...
Загрузка архива во временную директорию...
#<Thread:0x000055c73a831df8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> завершился с ошибкой (report_on_exception = true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
ИСКЛЮЧЕНИЕ: undefined method `split' for nil:NilClass
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
Попытка отката...
Откат не потребовался
Очистка временных файлов...
Удаление временной директории '/var/www/discourse/tmp/restores/default/2020-07-16-131434'...
Возобновление работы sidekiq...
Восстановление помечено как завершенное...
Уведомление 'system' об окончании восстановления...
#<Thread:0x000055c73a831510@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> завершился с ошибкой (report_on_exception = true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8316c8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> завершился с ошибкой (report_on_exception = true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8319e8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> завершился с ошибкой (report_on_exception = true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
Готово!
[ОШИБКА]
Восстановление завершено.

Возможно, ошибка возникает только при загрузке резервной копии? :face_with_monocle:

Похоже на то.

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

Ах, это имеет смысл. Спасибо, @Falco! :slight_smile:

Утром я попробую и отпишусь~

Спасибо @Falco, очень ценю! Всё прошло абсолютно гладко :smiley:

Я переехал на новый сервер, но, похоже, можно было остаться и на старом.

На случай, если кому-то ещё понадобится эта информация, вот более подробные шаги (обратите внимание: мои настройки S3 были указаны только в файле app.yml, как описано здесь, в настройках администратора ничего не менялось):

  1. На исходном сайте, если это не откат, включите «отключить электронную почту» (возможно, это не обязательно) и переведите сайт в режим только для чтения (не забудьте отключить эти настройки на новом экземпляре после завершения миграции). Создайте резервную копию; после завершения можно остановить старый экземпляр (./launcher stop app). Независимо от того, выполняется ли откат или нет, обновите A-записи DNS, указав новый IP-адрес сервера. Эти действия можно выполнить более элегантным способом или в другом порядке, чтобы минимизировать время простоя, но для моего случая (откат, форум ещё не запущен) простой не был проблемой.

  2. Установите Discourse на новый сервер и перенесите все пользовательские настройки из app.yml, включая настройки S3. Версии Discourse должны быть одинаковыми или близкими.

  3. Закомментируйте эти две записи (другие настройки S3 в app.yml можно оставить без изменений):
    DISCOURSE_S3_BACKUP_BUCKET: BucketName
    DISCOURSE_BACKUP_LOCATION: s3

  4. Вручную скачайте нужную резервную копию из S3 или совместимого с S3 сервиса.

  5. Перейдите в каталог /var/discourse/shared/standalone/backups и создайте новую папку с именем ‘default’, если её нет (при новой установке её не будет). Затем, находясь в каталоге backups, выполните (это изменит права доступа к папке так, как они обычно устанавливаются, если Discourse создаёт локальную резервную копию — не уверен, что это обязательно):
    chown -R 1000:www-data default

  6. Загрузите резервную копию в папку backups/default с помощью SFTP-клиента, не переименовывая файл резервной копии.

  7. Пересоберите приложение:
    cd /var/discourse
    ./launcher rebuild app

  8. Войдите в приложение, включите восстановление и выполните его (переименуйте BackupFileName.tar.gz):

./launcher enter app
discourse enable_restore
discourse restore BackupFileName.tar.gz
  1. После завершения раскомментируйте две строки настройки резервного копирования S3 в app.yml из шага 2 и пересоберите приложение.

  2. Вы можете удалить локальную папку backups/default и содержащуюся в ней резервную копию (/var/discourse/shared/standalone/backups).

Ссылка: