Подготовка инфраструктуры¶
Требования к сторонним компонентам¶
Для работы продукта VK People Hub необходимы следующие элементы инфраструктуры.
База данных PostgreSQL¶
- Необходимая версия: =>12
- Рекомендуемый helm chart: chart.people-hub.ru/postgresql версия 13.2.26
- Helm chart источник: oci://registry-1.docker.io/bitnamicharts/postgresql версия 13.2.26
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
- Необходимые настройки:
- Для каждого сервиса необходима отдельная БД. Имя БД выставляется в переменных окружения PG_DB.
- Для БД (filestorage,profile,groups,polls) необходимо установить extention pg_trgm, btree_gin.
- В настройках выставить max_connections=1000.
- Сервисы соединяются с БД через pgbounce.
Pgbouncer¶
- Необходимая версия: =>1.20.1
- Рекомендуемый helm chart: chart.people-hub.ru/pgbouncer вервия 3.31.3
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
- Необходимые настройки:
- Настройка доступа для всех БД.
Kafka¶
- Необходимая версия: =>7.0.1
- Рекомендуемый helm chart: oci://registry-1.docker.io/bitnamicharts/kafka версия 25.1.4
- Helm chart источник: oci://registry-1.docker.io/bitnamicharts/kafka версия 25.1.4
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
- Необходимые настройки:
- Настройка подключения клиентов к брокеру через переменную KAFKA_BROKER.
- Настроить listeners:
- client: containerPort: 9092 protocol: PLAINTEXT name: CLIENT sslClientAuth: ""
- controller: name: CONTROLLER containerPort: 9093 protocol: PLAINTEXT sslClientAuth: ""
Minio¶
- Необходимая версия: =>2023.10.24
- Рекомендуемый helm chart: oci://registry-1.docker.io/bitnamicharts/minio версия 12.8.12
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
- Helm chart источник: oci://registry-1.docker.io/bitnamicharts/minio версия 12.8.12
- Необходимые настройки:
- Конфигурация по умолчанию, в переменных настраивается MINIO_ACCESS_KEY и MINIO_SECRET_KEY. Необходимо одно объектное хранилище, которое настраивается через переменную AWS_STORAGE_BUCKET_NAME. При использовании внешнего s3 хранилища нужно изменить AWS_S3_ENDPOINT_URL. На данный момент, для работы портала объектное хранилище должно иметь права доступа public и проксирование запросов с пути /media и /media-fs
Keycloak¶
- Необходимая версия: 22.0.1
- Рекомендуемый helm chart: oci://registry-1.docker.io/bitnamicharts/keycloak версия 16.1.1
- Helm chart источник: oci://registry-1.docker.io/bitnamicharts/keycloak версия 16.1.1
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке: https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
- Необходимые настройки:
- Создать Realm (ph)
- Создать клиента с настройками по умолчанию, добавить в Valid redirect URIs * и Web origins *
- В клиенте добавить роль superuser
- Добавить Client scopes - ph, добавить mappers
- имя - aud Mapper type - Audience Included Client Audience - ph-client Add to ID token - on Add to access token - on
- имя - client roles Mapper type - User Client Role Add to ID token - on Add to access token - on
- Добавить Client scope в клиента
- Добавить пользователя в Realm с правами администратора ph-admin, создать ему пароль и добавить следующие роли:
- realm-management: manage-users;
- realm-management: view-authorization;
- realm-management: view-events;
- realm-management: realm-admin;
- realm-management: query-clients;
- realm-management: query-realms;
- realm-management: view-clients;
- realm-management: view-users;
- realm-management: impersonation;
- realm-management: manage-identity-providers;
- realm-management: manage-events;
- realm-management: view-realm;
- realm-management: manage-authorization;
- realm-management: manage-clients;
- realm-management: query-groups;
- realm-management: view-identity-providers;
- realm-management: create-client;
- realm-management: manage-realm;
- realm-management: query-users.
Redis¶
- Необходимая версия: 5.0.7
- Рекомендуемый helm chart: chart.people-hub.ru/redis:3.37.2
- Helm chart источник: oci://registry-1.docker.io/bitnamicharts/redis версия 3.37.2
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
- Необходимые настройки:
- БД необходима для следующих сервисов: adaptation, blogs, calendar, cms, comments, dictionaries, discovery, events, filestorage, gamification, groups, news, polls, profile, reports, tasks.
ClickHouse¶
- Необходимая версия: 22.0.1
- Рекомендуемый helm chart: chart.people-hub.ru/keycloak:16.1.1
- Helm chart источник: oci://registry-1.docker.io/bitnamicharts/clickhouse версия 16.1.1
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
Airflow¶
- Необходимая версия: 2.7.2
- Рекомендуемый helm chart: chart.people-hub.ru/redis:1.11.0
- Helm chart источник
chart
helm repo add apache-airflow https://airflow.apache.org helm pull airflow apache-airflow/airflow --version 1.11.0
- Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
Установка и настройка сторонних компонентов¶
-
Вариант установки можно найти в архиве https://raw.people-hub.ru/infra/scripts.tar.gz install.txt
-
Создать базы данных PostgreSQL для сервисов. Для создания БД можно использовать скрипт, передав ему как аргумент файл со списком БД, пользователей и паролей.
-
Скрипт для создания БД (PostgreSQL)
create_db.sh
- Пример файла со списком БД (PostgreSQL)#!/bin/bash DB_LIST=$1 export PGPASSWORD=$POSTGRES_PASSWORD if [ -f $DB_LIST ]; then IFS=$'\n' read -d '' -r -a DATABASES < $DB_LIST; unset IFS for DB_ENTRY in "${DATABASES[@]}" do IFS=' ' read -r DB_NAME DB_USER DB_PASS <<< $DB_ENTRY # Create database echo "SELECT 'CREATE DATABASE $DB_NAME' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DB_NAME')\gexec" | \ psql \ -h $POSTGRES_HOST \ -p $POSTGRES_PORT \ -U $POSTGRES_USER \ -d $POSTGRES_DB # Create role psql \ -h $POSTGRES_HOST \ -p $POSTGRES_PORT \ -U $POSTGRES_USER \ -d $POSTGRES_DB \ -c "CREATE ROLE $DB_USER WITH SUPERUSER PASSWORD '$DB_PASS'" # Grant privileges psql \ -h $POSTGRES_HOST \ -p $POSTGRES_PORT \ -U $POSTGRES_USER \ -d $POSTGRES_DB \ -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME to $DB_USER" # Create extensions psql \ -h $POSTGRES_HOST \ -p $POSTGRES_PORT \ -U $POSTGRES_USER \ -d $DB_NAME \ -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm' \ -c 'CREATE EXTENSION IF NOT EXISTS btree_gin' done else echo "Database list not found!" fi
В качестве разделителя использованы пробелы, поэтому пробелы в имени пользователя недопустимыdb_list.txt
asyncblogs user1 VerySecretPassword calendar user1 VerySecretPassword cms-backend user1 VerySecretPassword comments user1 VerySecretPassword dictionaries user1 VerySecretPassword discovery user1 VerySecretPassword events user1 VerySecretPassword filestorage user1 VerySecretPassword gamification user1 VerySecretPassword groups user1 VerySecretPassword meetings user1 VerySecretPassword news user1 VerySecretPassword notifications user1 VerySecretPassword pages user1 VerySecretPassword polls user1 VerySecretPassword profile user1 VerySecretPassword reports user1 VerySecretPassword roles user1 VerySecretPassword settings user1 VerySecretPassword tasks user1 VerySecretPassword termsof-use-service user1 VerySecretPassword websockets-notifications user1 VerySecretPassword
-
-
Для хранения медиафайлов необходимо совместимое s3 хранилище. Оно используется многими сервисами. Для настройки необходимо создать объектное хранилище и сгенерировать ключ доступа. Для доступа необходимо установить правило доступа к объектному хранилищу ACL Public.
-
- Для авторизации используется Keycloak. После установки нужно:
- Создать Realm (имя любое, по умолчанию ph)
-
Создать клиента со следующими параметрами
Тип OpenID Connect Valid redirect URIs * Valid post logout redirect URIs * Authentication flow Standard flow, Direct access grants
-
Добавить client scope с следующими mappers
aud Token mapper Audience client roles Token mapper User Client Role -
После создания Realm добавить публичный ключ в переменную ко всем сервисам. Для манипуляции с пользователями некоторый сервисам нужен доступ на изменение через API Keycloak. Для этого нужно создать пользователя с правами на изменение.
-
Создать клиентскую роль superuser. 1. Для каждого сервиса необходимо создать отдельную БД Redis. Путь и имя БД Redis добавляются в переменные окружения сервиса. 1. Настроить БД clickhouse
Создание БД (Clickhouse)ClickHouse create DB
1. Установить и настроить Kafka. Настроить listeners: SASL_PLAINTEXTclickhouse client --user ${CLICKHOUSE_USER} --password ${CLICKHOUSE_PASSWORD} -n <<-EOSQL CREATE TABLE IF NOT EXISTS intranet.user_analytic ( url String, service String, keycloak_id String, info String DEFAULT '', created_at DateTime DEFAULT now() ) ENGINE = MergeTree ORDER BY created_at; CREATE TABLE IF NOT EXISTS intranet.events ( action String, service String, object_id UInt32, object_type String, session String, user String, datetime DateTime DEFAULT now() ) ENGINE = MergeTree ORDER BY datetime; EOSQL