Этот документ описывает, как запускать и сопровождать Python скрипт воронок для сайта Testizer.
Основные переменные в файле .env:
-
APP_ENVЗначение:
developmentилиproduction. -
APP_DRY_RUNЗначение:
trueилиfalse.При
APP_DRY_RUN=true:- выполняются только чтения из базы MODX;
- таблица
funnel_entriesне изменяется; - реальные запросы в Brevo не отправляются, пишутся только логи.
При
APP_DRY_RUN=falseвыполняется полный боевой цикл с реальными записями в базу данных и вызовами API Brevo.Режим dry run предназначен для безопасной проверки на продакшн-данных без изменения состояния. Это позволяет операторам проверить логику запросов, выборку данных и ожидаемые операции перед включением реальных записей.
Для боевого режима установить
false. -
APP_LOG_LEVELВозможные значения:
DEBUG,INFO,WARNING,ERROR.Рекомендуемое значение для продакшена:
INFO. -
DB_HOST,DB_PORT,DB_USER,DB_PASSWORD,DB_NAME,DB_CHARSETПараметры подключения к базе данных MODX.
-
BREVO_API_KEYКлюч API из кабинета Brevo.
-
BREVO_BASE_URLБазовый URL API Brevo. По умолчанию
https://api.brevo.com/v3. -
BREVO_LANGUAGE_LIST_IDID списка Brevo для языковых тестов.
-
BREVO_NON_LANGUAGE_LIST_IDID списка Brevo для неязыковых тестов.
Перед включением боевого режима важно проверить, что:
- Подключение к базе данных работает.
- В Brevo существуют корректные списки и их ID записаны в
.env. APP_DRY_RUNвременно установлен вtrueдля тестовых прогонов.
Работа выполняется из корня проекта в активированном виртуальном окружении.
cd C:\Users\user\Desktop\testizer_email_funnels
.\.venv\Scripts\Activate.ps1
python -m app.main
При этом:
- скрипт выбирает кандидатов по языковым и неязыковым тестам;
- отправляет контакты в Brevo (или логирует сообщение dry run, в зависимости от
APP_DRY_RUN); - записывает вход в воронку в таблицу
funnel_entries(или логирует сообщение dry run, в зависимости отAPP_DRY_RUN); - синхронизирует покупки сертификатов с таблицами MODX и обновляет
funnel_entries(или логирует сообщение dry run, в зависимости отAPP_DRY_RUN).
Основная задача использует паттерн outbox для надежной синхронизации с Brevo:
-
Модуль синхронизации воронок и покупок записывает состояние в:
funnel_entries(основная аналитическая таблица)brevo_sync_outbox(таблица outbox для операций Brevo)
-
BrevoSyncWorker забирает задания из
brevo_sync_outboxи применяет их к Brevo, вызывая API Brevo.
Это разделяет запись в базу данных и внешние вызовы API, обеспечивая:
- Атомарность операций с базой данных и создания заданий в outbox в рамках транзакций
- Возможность повторных попыток вызовов API Brevo при сбоях
- Восстановление системы после временных сбоев API Brevo без потери работы
В режиме dry-run:
- Выполняются только запросы на чтение
- Таблицы
funnel_entriesиbrevo_sync_outboxне изменяются - Воркер не запускается
python -m app.report_conversions
или с указанием периода:
python -m app.report_conversions --from-date 2024-01-01 --to-date 2025-01-01
Даты задаются в формате YYYY-MM-DD.
Если --to-date не указана, учитываются записи до текущего момента.
Рекомендуемая последовательность:
-
Оставить
APP_DRY_RUN=true. -
Несколько раз запустить:
python -m app.mainи проверить логи в
logs/app.log, а также логи в Brevo, что запросы формируются корректно. -
Убедиться, что в логах отображается то, что было бы записано в таблицу
funnel_entries, и выглядит все ожидаемо. Примечание: В режиме dry run записи в базу данных фактически не выполняются. -
Изменить в
.env:APP_ENV=production APP_DRY_RUN=false -
Перезапустить задачу вручную и убедиться, что:
- в Brevo появляются реальные контакты в нужных списках;
- таблица
funnel_entriesзаполняется; - отчет
app.report_conversionsвозвращает данные по воронкам.
Этот раздел описывает настройку расписания на Windows для тестового стенда или локального окружения.
-
Открыть "Планировщик заданий" (Task Scheduler).
-
Создать новую задачу:
-
"Создать задачу".
-
Задать имя, например:
Testizer email funnels job.
-
-
Вкладка "Триггеры":
-
"Создать".
-
Выбрать расписание, например "По расписанию" → "Ежечасно" или нужный интервал.
-
Сохранить триггер.
-
-
Вкладка "Действия":
-
"Создать".
-
Действие: "Запуск программы".
-
В поле "Программа или сценарий" указать путь к
powershell.exe, например:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -
В поле "Добавить аргументы" указать:
-ExecutionPolicy Bypass -File "C:\Users\user\Desktop\testizer_email_funnels\run_job.ps1"
-
-
Вкладка "Условия" и "Параметры":
- Настроить по требованиям (можно оставить значения по умолчанию).
-
Сохранить задачу.
Для удобства можно вынести запуск Python в отдельный PowerShell скрипт run_job.ps1 в корне проекта:
$projectPath = "C:\Users\user\Desktop\testizer_email_funnels"
Set-Location $projectPath
.\.venv\Scripts\Activate.ps1
python -m app.main
Именно этот файл указывать в аргументах планировщика.
-
Проверять файл
logs/app.logна наличие ошибок. -
Периодически запускать:
python -m app.report_conversionsчтобы отслеживать эффективность воронок для языковых и неязыковых тестов.