Рядом с кластером ClickHouse не хватало остального стенда, а поднимать его по кускам — значит каждый раз вспоминать порядок. Теперь make up даёт стенд целиком, а make smoke честно отвечает, работает он или нет.
Что
Kafka в режиме KRaft (без ZooKeeper), Postgres под метаданные, Airflow 3.3 четырьмя сервисами (api-server, планировщик, обработчик DAG, разовая инициализация) и Superset 6.1 с драйверами ClickHouse и Postgres.
Мониторинг: Prometheus снимает метрики с обеих нод ClickHouse и keeper, Grafana получает подготовленный источник данных.
Подключение Airflow ведёт на ноду 1, подключение Superset — на ноду 2. Это осознанная ловушка правильных ошибок: забытый ON CLUSTER проявится в дашборде сам.
scripts/stand-smoke.sh — сквозная проверка из 24 пунктов. Не «контейнер запущен»: временный топик в Kafka создаётся, находится и удаляется; Prometheus видит ровно три цели ClickHouse со значением up=1; Airflow пускает по учётным данным и реально запускает пример DAG через API; Superset своим test-db проверяет подключение, вынутое из собственных метаданных; расход памяти сверяется с порогом 3,4 ГБ.
make config-test — статические ворота: Compose, синтаксис Bash и Python, стражи README. Стражи smoke проверяют, что отчёт краснеет на сломанном стенде и снова зеленеет после восстановления.
Решения записаны в docs/adr/0001-stand-services.md, состав стенда и порядок работы — в README.md.
Проверка
На чистых томах: make clean → cp .env.example .env → make up (1 мин 51 с) → make smoke — 24 пройдено, 0 ошибок, 2171 MiB.
Перезапуск: make down → make up (1 мин 43 с) → make smoke — 24/0.
Также зелены make config-test (3/0 и 5/0, в том числе под окружением без ripgrep), make smoke-cluster (8/8) и make smoke-guards (3/0 и 3/0).
На что смотреть при ревью
Ловушка нод: compose.yaml — подключения Airflow и Superset смотрят в разные ноды намеренно.
Честность проверок: scripts/stand-smoke.sh ничего не чинит по дороге — проверка источника данных Grafana читает файл настройки и не перезагружает его, иначе она заверяла бы то, что сама только что починила.
infra/airflow/init.sh — разовая инициализация работает от root ровно затем, чтобы отдать свежий том airflow_auth пользователю airflow, и сразу сбрасывает права через runuser; все монтирования репозитория в этот контейнер — только на чтение. Обоснование в ADR.
Закрывает #13.
## Зачем
Рядом с кластером ClickHouse не хватало остального стенда, а поднимать его по кускам — значит каждый раз вспоминать порядок. Теперь `make up` даёт стенд целиком, а `make smoke` честно отвечает, работает он или нет.
## Что
- Kafka в режиме KRaft (без ZooKeeper), Postgres под метаданные, Airflow 3.3 четырьмя сервисами (api-server, планировщик, обработчик DAG, разовая инициализация) и Superset 6.1 с драйверами ClickHouse и Postgres.
- Мониторинг: Prometheus снимает метрики с обеих нод ClickHouse и keeper, Grafana получает подготовленный источник данных.
- Подключение Airflow ведёт на ноду 1, подключение Superset — на ноду 2. Это осознанная ловушка правильных ошибок: забытый `ON CLUSTER` проявится в дашборде сам.
- `scripts/stand-smoke.sh` — сквозная проверка из 24 пунктов. Не «контейнер запущен»: временный топик в Kafka создаётся, находится и удаляется; Prometheus видит ровно три цели ClickHouse со значением `up=1`; Airflow пускает по учётным данным и реально запускает пример DAG через API; Superset своим `test-db` проверяет подключение, вынутое из собственных метаданных; расход памяти сверяется с порогом 3,4 ГБ.
- `make config-test` — статические ворота: Compose, синтаксис Bash и Python, стражи README. Стражи smoke проверяют, что отчёт краснеет на сломанном стенде и снова зеленеет после восстановления.
- Решения записаны в `docs/adr/0001-stand-services.md`, состав стенда и порядок работы — в `README.md`.
## Проверка
На чистых томах: `make clean` → `cp .env.example .env` → `make up` (1 мин 51 с) → `make smoke` — 24 пройдено, 0 ошибок, 2171 MiB.
Перезапуск: `make down` → `make up` (1 мин 43 с) → `make smoke` — 24/0.
Также зелены `make config-test` (3/0 и 5/0, в том числе под окружением без ripgrep), `make smoke-cluster` (8/8) и `make smoke-guards` (3/0 и 3/0).
## На что смотреть при ревью
- Ловушка нод: `compose.yaml` — подключения Airflow и Superset смотрят в разные ноды намеренно.
- Честность проверок: `scripts/stand-smoke.sh` ничего не чинит по дороге — проверка источника данных Grafana читает файл настройки и не перезагружает его, иначе она заверяла бы то, что сама только что починила.
- `infra/airflow/init.sh` — разовая инициализация работает от root ровно затем, чтобы отдать свежий том `airflow_auth` пользователю `airflow`, и сразу сбрасывает права через `runuser`; все монтирования репозитория в этот контейнер — только на чтение. Обоснование в ADR.
Зачем: рядом с кластером 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>
ddmitry
merged commit 6c10f48c17 into main2026-07-31 09:35:49 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Закрывает #13.
Зачем
Рядом с кластером ClickHouse не хватало остального стенда, а поднимать его по кускам — значит каждый раз вспоминать порядок. Теперь
make upдаёт стенд целиком, аmake smokeчестно отвечает, работает он или нет.Что
ON CLUSTERпроявится в дашборде сам.scripts/stand-smoke.sh— сквозная проверка из 24 пунктов. Не «контейнер запущен»: временный топик в Kafka создаётся, находится и удаляется; Prometheus видит ровно три цели ClickHouse со значениемup=1; Airflow пускает по учётным данным и реально запускает пример DAG через API; Superset своимtest-dbпроверяет подключение, вынутое из собственных метаданных; расход памяти сверяется с порогом 3,4 ГБ.make config-test— статические ворота: Compose, синтаксис Bash и Python, стражи README. Стражи smoke проверяют, что отчёт краснеет на сломанном стенде и снова зеленеет после восстановления.docs/adr/0001-stand-services.md, состав стенда и порядок работы — вREADME.md.Проверка
На чистых томах:
make clean→cp .env.example .env→make up(1 мин 51 с) →make smoke— 24 пройдено, 0 ошибок, 2171 MiB.Перезапуск:
make down→make up(1 мин 43 с) →make smoke— 24/0.Также зелены
make config-test(3/0 и 5/0, в том числе под окружением без ripgrep),make smoke-cluster(8/8) иmake smoke-guards(3/0 и 3/0).На что смотреть при ревью
compose.yaml— подключения Airflow и Superset смотрят в разные ноды намеренно.scripts/stand-smoke.shничего не чинит по дороге — проверка источника данных Grafana читает файл настройки и не перезагружает его, иначе она заверяла бы то, что сама только что починила.infra/airflow/init.sh— разовая инициализация работает от root ровно затем, чтобы отдать свежий томairflow_authпользователюairflow, и сразу сбрасывает права черезrunuser; все монтирования репозитория в этот контейнер — только на чтение. Обоснование в ADR.