Зачем: модельный день прогонялся только руками, и владельцу нечем было проверять процессы стенда вживую. Пульт нужен раньше этапа 3 и независимо от него: он обкатывает то, что приёму заказов понадобится готовым — вызов генератора из задачи Airflow. Что: `dags/world_control.py` — три дага по ADR 0009. Работники `world_next_day` (день пачкой, «сколько дней» параметром) и `world_live_day` (день в темпе) живут без расписания и без паузы; выключатель `world_live` создаётся на паузе, тикает раз в 25 минут и дёргает работника живого дня с ожиданием конца. Генератор зовётся `DockerOperator` в каноническом контейнере: сокет докера отдан планировщику, потому что при LocalExecutor задачи исполняет он, а GID группы `docker` уехал в `.env` как локальная настройка. Позицию на оси ведёт переменная `world_position` — её ставит сыгравший день работник и только по успеху. Факты стенда — образ, сеть, брокер, топик, размер стартового мира — даги получают окружением от compose; внутри compose они названы по разу якорями, иначе разошлись бы с разовой службой генератора. README получил раздел про пульт с названной вслух платой за сокет. Проверка: `make lint`, `make config-test`, `make smoke` (20/0), `make check-services` (7/0), `make check-clickhouse` (9/9) — зелёные. На чистом стенде: два прогона `world_next_day` подряд двигают позицию на два дня, «дней = 3» — на три, все пять дней доехали в ODS; обрыв контейнера позицию не двигает, повторный запуск играет тот же день с тем же счётом событий. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
40 lines
1.7 KiB
Bash
40 lines
1.7 KiB
Bash
# Имя и внешние порты меняют для второй копии стенда или при конфликте.
|
|
COMPOSE_PROJECT_NAME=clickstream-data-platform
|
|
CLICKHOUSE_01_HTTP_PORT=28123
|
|
CLICKHOUSE_01_TCP_PORT=29000
|
|
CLICKHOUSE_02_HTTP_PORT=28124
|
|
CLICKHOUSE_02_TCP_PORT=29001
|
|
CLICKHOUSE_CLUSTER_SECRET=cluster-26-secret
|
|
CLICKHOUSE_DEFAULT_PASSWORD=default-26-local
|
|
CLICKHOUSE_ETL_PASSWORD=etl-26-writer
|
|
CLICKHOUSE_BI_PASSWORD=bi-26-reader
|
|
CLICKHOUSE_ANALYST_PASSWORD=analyst-26-reader
|
|
KAFKA_EXTERNAL_PORT=29092
|
|
PROMETHEUS_PORT=29090
|
|
GRAFANA_PORT=23000
|
|
AIRFLOW_PORT=28080
|
|
SUPERSET_PORT=28088
|
|
|
|
# GID группы `docker` на этой машине: без него планировщик Airflow не достучится
|
|
# до сокета докера, и пульт мира не поднимет контейнер генератора.
|
|
# Подсмотреть свой — `getent group docker`.
|
|
DOCKER_GID=127
|
|
|
|
# Учётные данные и ключи учебного стенда. Для VPS замените значения образца.
|
|
GRAFANA_ADMIN_USER=admin
|
|
GRAFANA_ADMIN_PASSWORD=admin
|
|
POSTGRES_ADMIN_USER=postgres
|
|
POSTGRES_ADMIN_PASSWORD=postgres-local
|
|
AIRFLOW_METADATA_USER=airflow
|
|
AIRFLOW_METADATA_PASSWORD=airflow-local
|
|
SUPERSET_METADATA_USER=superset
|
|
SUPERSET_METADATA_PASSWORD=superset-local
|
|
AIRFLOW_ADMIN_USER=admin
|
|
AIRFLOW_ADMIN_PASSWORD=airflow
|
|
AIRFLOW_JWT_SECRET=local-only-airflow-jwt-secret-do-not-use
|
|
AIRFLOW_API_SECRET_KEY=local-only-airflow-api-secret-do-not-use
|
|
AIRFLOW_FERNET_KEY=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
SUPERSET_ADMIN_USER=admin
|
|
SUPERSET_ADMIN_PASSWORD=superset
|
|
SUPERSET_SECRET_KEY=local-only-superset-secret-do-not-use-outside-this-stand
|