Files
BitrixDealsBot/docs/adr/007-container-deployment.md

47 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-бот не требует
входящего сетевого порта. Изменение уже применённой миграции обнаруживается по
несовпадению контрольной суммы.