Зачем: README служил складом для двух зон без своих справочников — «службы и доступ» и «мир и его пульт». Раскладка принята резолюцией #211: README остается лицом, устройство живет в docs/architecture/. Что: новые docs/architecture/stand.md («Стенд: службы, доступ, настройка», доводы — ADR 0001 и 0007) и docs/architecture/world.md («Мир и его пульт», доводы — ADR 0009 и 0013). Доводы смоука и описания целей make слиты в testing.md без повторов: фраза о check_containers_survived и абзац про config-test умерли как дубли. На месте каждого переехавшего раздела README — абзац со ссылкой, адреса и пароли интерфейсов остались. Путеводитель и README генератора ссылаются на world.md вместо якорей README. Переехавший текст не правился, только относительные ссылки. Проверка: скрипт ссылок из тикета — пустой вывод; make config-test — ЗЕЛЁНО; подиффовая сверка переехавших диапазонов с README@2588515 — без расхождений (слепое ревью); в новой прозе нет «ё». Closes #212 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014QBCtU38qSHg5DvgtnKXcW
9.5 KiB
Стенд: службы, доступ, настройка
Здесь описано, из каких служб собран стенд, кто к кому подключается и как настройки доходят до контейнеров. Состав каркаса обоснован в ADR 0001, доступ к ClickHouse — в ADR 0007. Адреса и пароли интерфейсов остаются в корневом README.
Службы
clickhouse-01— инициатор DDL и точка подключения Airflow;clickhouse-02— точка подключения Superset;clickhouse-keeper— координатор кластера;kafka— один брокер KRaft;kafka-exporter— экспортёр метрик Kafka для Prometheus;postgres-metadata— один Postgres с отдельными базами и пользователямиairflowиsuperset;airflow-apiserver,airflow-schedulerиairflow-dag-processor— Airflow 3.3 с LocalExecutor, без triggerer;superset— интерфейс и подготовленное подключение ClickHouse;prometheusиgrafana— сбор и просмотр метрик ClickHouse и Kafka.
Пользователи и роли ClickHouse
В ClickHouse семь пользователей и шесть ролей:
etlподключает рабочие даги Airflow; рольetl_writerчитает и пишет слои хранилища;lifecycleприменяет канонический DDL и пересоздаёт прикладные базы; рольlifecycle_ownerне даёт эти административные права рабочим дагам;biподключает Superset; рольbi_readerчитает ODS, DDS, DM и справочникиdic, а запросы Superset обращаются к публичным_v;analystпредназначен для подключения человека и читает все слои и справочники;grafanaс рольюmonitoring_readerподключает Grafana и читает все слои, системные таблицы и данные со всех реплик кластера;dictчитает только базуdicи пароля не имеет: им словарь товаров ходит за своей подложкой;defaultостаётся служебным: им ходят проверки здоровья и скрипты внутри контейнеров, но не приложения.
Почему пользователи объявлены файлом, а ноды доверяют общему секрету, — в
ADR 0007.
Пользователи и роли объявлены в infra/clickhouse/users.d/access.xml. Пароли и
общий секрет нод живут в .env и передаются в конфигурацию через окружение;
Superset получает пароль bi, а Grafana — пароль grafana тем же путём.
Значения для локального стенда есть в .env.example.
Применение настроек
Изменения значений ClickHouse в .env и файлов настройки серверов в
infra/clickhouse/config.d/ и infra/clickhouse/users.d/ применяются
пересозданием нод:
docker compose up --force-recreate --wait clickhouse-01 clickhouse-02
Команда возвращает управление, когда обе ноды снова здоровы; именованные тома
при этом сохраняются. docker compose restart оставит прежнее окружение и
может оставить старую версию отдельно смонтированного файла.
Секреты и порты
Пароли ClickHouse и интерфейсов, пароли Postgres, ключи Airflow и Superset,
отсутствие проверки доступа у Kafka и Prometheus — намеренно простые и явно
ненастоящие настройки локального учебного стенда. Это не пример настройки
защиты: не копируйте значения из .env.example в рабочую среду. Все
опубликованные порты привязаны только к 127.0.0.1; Postgres наружу не
опубликован.
Одна реплика на шард
В бою перед репликами ClickHouse обычно был бы балансировщик. Здесь в каждом шарде одна реплика, поэтому балансировать нечего. Балансировщик и топология 2×2 намеренно не входят в стенд.
Что проверено
Конфигурация сверена 30 июля 2026 года с официальной документацией
ClickHouse:
настройками сервера,
Keeper,
ReplicatedMergeTree,
ON CLUSTER и
Distributed.
Описание кластера задаётся через remote_servers, макросы — через macros,
подключение к keeper — через zookeeper; путь ReplicatedMergeTree содержит
{shard} и {replica}, а Distributed получает имя кластера, базу, локальную
таблицу и ключ шардирования. Макросы выбраны, чтобы один DDL через ON CLUSTER
создавал отдельный путь каждого шарда без вписанных вручную значений. Для
образа зафиксирован точный текущий
LTS-выпуск 26.3.17.56;
серверы и keeper используют один образ. Настройки Kafka 4.3.1 сверены с
примером односерверного KRaft.
Секция метрик взята из конфигурации закреплённого образа ClickHouse и проверена
на серверах и keeper. Подготовка источников Grafana сверена с
официальным описанием автоматической настройки
и документацией плагина ClickHouse.
Prometheus собирает встроенные метрики двух серверов и keeper, а через
kafka-exporter — состояние Kafka. Поверх этого в Grafana поднимается дашборд
«Данные»: свежесть, поток, брак, сходимость Kafka с ClickHouse, отставание
чтения и дневной слепок заказов. Устройство зоны — в справочнике
мониторинга, разбор панелей — в
описании дашборда; правил оповещения
пока нет.
Airflow закреплён на 3.3.0. Состав обязательных процессов, LocalExecutor,
публичный airflow.sdk, API здоровья и SimpleAuthManager сверены с
архитектурой Airflow 3.3,
публичным интерфейсом
и описанием здоровья.
Для ClickHouse установлен официальный провайдер Airflow: SQL-файлы исполняет
общий SQLExecuteQueryOperator, программные запросы идут через
ClickHouseHook. Провайдер работает поверх закреплённого
clickhouse-connect. Официальный провайдер Kafka сам использует
confluent-kafka; отдельное подключение и его обёртки здесь не нужны, поэтому
клиент Kafka добавлен в образ напрямую.
Superset закреплён на 6.1.0; драйвер clickhouse-connect, форма
clickhousedb:// и драйвер Postgres сверены с
документацией подключений Superset
и настройкой базы метаданных.