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

**URL:** https://meta.discourse.org/t/s3-configuration-expectations-between-global-and-site-settings/153766
**Category:** Development
**Created:** [04.Июнь.2020 03:13:03 UTC](https://meta.discourse.org/t/s3-configuration-expectations-between-global-and-site-settings/153766 "2020-06-04T03:13:03Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [04.Июнь.2020 03:13:03 UTC](https://meta.discourse.org/t/s3-configuration-expectations-between-global-and-site-settings/153766/1 "2020-06-04T03:13:03Z")

</div>

У меня есть инстанс 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, недоступные через интерфейс:

```plaintext
** 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. Однако я здесь ещё недостаточно давно, чтобы уверенно вносить изменения такого уровня, как два последних варианта; ожидания относительно работы объектов конфигурации для меня пока довольно непрозрачны.

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