Управление секретами и конфигурацией для dev, staging, prod
Узнайте, как управлять секретами и конфигурацией в dev, staging и prod: простые паттерны для API-ключей, SMTP и секретов вебхуков без утечек.

Какую проблему мы решаем
Управление секретами и конфигурацией — это про то, чтобы не допускать попадания чувствительных значений туда, где их могут случайно скопировать, закэшировать или поделиться ими.
«Секрет» — это всё, что даёт доступ или подтверждает личность: API-ключ, пароль к базе, логин для SMTP или секрет подписи вебхука. Обычная «конфигурация» — значение, которое можно публиковать без вреда: имя фич-флага, таймаут или базовый URL публичного сайта.
Dev, staging и prod используют разные значения, потому что у них разные цели. Dev нужен для быстрой итерации и безопасного тестирования. Staging должен выглядеть как прод, но оставаться изолированным. Prod должен быть максимально защищён, аудируем и стабилен. Если вы используете одни и те же секреты везде, одна утечка в dev может перерасти в инцидент в prod.
«Утечка в билды» означает, что секрет оказался внутри чего-то, что упаковывается и распространяется: скомпилированный бэкенд, мобильный пакет или фронтенд-бандл. Как только секрет попал в артефакт сборки, он может распространяться туда, где вы не контролируете ситуацию.
Случайные утечки обычно происходят по нескольким предсказуемым путям:
- Хардкод секретов в исходниках, примерах или комментариях
- Коммит локального файла
.envили экспорта конфигурации в репозиторий - Запекание секретов в фронтенд- или мобильных сборках, которые запускаются на устройствах пользователей
- Печать секретов в логах, отчётах об ошибках или выводе сборки
- Копирование продовых значений в staging «для быстрого теста»
Простой пример: разработчик добавляет пароль SMTP в файл конфигурации, чтобы «почта заработала», затем файл коммитят или упаковывают в релиз. Даже если пароль позже заменят, старый билд может всё ещё лежать в CI-кэше, в загрузке магазина приложений или в папке загрузок у кого-то на компьютере.
Цель простая: держать секреты вне кода и билдов, и подставлять правильные значения для каждого окружения во время выполнения или через безопасный шаг деплоя.
Базовые принципы, предотвращающие большинство утечек
Большая часть безопасности достигается благодаря нескольким привычкам, которым вы следуете всегда.
Держите секреты вне кода и выводов сборки. Код распространяется: его копируют, просматривают, логируют и кэшируют. Сборки тоже распространяются: артефакты могут оказаться в CI-логах, приложениях магазинов, реестрах контейнеров или общих папках. Считайте всё, что коммитится или компилируется, публичным.
Разделяйте учётные данные по окружениям (принцип наименьших привилегий). Ключ для dev должен работать только в dev и иметь минимальные права. Если ключ украдут с ноутбука или тестового сервера, ущерб останется локальным. То же относится к SMTP-пользователям, паролям к БД и секретам вебхуков.
Сделайте ротацию рутинной. Предполагайте, что вы будете менять ключи — и проектируйте систему так, чтобы можно было заменить значение без правки кода и без пересборки всех приложений. Во многих системах это значит читать секреты во время выполнения (из переменных окружения или секретного хранилища) и поддерживать возможность иметь два активных секрета при переходе.
Ограничивайте и логируйте доступ. Секреты должны быть доступны только сервису, которому они нужны, и только в том окружении, где он работает. Доступ людей должен быть редким, ограниченным по времени и аудируемым.
Небольшой набор правил, который покрывает большинство случаев:
- Не коммитьте секреты и не вставляйте их в тикеты, чаты или скриншоты.
- Используйте отдельные учётные данные для dev, staging и prod.
- Предпочитайте runtime-конфигурацию запеканию значений в образы или мобильные сборки.
- Проводите ротацию по расписанию и после подозрительных событий.
- Ограничивайте, кто и что может читать секреты, и храните логи доступа.
Эти принципы применимы как к традиционной кодовой базе, так и к no-code платформам вроде AppMaster. Безопасный путь один: держать секреты вне сборок и точно ограничивать область их применения.
Где чаще всего происходят утечки
Большинство утечек — не «взломы». Они случаются в ходе обычной работы: быстрый тест, полезный скриншот, сборка, которая печатает лишнее. Хорошая отправная точка — знать, где обычно происходят такие случайные ошибки.
Система контроля версий — классический источник. Кто-то вставляет API-ключ в конфиг «на время», коммитит, и он распространяется по веткам, pull request-ам и комментариям к обзорам кода. Даже если потом удалить ключ, он может остаться в истории или в копии патча.
Всё, что вы отправляете пользователям. Фронтенд-бандлы и мобильные бинарники легко проинспектировать. Если секрет в JavaScript, iOS/Android приложении или «запечённой» конфигурации, считайте его публичным. Клиентские приложения могут хранить публичные идентификаторы, но не приватные ключи.
Секреты также попадают наружу через «полезный шум» в автоматизации и саппорте: CI-логи, которые эхоят переменные окружения; debug-print’ы с SMTP-учётками; отчёты об авариях, включающие конфигурацию и исходящие запросы; контейнерные образы и кэши сборки, случайно содержащие .env; тикеты поддержки с логи или скриншотами настроек.
Распространённый сценарий — секрет попадает в pipeline один раз, затем копируется повсюду: в слой контейнера, в кэш-артефакт, в лог и в тикет. Исправление редко сводится к одному инструменту. Это привычка: не вставлять секреты в код, сборки и в то, что люди копируют в чат.
Типы секретов и их риски
Полезно знать, с каким типом секрета вы имеете дело, что он может сделать при утечке и где он ни в коем случае не должен появляться.
API-ключи (Stripe, карты, аналитика и другие сервисы) часто являются «ключами проекта». Они идентифицируют приложение и позволяют совершать действия: списывать платежи или читать статистику. Это не то же самое, что токены пользователя. Токены представляют сессию пользователя и истекают. Многие API-ключи не истекают сами по себе, поэтому утечка может быть серьёзной.
SMTP-учётные данные — обычно логин и пароль для почтового сервера. При утечке злоумышленник может отправлять спам от вашего домена и испортить доставляемость. API-ориентированные почтовые провайдеры заменяют сырой SMTP-пароль на API-ключи и ограниченные права, что безопаснее, но риск остаётся, если ключ может отправлять письма от вашего аккаунта.
Секреты вебхуков (ключи подписи или верификации) защищают входящие запросы. Если секрет утечёт, кто-то сможет подделать события («оплата подтверждена», «подписка отменена») и обмануть систему. Опасность не только в утечке данных, но и в выполнении бизнес-логики по фейковым событиям.
Другие критичные секреты: URL базы данных (часто с паролем внутри), учётные данные сервисных аккаунтов и ключи шифрования. Утечка URL базы данных может привести к краже данных. Утечка ключа шифрования делает данные читаемыми и усложняет ротацию.
Краткая классификация по последствиям:
- Может тратить деньги или запускать действия: платёжные ключи, админские API-ключи, секреты подписи вебхуков
- Может выдать личность: SMTP-пароли, ключи отправки почты, токены ботов
- Может раскрыть все данные: учётные данные баз данных, аккаунты облачных сервисов
- Может навсегда нарушить приватность: ключи шифрования, ключи подписи
- Часто безопасно включать в клиент: publishable-ключи для браузера (их всё равно стоит ограничивать по домену/приложению)
Никогда не помещайте в клиентские приложения (веб, iOS, Android): приватные API-ключи, SMTP-пароли, пароли к БД, сервисные аккаунты, приватные ключи шифрования и секреты подписи вебхуков. Если клиенту нужно вызвать сторонний API, проксируйте через бэкенд, чтобы секреты оставались на сервере.
Паттерны хранения секретов, чтобы не запекать их в билды
Безопасный дефолт простой: не запекайте секреты в то, что компилируется, экспортируется или шариcтся. Считайте сборки публичными артефактами, даже если они внутри команды.
Выберите контейнер для каждого окружения
Для локальной разработки конфигурационный файл допустим, если он не попадает в VCS и легко заменяется (например, локальный .env). Для staging и production предпочтите реальное хранилище секретов: secret manager облачного провайдера, выделенный Vault или защищённые настройки платформы.
Переменные окружения — удобный дефолт: их просто подставлять во время выполнения и они отделены от кода. Главное — момент подстановки: runtime-внедрение безопаснее, чем build-time, потому что секрет никогда не попадает в вывод сборки или клиентский бандл.
Практический разбиение, которое подходит многим командам:
- Локально (dev): локальные env vars или локальный файл секретов, уникальный для каждой машины разработчика
- Staging: secret manager или защищённые настройки окружения, ограниченные для staging
- Production: secret manager с более жёсткими правами, логами аудита и ротацией
Согласованные имена и границы
Используйте одинаковые имена ключей в каждом окружении, чтобы приложение вело себя одинаково: SMTP_HOST, SMTP_USER, SMTP_PASS, STRIPE_SECRET_KEY, WEBHOOK_SIGNING_SECRET. Меняются только значения.
Когда окружения начинают иметь значение (платежи, почта, вебхуки), по возможности используйте отдельные проекты или облачные аккаунты для каждого окружения. Например, храните ключи Stripe и секреты вебхуков отдельно для staging, чтобы ошибка в staging не затронула прод.
Если вы деплоите через платформу вроде AppMaster, предпочтите runtime-настройки окружения для бэкенд-сервисов, чтобы секреты оставались на сервере и не встраивались в экспортируемый код или клиентские приложения.
Пошаговая настройка для dev, staging и prod
Сделайте так, чтобы ошибиться было сложно по умолчанию.
-
Инвентаризация. Перечислите все секреты и где они используются: API-ключи, SMTP логины/пароли, секреты вебхуков, пароли к БД, JWT-ключи, токены у сторонних сервисов. Для каждого укажите владельца (команда или вендор), компонент, который читает значение (бэкенд, воркер, мобильное приложение, веб) и адекватную частоту ротации.
-
Создайте отдельные значения для dev, staging и prod с разными правами. Dev-секреты должны быть безопасны для использования с ноутбуков и локальных контейнеров. Staging должен походить на prod, но никогда не использовать продовые учётные данные. Prod должен быть доступен только runtime-идентичности прод, а не людям по умолчанию.
-
Перенесите секреты в runtime-конфигурацию, а не на этапе сборки. Если секрет присутствует во время сборки, он может попасть в CI-логи, слои Docker, клиентские бандлы или отчёты об авариях. Простое правило: сборки создают артефакты, которыми безопасно делиться; секреты подставляются только при старте приложения.
-
Единый поток деплоя. Подход, который снижает ошибки:
- Создавайте отдельное хранилище секретов для каждого окружения (или строгую неймспейсовую политику).
- Давайте runtime-идентичности приложения права только на чтение секретов своего окружения.
- Внедряйте секреты при старте через переменные окружения или примонтированные файлы, держите их вне образов и клиентских бандлов.
- Введите правила ротации (сроки, владелец, напоминания) для каждого секрета.
- Жёсткий тест: деплой в staging должен падать, если он пытается читать продовый секрет.
Lockdown означает уменьшение того, кто и что может читать секрет. Избегайте общих учётных записей, длиноживущих токенов и делайте права на чтение уже как можно уже.
Если вы используете no-code платформу типа AppMaster, тот же подход работает: держите креденшелы в runtime-настройках для каждого окружения, и не позволяйте артефактам сборки встраивать секреты.
Практические паттерны для API-ключей и SMTP
Многие утечки происходят, когда приложению нужно «что-то отправить», и самый быстрый путь — вставить креденшелы в клиент или в конфиг, который попадает в сборку. Хорошее правило: веб- и мобильные клиенты не должны хранить SMTP-логины, пароли или ключи провайдера, которые могут отправлять сообщения.
Для почты предпочтите API-ключи почтового провайдера вместо сырого SMTP, когда это возможно. API-отправка проще ограничивается (только отправка), ротация и мониторинг удобнее. Если SMTP неизбежен, держите его на сервере и пусть бэкенд будет единственной точкой отправки почты.
Практичная настройка:
- Выносьте отправку почты за бэкенд-эндпоинт (например «отправить код для входа» или «выслать счёт»).
- Храните API-ключ или SMTP-пароль как секрет окружения на бэкенде, а не в исходниках или UI-настройках.
- Используйте отдельные креденшелы для dev, staging и prod (лучше — отдельные аккаунты и домены отправителя).
- В staging добавьте allowlist получателей, чтобы письма приходили только на разрешённые адреса.
- Логируйте результаты доставки (ID сообщения, ответ провайдера, домен получателя), но никогда не логируйте креденшелы или полные тела сообщений.
Разделение staging и prod важнее, чем многие думают. Staging может случайно разослать письма реальным клиентам, если использует те же правила отправки. Простая защита — блокировать исходящую почту в staging, если адрес получателя не в allowlist.
Пример с AppMaster: мобильное приложение запрашивает «пришлите код для входа». Приложение вызывает бэкенд, бэкенд читает секрет почты из окружения (prod или staging) и отправляет письмо. В staging allowlist не позволит отправить сообщение реальным клиентам, а логи покажут статус отправки без раскрытия ключа.
Вебхуки: подпись, верификация и ротация
Безопасность вебхуков сводится к одному правилу: верифицируйте каждый запрос на сервере секретом, который никогда не покидает бэкенд. Если секрет попал в веб или мобильное приложение — он перестал быть секретом.
Подпись и верификация
Обращайтесь с вебхуком как с входящим платёжным сообщением: ничего не принимайте, пока не проверите подпись. Провайдер присылает заголовок с подписью, вычисленной от полезной нагрузки и вашего секретного ключа. Сервер переписывает подпись и сравнивает её с присланной.
Простой поток проверки:
- Читайте сырое тело запроса точно как пришло (без изменений формата).
- Вычисляйте ожидаемую подпись с использованием вашего секретного вебхука.
- Сравнивайте в константном времени.
- Отклоняйте отсутствующие или неверные подписи с понятным 401 или 403.
- Только после этого парсите JSON и обрабатывайте событие.
Используйте отдельные эндпоинты и отдельные секреты для dev, staging и prod. Это помешает тестовым системам запускать продовые действия и упростит локализацию инцидентов. В AppMaster это обычно означает разные конфиги окружений с секретом вебхука в server-side переменной, а не в UI клиента.
Защита от повторов и ротация
Подписи защищают от подделки, но не от повторного воспроизведения (replay). Добавьте проверки, чтобы каждое событие было действительно один раз или действительно только в ограниченное окно времени. Общие подходы: заголовок с меткой времени и строгим таймаутом, nonce или idempotency-key, который сохраняется и позволяет отклонять повторы.
Планируйте ротацию заранее. Безопасный паттерн — поддерживать два активных секрета на короткое время: принимать подписи, вычисленные как старым, так и новым секретом, пока провайдер не обновит значение, затем выводить старый. Установите чёткое время выведения и мониторьте трафик с подписью по старому ключу.
И будьте осторожны с логами: полезная нагрузка вебхука часто содержит email’ы, адреса или платёжные метаданные. Логируйте ID события, типы и результаты верификации, но избегайте печати полных полезных нагрузок или заголовков, которые могут раскрыть чувствительные данные.
Частые ошибки и ловушки
Большинство утечек — простые привычки, удобные в разработке, но затем переносящиеся в staging и prod.
Относиться к локальному .env как к безопасному месту навсегда. Для ноутбука это нормально, но опасность появляется, как только файл копируется в репозиторий, общий zip или Docker-образ. Если вы используете .env, игнорируйте его в VCS и заменяйте окружными настройками в деплое.
Использовать одни и те же креденшелы везде. Один ключ для dev, staging и prod значит, что ошибка в dev может превратиться в прод-инцидент. Разные ключи упрощают ротацию, отзыв и аудит.
Внедрять секреты на этапе сборки для фронтенда и мобильных приложений. Если секрет попал в скомпилированный бандл, его можно извлечь. Клиенты должны получать только публичную конфигурацию (например, базовый URL API). Всё чувствительное — на сервере.
Логи — тихий источник утечек. «Временный» debug-print может жить месяцами и отправиться куда угодно. Если нужно подтвердить значение — логируйте только маскированную форму (например, последние 4 символа) и сразу удаляйте сообщение.
Тревожные признаки
- Секреты есть в истории Git, даже если позже удалены.
- Один ключ работает во всех окружениях.
- Мобильное приложение содержит ключи вендора или SMTP-пароли.
- Тикеты поддержки содержат дампы запросов с заголовками.
- Значения «скрыты» через base64 или в полях формы.
Кодирование — не защита, а скрытые поля по-прежнему видны пользователю.
При разработке в AppMaster держите чувствительные значения в конфигурации уровня окружения для каждой цели деплоя (dev, staging, prod) и передавайте в клиентские приложения только не чувствительные настройки. Простой чек: если браузер видит значение — считайте его публичным.
Быстрая чек-лист перед релизом
Пройдитесь один раз с мыслью «что может утечь». Большинство инцидентов банальны: ключ вставили в тикет, в скриншоте показали панель настроек, или артефакт сборки случайно включает секрет.
Перед релизом проверьте:
- Секретов нет в истории репозитория, задачах, документации, скриншотах или чатах. Если вы когда-то вставляли секрет в открытый текст — считайте его скомпрометированным и ротируйте.
- Веб- и мобильные сборки содержат только публичные настройки (API base URL, фич-флаги). Приватные ключи, SMTP-пароли и секреты вебхуков должны храниться на сервере или в секретном хранилище окружения.
- Staging изолирован от production: свои API-ключи, SMTP-учётка и тестовые вебхуки. Staging не должен читать продовые БД или секретные менеджеры.
- CI-логи, мониторинг и отчёты об ошибках не печатают чувствительных значений. Проверьте вывод сборки, отчёты об авариях и debug-логи. Маскируйте токены и редактируйте заголовки вроде
Authorization. - Вы можете быстро ротировать и отозвать ключи без изменения кода. Секреты должны подхватываться при деплое (переменные окружения или secret manager), чтобы смена ключа была конфигурационной, а не требовала срочной пересборки.
Если вы используете AppMaster, держите секреты как настройки среды при деплое, а не как значения в UI или экспортируемых сборках. Полезная последняя проверка — поискать типичные паттерны в собранных артефактах и логах: sk_live, Bearer или имена SMTP-хостов.
Опишите «кнопку отключения» для каждой интеграции: где отозвать ключ и кто может сделать это за пять минут.
Пример сценария: платежи, почта и вебхуки
Небольшая команда из трёх человек ведёт портал клиентов (веб), сопутствующее мобильное приложение и небольшой фоновой воркер, который отправляет квитанции и синхронизирует данные. Окружения: dev на ноутбуках, staging для QA и prod для реальных пользователей. Нужна настройка секретов и конфигурации, которая не замедлит ежедневную работу.
В dev используют sandbox-ключи платежных систем и тестовый SMTP-аккаунт. Каждый разработчик хранит секреты в локальных переменных окружения (или в локальном неотслеживаемом файле, загружаемом в env), чтобы ничего не попало в репозиторий. Веб, мобильное приложение и фоновые сервисы читают одни и те же имена переменных: PAYMENTS_KEY, SMTP_USER, WEBHOOK_SECRET, но значения отличаются по окружению.
В staging CI деплоит билд, и платформа подставляет секреты во время выполнения. Staging использует свой платёжный аккаунт, свои SMTP-креденшлы и собственный секрет вебхука. QA может тестировать реальные сценарии без риска попасть в prod.
В prod те же артефакты разворачивают с секрктами из выделенного secret store (или secret manager облака), доступными только для runtime-сервисов. Права ужесточены: только фоновые задачи читают SMTP-учётки, только обработчик вебхуков читает соответствующий секрет.
Когда ключ скомпрометирован (например, скриншот показал API-ключ), команда действует по плану:
- Немедленно отзывать скомпрометированный ключ и ротировать связанные секреты.
- Искать подозрительную активность в логах за окно предполагаемой утечки.
- Переразвернуть сервисы, чтобы они взяли новые значения.
- Задокументировать инцидент и добавить защиту (например, pre-commit сканер).
Чтобы локальная работа оставалась удобной, продовые секреты не расшаривают. Разработчики используют sandbox-аккаунты, а в AppMaster хранят отдельные значения окружений для dev, staging и prod, чтобы одна и та же логика приложения работала везде безопасно.
Следующие шаги: сделайте процесс повторяемым
Рассматривайте работу с секретами как гигиену. Первый раз это раздражает, но потом должно стать рутиной.
Начните с простой карты секретов в понятной форме, чтобы любой мог её обновить:
- Что это за секрет (API-ключ, пароль SMTP, секрет вебхука)
- Где используется (сервис, задание, мобильное/веб-приложение, панель вендора)
- Где хранится по окружениям (dev, staging, prod)
- Кто имеет доступ (люди, CI/CD, только runtime)
- Как его ротировать (шаги и что мониторить)
Далее выберите один паттерн хранения для каждого окружения и придерживайтесь его. Последовательность важнее изобретательности. Например: разработчики используют локальное хранилище секретов, staging — управляемые секреты с ограниченным доступом, а production — те же управляемые секреты плюс усиленный аудит.
Добавьте расписание ротации и небольшой план действий при инциденте, который люди действительно будут выполнять:
- Поворачивайте ключи высокого риска по календарю (и сразу при изменениях персонала).
- Предполагайте утечки: отзывайте, заменяйте и проверяйте, что трафик восстанавливается.
- Логируйте, кто ротировал что, когда и почему.
- Определите проверки области поражения (платежи, отправка почты, вебхуки).
Если вы разрабатываете с AppMaster (appmaster.io), храните приватные ключи в серверной конфигурации и деплойте по окружениям, чтобы веб- и мобильные сборки не встраивали секреты. Протестируйте процесс один раз в staging: ротируйте один ключ от начала до конца (обновить хранилище, переразвернуть, проверить, отозвать старый ключ). Повторите для следующего секрета.
Вопросы и ответы
Секрет — это любое значение, которое подтверждает личность или даёт доступ: API-ключи, пароли к БД, SMTP-учётки и секреты для подписи вебхуков. Конфигурация — это значение, которое можно публиковать без вреда: таймауты, имена фич-флагов или базовый публичный URL.
Если значение может нанести ущерб при копировании из скриншота или репозитория, рассматривайте его как секрет.
Используйте отдельные секреты, чтобы сократить радиус поражения. Если с утечкой сталкивается ноутбук разработчика, тестовый сервер или staging, вы не хотите, чтобы этим ключом можно было открыть доступ в прод.
Отдельные окружения также позволяют задавать более мягкие права в dev и staging и усиливать, аудировать доступ в production.
Предполагается, что всё, что компилируется, бандлится или загружается, может быть скопировано и проинспектировано. Держите секреты вне исходников и не подставляйте их в переменные на этапе сборки; внедряйте их во время выполнения через переменные окружения или секретный менеджер.
Если вы можете заменить секрет без пересборки приложения, скорее всего вы идёте по безопасному пути.
Локальный файл .env вполне подходит для личной разработки, если он никогда не попадёт в систему контроля версий и не будет запечён в образы или артефакты. Добавьте его в .gitignore и не пересылайте через чаты или архивы.
Для staging и production лучше использовать защищённые настройки окружения или секретный менеджер.
Никогда не помещайте в клиентские приложения приватные ключи, SMTP-пароли, учётные данные баз данных или секреты подписи вебхуков. Если код выполняется на устройстве пользователя или в браузере, предполагайте, что злоумышленник сможет извлечь значения.
Если клиенту нужно вызвать сторонний API с секретом, проксируйте вызов через ваш бэкенд, где секрет хранится на сервере.
Делайте ротацию конфигурационной операцией, а не правкой кода. Храните секреты вне исходников, переразворачивайте сервисы для подхвата новых значений и назначьте владельца и напоминания для каждого ключа.
По возможности поддерживайте короткий период совместимости, когда старый и новый секреты работают одновременно, затем отключайте старый.
Проверяйте каждый входящий вебхук на сервере с помощью секрета, который никогда не покидает бэкенд. Вычисляйте ожидаемую подпись от сырого тела запроса (exact request body) и сравнивайте её безопасно до того, как парсите и обрабатываете событие.
Используйте отдельные эндпоинты и секреты для dev, staging и prod, чтобы тестовые события не запускали продовые действия.
Избегайте печати секретов, полных заголовков или тел запросов в логи, вывод сборки или отчёты об ошибках. Для отладки логируйте метаданные: ID события, коды статусов, маскированные значения, но не сами креденшелы.
Считайте любой вставленный лог в тикет или чат потенциально публичным и редактируйте/редактируйте его перед распространением.
Staging должен имитировать поведение продакшна, оставаясь изолированным. Используйте отдельные аккаунты у вендоров или проекты, отдельные SMTP-учётки, платёжные ключи и секреты вебхуков.
Добавьте защиту: staging не должен иметь возможность читать продовые секретные хранилища или базы данных, даже при ошибочной конфигурации.
В AppMaster храните чувствительные значения в настройках окружения для каждой цели деплоя, а не в UI или клиентской конфигурации. Это гарантирует, что сгенерированные веб- и мобильные сборки содержат только публичные настройки, а секреты остаются на сервере.
Хорошая практика — использовать одинаковые имена переменных в dev, staging и prod и менять только значения.


