Перейти к содержанию

Подготовка инфраструктуры

Требования к сторонним компонентам

Для работы продукта VK People Hub необходимы следующие элементы инфраструктуры.

База данных PostgreSQL

  1. Необходимая версия: =>12
  2. Рекомендуемый helm chart: chart.people-hub.ru/postgresql версия 13.2.26
  3. Helm chart источник: oci://registry-1.docker.io/bitnamicharts/postgresql версия 13.2.26
  4. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
  5. Необходимые настройки:
    • Для каждого сервиса необходима отдельная БД. Имя БД выставляется в переменных окружения PG_DB.
    • Для БД (filestorage,profile,groups,polls) необходимо установить extention pg_trgm, btree_gin.
    • В настройках выставить max_connections=1000.
    • Сервисы соединяются с БД через pgbounce.

Pgbouncer

  1. Необходимая версия: =>1.20.1
  2. Рекомендуемый helm chart: chart.people-hub.ru/pgbouncer вервия 3.31.3
  3. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
  4. Необходимые настройки:
    • Настройка доступа для всех БД.

Kafka

  1. Необходимая версия: =>7.0.1
  2. Рекомендуемый helm chart: oci://registry-1.docker.io/bitnamicharts/kafka версия 25.1.4
  3. Helm chart источник: oci://registry-1.docker.io/bitnamicharts/kafka версия 25.1.4
  4. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
  5. Необходимые настройки:
    • Настройка подключения клиентов к брокеру через переменную KAFKA_BROKER.
    • Настроить listeners:
      • client: containerPort: 9092 protocol: PLAINTEXT name: CLIENT sslClientAuth: ""
      • controller: name: CONTROLLER containerPort: 9093 protocol: PLAINTEXT sslClientAuth: ""

Minio

  1. Необходимая версия: =>2023.10.24
  2. Рекомендуемый helm chart: oci://registry-1.docker.io/bitnamicharts/minio версия 12.8.12
  3. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
  4. Helm chart источник: oci://registry-1.docker.io/bitnamicharts/minio версия 12.8.12
  5. Необходимые настройки:
    • Конфигурация по умолчанию, в переменных настраивается MINIO_ACCESS_KEY и MINIO_SECRET_KEY. Необходимо одно объектное хранилище, которое настраивается через переменную AWS_STORAGE_BUCKET_NAME. При использовании внешнего s3 хранилища нужно изменить AWS_S3_ENDPOINT_URL. На данный момент, для работы портала объектное хранилище должно иметь права доступа public и проксирование запросов с пути /media и /media-fs

Keycloak

  1. Необходимая версия: 22.0.1
  2. Рекомендуемый helm chart: oci://registry-1.docker.io/bitnamicharts/keycloak версия 16.1.1
  3. Helm chart источник: oci://registry-1.docker.io/bitnamicharts/keycloak версия 16.1.1
  4. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке: https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
  5. Необходимые настройки:
    • Создать 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

  1. Необходимая версия: 5.0.7
  2. Рекомендуемый helm chart: chart.people-hub.ru/redis:3.37.2
  3. Helm chart источник: oci://registry-1.docker.io/bitnamicharts/redis версия 3.37.2
  4. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
  5. Необходимые настройки:
    • БД необходима для следующих сервисов: adaptation, blogs, calendar, cms, comments, dictionaries, discovery, events, filestorage, gamification, groups, news, polls, profile, reports, tasks.

ClickHouse

  1. Необходимая версия: 22.0.1
  2. Рекомендуемый helm chart: chart.people-hub.ru/keycloak:16.1.1
  3. Helm chart источник: oci://registry-1.docker.io/bitnamicharts/clickhouse версия 16.1.1
  4. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz

Airflow

  1. Необходимая версия: 2.7.2
  2. Рекомендуемый helm chart: chart.people-hub.ru/redis:1.11.0
  3. Helm chart источник chart
    helm repo add apache-airflow https://airflow.apache.org
    helm pull airflow apache-airflow/airflow --version 1.11.0
    
  4. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz

Установка и настройка сторонних компонентов

  1. Вариант установки можно найти в архиве https://raw.people-hub.ru/infra/scripts.tar.gz install.txt

  2. Создать базы данных PostgreSQL для сервисов. Для создания БД можно использовать скрипт, передав ему как аргумент файл со списком БД, пользователей и паролей.

    • Скрипт для создания БД (PostgreSQL)

      create_db.sh

      #!/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
      
      - Пример файла со списком БД (PostgreSQL)
      В качестве разделителя использованы пробелы, поэтому пробелы в имени пользователя недопустимы

      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
      

  3. Для хранения медиафайлов необходимо совместимое s3 хранилище. Оно используется многими сервисами. Для настройки необходимо создать объектное хранилище и сгенерировать ключ доступа. Для доступа необходимо установить правило доступа к объектному хранилищу ACL Public.

    1. Для авторизации используется Keycloak. После установки нужно:
    2. Создать Realm (имя любое, по умолчанию ph)
    3. Создать клиента со следующими параметрами

      Тип 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

      clickhouse 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
      
      1. Установить и настроить Kafka. Настроить listeners: SASL_PLAINTEXT