Files
clickstream-data-platform/infra/clickhouse/users.d/access.xml
T
ddadmin fc5244cc67 feat(world): жизненный цикл передан Airflow
- Зачем:
  - Compose должен поднимать инфраструктуру, а Airflow — владеть прикладным миром.
- Что:
  - добавлены даги создания и пересоздания мира с явными состояниями позиции;
  - цели make переведены на REST API Airflow, старые одноразовые службы удалены;
  - добавлена ограниченная учётная запись ClickHouse для прикладного DDL.
- Проверка:
  - `make lint`, `make config-test`, `bash -n scripts/run-dag.sh infra/airflow/init.sh`;
  - `make lint` и `make typecheck` в `generator/`;
  - холодный `make up`, повторный `make up`, `make rebuild-storage` и сценарий оборванной очистки;
  - `make smoke`, `make check-clickhouse`, `make check-services`.
2026-08-21 23:01:11 +03:00

131 lines
6.3 KiB
XML

<clickhouse>
<!--
Пользователи и роли объявлены файлом: повторный подъём стенда не хранит
доступ в томах. Пароли приходят из .env через Compose.
-->
<roles>
<etl_writer>
<grants>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW ON default.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON stg.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON ods.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON dds.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON dm.*</query>
<!-- Зона справочников: etl применяет её DDL и читает словари из преобразований. -->
<query>GRANT SELECT, CREATE TABLE, CREATE DICTIONARY, dictGet, DROP TABLE, CREATE DATABASE ON dic.*</query>
<query>GRANT SELECT ON system.*</query>
<query>GRANT CLUSTER ON *.*</query>
<query>GRANT REMOTE ON *.*</query>
<!--
В 26.3 движки внешних источников требуют права на источник.
Отказ при этом называет не источник, а `TABLE ENGINE ON File`
— и права с таким именем не хватит: замерено, нужен FILE.
-->
<query>GRANT KAFKA ON *.*</query>
<query>GRANT FILE ON *.*</query>
</grants>
</etl_writer>
<!-- Жизненный цикл мира: тот же канонический DDL, но с удалением баз. -->
<lifecycle_owner>
<grants>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE, DROP DATABASE ON stg.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE, DROP DATABASE ON ods.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE, DROP DATABASE ON dds.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE, DROP DATABASE ON dm.*</query>
<query>GRANT SELECT, CREATE TABLE, CREATE DICTIONARY, dictGet, DROP TABLE, DROP DICTIONARY, CREATE DATABASE, DROP DATABASE ON dic.*</query>
<!-- clickhouse-connect читает эту таблицу при подключении. -->
<query>GRANT SELECT ON system.settings</query>
<query>GRANT CLUSTER ON *.*</query>
<query>GRANT REMOTE ON *.*</query>
<query>GRANT KAFKA ON *.*</query>
<query>GRANT FILE ON *.*</query>
</grants>
</lifecycle_owner>
<!-- Оба читателя: clickhouse-connect читает system.settings при подключении. -->
<bi_reader>
<grants>
<query>GRANT SELECT ON dds.*</query>
<query>GRANT SELECT ON dm.*</query>
<query>GRANT SELECT, dictGet ON dic.*</query>
<query>GRANT SELECT ON system.settings</query>
</grants>
</bi_reader>
<analyst_reader>
<grants>
<query>GRANT SELECT ON stg.*</query>
<query>GRANT SELECT ON ods.*</query>
<query>GRANT SELECT ON dds.*</query>
<query>GRANT SELECT ON dm.*</query>
<query>GRANT SELECT, dictGet ON dic.*</query>
<query>GRANT SELECT ON system.settings</query>
</grants>
</analyst_reader>
<monitoring_reader>
<grants>
<query>GRANT SELECT ON stg.*</query>
<query>GRANT SELECT ON ods.*</query>
<query>GRANT SELECT ON dds.*</query>
<query>GRANT SELECT ON dm.*</query>
<query>GRANT SELECT ON dic.*</query>
<query>GRANT SELECT ON system.*</query>
<query>GRANT CLUSTER ON *.*</query>
<query>GRANT REMOTE ON *.*</query>
</grants>
</monitoring_reader>
<!-- Учётка словаря: пароля нет намеренно, см. ADR 0007. -->
<dict_reader>
<grants>
<query>GRANT SELECT ON dic.*</query>
</grants>
</dict_reader>
</roles>
<users>
<default>
<password from_env="CLICKHOUSE_DEFAULT_PASSWORD"/>
</default>
<etl>
<password from_env="CLICKHOUSE_ETL_PASSWORD"/>
<quota>default</quota>
<grants>
<query>GRANT etl_writer</query>
</grants>
</etl>
<lifecycle>
<password from_env="CLICKHOUSE_LIFECYCLE_PASSWORD"/>
<quota>default</quota>
<grants>
<query>GRANT lifecycle_owner</query>
</grants>
</lifecycle>
<bi>
<password from_env="CLICKHOUSE_BI_PASSWORD"/>
<quota>default</quota>
<grants>
<query>GRANT bi_reader</query>
</grants>
</bi>
<analyst>
<password from_env="CLICKHOUSE_ANALYST_PASSWORD"/>
<quota>default</quota>
<grants>
<query>GRANT analyst_reader</query>
</grants>
</analyst>
<grafana>
<password from_env="CLICKHOUSE_GRAFANA_PASSWORD"/>
<quota>default</quota>
<grants>
<query>GRANT monitoring_reader</query>
</grants>
</grafana>
<dict>
<no_password/>
<quota>default</quota>
<grants>
<query>GRANT dict_reader</query>
</grants>
</dict>
</users>
</clickhouse>