# ADR-007: развёртывание приложения с помощью Docker Compose **Статус:** Принято **Дата:** 2026-07-23 ## Контекст Программное решение состоит из PostgreSQL, сервиса миграций, Telegram-бота и Flask-сайта. База данных должна быть готова до запуска приложений, а SQL-миграции должны выполняться последовательно с сохранением истории применения. ## Решение Для развёртывания используется Docker Compose из четырёх основных сервисов: `db`, `site`, `bot` и `migrate`. Сервисы базы данных и миграций используют готовые образы на основе Alpine Linux. Модули приложения собираются с помощью Dockerfile на базе среды выполнения Python 3.13 и включают необходимые библиотеки. Первым запускается контейнер `db` с PostgreSQL, который также импортирует первичные настройки ролей. Контейнер PostgreSQL не публикует порт на хост и остаётся доступным только внутри сети Compose. Затем запускается контейнер `migrate`. Он последовательно применяет SQL-скрипты из `db/migrations` и сохраняет историю их применения в таблице `public.schema_migrations`. Для каждой миграции хранится контрольная сумма. Если уже применённый файл был изменён, выполнение завершается с ошибкой. После успешного завершения миграций запускаются Telegram-бот и Flask-сайт. Условиями их запуска являются нормальное состояние контейнера базы данных и успешное завершение контейнера `migrate`. Сайт доступен только через loopback-адрес `127.0.0.1`. Внешний nginx принимает HTTPS-трафик и передаёт заголовки `X-Forwarded-*`. Бот не имеет входящего порта и получает обновления методом long polling. Контейнеры приложения выполняются от системного пользователя `runtime`, а не от `root`. ## Последствия Миграции выполняются до запуска прикладных процессов. PostgreSQL не публикуется наружу, сайт доступен извне только через HTTPS-прокси, а Telegram-бот не требует входящего сетевого порта. Изменение уже применённой миграции обнаруживается по несовпадению контрольной суммы.