Pull to refresh

Comments 17

в том числе и для каждого разработчика — своя личная

ИМХО — большой оверхед, гораздо лучше для Develop контура использовать переменные окружения.
Где вы рекомендуете задавать эти переменные окружения? Нужно, чтобы у каждого разработчика, и у каждого контура были свои значения.
Смотря какие переменные, если тупо email тогда переменная среды пользователя. А вот для контуров (тестовый, стейдж, прод) — да, тут можно и трансформацию настроить.
Так и все же, где и как вы рекомендуете задавать эти переменные окружения?
Я же говорю — зависит от структуры ваших сред.
Например, если есть ActiveDirectory, то каждому разработчику через групповые политики можно централизованно выставлять значения переменных окружений.
Если же AD нет, ну тогда один раз можно и занести в ручную или через скрипты задать в целевой системе разработчика.
Таки как вариант ansible. Очевидно, что задавать надо там, где делаете оркестрацию сервисов
UFO just landed and posted this here
Больше какого числа N?
Для команды из 5 разработчиков никакого оверхеда.
Эммм оверхед приличный, особенно когда у всех разработчиков конфиги начинают разъезжаться
Я вот не замечаю ну никакого оверхеда.
А вот проблему, когда у одного разраба БД зовется по-одному, а на других контурах по-другому, видно очень хорошо.
UFO just landed and posted this here
А как вы все это собираете? Вы добавили в проект несколько конфигураций сборки. В данном случае у вас конкретная трансформация применяется в момент сборки проекта, но это же очевидно плохое решение. Конечный вид конфигурации должен зависеть от того в каком окружении запускается приложение, либо вобще от него не зависеть.
В вашем случае имхо трансформация конфига должна применяться не в момент сборки, а в момент публикации.
Так же непонятно как вы в своем решении прячете продакшн конфиг, в котором могут содержаться боевые логины/пароли и т.д. если все это зашито в релизную трансформацию, то это тоже решение не очень.

Как выше заметили для решения таких проблем используются либо переменные окружением, либо сервисы которые в зависимости от 1 переменной окружения (dev|stage|prod) выдаст вам актуальную конфигурацию для приложения

по поводу LogEvent недавно прикрутили в нлог structured logging, хотя я все равно поклонник Serilogа
Обычный publish Visual Stuidio применяет трансформации.
Поэтому для применения достаточно выбрать нужную solution configuration — либо как указано в статье, либо при создании publish-профиля.

Вопрос сокрытия секретных данных из web.config'а темы трансформаций не касается ну вообще никак. Замечу только, что есть техники, позволяющие шифровать куски web.config'а.

Ни для чего из этого переменные окружения не нужны.
Я к тому, что перед применением конфигурации вам обычный publish сделает еще и сборку проекта и еще много других ненужных вам вещей. А хочется, чтобы один проект, который собирается под CI и пакуется потом в артефакты можно было задеплоить на любую среду окружения будь то prod/qa/dev без повторной компиляции проекта. Поэтому и говорю что трансформацию конфигурации лучше держать подальше от процесса сборки. Если брать тот же .Net Core, даже трансформации не применяются все конфиги накатываются скопом, а потом в зависимости от окружения берутся подходящие значения либо из базового конфига, либо из конфига окружения. Что не исключает возможность их получения из других источников подробнее тут

Замечу только, что есть техники, позволяющие шифровать куски web.config'а.

Сталкивался я с такими техниками, больше не хочется.

Судя по иконке в SolutionExplorer файл NLog.config лежит в репозитории и наверное у него длинная история.
Подход с кофигом для каждого разработчика имеет недостатки:
• Надо следить за изменением конфигов во всех N трансформ файлах
• NLog.Prod.config лежит в репозитории и судя по всему со всеми паролями прод базы
• Плохо масштабируется и не работает для большого кол-ва разработчиков
• Не применить без боли в ASP.NET Core


Если проблема только в имени БД, возможно, проще всем использовать одно имя?
Посылать мейлы с локальной машины выглядит странновато, но ладно.


Но даже для решения этих двух проблем можно использовать:
• Environments variables


Для Core:
https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-2.0
• Параметны командной строки


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

"NLog.Prod.config со всеми паролями прод базы" — если вы в нлоге храните "все пароли", то ой, конечно. Излишне делать из хранилища логов что-то большее. Не хотите в nlog.config хранить логин-пароль к бд, если логи идут в бд — можно сделать пользователя sql server, имеющего право только на хп AddLog. А еще лучше тогда использовать Trusted Connection и доменную авторизацию — и это будет совсем ок для обычного проекта. Если и так опасно (я уверен, что это так для очень малой доли проектов — лишь самых больших и самых серьезных, для которых все по-другому. Даже есть такой афоризм — "лучшее враг хорошего"), или не хотите там светить настройками доступа к smtp — можно конфиг нлога


  • хранить в web.config и там шифровать;
  • хранить во внешнем файле, который будет присутствовать только в ФС ПРОДа — не хранить его в репозитарии. Для этого нужно использовать директиву include https://github.com/nlog/NLog/wiki/Configuration-file#include-files

Что хранить в web.config, и что не хранить статья не затрагивает. Статья ровно об оповещении об ошибках по-своему для каждого контура. Не хотите хранить чувствительные к безопасности данные — ну ок, можно их вынести. Тут замечания: во-первых, это нужно для очень малой доли проектов (да, у всего есть границы применимости) — обычно достаточно того факта, что web.config недоступен без доступа к файловой системе; во-вторых, любое решение по хранению настроек все основного их хранилища подразумевает дисциплинарное ограничение, а их гораздо полезнее заменять на инструментальные расширения. Я снова имею в виду, что части web.config можно шифровать.
http://qaru.site/questions/173916/how-to-encrypt-one-entry-in-webconfig


Утверждение "конфиг не должен быть именным" не является ни абсолютом, ни даже полезным для большей части проектов. Именной конфиг ничему, в обычном корпоративном проекте, не мешает. Тут я не имею в виду проекты, где разработчиков очень много — и опять же, это обычная ситуация. Даже для 10 разрабов не вижу проблемы. У разработчика запросто может быть — и это просто конкретные примеры из живых проектов:


  • Именованный инстанс sql server'а, или он может использовать sql server на сервере, если, например, он на ноутбуке и у него не хватает ресурсов.
  • Другое имя БД — а я хочу иметь возможность переключиться на восстановленный бекап, или, наоборот, на чистую БД без данных. Или вообще один sql server на всех, и тогда у всех имена БД должны быть разные. Предложение "давайте у всех имя БД будет одинаково" вредно. Кстати, весьма полезна практика иметь 2 sql server'а — ПРОД и тестовый, для экономии ресурсов. А на тестовом несколько БД для разных тестовых контуров, в том числе и для разрабов.
  • Другие настройки включения-выключения фоновых сервисов. Если работает над одним сервисом, ему не нужно запускать весь контур.
  • Другой урл для собственного веб-сервиса, эмулирующего внешнуюю ИС. Не надо запрещать это делать.
  • Настройки собственной шины сообщений, своего rabbitmq.
  • А если я хочу протестировать весь контур, то я хочу иметь все настройки, равные боевым, кроме всяких урлов.

Все это исключительно из моих работающих проектов, но я бы это обобщил — у каждого контура приложения должна быть возможность задать свое личное значение любой настройки. И работающий экземпляр приложения у разработчика в visual studio — это тоже контур. Вредно называть "окружением" значения настроек. Окружение — это набор всех сервисов (и, обычно, их версий), работающих "рядом". А настройки этих сервисов — не окружение. Тогда утверждение "окружение у всех контуров одинаковое" очень полезно и конструктивно.

"NLog.Prod.config со всеми паролями прод базы" — если вы в нлоге храните "все пароли", то ой, конечно.

Я как раз предлагал использовать подход где пароли хранятся не в репозитории. Ну и я не использую NLog)


можно конфиг нлога...

Понятно что можно шифровать, выносить в N отдельных файлов, убеждать себя и команду что хранить пароли от прода в репозитории это хорошо и надеяться что кто-нибудь по случайности не дропнет базу. Но ради чего все это? Чтобы получить систему которая не масштабируется и не работает с новыми технологиями (ASP.NET Core)?


Статья ровно об оповещении об ошибках по-своему для каждого контура.
Тут я не имею в виду проекты, где разработчиков очень много — и опять же, это обычная ситуация. Даже для 10 разрабов не вижу проблемы.

Стоит добавить: Для небольшой команды.
Ну то есть вы понимаете что ваш подход не масштабируется, и если вдруг ваша команда вырастет, то он не будет работать хорошо?


Именованный инстанс sql server'а, или он может использовать sql server на сервере, если, например, он на ноутбуке и у него не хватает ресурсов.

В sql server есть алиасы.


Кстати, весьма полезна практика иметь 2 sql server'а — ПРОД и тестовый, для экономии ресурсов. А на тестовом несколько БД для разных тестовых контуров, в том числе и для разрабов.

Опять же, немасштабируемое решение работающее для небольшой команды.


Другой урл для собственного веб-сервиса, эмулирующего внешнуюю ИС. Не надо запрещать это делать.

Согласен что нельзя, но какой довод в пользу уникального имени для каждого разработчика?


Все это исключительно из моих работающих проектов, но я бы это обобщил — у каждого контура приложения должна быть возможность задать свое личное значение любой настройки.

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


Вредно называть "окружением" значения настроек.

Почему вы так решили? Даже в документации МС разделение настроек идет по окружению.

Sign up to leave a comment.

Articles