.PHONY: up down clean ddl data transform logs \ generated-history-analytics generated-history-check generated-history-runtime-check \ startup-history-export startup-history-import startup-history-check \ reload-monitoring recover-monitoring \ superset-init superset-dashboard superset-ui superset-restart \ generator-up generator-down generator-logs generator-restart \ generator-backfill generator-continue generator-reset \ generator-test generator-test-build generator-test-cov \ contract-test config-test test lint COMPOSE ?= docker compose PROFILE ?= ci PYTEST_ARGS ?= -q -p no:cacheprovider PYTHON_CHECK_PATHS := airflow/dags configs generator scripts superset tests BASH_SCRIPTS := $(shell find scripts -type f -name '*.sh' | sort) # ============================================================================ # Основные команды # ============================================================================ up: $(COMPOSE) up -d --build clickhouse kafka kafka-ui postgres-metadata airflow-webserver airflow-scheduler prometheus grafana kafka-exporter statsd-exporter # Остановить и удалить контейнеры/сети текущего проекта down: $(COMPOSE) --profile live-generator down # Полная очистка окружения проекта (включая volumes) clean: $(COMPOSE) --profile live-generator down -v --remove-orphans logs: $(COMPOSE) logs -f --tail=200 $(service) # ============================================================================ # ETL Pipeline # ============================================================================ ddl: bash ./scripts/apply_clickhouse_ddl.sh data: bash ./scripts/load_kafka_data.sh transform: bash ./scripts/run_batch.sh # Чистый аналитический прогон: стартовая история генератора -> STG -> ODS -> DDS -> DM -> Superset generated-history-analytics: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generated_history_analytics.sh # Повторяемая проверка после прогона стартовой истории generated-history-check: PROFILE="$${PROFILE:-$${GEN_LAUNCH_PROFILE:-$(PROFILE)}}" GEN_LAUNCH_PROFILE="$${GEN_LAUNCH_PROFILE:-$${PROFILE:-$(PROFILE)}}" CHECK_LIVE_SEAM="$${CHECK_LIVE_SEAM:-1}" COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_generated_analytics.sh # Быстрый runtime gate issue 17: короткий daily-wave backfill + live seam без Superset UI generated-history-runtime-check: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generated_history_runtime_check.sh # Сгенерировать стартовую историю и сохранить портативный артефакт startup-history-export: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/export_startup_history_artifact.sh # Воспроизвести портативный артефакт стартовой истории в Kafka startup-history-import: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/import_startup_history_artifact.sh # Сверить ClickHouse после импорта с manifest артефакта startup-history-check: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_startup_history_manifest.sh # Перезагрузка конфигурации мониторинга (после изменений в provisioning) reload-monitoring: @echo "=== Перезагрузка сервисов мониторинга ===" $(COMPOSE) up -d prometheus grafana kafka-exporter statsd-exporter $(COMPOSE) restart prometheus statsd-exporter @echo "=== Перезагрузка provisioning Grafana ===" @sleep 2 @curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload && echo " [datasources]" @curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload && echo " [dashboards]" @curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload && echo " [alerting]" @echo "=== Проверка ===" @curl -s http://localhost:9090/api/v1/targets | grep -o '"job":"[^"]*"' | sort | uniq # Восстановление мониторинга после сбоев (например, out of bounds / пустые дашборды) recover-monitoring: @echo "=== Восстановление мониторинга (жесткий режим) ===" $(COMPOSE) rm -sf prometheus statsd-exporter $(COMPOSE) up -d prometheus grafana kafka-exporter statsd-exporter $(COMPOSE) restart airflow-scheduler airflow-webserver @echo "=== Перезагрузка provisioning Grafana ===" @sleep 2 @curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload && echo " [datasources]" @curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload && echo " [dashboards]" @curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload && echo " [alerting]" @echo "=== Проверка targets ===" @curl -s http://localhost:9090/api/v1/targets | grep -o '"job":"[^"]*"' | sort | uniq @curl -s http://localhost:9090/api/v1/targets | grep -o '"health":"[^"]*"' | sort | uniq -c # ============================================================================ # Superset команды # ============================================================================ # Инициализация Superset (подключение к ClickHouse + датасеты) superset-init: $(COMPOSE) up -d postgres-metadata clickhouse $(COMPOSE) up --abort-on-container-exit --exit-code-from superset-init superset-init $(COMPOSE) up -d --no-deps superset # Создание дашборда с чартами superset-dashboard: $(COMPOSE) exec -T superset bash -c "python /app/superset_init/create_dashboard.py" # Открыть Superset UI superset-ui: @echo "Superset доступен по адресу: http://localhost:8088" @echo "Логин: admin / Пароль: admin" # Перезапуск Superset superset-restart: $(COMPOSE) restart superset # ============================================================================ # Генератор событий (автономный стриминг) # ============================================================================ # Запустить только генератор (полезно для отладки) generator-up: $(COMPOSE) up -d --build generator # Остановить генератор generator-down: $(COMPOSE) stop generator # Логи генератора generator-logs: $(COMPOSE) logs -f --tail=100 generator # Перезапуск генератора с пересборкой generator-restart: $(COMPOSE) up -d --build --force-recreate generator # Промотать стартовую историю через профиль запуска generator-backfill: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generator.sh backfill # Продолжить live-поток из существующего state generator-continue: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generator.sh continue # Запустить live-поток как новый мир generator-reset: COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generator.sh reset # Собрать тестовый образ генератора generator-test-build: cd generator && docker build -t generator:test . # Запустить тесты генератора (pytest) generator-test: generator-test-build @echo "=== Запуск тестов генератора ===" docker run --rm -v $(PWD):/workspace -w /workspace/generator generator:test pytest tests/ $(PYTEST_ARGS) # Запустить тесты с покрытием generator-test-cov: generator-test-build @echo "=== Запуск тестов с покрытием ===" docker run --rm -v $(PWD):/workspace -w /workspace/generator generator:test pytest tests/ -v --cov=. --cov-report=term-missing # Запустить контрактные тесты верхнего уровня contract-test: generator-test-build @echo "=== Запуск контрактных тестов репозитория ===" docker run --rm -v $(PWD):/workspace -w /workspace generator:test pytest tests/ $(PYTEST_ARGS) # Проверить конфигурацию compose без запуска сервисов config-test: $(COMPOSE) config --quiet # Быстрый предкоммитный набор: тесты генератора, контракты и конфигурация test: generator-test contract-test config-test # Статические проверки без запуска стенда lint: generator-test-build @echo "=== Проверка синтаксиса Python ===" docker run --rm -e PYTHONPYCACHEPREFIX=/tmp/pycache -v $(PWD):/workspace -w /workspace generator:test python -m compileall -q $(PYTHON_CHECK_PATHS) @echo "=== Проверка синтаксиса Bash ===" bash -n $(BASH_SCRIPTS) @echo "=== Проверка docker compose ===" $(COMPOSE) config --quiet @echo "=== Проверка пробелов в diff ===" git diff --check