Перейти к основному содержимому

Первичная установка в Kubernetes

Требования к окружению

  • Kubernetes 1.27+
  • PostgreSQL 14+
  • RabbitMQ 3.11+
  • Redis 7+
  • Meilisearch 1.8+
  • Weaviate 1.25+
  • MinIO 2023-10+
  • SMTP-сервер

Опционально:

  • Установленная на GPU-кластере LLM с API совместимым с OpenAI / ключ OpenAI / ключ Yandex Cloud Foundation Models (для суммаризации и других AI-функций)
  • Установленный на GPU-кластере Whisper / ключ Yandex Foundation Models (для speech-to-text)

Все компоненты окружения могут быть размещены как в кластере так и вне его.

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

  • ArgoCD 2.10+

Подготовка

PostgreSQL:

Создайте базу данных yuchat_db.
Создайте схемы yuchat и yuchat_services.
Создайте пользователя (ТУЗ) с правами read/write на эту базу данных и схемы.

RabbitMQ:

Создайте пользователя (ТУЗ) с правами configure/read/write на виртуальный хост /.

MinIO:

Создайте пользователя (ТУЗ) с правами на создание бакетов.

Настройте amqp нотификации с параметрами:

MINIO_NOTIFY_AMQP_ENABLE_PRIMARY: "on"
MINIO_NOTIFY_AMQP_URL_PRIMARY: "amqp://username:password@rabbitmq_host:5672"
MINIO_NOTIFY_AMQP_EXCHANGE_PRIMARY: "yuchat.aws.file.events.ex"
MINIO_NOTIFY_AMQP_EXCHANGE_TYPE_PRIMARY: "fanout"
MINIO_NOTIFY_AMQP_ROUTING_KEY_PRIMARY: "#"
MINIO_NOTIFY_AMQP_DURABLE_PRIMARY: "true"
MINIO_NOTIFY_AMQP_AUTO_DELETED_PRIMARY: "false"

На Minio должен быть настроен https!

Redis:

Создайте пользователя (ТУЗ).
Для Redis можно использовать стандартного пользователя, поскольку Redis обычно не использует отдельных учетных записей пользователей.

SMTP сервер:

Установите и настройте SMTP сервер для отправки почты (например, для подтверждения регистрации пользователей).
Убедитесь, что SMTP сервер доступен и настроен с параметрами SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD.

Публичный IP адрес:

Подготовьте публичный IP адрес с портом 3478, на который будет создан gateway для обеспечения связи с STUN/TURN серверами.

Создание домена для Yuchat:

Зарегистрируйте домен, на котором будет развернут Yuchat yourdomain.com. Для корректной работы Yuchat внутри Kubernetes необходимо будет настроить subdomains - api.yourdomain.com и web.yourdomain.com.

Установка

1. Создайте namespace yuchat:

kubectl create namespace yuchat

2. Создайте секрет с TLS сертификатом для домена и субдоменов, которые зарезервировали ранее:

Генерация и установка секрета:

kubectl create secret tls yuchat-tls --cert=/path/to/tls.crt --key=/path/to/tls.key -n yuchat

3. Создайте секрет с типом docker-registry для доступа к репозиторию с образами:

kubectl create secret docker-registry yuchat-regcred \\
--docker-server=https://registry.unison.team \\
--docker-username= <обратитесь к поставщику за учетными данными> \\
--docker-password= <обратитесь к поставщику за учетными данными> \\
-n yuchat

4. Создайте StorageClass:

Пример YAML для StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: yuchat-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2

5. Настройка доступа в ArgoCD до репозитория с чартами:

В ArgoCD добавьте репозиторий через Kubernetes secret:

apiVersion: v1
stringData:
enableOCI: "true"
name: yuchat-charts
password: <обратитесь к поставщику за учетными данными>
type: helm
url: registry.unison.team/yuchatcharts # или используйте свой репозиторий, где сохранены helm charts для Yuchat
username: <обратитесь к поставщику за учетными данными>
kind: Secret
metadata:
labels:
argocd.argoproj.io/secret-type: repository
name: yuchat-charts

6. Создайте секреты для RabbitMQ, Redis, MinIO, PostgreSQL, Keycloak, SMTP и Stunner:

Redis:

kubectl create secret generic redis-creds-secret \
--from-literal=REDIS_HOST=redis.yuchat.yourdomain.com \
--from-literal=REDIS_PASSWORD=your_password \
--from-literal=REDIS_PORT=6379 \
-n yuchat

RabbitMQ:

kubectl create secret generic rabbitmq-creds-secret \
--from-literal=RABBITMQ_URI=amqp://rabbitmq.yuchat.yourdomain.com:5672 \
--from-literal=RABBITMQ_USERNAME=yuchat_user \
--from-literal=RABBITMQ_PASSWORD=your_password \
--from-literal=RABBITMQ_HOST=rabbitmq.yuchat.yourdomain.com \
--from-literal=RABBITMQ_VHOST=\
-n yuchat

Опционально! Если в конфигурации backend включен Audit, то создайте секрет со следующими параметрами:

kubectl create secret generic rabbitmq-creds-secret \
--from-literal=RABBITMQ_URI=amqp://rabbitmq.yuchat.yourdomain.com:5672 \
--from-literal=RABBITMQ_USERNAME=yuchat_user \
--from-literal=RABBITMQ_PASSWORD=your_password \
--from-literal=RABBITMQ_HOST=rabbitmq.yuchat.yourdomain.com \
--from-literal=RABBITMQ_VHOST=\
--from-literal=AUDIT_RABBITMQ_URI=amqp://rabbitmq.yuchat.yourdomain.com:5672 \
--from-literal=AUDIT_RABBITMQ_USERNAME=yuchat_user \
--from-literal=AUDIT_RABBITMQ_PASSWORD=your_password \
--from-literal=AUDIT_RABBITMQ_VHOST=\
-n yuchat

MinIO:

kubectl create secret generic minio-creds-secret \
--from-literal=CLOUD_ACCESS_KEY=your_access_key \
--from-literal=CLOUD_SECRET_KEY=your_secret_key \
--from-literal=S3_URL=https://minio.yuchat.yourdomain.com \
--from-literal=S3_DOMAIN=minio.yuchat.yourdomain.com \
-n yuchat

PostgreSQL:

kubectl create secret generic postgresql-creds-secret \
--from-literal=DATASOURCE_USERNAME=yuchat_user \
--from-literal=DATASOURCE_URL=jdbc:postgresql://postgres.yuchat.yourdomain.com:5432/yuchat_db \
--from-literal=DATASOURCE_PASSWORD=your_password \
--from-literal=DATASOURCE_SCHEMA=yuchat \
--from-literal=DATASOURCE_ENCRYPT_TOKEN=datasource_encrypt_token \
-n yuchat

SMTP сервер:
Если отсутствуют username и password от сервера, установите SMTP_USERNAME и SMTP_PASSWORD в "".

kubectl create secret generic smtp-creds-secret \
--from-literal=MAIL_SMTP_HOST=smtp.yourdomain.com \
--from-literal=MAIL_SMTP_PORT=25 \
--from-literal=MAIL_SMTP_USERNAME=smtp_user \
--from-literal=MAIL_SMTP_PASSWORD=smtp_password \
-n yuchat

Stunner:

kubectl create secret generic stunner-creds-secret \
--from-literal=STUNNER_USERNAME=stunner_user \
--from-literal=STUNNER_PASSWORD=stunner_password \
--from-literal=STUNNER_PORT=3478 \
--from-literal=STUNNER_HOST=<public_ip> \
-n yuchat

Keycloak (Опционально. Требуется только для настройки SSO.):

kubectl create secret generic keycloak-creds-secret \
--from-literal=KC_CLIENT_SECRET=kc_client_secret \
--from-literal=KC_SIG_KEY_SECRET=kc_sig_key_secret \
-n yuchat

7. Создайте секрет с переменными для backend сервиса:

kubectl create secret generic backend-secret \
--from-literal=JWT_SHARED_SECRET=random_string_256_bits \
--from-literal=MEILISEARCH_MASTER_KEY=random_string \
-n yuchat

8. Создайте секрет с переменными для freeswitch сервиса:

kubectl create secret generic freeswitch-secret \
--from-literal=FS_ESL_PASS=random_string \
-n yuchat

Подготовка HelmCharts

Для успешного развертывания всех сервисов в Kubernetes кластере через ArgoCD необходимо подготовить и настроить Helm Charts для каждого сервиса.

Для каждого сервиса создайте отдельный ArgoCD Application, который будет управлять его развертыванием. Для всех сервисов настройте values.yaml, необходимо указать следующие параметры:

  • Репозитории с образами: Укажите URL-адрес репозитория Docker образов для сервиса.

  • PullSecret: Настройте секрет для доступа к приватным репозиториям с Docker образами. Укажите его в поле imagePullSecrets.

  • Ингресс: Настройте доступ к сервисам через Ingress, используя заранее созданный домен. Укажите все необходимые правила и аннотации.

  • StorageClass: Укажите класс хранилища для Persistent Volume, если сервис требует использования хранилища.

  • Селекторы, аффинити, топология и толерации: Если требуется, укажите nodeSelector, tolerations, topologySpreadConstraints и affinity для подов, чтобы они размещались на узлах с определёнными характеристиками.

  • Настройка секретов: В values-файлах укажите ссылки на существующие Kubernetes секреты, которые создавали ранее. В default values файлах в чартах они закомментированы.

Например, в чарте backend сервиса в values.yaml раскоментируйте следующие секреты: keycloak-secret (Опционально. Требуется только для настройки SSO), postgresql-creds-secret, rabbitmq-creds-secret, redis-creds-secret, stunner-creds-secret, minio-creds-secret, smtp-creds-secret, backend-secret.

env:
secret:
# keycloak-secret:
# - KC_CLIENT_SECRET
# - KC_SIG_KEY_SECRET
# postgresql-creds-secret:
# - DATASOURCE_USERNAME
# - DATASOURCE_URL
# - DATASOURCE_PASSWORD
# - DATASOURCE_SCHEMA
# - DATASOURCE_ENCRYPT_TOKEN
# AUDIT_ переменные можно убрать, если AUDIT выключен
# rabbitmq-creds-secret:
# - RABBITMQ_HOST
# - RABBITMQ_USERNAME
# - RABBITMQ_PASSWORD
# - RABBITMQ_VHOST
# - AUDIT_RABBITMQ_VHOST
# - AUDIT_RABBITMQ_USERNAME
# - AUDIT_RABBITMQ_PASSWORD
# - AUDIT_RABBITMQ_URI
# redis-creds-secret:
# - REDIS_HOST
# - REDIS_PORT
# - REDIS_PASSWORD
# stunner-creds-secret:
# - STUNNER_USERNAME
# - STUNNER_PASSWORD
# - STUNNER_PORT
# - STUNNER_HOST
# minio-creds-secret:
# - CLOUD_ACCESS_KEY
# - CLOUD_SECRET_KEY
# - S3_URL
# smtp-creds-secret:
# - MAIL_SMTP_HOST
# - MAIL_SMTP_PORT
# - MAIL_SMTP_USERNAME
# - MAIL_SMTP_PASSWORD
# backend-secret:
# - JWT_SHARED_SECRET
# - MEILISEARCH_MASTER_KEY

Порядок установки сервисов

  • Meilisearch: укажите название секрета backend-secret для параметра existingMasterKeySecret:
auth:
# Use an existing Kubernetes secret for the MEILI_MASTER_KEY
existingMasterKeySecret: "backend-secret"
  • STUNner Gateway Operator:

    1. После деплоя applications в Арго создайте CRD для Gateway, GatewayClass, GatewayConfig и UDPRoute.

    2. Пример конфигурации CRD:

Gateway:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
annotations:
stunner.l7mp.io/service-type: LoadBalancer
name: udp-gateway
namespace: yuchat
spec:
addresses:
- type: IPAddress
value: <Ваш IP>
gatewayClassName: stunner-gatewayclass
listeners:
- allowedRoutes:
namespaces:
from: Same
name: udp-listener
port: 3478
protocol: UDP

GatewayClass:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: stunner-gatewayclass
spec:
parametersRef:
group: stunner.l7mp.io
kind: GatewayConfig
name: stunner-gatewayconfig
namespace: yuchat
controllerName: "stunner.l7mp.io/gateway-operator"

GatewayConfig:

apiVersion: stunner.l7mp.io/v1alpha1
kind: GatewayConfig
metadata:
name: stunner-gatewayconfig
namespace: yuchat
spec:
authType: plaintext
password: <Ваш пароль>
realm: stunner.l7mp.io
stunnerConfig: stunnerd-config
userName: <Ваш логин>
logLevel: all:TRACE

UDPRoute:

kind: UDPRoute
metadata:
name: media-yuchat
namespace: yuchat
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: udp-gateway
rules:
- backendRefs:
- group: ""
kind: Service
name: webrtc
namespace: yuchat
weight: 1
port: 8090

Остальные сервисы: Установите оставшиеся сервисы в следующем порядке:

  1. web
  2. nginx-static

В файле configs/prod/nginx.conf укажите нужный ns в строчке:

proxy_pass http://backend.yuchat:8080; # указать нужный namespace
  1. media-converter
  2. backend: при необходимости создайте вручную ConfigMap в Kubernetes с конфигурацией application.yaml файла и укажите ее в values.yaml:
configurationExistingCM: "backend-configuration"

Также необходимо настроить ключи для работы с ios и adnroid. За уточнением конфигурации и получения api ключей (backend-apikeys) обратитесь к разработчикам

kind: Secret
apiVersion: v1
metadata:
name: backend-apikeys
namespace: yuchat
data:
AuthKey_2U9QTC2B7A.p8:
AuthKey_89A2RYNYNS.p8:
electron-fcm.json:
fcm-prod.json:

После запуска backend необходимо выполнить следующие команды для Minio:

mc event add local/yuchat-avatars arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-file-pdf-preview arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-file-preview arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-files arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-files-presigned arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-per-track-recordings arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-records arn:minio:sqs::PRIMARY:amqp --event put
mc event add local/yuchat-transcribe arn:minio:sqs::PRIMARY:amqp --event put
  1. avnotes-streaming
  2. ws-endpoint-service
  3. conference-service-discovery
  4. chat-message-event-service
  5. media-composer
  6. fs-webrtc-stack

В дополнении к env.secret параметрам, раскоментируйте конфигурацию переменных в values.yaml:

env:
normal: {}
# S3_RECORDS_BUCKET: yuchat-records
# S3_REGION: ru-central