feat(infra): стенд целиком — Kafka, Airflow 3, Superset и мониторинг одной командой
Зачем: рядом с кластером ClickHouse не хватало остальной платформы, а поднимать её по кускам — значит каждый раз вспоминать порядок. Теперь `make up` даёт стенд целиком, а `make smoke` честно отвечает, работает он или нет. Что: - Kafka в режиме KRaft (без ZooKeeper), Postgres под метаданные, Airflow 3.3 четырьмя сервисами и Superset 6.1 с драйверами ClickHouse; - мониторинг: Prometheus снимает метрики с обеих нод ClickHouse и keeper, Grafana получает подготовленный источник данных; - подключение Airflow ведёт на ноду 1, подключение Superset — на ноду 2: ловушка правильных ошибок, забытый `ON CLUSTER` виден в дашборде сам; - `scripts/stand-smoke.sh` — сквозная проверка из 24 пунктов: топик в Kafka, цели Prometheus, запуск примера DAG через API Airflow, проверка подключения Superset и расход памяти против порога 3,4 ГБ; - `make config-test` — статические ворота: Compose, синтаксис Bash и Python, стражи README; стражи smoke проверяют, что отчёт краснеет на сломанном стенде и зеленеет после восстановления; - решения записаны в `docs/adr/0001-stand-services.md`, состав стенда и порядок работы — в README. Проверка: на чистых томах `make clean` → `cp .env.example .env` → `make up` (1 мин 51 с) → `make smoke` — 24 пройдено, 0 ошибок, 2171 MiB. Перезапуск `make down` → `make up` → `make smoke` — 24/0. Также зелены `make config-test` (3/0 и 5/0), `make smoke-cluster` (8/8) и `make smoke-guards` (3/0 и 3/0). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
readonly ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
read -r -a COMPOSE_CMD <<<"${COMPOSE_BIN:-docker compose}"
|
||||
readonly CACHE_DIR="$(mktemp -d)"
|
||||
readonly SHELL_FILES_LIST="$CACHE_DIR/shell-files"
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$CACHE_DIR"
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
"${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" config --quiet
|
||||
config_json="$("${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" config --format json)"
|
||||
grep -qx 'ARG SUPERSET_BASE_IMAGE' "$ROOT_DIR/infra/superset/Dockerfile"
|
||||
jq -e '
|
||||
.services.superset.image == "clickstream-superset:local" and
|
||||
(.services.superset.build.args.SUPERSET_BASE_IMAGE | length > 0)
|
||||
' >/dev/null <<<"$config_json"
|
||||
jq -e '
|
||||
.services["airflow-init"] as $service |
|
||||
($service.environment.AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_PASSWORDS_FILE ==
|
||||
"/opt/airflow/auth/simple_auth_manager_passwords.json") and
|
||||
any($service.volumes[]; .source == "airflow_auth" and .target == "/opt/airflow/auth") and
|
||||
any($service.volumes[]; .source == "airflow_logs" and .target == "/opt/airflow/logs")
|
||||
' >/dev/null <<<"$config_json"
|
||||
if ! find "$ROOT_DIR" \
|
||||
-path "$ROOT_DIR/.git" -prune -o \
|
||||
-type f -name '*.sh' -print0 >"$SHELL_FILES_LIST"; then
|
||||
printf 'ОШИБКА: не удалось получить список файлов Bash для проверки.\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
mapfile -d '' -t shell_files <"$SHELL_FILES_LIST"
|
||||
if [[ "${#shell_files[@]}" -eq 0 ]]; then
|
||||
printf 'ОШИБКА: не найдено ни одного файла Bash для проверки.\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
bash -n "${shell_files[@]}"
|
||||
PYTHONPYCACHEPREFIX="$CACHE_DIR" uv run --no-project python -m compileall -q "$ROOT_DIR/dags"
|
||||
git -C "$ROOT_DIR" diff --check
|
||||
|
||||
printf 'ЗЕЛЁНО: Compose, Bash, Python и пробельные ошибки diff проверены.\n'
|
||||
Reference in New Issue
Block a user