Что такое методология Twelve-Factor App?

«Что такое методология Twelve-Factor App?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Twelve-Factor App — это набор принципов для построения современных, масштабируемых и переносимых SaaS-приложений. Эти принципы помогают создавать приложения, которые легко развертывать, масштабировать и поддерживать в облачных средах.

Ключевые принципы:

  1. Одна кодовая база, отслеживаемая в системе контроля версий, — множество развертываний. Один репозиторий для приложения, но разные среды (разработка, staging, production).
  2. Явное объявление и изоляция зависимостей. Все зависимости должны быть явно объявлены (например, в package.json, requirements.txt, pom.xml) и никогда не подразумеваться.
  3. Хранение конфигурации в среде выполнения. Конфигурация (ключи API, строки подключения к БД) должна храниться в переменных окружения, а не в коде.
  4. Сопоставление сторонних сервисов с ресурсами. Базы данных, очереди сообщений, кэш должны рассматриваться как присоединяемые ресурсы, настраиваемые через конфигурацию.
  5. Строгое разделение стадий сборки и выполнения. Стадия сборки преобразует код в исполняемый артефакт. Стадия выполнения запускает этот артефакт. Их нельзя смешивать.
  6. Запуск приложения как одного или нескольких несостоятельных процессов. Приложение выполняется как один или несколько процессов, не хранящих состояние внутри себя. Состояние сохраняется во внешних хранилищах (БД, кэш).
  7. Экспорт сервисов через привязку портов. Приложение должно быть самодостаточным и предоставлять свои сервисы через объявленный порт.
  8. Масштабирование через модель процессов. Масштабирование осуществляется путем запуска большего количества идентичных процессов (горизонтальное масштабирование).
  9. Быстрый запуск и корректное завершение для обеспечения надежности. Процессы должны быстро запускаться и корректно завершаться при получении сигнала (например, SIGTERM), обеспечивая устойчивость к сбоям.
  10. Максимальное сближение сред разработки, промежуточной и рабочей. Следует минимизировать различия между средами, чтобы избежать проблем типа "работает на моей машине".
  11. Журналирование как поток событий. Приложение должно выводить журналы (логи) как поток событий в stdout. Агрегация и хранение логов — задача инфраструктуры.
  12. Задачи администрирования запускать как разовые процессы. Задачи по обслуживанию (миграции БД, запуск скриптов) должны выполняться в той же среде, что и основное приложение, но как разовые процессы.

Пример (Принцип 3 — Конфигурация):

# Плохо: конфигурация захардкожена
DATABASE_URL = 'postgresql://user:pass@localhost/db'

# Хорошо: конфигурация берется из переменных окружения
import os
DATABASE_URL = os.environ.get('DATABASE_URL')

Следование этим принципам упрощает CI/CD, развертывание в контейнерах (Docker) и оркестрацию (Kubernetes).