Migrate_from_s3: Необходимо отключить загрузку в S3 перед выполнением этой задачи

Я пытаюсь мигрировать все данные из S3 обратно на свой сервер. Однако команда rake uploads:migrate_from_s3 выдает ошибку: You must disable S3 uploads before running that task (Необходимо отключить загрузки в S3 перед запуском этой задачи). Я снял галочку с опции enable s3 uploads в настройках Discourse и также добавил DISCOURSE_USE_S3: false в файл app.yml. Но результат тот же — ошибка не исчезает.

[1] pry(main)> SiteSetting.enable_s3_uploads
=> false
[2] pry(main)> GlobalSetting.use_s3
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true

Я в замешательстве. Как это отключить?

Содержит ли ваш app.yml переменные окружения S3? Возможно, вам потребуется проверить их, чтобы отключить загрузки в S3.

Что такое переменная окружения S3? В моем случае DISCOURSE_USE_S3 хранится в окружении.

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  UNICORN_WORKERS: 2

  ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
  DISCOURSE_HOSTNAME: engineersasylum.com

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'praveen369gen@gmail.com'

  # Настройки S3
  DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKxxxxxxxxxxxxxxxxxxxxxDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: QWVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLigGs
  DISCOURSE_S3_BUCKET: enginxxxxxxxxxxket
  DISCOURSE_S3_BACKUP_BUCKET: enginxxxxxxxxxxxxcket
  DISCOURSE_BACKUP_LOCATION: s3

… и не забудьте, @Pravi, что после изменения большинства переменных в вашем файле yml необходимо пересобрать ваш контейнер (приложение); некоторые изменения могут вступить в силу после остановки и запуска контейнера, но в случае сомнений пересобирайте контейнер (приложение) после любого изменения в вашем файле yml.

Я пересоздаю контейнер после каждого изменения в файле app.yml. Тем не менее, он выключен.

Попробуйте изменить расположение резервной копии на локальное?
Не уверен, поможет ли это, но это мой лучший вариант.

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

Извините, я не знаю, что может быть причиной этого.

После пересборки с параметром DISCOURSE_USE_S3=false в файле yml вы запустили задачу rake, но всё ещё появляется сообщение «Необходимо отключить загрузку в S3»? Вы также отключили S3 в панели администратора?

На данный момент, какой вывод у:

SiteSetting.Upload.enable_s3_uploads
SiteSetting.enable_s3_uploads
GlobalSetting.use_s3?

Логика для GlobalSetting.use_s3? не использует переменные окружения таким же образом — она использует:

  def self.use_s3?
    (@use_s3 ||=
      begin
        s3_bucket &&
        s3_region && (
          s3_use_iam_profile || (s3_access_key_id && s3_secret_access_key)
        ) ? :true : :false
      end) == :true
  end

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

Пока что, снятие переменных DISCOURSE_USE_S3 в окружении и DISCOURSE_S3_BUCKET позволит вам выполнить миграцию с S3.

Вот что я получаю,

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)>

Да, я добавил DISCOURSE_USE_S3=false в app.yml, затем пересобрал контейнер и выполнил задачу rake, но результат остаётся прежним. Да, я отключил загрузку файлов в админ-панели.

Как упоминалось здесь, вам также следует отключить DISCOURSE_S3_BUCKET в файле yml. Вероятно, достаточно просто поставить перед ним символ #.

Сейчас я пересобираю контейнер. Через пару минут сообщу о результатах.

Не понимаю, как последний показатель может быть истинным, если вы установили переменную окружения в false и выполнили пересборку. Параметры SiteSetting взяты из вашей панели администратора, а GlobalSettings — из файла app.yml.

Настройка сайта в моей панели администратора отключена.

s3

Настройка S3

  #DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
  #DISCOURSE_S3_BUCKET: engineers-leakybucket
  DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
  DISCOURSE_BACKUP_LOCATION: s3
  #DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com

Отключение DISCOURSE_USE_S3 и DISCOURSE_S3_BUCKET приводит к следующей ошибке:

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads:migrate_from_s3
Миграция загрузок с S3 на локальное хранилище для 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(Полный трассировочный вывод можно получить, запустив задачу с флагом --trace)

Обновление:

До отключения DISCOURSE_USE_S3 и DISCOURSE_S3_BUCKET:

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)> 

После отключения DISCOURSE_USE_S3 и DISCOURSE_S3_BUCKET:

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)>

Привет, @Pravi

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

DISCOURSE_USE_S3: false
#DISCOURSE_S3_REGION: ap-south-1
#DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
#DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
##DISCOURSE_S3_BUCKET: engineers-leakybucket
#DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
#DISCOURSE_BACKUP_LOCATION: s3
#DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com 

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

Поздравляю с достигнутым прогрессом. Молодец!

Я тоже это попробовал. Закомментировал всё, кроме DISCOURSE_USE_S3: false, и появилась та же ошибка, что и раньше.

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads:migrate_from_s3
Миграция загрузок из S3 в локальное хранилище для 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(Полный стек вызовов можно увидеть, запустив задачу с флагом --trace)

SiteSetting и GlobalSettings отключены.

root@ip-172-31-7-247-app:/var/www/discourse# rails c
[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)> 

Спасибо, но я не уверен, что добился какого-либо прогресса. Теперь мне нужно разобраться с этой новой ошибкой.

Кто-нибудь знает, как решить эту проблему?