12-factor конфигурация
Почему конфиг держат в окружении, что значит «один артефакт на все среды» и какие принципы 12-factor про эксплуатацию.
Откуда взялся 12-factor
The Twelve-Factor App это набор из двенадцати принципов, как писать сервисы, удобные для эксплуатации в облаке. Они появились из практики и стали общим языком: когда говорят «12-factor app», имеют в виду сервис, который легко конфигурировать, масштабировать и катить. Здесь разберём те факторы, которые ближе всего к DevOps.
Конфиг в окружении
Главный для нас фактор: конфигурация живёт в окружении, не в коде. Адрес базы, ключи, режим работы передаются через переменные окружения, а не зашиты в файлы внутри сборки. Подробно механику переменных разбирал урок про env-vars, здесь важен принцип.
Признак нарушения простой: если, чтобы сменить адрес базы между dev и prod, надо пересобрать артефакт, конфиг сидит не там. Правильно, когда один и тот же образ запускается в любой среде, отличаясь только переменными.
# один образ, разные среды
docker run -e DATABASE_URL=postgres://dev-db/app myapp:1.4
docker run -e DATABASE_URL=postgres://prod-db/app myapp:1.4
Один артефакт на все среды
Отсюда следует принцип build once, deploy anywhere. Артефакт (образ) собирают один раз, и ровно его прогоняют через staging и прод. Не пересобирают «прод-версию» отдельно: пересборка означает, что в прод уехало не то, что проверяли на staging.
Версию фиксируют тегом или digest из урока про реестры, а различия сред выносят в переменные. Так staging и прод гарантированно запускают один код.
Stateless-процессы
Ещё один важный фактор: процессы не хранят состояние. Всё, что должно пережить рестарт или существовать между копиями (сессии, загруженные файлы, кеш), выносят во внешние хранилища: базу, объектное хранилище, Redis. Сам процесс держит в памяти только то, что относится к текущему запросу.
Это то, на чём держится горизонтальное масштабирование из урока про балансировку: если копии stateless, любой запрос обслужит любая из них, и их можно свободно добавлять и убирать.
Логи как поток
И ещё один: логи — поток в stdout, а не файлы, которыми управляет приложение. Процесс просто пишет в stdout, а собирает и хранит логи окружение (journald, сборщик логов). Это связывает с уроком про уровни логирования: приложение не думает про ротацию файлов, оно отдаёт поток.
Что важно запомнить
12-factor — принципы сервиса, удобного в эксплуатации. Ключевые для DevOps: конфиг в окружении, один артефакт на все среды, stateless-процессы, логи в stdout.
Если смена настройки требует пересборки, конфиг лежит не там. Один и тот же образ прогоняют через staging и прод, отличая среды только переменными. Состояние выносят наружу, чтобы копии масштабировались свободно.
В следующем уроке разберём устойчивость к сбоям: ретраи, таймауты и circuit breaker.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс