Раздел 14 · Infrastructure / DevSecOps

Базовый DevOps: 12-factor, compose, CI и AWS

middle~25 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Базовый DevOps: 12-factor, compose, CI и AWS

Второй урок раздела. DevOps начинается не с инструментов, а с принципов: конфиг живёт в окружении, сборка воспроизводима, тесты гоняются автоматически. Если этих принципов нет, не спасут ни compose, ни Kubernetes: получится автоматизированный беспорядок. Поэтому сначала контракт между приложением и платформой, а уже на него ложатся docker-compose и CI.

Идея: 12-factor как контракт

12-factor это набор правил, которые делают приложение пригодным для облака. Не обязательно помнить все двенадцать, важны несколько, которые ломаются чаще всего:

  • Конфиг в окружении, не в коде. Никаких хардкод-паролей, никаких if (env === 'prod') с разными ветками. Одна сборка, поведение задаётся переменными окружения.
  • Зависимости объявлены явно (package.json, lock-файл), ничего не подразумевается установленным на машине.
  • Приложение без состояния: ничего важного в памяти процесса и на локальном диске. Тогда инстансы взаимозаменяемы и приложение масштабируется копиями.
  • Логи в stdout, а не в файл. Куда их собирать, решает платформа.
  • Dev и prod похожи: одна и та же база, одни версии, минимум расхождений. Иначе “у меня работает” перестаёт что-либо значить.

Эти правила это и есть граница между приложением и платформой: приложение читает конфиг и пишет логи, платформа решает, откуда конфиг и куда логи. Compose и CI это просто инструменты, реализующие контракт.

docker-compose: граф сервисов

Compose описывает, из каких сервисов состоит окружение, и одной командой поднимает их все. Это идеальный инструмент для локальной разработки и небольшого self-host.

services:
  app:
    build: .
    environment:
      DATABASE_URL: postgres://app:app@db:5432/app
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:17
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
      POSTGRES_DB: app
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U app']
      interval: 5s
      retries: 5
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Два важных куска: healthcheck проверяет, что Postgres реально принимает соединения, а depends_on с условием заставляет app дождаться, пока база здорова, а не просто пока её контейнер запустился. Без условия приложение стартует раньше базы и падает на первом же запросе.

Compose это про dev и небольшой прод. Как только нужны автоскейл, rolling-деплой и несколько узлов, на сцену выходит оркестратор (Kubernetes), о нём в четвёртом уроке.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.