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:
@@ -0,0 +1,12 @@
|
||||
ARG SUPERSET_BASE_IMAGE
|
||||
FROM ${SUPERSET_BASE_IMAGE}
|
||||
|
||||
USER root
|
||||
|
||||
# В основном образе нет ни драйвера ClickHouse, ни драйвера Postgres.
|
||||
RUN . /app/.venv/bin/activate \
|
||||
&& uv pip install --no-cache \
|
||||
"clickhouse-connect==1.6.0" \
|
||||
"psycopg2-binary==2.9.12"
|
||||
|
||||
USER superset
|
||||
@@ -0,0 +1,14 @@
|
||||
database_name: ClickHouse
|
||||
sqlalchemy_uri: clickhousedb://default@clickhouse-02:8123/default
|
||||
uuid: 4b8f2c6e-1d3a-4f5b-9c7d-2e8a1f0b3c5d
|
||||
cache_timeout: null
|
||||
expose_in_sqllab: true
|
||||
allow_run_async: false
|
||||
allow_ctas: false
|
||||
allow_cvas: false
|
||||
allow_dml: false
|
||||
allow_file_upload: false
|
||||
impersonate_user: false
|
||||
extra:
|
||||
allows_virtual_table_explore: true
|
||||
version: 1.0.0
|
||||
@@ -0,0 +1,3 @@
|
||||
version: 1.0.0
|
||||
type: Database
|
||||
timestamp: '2026-07-30T00:00:00+00:00'
|
||||
Executable
+31
@@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
superset db upgrade
|
||||
if python - <<'PY'
|
||||
import os
|
||||
|
||||
from sqlalchemy import create_engine, text
|
||||
|
||||
engine = create_engine(os.environ["SUPERSET__SQLALCHEMY_DATABASE_URI"])
|
||||
with engine.connect() as connection:
|
||||
exists = connection.scalar(
|
||||
text("SELECT EXISTS (SELECT 1 FROM ab_user WHERE username = :username)"),
|
||||
{"username": os.environ["SUPERSET_ADMIN_USER"]},
|
||||
)
|
||||
raise SystemExit(0 if exists else 1)
|
||||
PY
|
||||
then
|
||||
superset fab reset-password \
|
||||
--username "$SUPERSET_ADMIN_USER" \
|
||||
--password "$SUPERSET_ADMIN_PASSWORD"
|
||||
else
|
||||
superset fab create-admin \
|
||||
--username "$SUPERSET_ADMIN_USER" \
|
||||
--password "$SUPERSET_ADMIN_PASSWORD" \
|
||||
--firstname Superset \
|
||||
--lastname Admin \
|
||||
--email admin@example.invalid
|
||||
fi
|
||||
superset init
|
||||
superset import-directory /app/import --overwrite
|
||||
@@ -0,0 +1,17 @@
|
||||
"""Минимальные настройки локального учебного Superset."""
|
||||
|
||||
import os
|
||||
|
||||
SQLALCHEMY_DATABASE_URI = os.environ["SUPERSET__SQLALCHEMY_DATABASE_URI"]
|
||||
SECRET_KEY = os.environ["SUPERSET_SECRET_KEY"]
|
||||
|
||||
SESSION_COOKIE_NAME = "superset_session"
|
||||
SESSION_COOKIE_SECURE = False
|
||||
SESSION_COOKIE_HTTPONLY = True
|
||||
SESSION_COOKIE_SAMESITE = "Lax"
|
||||
|
||||
WTF_CSRF_ENABLED = True
|
||||
CACHE_CONFIG = {
|
||||
"CACHE_TYPE": "SimpleCache",
|
||||
"CACHE_DEFAULT_TIMEOUT": 300,
|
||||
}
|
||||
Reference in New Issue
Block a user