У меня есть инстанс 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'
Какое решение будет лучшим?
- Ожидается, что настройка S3 всегда выполняется через переменные окружения
DISCOURSE_в файлеapp.ymlи записывается вconfig/discourse.confпри сборке контейнера, и мне следует сделать это и пересобрать своё приложение сейчас. (Обращаю внимание, что передача переменных окружения в rake, похоже, не устанавливаетGlobalSettingsздесь; я тоже пробовал этот вариант. Вероятно, тот факт, что что-то работало только с настроеннымиSiteSettings, является упущением и не было задумано.) Я проверил это, добавивs3_bucketв свойconfig/discourse.confв существующем контейнере, и это устранило ошибку. - Доработать задачу миграции так, чтобы если
SiteSetting.s3_upload_bucketустановлен, ноGlobalSetting.s3_bucketравенnil, тоGlobalSetting.s3_bucketустанавливался в значениеSiteSetting.s3_upload_bucket. Я предполагаю, что это не будет сложным PR, если такой подход будет признан правильным, но я пока не изучал вопрос глубоко. Редакция: я попробовал изменитьGlobalSetting.s3_bucketвнутриuploads:migrate_from_s3, но это не сработало из-за отсутствия аксессора. - Заставить
SiteSetting.absolute_base_urlиспользоватьSiteSetting.s3_upload_bucket, еслиGlobalSetting.s3_bucketравенnil— является ли это вообще корректной конфигурацией? - Добавить возможность установки
s3_bucketв настройках сайта, чтобы она была доступна через интерфейс.
Первый вариант — это просто настройка сайта, и я, вероятно, сделаю именно это. Если второй вариант будет признан хорошей альтернативой, я с радостью попробую подготовить PR. Однако я здесь ещё недостаточно давно, чтобы уверенно вносить изменения такого уровня, как два последних варианта; ожидания относительно работы объектов конфигурации для меня пока довольно непрозрачны.
Для ясности: я уже нашёл простое обходное решение своей проблемы; меня просто удивило, что это было необходимо.