Управление конфигурацией в 12-факторных приложениях

Мне понравилось использовать Rails на Heroku, и вот так я могу настроить свойство конфигурации приложения Heroku без необходимости вносить изменения в xyz.yml и перераспределить.

Было бы неплохо полностью избавиться от конфигурационных файлов Yaml в моем приложении Rails и максимально полагаться на сохранение конфигурации в ENV. Это соответствует 12-факторному принципу конфигурации.

Однако при переходе от управления конфигурацией на основе Yaml к управлению на основе Heroku/12-фактора есть некоторые компромиссы.

  • Несмотря на то, что распространение развертываний (qa, stage, prod, dev, demo, labs) может привести к распространению файлов Yaml, скопировать-вставить очень просто, чтобы создать новый профиль конфигурации. Я не вижу способа "копировать" профили конфигурации из одного развертывания в другое в Heroku.
  • Хранение данных конфигурации в репозитории означает, что в случае Heroku развертывание, настройка и применение выполняются за одну операцию. Если бы я перенес свою конфигурацию из файлов Yaml в переменные ENV, мне пришлось бы настраивать свое приложение на отдельном этапе после развертывания.

Хотелось бы услышать от людей, которые использовали конфигурацию 12-факторного стиля в своих частных приложениях, и как они управляли множеством переменных конфигурации во множестве развертываний.

  • Как быстро настроить новое развертывание?
  • Где вы храните свой авторитетный источник переменных конфигурации, если не репо? Как вы распределяете его среди разработчиков?

Спасибо!

3 ответа

Решение

Вы можете сделать это относительно легко с помощью некоторых простых скриптов оболочки, перебрать существующие переменные через конфигурацию heroku или релиз heroku:info v99, а затем установить конфигурацию heroku:set k=v --app

Но если это проблема / боль / трение, возможно, у вас слишком много в вашей конфигурации env var.

Обычно я использую Yaml, используя ENV и предоставляя значения по умолчанию. Например, в YAML можно с радостью использовать ERB для включения ваших переменных ENV:

foo:
  var: ENV["MY_CONFIG"] || "default_value"

Вам просто нужно убедиться, что вы загружаете Yaml с помощью ERB, когда читаете его:

YAML.load(ERB.new(File.read("#{Rails.root}/config/app_config.yml")).result)

Делая это, ваш код отлично работает в dev, но также позволяет вам устанавливать конфигурационные переменные в среде.

Немного поздний ответ, но я считаю, что это то, что вы ищете.

Я разработал гем под названием settei, позволяющий использовать файлы YAML для настройки приложения. Однако гем будет сериализовать файл YAML как одну переменную среды во время развертывания. Таким образом можно получить лучшее из обоих миров: YAML для простоты управления / создания производной среды и ENV для 12-факторного соответствия.

Другие вопросы по тегам