Ответ
Twelve-Factor App — это набор принципов для построения современных, масштабируемых и переносимых SaaS-приложений. Эти принципы помогают создавать приложения, которые легко развертывать, масштабировать и поддерживать в облачных средах.
Ключевые принципы:
- Одна кодовая база, отслеживаемая в системе контроля версий, — множество развертываний. Один репозиторий для приложения, но разные среды (разработка, staging, production).
- Явное объявление и изоляция зависимостей. Все зависимости должны быть явно объявлены (например, в
package.json,requirements.txt,pom.xml) и никогда не подразумеваться. - Хранение конфигурации в среде выполнения. Конфигурация (ключи API, строки подключения к БД) должна храниться в переменных окружения, а не в коде.
- Сопоставление сторонних сервисов с ресурсами. Базы данных, очереди сообщений, кэш должны рассматриваться как присоединяемые ресурсы, настраиваемые через конфигурацию.
- Строгое разделение стадий сборки и выполнения. Стадия сборки преобразует код в исполняемый артефакт. Стадия выполнения запускает этот артефакт. Их нельзя смешивать.
- Запуск приложения как одного или нескольких несостоятельных процессов. Приложение выполняется как один или несколько процессов, не хранящих состояние внутри себя. Состояние сохраняется во внешних хранилищах (БД, кэш).
- Экспорт сервисов через привязку портов. Приложение должно быть самодостаточным и предоставлять свои сервисы через объявленный порт.
- Масштабирование через модель процессов. Масштабирование осуществляется путем запуска большего количества идентичных процессов (горизонтальное масштабирование).
- Быстрый запуск и корректное завершение для обеспечения надежности. Процессы должны быстро запускаться и корректно завершаться при получении сигнала (например, SIGTERM), обеспечивая устойчивость к сбоям.
- Максимальное сближение сред разработки, промежуточной и рабочей. Следует минимизировать различия между средами, чтобы избежать проблем типа "работает на моей машине".
- Журналирование как поток событий. Приложение должно выводить журналы (логи) как поток событий в
stdout. Агрегация и хранение логов — задача инфраструктуры. - Задачи администрирования запускать как разовые процессы. Задачи по обслуживанию (миграции БД, запуск скриптов) должны выполняться в той же среде, что и основное приложение, но как разовые процессы.
Пример (Принцип 3 — Конфигурация):
# Плохо: конфигурация захардкожена
DATABASE_URL = 'postgresql://user:pass@localhost/db'
# Хорошо: конфигурация берется из переменных окружения
import os
DATABASE_URL = os.environ.get('DATABASE_URL')
Следование этим принципам упрощает CI/CD, развертывание в контейнерах (Docker) и оркестрацию (Kubernetes).