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
+52
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
readonly ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
readonly FIXTURE_DIR="$(mktemp -d)"
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$FIXTURE_DIR"
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
mkdir -p "$FIXTURE_DIR/bin" "$FIXTURE_DIR/scripts"
|
||||
cp "$ROOT_DIR/scripts/stand-smoke.sh" "$FIXTURE_DIR/scripts/stand-smoke.sh"
|
||||
cp "$(type -P false)" "$FIXTURE_DIR/bin/docker"
|
||||
|
||||
set +e
|
||||
output="$(PATH="$FIXTURE_DIR/bin:$PATH" COMPOSE_BIN=false \
|
||||
"$FIXTURE_DIR/scripts/stand-smoke.sh" 2>&1)"
|
||||
status=$?
|
||||
set -e
|
||||
|
||||
error_message_status=0
|
||||
grep -q 'ОШИБКА: compose.yaml или .env.example недоступны для чтения' \
|
||||
<<<"$output" || error_message_status=$?
|
||||
green_message_status=0
|
||||
grep -q 'ЗЕЛЁНО: .env.example совпадает' <<<"$output" || green_message_status=$?
|
||||
if [[ "$status" -ne 0 ]] && \
|
||||
[[ "$error_message_status" -eq 0 ]] && \
|
||||
[[ "$green_message_status" -eq 1 ]]; then
|
||||
printf 'ЗЕЛЁНО: недоступные compose.yaml и .env.example не проходят статическую проверку.\n'
|
||||
else
|
||||
printf 'ОШИБКА: статическая проверка приняла недоступные файлы.\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cp "$ROOT_DIR/compose.yaml" "$ROOT_DIR/.env.example" "$FIXTURE_DIR/"
|
||||
set +e
|
||||
timeout 3s env LC_ALL=ru_RU.UTF-8 PATH="$FIXTURE_DIR/bin:$PATH" COMPOSE_BIN=false \
|
||||
"$FIXTURE_DIR/scripts/stand-smoke.sh" >/dev/null 2>&1
|
||||
status=$?
|
||||
set -e
|
||||
if [[ "$status" -ne 124 ]]; then
|
||||
printf 'ЗЕЛЁНО: статическая проверка укладывается в три секунды при русской локали.\n'
|
||||
else
|
||||
printf 'ОШИБКА: статическая проверка превысила три секунды при русской локали.\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
grep -Eq '^ # .*подстановки Compose.*\$\$' "$ROOT_DIR/scripts/stand-smoke.sh"
|
||||
printf 'ЗЕЛЁНО: сложный разбор подстановок Compose пояснён рядом с кодом.\n'
|
||||
|
||||
printf 'ИТОГ: пройдено 3, ошибок 0\n'
|
||||
Reference in New Issue
Block a user