Ожидания конфигурации S3 между глобальными и настройками сайта

У меня есть инстанс Discourse, который был создан несколько месяцев назад. Позже мы на некоторое время включили «S3» (в нашем случае — DigitalOcean Spaces) исключительно через настройки администратора, не добавляя никаких опций конфигурации DISCOURSE_ в файл app.yml. Мы никогда не мигрировали всё на S3, но большинство изображений было загружено, пока эта функция была активна. Сейчас мы хотим мигрировать всё обратно с «S3» по разным причинам, которые здесь не важны.

(Я понимаю, что пока это звучит как запрос в службу поддержки, но это не так…)

В недавно слитом pull-запросе я добавил rake-задачу uploads:batch_migrate_from_s3 — простую обёртку над uploads:migrate_from_s3, чтобы можно было мигрировать пакеты размером всего с изображения одного поста, и запустил её. На этом этапе я обнаружил, что upload:migrate_from_s3, которую вызывает моя задача, предполагает, что в discourse.conf есть настройки S3, недоступные через интерфейс:

** Invoke uploads:batch_migrate_from_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:batch_migrate_from_s3
Migrating uploads from S3 to local storage for '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'

Какое решение будет лучшим?

  1. Ожидается, что настройка S3 всегда выполняется через переменные окружения DISCOURSE_ в файле app.yml и записывается в config/discourse.conf при сборке контейнера, и мне следует сделать это и пересобрать своё приложение сейчас. (Обращаю внимание, что передача переменных окружения в rake, похоже, не устанавливает GlobalSettings здесь; я тоже пробовал этот вариант. Вероятно, тот факт, что что-то работало только с настроенными SiteSettings, является упущением и не было задумано.) Я проверил это, добавив s3_bucket в свой config/discourse.conf в существующем контейнере, и это устранило ошибку.
  2. Доработать задачу миграции так, чтобы если SiteSetting.s3_upload_bucket установлен, но GlobalSetting.s3_bucket равен nil, то GlobalSetting.s3_bucket устанавливался в значение SiteSetting.s3_upload_bucket. Я предполагаю, что это не будет сложным PR, если такой подход будет признан правильным, но я пока не изучал вопрос глубоко. Редакция: я попробовал изменить GlobalSetting.s3_bucket внутри uploads:migrate_from_s3, но это не сработало из-за отсутствия аксессора.
  3. Заставить SiteSetting.absolute_base_url использовать SiteSetting.s3_upload_bucket, если GlobalSetting.s3_bucket равен nil — является ли это вообще корректной конфигурацией?
  4. Добавить возможность установки s3_bucket в настройках сайта, чтобы она была доступна через интерфейс.

Первый вариант — это просто настройка сайта, и я, вероятно, сделаю именно это. Если второй вариант будет признан хорошей альтернативой, я с радостью попробую подготовить PR. Однако я здесь ещё недостаточно давно, чтобы уверенно вносить изменения такого уровня, как два последних варианта; ожидания относительно работы объектов конфигурации для меня пока довольно непрозрачны.

Для ясности: я уже нашёл простое обходное решение своей проблемы; меня просто удивило, что это было необходимо.

2 лайка