diff --git a/README.md b/README.md index a9e8475..b32e471 100644 --- a/README.md +++ b/README.md @@ -242,16 +242,26 @@ uv run --project generator python -m clickstream_generator batch \ - Prometheus — `http://127.0.0.1:29090`; - Grafana — `http://127.0.0.1:23000`, пользователь `admin`, пароль `admin`. -У локального учебного кластера нет пароля: ноды используют общего пользователя -`default` для запросов `Distributed`. Порты поэтому привязаны к `127.0.0.1` и -не открыты во внешнюю сеть. +В ClickHouse четыре пользователя: -Пароли интерфейсов, пароли Postgres, ключи Airflow и Superset, отсутствие -пароля ClickHouse и отсутствие проверки доступа у Kafka и Prometheus — -намеренно простые и явно ненастоящие настройки локального учебного стенда. Это -не пример настройки защиты: не копируйте значения из `.env.example` в рабочую -среду. Все опубликованные порты привязаны только к `127.0.0.1`; Postgres наружу -не опубликован. +- `etl` применяет DDL и подключает Airflow; роль `etl_writer` читает и пишет + слои хранилища; +- `bi` подключает Superset; роль `bi_reader` читает будущие слои DDS и DM; +- `analyst` предназначен для подключения человека и читает все слои; +- `default` остаётся служебным: им ходят проверки здоровья и скрипты внутри + контейнеров, но не приложения. + +Пользователи и роли объявлены в `infra/clickhouse/users.d/access.xml`. Пароли +и общий секрет нод живут в `.env` и передаются в конфигурацию через окружение; +Superset получает пароль `bi` тем же путём через штатную функцию настройки. +Значения для локального стенда есть в `.env.example`. + +Пароли ClickHouse и интерфейсов, пароли Postgres, ключи Airflow и Superset, +отсутствие проверки доступа у Kafka и Prometheus — намеренно простые и явно +ненастоящие настройки локального учебного стенда. Это не пример настройки +защиты: не копируйте значения из `.env.example` в рабочую среду. Все +опубликованные порты привязаны только к `127.0.0.1`; Postgres наружу не +опубликован. В бою перед репликами ClickHouse обычно был бы балансировщик. Здесь в каждом шарде одна реплика, поэтому балансировать нечего. Балансировщик и топология diff --git a/compose.yaml b/compose.yaml index 1f4ff61..10e79f2 100644 --- a/compose.yaml +++ b/compose.yaml @@ -9,7 +9,7 @@ x-clickhouse-common: &clickhouse-common image: clickhouse/clickhouse-server:26.3.17.56 restart: unless-stopped environment: - # Стенд локальный: нодам нужен общий пользователь без пароля для Distributed. + # Пользователей объявляет access.xml; настройка учётки образом не нужна. CLICKHOUSE_SKIP_USER_SETUP: "1" CLICKHOUSE_CLUSTER_SECRET: ${CLICKHOUSE_CLUSTER_SECRET:?Скопируйте .env.example в .env} CLICKHOUSE_DEFAULT_PASSWORD: ${CLICKHOUSE_DEFAULT_PASSWORD:?Скопируйте .env.example в .env} @@ -116,7 +116,7 @@ services: retries: 30 start_period: 10s - # Инициатор DDL и будущее подключение Airflow. + # Инициатор DDL и точка подключения Airflow. clickhouse-01: <<: *clickhouse-common hostname: clickhouse-01 @@ -130,7 +130,7 @@ services: - ./infra/clickhouse/users.d/access.xml:/etc/clickhouse-server/users.d/access.xml:ro - clickhouse_01_data:/var/lib/clickhouse - # Будущее подключение Superset. + # Точка подключения Superset. clickhouse-02: <<: *clickhouse-common hostname: clickhouse-02 diff --git a/dags/test_clickhouse.py b/dags/test_clickhouse.py index 8fb4f61..ab05aa9 100644 --- a/dags/test_clickhouse.py +++ b/dags/test_clickhouse.py @@ -29,12 +29,10 @@ EXPECTED_TABLES = [ (LOCAL_TABLE, "ReplicatedMergeTree"), ] -# Ноду 2 пробник читает не своим подключением, а запросом remote() с ноды 1: у -# Airflow подготовлено одно подключение — к clickhouse-01, и второго ради -# пробника не заводят. При этом remote('clickhouse-02:9000', ...) делает -# инициатором распределённого запроса саму ноду 2 — проверяется именно это, а -# не доступность ноды 2 по сети. Порт 9000 — межсерверный, тогда как -# подключение Airflow ходит по HTTP на 8123. +# У Airflow одно подключение — к ноде 1; второго ради пробника не заводят. +# Ноду 2 он читает через remote(), который не использует секрет из описания +# кластера, поэтому учётные данные etl передаются явно. Порт 9000 — нативный, +# тогда как подключение Airflow ходит по HTTP на 8123. NODES = ( ("ноде 1", "system.tables"), ( diff --git a/docs/specs/2026-07-30-stand-v2-realism.md b/docs/specs/2026-07-30-stand-v2-realism.md index 4546e80..cf79609 100644 --- a/docs/specs/2026-07-30-stand-v2-realism.md +++ b/docs/specs/2026-07-30-stand-v2-realism.md @@ -576,6 +576,8 @@ v2 стартует пустым, поэтому объём ниже — это стенд работает, но учебного пути на нём ещё нет. - Инкрементальный ETL (#8) — свой issue. - Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд. +- TLS между нодами, настоящее хранилище и ротация секретов, внешние учётные + записи, квоты, политики строк и аудит запросов — за границей учебного стенда. - Полный словарь торговых событий Метрики (detail, remove, impressions), пять уровней категорий, блоки `purchasedProduct*`/`impressions*`. - Механика `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток