Установка в Kubernetes
Требования к окружению
- Kubernetes 1.27+
- PostgreSQL 14+
- RabbitMQ 3.11+
- Redis 7+
- Meilisearch 1.8+
- Weaviate 1.25+
- MinIO 2023-10+
- Stunner 1.0+
- 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:
-
После деплоя applications в Арго создайте CRD для Gateway, GatewayClass, GatewayConfig и UDPRoute.
-
Пример конфигурации 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
Остальные сервисы: Установите оставшиеся сервисы в следующем порядке:
- web
- nginx
В файле configs/prod/nginx.conf укажите нужный ns в строчке:
proxy_pass http://backend.yuchat:8080; # указать нужный namespace
- media-converter-service
- 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
- avnotes-streaming
- ws-endpoint-v2
- conference-service-discovery
- chat-message-event-service
- media-composer
- webrtc
- freeswitch
- mediahub
- admin-dashboard
В дополнении к env.secret параметрам, раскоментируйте конфигурацию переменных в values.yaml:
env:
normal: {}
# S3_RECORDS_BUCKET: yuchat-records
# S3_REGION: ru-central