Приложения с двенадцатью факторами: способы оставаться на одной линии с руководством по настройке

Я пишу тезис о приложениях из двенадцати факторов, и мне интересно, можете ли вы помочь мне здесь.

Третий фактор из двенадцатифакторных приложений гласит: сохраняйте конфигурацию в среде. ( https://12factor.net/config). Согласно странице вся конфигурация, которая может варьироваться между развертываниями, должна быть извлечена в переменные среды.

Мне интересно, как применять во время разработки, например, при создании приложения Rails. В настоящее время я вижу два пути, которые, на мой взгляд, не идеальны.

  • Храните переменные среды в файле, например .bashrc или .zshrc. У меня нет хорошей идеи о том, как управлять средой тестирования и разработки с использованием этого подхода, поскольку обеим требуется определенная конфигурация с использованием одних и тех же переменных среды. Также при работе над несколькими проектами это будет загромождать оболочку переменными, но, похоже, она соответствует методологии приложения из двенадцати факторов.
  • используйте такой инструмент, как https://github.com/bkeepers/dotenv который использует файл, который является частью проекта, для хранения конфигурации и, таким образом, не так сильно отличается от secrets.yml или database.yml, который уже предлагает инфраструктура Rails. и который не совсем соответствует идее приложения из двенадцати факторов (все еще может быть случайно включен в кодовую базу и в основном не зависит от языка)

Правильно ли мое мнение? Интересно, есть ли лучшие практики для решения этой проблемы.

Спасибо!

1 ответ

Решение

В основном, переменные среды доступны в зависимости от вашего контекста. Пользователь, выполняющий процесс, систему, приложение, все может изменять набор переменных, к которым вы можете обращаться в любое время / место в вашем приложении. Итак, куда вы их поместите, зависит от потребностей вашего приложения - вам нужно изолировать разные приложения на одном сервере? Вам нужно эффективно управлять десятками приложений? Вам нужно подготовить и заполнить новые серверные среды? И т.п.

Что касается вариантов, вот что я испытал:

.*rc файлы подходят для такого типа конфигурации, даже если вам может не понравиться это. Они делают их доступными для пользователя, среда которого запускает файлы, поэтому он может не работать для вас, если ваш логин ubuntu но ваши сервисы работают как другие пользователи, например www-data или же httpd,

Dotenv также хорош, потому что он вводит переменные в фактический ENV при запуске. Не идеально, но все же приемлемо imho (предполагается, что вы никогда не передаете эти переменные в vc, как вы указали). Это делает их доступными для одного приложения, использующего Dotenv.

Другими способами (для веб-приложений) является их размещение в конфигурации Apache или Nginx (или другого веб-сервера). Они могут быть помещены в среду на уровне определения виртуального хоста или на уровне конфигурации сервиса / демона (хотя Nginx, я думаю, не поддерживает vhost Environments). Это делает переменные доступными для любых приложений, запускаемых этими службами. Это обычное явление для веб-сайта или веб-приложения.

Вы также можете установить среду для всего сервера: /etc/profile или же /etc/environment, Это делает их доступными для любого сервиса во всей системе.

Помимо этого (многосерверные приложения, сложный хостинг и т. Д.), Вопрос в большей степени относится к Ops - управление несколькими наборами конфигурации все еще актуально для 12-факторного приложения, но не будет простого ответа:)

Вот классная вещь, хотя:

Вам не нужно решать прямо сейчас! Использование переменных среды - очень гибкий подход! Вы можете использовать DotEnv на вашем Macbook для разработки, поместить их в Apache в вашей промежуточной среде, использовать .bashrc для вашего сервера тестирования / интеграции и поместите их в /etc/environment на вашем собственном сервере Lighttpd Production. Если ваше приложение ожидает, что ваша конфигурация будет в ENV, значит, вашему приложению не нужно заботиться о том, как оно туда попало!!!

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