docs(clickhouse): описана учебная модель доступа

- Зачем:
  - читателю нужна честная граница между учебными ролями и боевой защитой.
- Что:
  - README описывает пользователей, роли и место хранения паролей.
  - мастер-спека явно откладывает эксплуатационные меры защиты.
  - устаревшие комментарии Compose и пробника приведены к реализации.
- Проверка:
  - make config-test, make lint.
This commit is contained in:
2026-08-13 10:26:35 +03:00
parent 780b2d0ef9
commit 5627f6c7aa
4 changed files with 28 additions and 18 deletions
+19 -9
View File
@@ -242,16 +242,26 @@ uv run --project generator python -m clickstream_generator batch \
- Prometheus — `http://127.0.0.1:29090`; - Prometheus — `http://127.0.0.1:29090`;
- Grafana — `http://127.0.0.1:23000`, пользователь `admin`, пароль `admin`. - Grafana — `http://127.0.0.1:23000`, пользователь `admin`, пароль `admin`.
У локального учебного кластера нет пароля: ноды используют общего пользователя В ClickHouse четыре пользователя:
`default` для запросов `Distributed`. Порты поэтому привязаны к `127.0.0.1` и
не открыты во внешнюю сеть.
Пароли интерфейсов, пароли Postgres, ключи Airflow и Superset, отсутствие - `etl` применяет DDL и подключает Airflow; роль `etl_writer` читает и пишет
пароля ClickHouse и отсутствие проверки доступа у Kafka и Prometheus — слои хранилища;
намеренно простые и явно ненастоящие настройки локального учебного стенда. Это - `bi` подключает Superset; роль `bi_reader` читает будущие слои DDS и DM;
не пример настройки защиты: не копируйте значения из `.env.example` в рабочую - `analyst` предназначен для подключения человека и читает все слои;
среду. Все опубликованные порты привязаны только к `127.0.0.1`; Postgres наружу - `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 обычно был бы балансировщик. Здесь в каждом В бою перед репликами ClickHouse обычно был бы балансировщик. Здесь в каждом
шарде одна реплика, поэтому балансировать нечего. Балансировщик и топология шарде одна реплика, поэтому балансировать нечего. Балансировщик и топология
+3 -3
View File
@@ -9,7 +9,7 @@ x-clickhouse-common: &clickhouse-common
image: clickhouse/clickhouse-server:26.3.17.56 image: clickhouse/clickhouse-server:26.3.17.56
restart: unless-stopped restart: unless-stopped
environment: environment:
# Стенд локальный: нодам нужен общий пользователь без пароля для Distributed. # Пользователей объявляет access.xml; настройка учётки образом не нужна.
CLICKHOUSE_SKIP_USER_SETUP: "1" CLICKHOUSE_SKIP_USER_SETUP: "1"
CLICKHOUSE_CLUSTER_SECRET: ${CLICKHOUSE_CLUSTER_SECRET:?Скопируйте .env.example в .env} CLICKHOUSE_CLUSTER_SECRET: ${CLICKHOUSE_CLUSTER_SECRET:?Скопируйте .env.example в .env}
CLICKHOUSE_DEFAULT_PASSWORD: ${CLICKHOUSE_DEFAULT_PASSWORD:?Скопируйте .env.example в .env} CLICKHOUSE_DEFAULT_PASSWORD: ${CLICKHOUSE_DEFAULT_PASSWORD:?Скопируйте .env.example в .env}
@@ -116,7 +116,7 @@ services:
retries: 30 retries: 30
start_period: 10s start_period: 10s
# Инициатор DDL и будущее подключение Airflow. # Инициатор DDL и точка подключения Airflow.
clickhouse-01: clickhouse-01:
<<: *clickhouse-common <<: *clickhouse-common
hostname: clickhouse-01 hostname: clickhouse-01
@@ -130,7 +130,7 @@ services:
- ./infra/clickhouse/users.d/access.xml:/etc/clickhouse-server/users.d/access.xml:ro - ./infra/clickhouse/users.d/access.xml:/etc/clickhouse-server/users.d/access.xml:ro
- clickhouse_01_data:/var/lib/clickhouse - clickhouse_01_data:/var/lib/clickhouse
# Будущее подключение Superset. # Точка подключения Superset.
clickhouse-02: clickhouse-02:
<<: *clickhouse-common <<: *clickhouse-common
hostname: clickhouse-02 hostname: clickhouse-02
+4 -6
View File
@@ -29,12 +29,10 @@ EXPECTED_TABLES = [
(LOCAL_TABLE, "ReplicatedMergeTree"), (LOCAL_TABLE, "ReplicatedMergeTree"),
] ]
# Ноду 2 пробник читает не своим подключением, а запросом remote() с ноды 1: у # У Airflow одно подключение — к ноде 1; второго ради пробника не заводят.
# Airflow подготовлено одно подключение — к clickhouse-01, и второго ради # Ноду 2 он читает через remote(), который не использует секрет из описания
# пробника не заводят. При этом remote('clickhouse-02:9000', ...) делает # кластера, поэтому учётные данные etl передаются явно. Порт 9000 — нативный,
# инициатором распределённого запроса саму ноду 2 — проверяется именно это, а # тогда как подключение Airflow ходит по HTTP на 8123.
# не доступность ноды 2 по сети. Порт 9000 — межсерверный, тогда как
# подключение Airflow ходит по HTTP на 8123.
NODES = ( NODES = (
("ноде 1", "system.tables"), ("ноде 1", "system.tables"),
( (
@@ -576,6 +576,8 @@ v2 стартует пустым, поэтому объём ниже — это
стенд работает, но учебного пути на нём ещё нет. стенд работает, но учебного пути на нём ещё нет.
- Инкрементальный ETL (#8) — свой issue. - Инкрементальный ETL (#8) — свой issue.
- Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд. - Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд.
- TLS между нодами, настоящее хранилище и ротация секретов, внешние учётные
записи, квоты, политики строк и аудит запросов — за границей учебного стенда.
- Полный словарь торговых событий Метрики (detail, remove, impressions), - Полный словарь торговых событий Метрики (detail, remove, impressions),
пять уровней категорий, блоки `purchasedProduct*`/`impressions*`. пять уровней категорий, блоки `purchasedProduct*`/`impressions*`.
- Механика `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток - Механика `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток