47 lines
3.2 KiB
Markdown
47 lines
3.2 KiB
Markdown
# 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-бот не требует
|
||
входящего сетевого порта. Изменение уже применённой миграции обнаруживается по
|
||
несовпадению контрольной суммы.
|