Этот документ описывает, как собрать и запускать сервис TestizerFunnelEngine в Docker.
Подходит как для локального запуска, так и для сервера.
Перед началом нужны:
- установленный Docker;
- файл
.envв корне проекта с корректными настройками:- доступ к базе MySQL (MODX);
- настройки Brevo (API ключ, базовый адрес, списки);
- параметры приложения (
APP_ENV,APP_DRY_RUNи так далее).
Контейнер использует те же переменные окружения, что и локальный запуск Python.
Из корня проекта:
docker build -t testizer-funnel-engine .После выполнения этой команды у вас будет образ с именем testizer-funnel-engine, в который упакован весь код проекта и зависимости из requirements.txt.
Основная задача сервиса соответствует локальной команде:
python -m app.mainВ Docker это будет выглядеть так:
docker run --rm --env-file .env testizer-funnel-engineЧто важно:
--env-file .envпередает переменные окружения из локального.envвнутрь контейнера;- контейнер внутри будет подключаться к MySQL по параметрам
DB_HOST,DB_PORT,DB_USER,DB_PASSWORD,DB_NAME,DB_CHARSET.
Если база данных и Docker-контейнер находятся на одной машине, возможно, нужно будет изменить DB_HOST. Например:
- вместо
127.0.0.1использоватьhost.docker.internal(зависит от окружения и хостинга).
Сервис умеет работать в двух режимах:
-
APP_DRY_RUN=trueНичего реально не отправляет в Brevo, только делает запросы, пишет логи и может использоваться для проверки логики.
-
APP_DRY_RUN=falseПолноценный боевой режим: контакты уходят в Brevo, записи в воронке и покупки фиксируются по-настоящему.
Примеры:
Запуск в dry run:
docker run --rm --env-file .env -e APP_DRY_RUN=true testizer-funnel-engineЗапуск в боевом режиме:
docker run --rm --env-file .env -e APP_DRY_RUN=false testizer-funnel-engineЕсли переменная APP_DRY_RUN уже указана в .env, можно не пробрасывать её через -e, а управлять режимом прямо в .env.
Есть два базовых варианта.
На сервере можно:
- настроить cron (или планировщик в панели хостинга), который раз в N минут выполняет команду вида:
docker run --rm --env-file /path/to/.env testizer-funnel-engineКаждый такой запуск делает один полный цикл:
- забирает кандидатов из MODX;
- отправляет контакты в Brevo;
- записывает вход в воронку;
- подтягивает покупки и обновляет статус.
Повторные запуски безопасны: логика работы опирается на состояние таблицы funnel_entries и не дублирует данные.
Если в будущем сервис будет запускаться в Kubernetes, Docker Swarm или другой системе оркестрации:
- используется тот же образ
testizer-funnel-engine; - команда запуска внутри контейнера:
python -m app.main; - переменные окружения и расписание задаются на стороне оркестратора.
Для дополнительной проверки можно прогнать тесты прямо в контейнере:
docker run --rm testizer-funnel-engine python -m pytestЭто не обязательный шаг для продакшена, но полезен:
- при отладке;
- при ручной проверке перед выкладкой;
- если на сервере нет локального Python, но есть Docker.
-
Собрать образ:
docker build -t testizer-funnel-engine .
-
Проверить работу в режиме dry run:
docker run --rm --env-file .env -e APP_DRY_RUN=true testizer-funnel-engine
-
После проверки перевести в боевой режим:
docker run --rm --env-file .env -e APP_DRY_RUN=false testizer-funnel-engine
-
Подключить Docker-команду к расписанию на сервере и запускать с нужной периодичностью.