Я собираюсь бросить свою шляпу в кольцо здесь, потому что ни один из этих ответов не обращается ко всем критическим компонентам, которые в значительной степени нужны любой системе. Соображения:
- Публичная конфигурация (которую видит внешний интерфейс) против частной конфигурации (парень mograbi понял это правильно). И обеспечение их хранятся отдельно.
- Секреты как ключи
- Значения по умолчанию против переопределений, зависящих от среды
- Фронтенд связки
Вот как я делаю свою конфигурацию:
config.default.private.js
- В управлении версиями это параметры конфигурации по умолчанию, которые видны только вашему бэкэнду.
config.default.public.js
- В управлении версиями это параметры конфигурации по умолчанию, которые видны бэкэндом и внешним интерфейсом.
config.dev.private.js
- Если вам нужны разные частные настройки по умолчанию для dev.
config.dev.public.js
- Если вам нужны разные публичные значения по умолчанию для dev.
config.private.js
- Не в управлении версиями, это специфические параметры среды, которые переопределяют config.default.private.js
config.public.js
- Не в управлении версиями, это специфические параметры среды, которые переопределяют config.default.public.js
keys/
- Папка, в которой каждый файл хранит какой-то секрет. Это также не под контролем версий (ключи никогда не должны быть под контролем версий).
Я использую простые старые файлы javascript для конфигурации, поэтому у меня есть все возможности языка javascript (включая комментарии и возможность делать такие вещи, как загрузка файла конфигурации по умолчанию в файле, специфичном для среды, чтобы затем их можно было переопределить). Если вы хотите использовать переменные окружения, вы можете загрузить их в эти файлы конфигурации (хотя я рекомендую не использовать env vars по той же причине, по которой я не рекомендую использовать файлы json - у вас нет возможностей языка программирования для создания ваш конфиг).
Причина, по которой каждый ключ находится в отдельном файле, предназначена для использования установщиком. Это позволяет вам иметь установщик, который создает ключи на компьютере и сохраняет их в папке ключей. Без этого ваш установщик может потерпеть неудачу при загрузке файла конфигурации, который не может получить доступ к вашим ключам. Таким образом, вы можете перемещаться по каталогу и загружать любые ключевые файлы, которые находятся в этой папке, не беспокоясь о том, что существует, а что нет в любой конкретной версии вашего кода.
Поскольку у вас, вероятно, есть ключи, загруженные в вашу личную конфигурацию, вы определенно не хотите загружать вашу личную конфигурацию в любой код внешнего интерфейса. В то время как, вероятно, было бы гораздо более идеальным полностью отделить вашу кодовую базу веб-интерфейса от вашей серверной части, во многих случаях PITA является достаточно большим барьером, препятствующим тому, чтобы люди делали это, таким образом, частная и общедоступная конфигурация. Но есть две вещи, которые я делаю, чтобы предотвратить загрузку приватного конфига в интерфейсе:
- У меня есть модульное тестирование, которое гарантирует, что мои пакеты веб-интерфейса не содержат один из секретных ключей, которые у меня есть в приватной конфигурации.
- У меня есть мой код внешнего интерфейса в папке, отличной от моего внутреннего кода, и у меня есть два разных файла с именем "config.js" - по одному для каждого конца. Для бэкэнда config.js загружает приватный конфиг, для внешнего интерфейса - публичный конфиг. Тогда вы всегда просто требуете ('config') и не беспокоитесь о том, откуда оно берется.
И последнее: ваша конфигурация должна быть загружена в браузер с помощью совершенно отдельного файла, чем любой другой код вашего внешнего интерфейса. Если вы связываете свой код внешнего интерфейса, общедоступная конфигурация должна создаваться как отдельный пакет. В противном случае ваш конфиг уже не является конфигом - это просто часть вашего кода. Конфиг должен быть разным на разных машинах.