From ed3c059511a288646abb8f8eb87a79fc216d002f Mon Sep 17 00:00:00 2001 From: Vlad Bubnov Date: Fri, 30 Jan 2026 12:13:23 +0300 Subject: [PATCH 1/6] new hrbox chart version --- .helm/Chart.yaml | 4 +- .helm/templates/03-websocket.yaml | 23 +- .helm/templates/09-document-converter.yaml | 32 +++ .helm/templates/09-goworker.yaml | 52 +++++ .helm/templates/09-kedoca.yaml | 63 ++++++ .helm/templates/_envs.tpl | 56 ++++- .helm/templates/_resources.tpl | 48 +++++ .helm/values.yaml | 128 ++++++++--- CHANGELOG.md | 233 +++++++++++++++++++++ 9 files changed, 592 insertions(+), 47 deletions(-) create mode 100644 .helm/templates/09-document-converter.yaml create mode 100644 .helm/templates/09-goworker.yaml create mode 100644 .helm/templates/09-kedoca.yaml create mode 100644 CHANGELOG.md diff --git a/.helm/Chart.yaml b/.helm/Chart.yaml index 07e334f..a4f081b 100644 --- a/.helm/Chart.yaml +++ b/.helm/Chart.yaml @@ -4,10 +4,10 @@ description: Simplified HRBox application Helm chart type: application # Версия самого чарта. Увеличивается при каждом изменении чарта -version: 1.2.0 +version: 2.0.0 # Версия приложения, которое деплоится. Не обязательно увеличивать при изменении чарта -appVersion: "2.0.0" +appVersion: "3.0.0" # Ключевые слова для поиска keywords: diff --git a/.helm/templates/03-websocket.yaml b/.helm/templates/03-websocket.yaml index 60b4350..b820086 100644 --- a/.helm/templates/03-websocket.yaml +++ b/.helm/templates/03-websocket.yaml @@ -1,10 +1,11 @@ --- +# Chatbox (WebSocket server) - обеспечивает real-time функционал apiVersion: apps/v1 kind: Deployment metadata: - name: {{ .Chart.Name }}-websocket + name: {{ .Chart.Name }}-chatbox labels: - app: websocket + app: chatbox spec: minReadySeconds: 5 strategy: @@ -12,14 +13,14 @@ spec: rollingUpdate: maxSurge: 1 maxUnavailable: 1 - replicas: {{ .Values.app.replicas.websocket }} + replicas: {{ .Values.app.replicas.chatbox }} selector: matchLabels: - service: {{ .Chart.Name }}-websocket + service: {{ .Chart.Name }}-chatbox template: metadata: labels: - service: {{ .Chart.Name }}-websocket + service: {{ .Chart.Name }}-chatbox annotations: prometheus.io/scrape: 'true' prometheus.io/port: '9797' @@ -28,21 +29,21 @@ spec: imagePullSecrets: - name: regsecret containers: - - name: websocket - {{- include "websocket_resources" . | indent 10}} - image: cr.yandex/crphnph9c2s776j32sjd/hrbox-websocket:2.1 + - name: chatbox + image: {{ .Values.app.chatbox.image }} imagePullPolicy: Always env: - {{- include "envs_all" . | indent 12 }} + {{- include "envs_all" . | indent 12 }} + {{- include "chatbox_resources" . | indent 10 }} --- apiVersion: v1 kind: Service metadata: - name: {{ .Chart.Name }}-websocket + name: {{ .Chart.Name }}-chatbox spec: selector: - service: {{ .Chart.Name }}-websocket + service: {{ .Chart.Name }}-chatbox ports: - name: http port: 80 diff --git a/.helm/templates/09-document-converter.yaml b/.helm/templates/09-document-converter.yaml new file mode 100644 index 0000000..0d88d04 --- /dev/null +++ b/.helm/templates/09-document-converter.yaml @@ -0,0 +1,32 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Chart.Name }}-document-converter + labels: + app: document-converter +spec: + minReadySeconds: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + replicas: {{ .Values.app.document_converter.replicas }} + selector: + matchLabels: + service: {{ .Chart.Name }}-document-converter + template: + metadata: + labels: + service: {{ .Chart.Name }}-document-converter + spec: + imagePullSecrets: + - name: regsecret + containers: + - name: document-converter + image: {{ .Values.app.document_converter.image }} + imagePullPolicy: Always + env: + {{- include "envs_all" . | indent 12 }} + {{- include "document_converter_resources" . | indent 10 }} diff --git a/.helm/templates/09-goworker.yaml b/.helm/templates/09-goworker.yaml new file mode 100644 index 0000000..87c7196 --- /dev/null +++ b/.helm/templates/09-goworker.yaml @@ -0,0 +1,52 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Chart.Name }}-goworker + labels: + app: goworker +spec: + minReadySeconds: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + replicas: {{ .Values.app.goworker.replicas }} + selector: + matchLabels: + service: {{ .Chart.Name }}-goworker + template: + metadata: + labels: + service: {{ .Chart.Name }}-goworker + spec: + imagePullSecrets: + - name: regsecret + containers: + - name: goworker + stdin: true + tty: true + image: {{ .Values.app.goworker.image }} + imagePullPolicy: Always + env: + {{- include "envs_all" . | indent 12 }} + {{- include "goworker_resources" . | indent 10 }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Chart.Name }}-goworker + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8686" + prometheus.io/path: "/metrics" +spec: + selector: + service: {{ .Chart.Name }}-goworker + ports: + - name: http + port: 8686 + targetPort: 8686 + protocol: TCP diff --git a/.helm/templates/09-kedoca.yaml b/.helm/templates/09-kedoca.yaml new file mode 100644 index 0000000..d4ee3d0 --- /dev/null +++ b/.helm/templates/09-kedoca.yaml @@ -0,0 +1,63 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Chart.Name }}-kedoca + labels: + app: kedoca +spec: + minReadySeconds: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + replicas: {{ .Values.app.kedoca.replicas }} + selector: + matchLabels: + service: {{ .Chart.Name }}-kedoca + template: + metadata: + labels: + service: {{ .Chart.Name }}-kedoca + spec: + imagePullSecrets: + - name: regsecret + containers: + - name: kedoca + image: {{ .Values.app.kedoca.image }} + imagePullPolicy: Always + env: + {{- include "envs_all" . | indent 12 }} + {{- include "envs_kedoca" . | indent 12 }} + ports: + - containerPort: 8558 + {{- include "kedoca_resources" . | indent 10 }} + {{- if .Values.app.kedoca.secretName }} + volumeMounts: + - name: ca-cert + mountPath: /ca-cert + {{- end }} + {{- if .Values.app.kedoca.secretName }} + volumes: + - name: ca-cert + secret: + secretName: {{ .Values.app.kedoca.secretName }} + {{- end }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Chart.Name }}-kedoca + labels: + app: kedoca +spec: + selector: + service: {{ .Chart.Name }}-kedoca + ports: + - name: http + port: 8558 + targetPort: 8558 + protocol: TCP + type: ClusterIP diff --git a/.helm/templates/_envs.tpl b/.helm/templates/_envs.tpl index de8f7c4..35c4f25 100644 --- a/.helm/templates/_envs.tpl +++ b/.helm/templates/_envs.tpl @@ -190,12 +190,54 @@ - name: YANDEX_CLOUD_AI_API_KEY value: {{ .Values.app.ai.yandex.apiKey | quote }} {{- end }} -{{- if .Values.app.ai.openai.apiKey }} -- name: OPENAI_API_KEY - value: {{ .Values.app.ai.openai.apiKey | quote }} -- name: OPENAI_PROXY_KEY - value: {{ .Values.app.ai.openai.proxyKey | quote }} -- name: OPENAI_BASE_URI - value: {{ .Values.app.ai.openai.baseUri | quote }} + +# Integration Services +- name: GOWORKER_URL + value: {{ .Values.app.goworker.url | quote }} +{{- if .Values.app.goworker.sentryDsn }} +- name: GOWORKER_SENTRY_DSN + value: {{ .Values.app.goworker.sentryDsn | quote }} {{- end }} +- name: GOWORKER_PUSH_MIN_INTERVAL + value: {{ .Values.app.goworker.pushMinInterval | quote }} + +- name: KEDOCA_URL + value: {{ .Values.app.kedoca.url | quote }} +- name: TSP_URL + value: "http://qs.cryptopro.ru/tsp/tsp.srf" + +# Internal Services +- name: SERVICES_INTERNAL_SECRET + value: {{ .Values.secrets.servicesInternalSecret | default "QrrH84K2dG5JfoYxi4ZNPyg5p2LEj6rN69z5tIQYkfY6SJZ8GDXOcRjTNnefbOx5" | quote }} + +# Document Converter +- name: PYTHONUNBUFFERED + value: "1" +- name: DOCCONV_MAX_PARALLEL_TASKS + value: "1" + +# AI Features +- name: AI_DOCS_INDEX_ENABLED + value: "true" +- name: AI_SEMANTIC_INDEX_ENABLED + value: "true" +- name: AI_SEMANTIC_INDEX_USE_BATCH + value: "true" + +# Chatbox +{{- if .Values.app.chatbox.sentryDsn }} +- name: CHATBOX_SENTRY_DSN + value: {{ .Values.app.chatbox.sentryDsn | quote }} +{{- end }} +{{- end }} + +{{- define "envs_kedoca" }} +- name: ROOT_CA_PASS + value: {{ .Values.app.kedoca.rootCaPass | quote }} +- name: KEDO_ENGINE + value: {{ .Values.app.kedoca.engine | quote }} +- name: KEDO_ALGORITHM + value: {{ .Values.app.kedoca.algorithm | quote }} +- name: KEDO_PKEYOPT + value: {{ .Values.app.kedoca.pkeyopt | quote }} {{- end }} \ No newline at end of file diff --git a/.helm/templates/_resources.tpl b/.helm/templates/_resources.tpl index 051e331..11b31dc 100644 --- a/.helm/templates/_resources.tpl +++ b/.helm/templates/_resources.tpl @@ -80,4 +80,52 @@ resources: memory: {{ .Values.resources.jobs.limits.memory | quote }} cpu: {{ .Values.resources.jobs.limits.cpu | quote }} ephemeral-storage: {{ .Values.resources.jobs.limits.ephemeralStorage | quote }} +{{- end }} + +{{- define "goworker_resources" }} +resources: + requests: + memory: {{ .Values.resources.goworker.requests.memory | quote }} + cpu: {{ .Values.resources.goworker.requests.cpu | quote }} + ephemeral-storage: {{ .Values.resources.goworker.requests.ephemeralStorage | quote }} + limits: + memory: {{ .Values.resources.goworker.limits.memory | quote }} + cpu: {{ .Values.resources.goworker.limits.cpu | quote }} + ephemeral-storage: {{ .Values.resources.goworker.limits.ephemeralStorage | quote }} +{{- end }} + +{{- define "kedoca_resources" }} +resources: + requests: + memory: {{ .Values.resources.kedoca.requests.memory | quote }} + cpu: {{ .Values.resources.kedoca.requests.cpu | quote }} + ephemeral-storage: {{ .Values.resources.kedoca.requests.ephemeralStorage | quote }} + limits: + memory: {{ .Values.resources.kedoca.limits.memory | quote }} + cpu: {{ .Values.resources.kedoca.limits.cpu | quote }} + ephemeral-storage: {{ .Values.resources.kedoca.limits.ephemeralStorage | quote }} +{{- end }} + +{{- define "document_converter_resources" }} +resources: + requests: + memory: {{ .Values.resources.document_converter.requests.memory | quote }} + cpu: {{ .Values.resources.document_converter.requests.cpu | quote }} + ephemeral-storage: {{ .Values.resources.document_converter.requests.ephemeralStorage | quote }} + limits: + memory: {{ .Values.resources.document_converter.limits.memory | quote }} + cpu: {{ .Values.resources.document_converter.limits.cpu | quote }} + ephemeral-storage: {{ .Values.resources.document_converter.limits.ephemeralStorage | quote }} +{{- end }} + +{{- define "chatbox_resources" }} +resources: + requests: + memory: {{ .Values.resources.chatbox.requests.memory | quote }} + cpu: {{ .Values.resources.chatbox.requests.cpu | quote }} + ephemeral-storage: {{ .Values.resources.chatbox.requests.ephemeralStorage | quote }} + limits: + memory: {{ .Values.resources.chatbox.limits.memory | quote }} + cpu: {{ .Values.resources.chatbox.limits.cpu | quote }} + ephemeral-storage: {{ .Values.resources.chatbox.limits.ephemeralStorage | quote }} {{- end }} \ No newline at end of file diff --git a/.helm/values.yaml b/.helm/values.yaml index bf16992..86d3eca 100644 --- a/.helm/values.yaml +++ b/.helm/values.yaml @@ -32,12 +32,12 @@ app: # Рекомендации по масштабированию: # - web: 2-10 реплик в зависимости от количества пользователей # - worker: 2-5 реплик для обработки фоновых задач - # - websocket: 2-6 реплик для real-time функционала + # - chatbox: 2-6 реплик для real-time функционала (WebSocket) # - geonames: 1-2 реплики (сервис не требователен к ресурсам) replicas: web: 2 worker: 2 - websocket: 2 + chatbox: 2 geonames: 1 # PostgreSQL база данных @@ -136,10 +136,9 @@ app: # Проверять SSL сертификат сервера sslVerifyPeer: "false" - # Sentry для мониторинга ошибок (опционально) + # Sentry для мониторинга ошибок sentry: # DSN для отправки ошибок - # Оставьте пустым, чтобы отключить dsn: "" # Окружение для группировки ошибок @@ -150,6 +149,53 @@ app: # URL внутреннего сервиса geonames # Не меняйте, если используете стандартный деплой url: "http://hrbox-geonames:8181" + + # Goworker - интеграции с мессенджерами (Telegram, WhatsApp и др.) + goworker: + # URL внутреннего сервиса goworker + url: "http://hrbox-goworker:8686" + # Docker образ goworker + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-goworker:2.7" + # Количество реплик + replicas: 2 + # Минимальный интервал между push-уведомлениями + pushMinInterval: "5m" + # Sentry DSN для мониторинга ошибок + sentryDsn: "" + + # Kedoca - сервис электронной подписи (ГОСТ, OpenSSL) + kedoca: + # URL внутреннего сервиса kedoca + url: "http://hrbox-kedoca:8558" + # Docker образ kedoca + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-kedoca:0.8" + # Количество реплик + replicas: 1 + # Пароль для корневого сертификата + rootCaPass: "hrbox" + # Криптографический движок: "gost" или "openssl" + engine: "gost" + # Алгоритм: "gost2012_256" для GОСТ или "rsa" для OpenSSL + algorithm: "gost2012_256" + # Параметры ключа: "paramset:A" для ГОСТ или "rsa_keygen_bits:2048" для RSA + pkeyopt: "paramset:A" + # Имя Kubernetes Secret с сертификатами + # Если указано, будет смонтирован в /ca-cert + secretName: "" + + # Document Converter - конвертер документов (PDF, DOCX и др.) + document_converter: + # Docker образ document converter + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-document-converter:latest" + # Количество реплик + replicas: 1 + + # Chatbox - WebSocket сервер для real-time функционала + chatbox: + # Docker образ chatbox + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-chatbox:3.0" + # Sentry DSN для мониторинга ошибок + sentryDsn: "" # Настройки воркеров Launchpad # Формат: "название-топика:количество-воркеров" @@ -187,15 +233,6 @@ app: folderId: "" # API ключ для Yandex Cloud apiKey: "" - - # OpenAI интеграция - openai: - # API ключ OpenAI - apiKey: "" - # Прокси ключ (если используете прокси) - proxyKey: "" - # Base URL для API (можно указать прокси) - baseUri: "" # Настройки безопасности security: @@ -210,13 +247,18 @@ secrets: # Используется для защиты от XSS атак # Генерация: openssl rand -hex 16 cookieValidationKey: "" - + # Ключ шифрования данных (64 символа) # ВАЖНО: Не теряйте этот ключ! Без него невозможно расшифровать данные # Используется для шифрования паролей интеграций (S3, ADFS и др.) # Генерация: openssl rand -base64 48 encryptionKey: "" + # Секрет для внутренней коммуникации микросервисов (64 символа) + # Используется для защиты внутренних API вызовов между сервисами + # Генерация: openssl rand -base64 48 + servicesInternalSecret: "" + # Настройки Ingress ingress: # Включить Ingress @@ -280,19 +322,7 @@ resources: cpu: "2" memory: "2Gi" ephemeralStorage: "2Gi" - - # WebSocket сервер - # Обеспечивает real-time функционал, например, уведомления - websocket: - requests: - cpu: "0.1" - memory: "128Mi" - ephemeralStorage: "64Mi" - limits: - cpu: "1" - memory: "512Mi" - ephemeralStorage: "64Mi" - + # Geonames - сервис геолокации # Определяет города, страны, часовые пояса geonames: @@ -329,6 +359,50 @@ resources: memory: "2Gi" ephemeralStorage: "256Mi" + # Goworker - интеграции с мессенджерами + goworker: + requests: + cpu: "0.1" + memory: "196Mi" + ephemeralStorage: "64Mi" + limits: + cpu: "0.3" + memory: "256Mi" + ephemeralStorage: "64Mi" + + # Kedoca - электронная подпись + kedoca: + requests: + cpu: "0.1" + memory: "196Mi" + ephemeralStorage: "64Mi" + limits: + cpu: "0.5" + memory: "256Mi" + ephemeralStorage: "64Mi" + + # Document Converter - конвертер документов + document_converter: + requests: + cpu: "1" + memory: "512Mi" + ephemeralStorage: "512Mi" + limits: + cpu: "1" + memory: "1024Mi" + ephemeralStorage: "1024Mi" + + # Chatbox - WebSocket сервер + chatbox: + requests: + cpu: "0.3" + memory: "96Mi" + ephemeralStorage: "128Mi" + limits: + cpu: "0.3" + memory: "192Mi" + ephemeralStorage: "256Mi" + # Настройки NATS JetStream nats: # Включить NATS (обязательно для работы HRBox) diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a1c2861 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,233 @@ +# Changelog + +All notable changes to the HRBox Helm chart will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [2.0.0] - 2026-01-30 + +Масштабная актуализация чарта на основе продового окружения hrbox. Синхронизированы версии компонентов, добавлены новые микросервисы, обновлены переменные окружения. + +### Added + +#### Новые микросервисы + +- **Goworker** (`09-goworker.yaml`) - Сервис интеграций с мессенджерами + - Образ: `hrbox-goworker:2.7` + - Поддержка Telegram, WhatsApp и других мессенджеров + - Prometheus metrics на порту 8686 + - Настройки: `app.goworker` в values.yaml + - Переменные: `GOWORKER_URL`, `GOWORKER_PUSH_MIN_INTERVAL`, `GOWORKER_SENTRY_DSN` + +- **Kedoca** (`09-kedoca.yaml`) - Сервис электронной подписи + - Образ: `hrbox-kedoca:0.8` + - Поддержка ГОСТ и OpenSSL + - Монтирование Kubernetes Secret с CA сертификатами + - Настройки: `app.kedoca` в values.yaml + - Переменные: `KEDOCA_URL`, `TSP_URL`, `ROOT_CA_PASS`, `KEDO_ENGINE`, `KEDO_ALGORITHM`, `KEDO_PKEYOPT` + +- **Document Converter** (`09-document-converter.yaml`) - Конвертер документов + - Образ: `hrbox-document-converter:latest` + - Конвертация PDF, DOCX и других форматов + - Настройки: `app.document_converter` в values.yaml + - Переменные: `PYTHONUNBUFFERED`, `DOCCONV_MAX_PARALLEL_TASKS` + +#### Новые переменные окружения + +- `SERVICES_INTERNAL_SECRET` - Секрет для межсервисной коммуникации +- `AI_DOCS_INDEX_ENABLED` - Включение индексации документов через AI +- `AI_SEMANTIC_INDEX_ENABLED` - Семантическое индексирование +- `AI_SEMANTIC_INDEX_USE_BATCH` - Пакетная обработка при индексации +- `CHATBOX_SENTRY_DSN` - Sentry DSN для Chatbox +- `SINGLE_TENANT` - Режим single-tenant для on-premise установок +- `TSP_URL` - URL службы временных меток (http://qs.cryptopro.ru/tsp/tsp.srf) + +#### Новые секреты + +- `secrets.servicesInternalSecret` - Секрет для защиты внутренних API между микросервисами + - Генерация: `openssl rand -base64 48` + +#### Resource definitions + +Добавлены resource limits/requests для новых сервисов: +- `resources.goworker` - CPU: 0.1-0.3, Memory: 196Mi-256Mi +- `resources.kedoca` - CPU: 0.1-0.5, Memory: 196Mi-256Mi +- `resources.document_converter` - CPU: 1, Memory: 512Mi-1024Mi, Ephemeral: 512Mi-1024Mi +- `resources.chatbox` - CPU: 0.3, Memory: 96Mi-192Mi + +### Changed + +#### Обновление версий + +- **Chart version**: `1.2.0` → `2.0.0` +- **App version**: `2.0.0` → `3.0.0` + +#### Chatbox (ранее WebSocket) + +- **Образ обновлен**: `hrbox-websocket:2.1` → `hrbox-chatbox:3.0` +- **Переименован deployment**: `{chart}-websocket` → `{chart}-chatbox` +- **Переименован service**: `{chart}-websocket` → `{chart}-chatbox` +- **Переименована конфигурация**: + - `app.replicas.websocket` → `app.replicas.chatbox` + - Файл остался `03-websocket.yaml` но содержимое обновлено на chatbox + +#### Архитектура + +- Все микросервисы теперь **обязательны** (не опциональны) + - Удалены условия `{{- if .Values.app.goworker }}` из templates + - Удалены `| default` значения для обязательных параметров + - Goworker, Kedoca, Document Converter, Chatbox всегда деплоятся + +#### Templates + +- `_envs.tpl`: + - Упрощена логика переменных окружения + - Удалены условия для обязательных сервисов + - Добавлен блок `envs_kedoca` для настроек криптографии + +- `_resources.tpl`: + - Добавлены определения: `goworker_resources`, `kedoca_resources`, `document_converter_resources`, `chatbox_resources` + +- `_helpers.tpl`: + - Без изменений, сохранена совместимость + +### Removed + +#### Устаревшие компоненты + +- **WebSocket сервис** - Полностью заменен на Chatbox 3.0 + - Удалено: `app.replicas.websocket` из values.yaml + - Удалено: `resources.websocket` из values.yaml + +#### Устаревшие интеграции + +- **OpenAI** - Интеграция удалена, используйте HRBox Hub + - Удален блок: `app.ai.openai` с полями `apiKey`, `proxyKey`, `baseUri` + - Удалены переменные: `OPENAI_API_KEY`, `OPENAI_PROXY_KEY`, `OPENAI_BASE_URI` + +### Migration Guide + +#### Миграция с версии 1.x на 2.0 + +**Шаг 1: Обновите values.yaml** + +```yaml +# 1. Переименуйте websocket в chatbox +app: + replicas: + # websocket: 2 # УДАЛИТЬ + chatbox: 2 # ДОБАВИТЬ + +# 2. Добавьте новые сервисы +app: + goworker: + url: "http://hrbox-goworker:8686" + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-goworker:2.7" + replicas: 2 + pushMinInterval: "5m" + sentryDsn: "" + + kedoca: + url: "http://hrbox-kedoca:8558" + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-kedoca:0.8" + replicas: 1 + rootCaPass: "hrbox" + engine: "gost" + algorithm: "gost2012_256" + pkeyopt: "paramset:A" + secretName: "" + + document_converter: + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-document-converter:latest" + replicas: 1 + + chatbox: + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-chatbox:3.0" + sentryDsn: "" + +# 3. Добавьте новый секрет +secrets: + servicesInternalSecret: "" # Сгенерируйте: openssl rand -base64 48 + +# 4. Удалите OpenAI (если был настроен) +app: + ai: + # openai: # УДАЛИТЬ весь блок + # apiKey: "" + # proxyKey: "" + # baseUri: "" +``` + +**Шаг 2: Сгенерируйте новый секрет** + +```bash +# Генерация servicesInternalSecret +openssl rand -base64 48 +``` + +**Шаг 3: Обновите Chart** + +```bash +helm upgrade hrbox .helm/ \ + --namespace hrbox \ + --values your-values.yaml +``` + +**Шаг 4: Проверьте новые поды** + +```bash +# Проверка новых сервисов +kubectl get pods -n hrbox -l app=goworker +kubectl get pods -n hrbox -l app=kedoca +kubectl get pods -n hrbox -l app=document-converter +kubectl get pods -n hrbox -l app=chatbox + +# Убедитесь что старый websocket удален +kubectl get pods -n hrbox -l app=websocket # Должно быть пусто +``` + +### Breaking Changes + +⚠️ **Критические изменения, требующие действий:** + +1. **WebSocket → Chatbox**: Обязательное переименование конфигурации + - Service name изменился с `{chart}-websocket` на `{chart}-chatbox` + - Если есть зависимости от старого имени сервиса - обновите их + +2. **Новые обязательные сервисы**: Goworker, Kedoca, Document Converter всегда деплоятся + - Требуются дополнительные ресурсы кластера + - Проверьте доступность ресурсов перед обновлением + +3. **Новый секрет**: `secrets.servicesInternalSecret` обязателен + - Приложение не запустится без этого секрета + - Сгенерируйте перед деплоем + +4. **OpenAI удален**: Используйте HRBox Hub для AI интеграций + - Миграция на Hub API требуется если использовали OpenAI + +### Notes + +- Все образы сервисов используют registry: `cr.yandex/crphnph9c2s776j32sjd/` +- Для работы Kedoca с сертификатами создайте Kubernetes Secret и укажите в `kedoca.secretName` +- Goworker экспортирует метрики Prometheus на `/metrics` (порт 8686) +- Document Converter требует больше ephemeral storage (512Mi-1024Mi) + +--- + +## [1.2.0] - Previous version + +Упрощенный Helm chart для on-premise установок HRBox. + +### Initial Features + +- Базовые компоненты: web, worker, websocket, geonames, conductor +- PostgreSQL, Redis, NATS JetStream +- Ingress с TLS +- ConfigMaps и resource limits +- Migration и update jobs + +--- + +[2.0.0]: #200---2026-01-30 +[1.2.0]: #120---previous-version From 803733ebf2044aa33c9354f5c951157c1b737609 Mon Sep 17 00:00:00 2001 From: Vlad Bubnov Date: Fri, 30 Jan 2026 12:34:53 +0300 Subject: [PATCH 2/6] chatbox wrapping key --- .helm/templates/_envs.tpl | 2 ++ .helm/values.yaml | 8 ++++++-- CHANGELOG.md | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.helm/templates/_envs.tpl b/.helm/templates/_envs.tpl index 35c4f25..683cf2f 100644 --- a/.helm/templates/_envs.tpl +++ b/.helm/templates/_envs.tpl @@ -229,6 +229,8 @@ - name: CHATBOX_SENTRY_DSN value: {{ .Values.app.chatbox.sentryDsn | quote }} {{- end }} +- name: CHATBOX_WRAPPING_KEY + value: {{ .Values.app.chatbox.wrappingKey | quote }} {{- end }} {{- define "envs_kedoca" }} diff --git a/.helm/values.yaml b/.helm/values.yaml index 86d3eca..adfb24b 100644 --- a/.helm/values.yaml +++ b/.helm/values.yaml @@ -150,7 +150,7 @@ app: # Не меняйте, если используете стандартный деплой url: "http://hrbox-geonames:8181" - # Goworker - интеграции с мессенджерами (Telegram, WhatsApp и др.) + # Goworker goworker: # URL внутреннего сервиса goworker url: "http://hrbox-goworker:8686" @@ -158,7 +158,7 @@ app: image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-goworker:2.7" # Количество реплик replicas: 2 - # Минимальный интервал между push-уведомлениями + # Минимальный интервал между push pushMinInterval: "5m" # Sentry DSN для мониторинга ошибок sentryDsn: "" @@ -194,6 +194,10 @@ app: chatbox: # Docker образ chatbox image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-chatbox:3.0" + # Wrapping key - часть ключа для ассиметричного шифрования чатов + # Сгенерируйте произвольную строку из 32 символов + # openssl rand -hex 16 + wrappingKey: "" # Sentry DSN для мониторинга ошибок sentryDsn: "" diff --git a/CHANGELOG.md b/CHANGELOG.md index a1c2861..074ab63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AI_SEMANTIC_INDEX_ENABLED` - Семантическое индексирование - `AI_SEMANTIC_INDEX_USE_BATCH` - Пакетная обработка при индексации - `CHATBOX_SENTRY_DSN` - Sentry DSN для Chatbox +- `CHATBOX_WRAPPING_KEY` - часть ключа для шифрования чатов - `SINGLE_TENANT` - Режим single-tenant для on-premise установок - `TSP_URL` - URL службы временных меток (http://qs.cryptopro.ru/tsp/tsp.srf) @@ -140,6 +141,7 @@ app: document_converter: image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-document-converter:latest" + wrappingKey: "" # Cгенерируйте: openssl rand -hex 16 replicas: 1 chatbox: From ea7652a2630b5a78ee9755959627d73ccdbdeb24 Mon Sep 17 00:00:00 2001 From: Dmitrii Sashchenko Date: Fri, 30 Jan 2026 10:40:49 +0000 Subject: [PATCH 3/6] ws -> chatbox --- .helm/templates/10-app-ingress.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.helm/templates/10-app-ingress.yaml b/.helm/templates/10-app-ingress.yaml index f5c1793..79a5b89 100644 --- a/.helm/templates/10-app-ingress.yaml +++ b/.helm/templates/10-app-ingress.yaml @@ -5,7 +5,7 @@ metadata: name: {{ .Chart.Name }}-ingress annotations: kubernetes.io/ingress.class: {{ .Values.ingress.className }} - nginx.org/websocket-services: {{ .Chart.Name }}-websocket + nginx.org/websocket-services: {{ .Chart.Name }}-chatbox nginx.ingress.kubernetes.io/proxy-body-size: "10m" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" @@ -18,11 +18,11 @@ spec: - host: {{ .Values.ingress.host | quote }} # something.example.com http: paths: - - path: /ws/ + - path: /chatbox/ pathType: Prefix backend: service: - name: {{ .Chart.Name }}-websocket + name: {{ .Chart.Name }}-chatbox port: number: 80 - path: / From c9ef6592d2ffa87ac38bdf835a5b49498608b5d1 Mon Sep 17 00:00:00 2001 From: Dmitrii Sashchenko Date: Fri, 6 Feb 2026 09:08:24 +0000 Subject: [PATCH 4/6] nats image 2.8 -> 2.10 for compatibility --- .helm/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.helm/values.yaml b/.helm/values.yaml index adfb24b..509671f 100644 --- a/.helm/values.yaml +++ b/.helm/values.yaml @@ -413,7 +413,7 @@ nats: enabled: true # Docker образ NATS - image: "nats:2.8" + image: "nats:2.10" # Количество реплик NATS # Для отказоустойчивости используйте 3 или 5 From a1bef4833995d9ff4269236fc02cfea436a57b09 Mon Sep 17 00:00:00 2001 From: Vlad Bubnov Date: Thu, 12 Feb 2026 11:34:23 +0300 Subject: [PATCH 5/6] add fileprocessor --- .helm/templates/09-file-processor.yaml | 34 ++++++++++++++++++++++++++ .helm/values.yaml | 7 ++++++ 2 files changed, 41 insertions(+) create mode 100644 .helm/templates/09-file-processor.yaml diff --git a/.helm/templates/09-file-processor.yaml b/.helm/templates/09-file-processor.yaml new file mode 100644 index 0000000..200df85 --- /dev/null +++ b/.helm/templates/09-file-processor.yaml @@ -0,0 +1,34 @@ +--- +{{ $name := printf "%s-file-processor" (.Chart.Name) }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $name }} + labels: + app: file-processor +spec: + minReadySeconds: 5 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + replicas: {{ .Values.app.file_processor.replicas }} + selector: + matchLabels: + service: {{ $name }} + template: + metadata: + labels: + service: {{ $name }} + spec: + imagePullSecrets: + - name: regsecret + containers: + - name: file-processor + image: {{ .Values.app.file_processor.image }} + imagePullPolicy: Always + env: + {{- include "envs_all" . | indent 12 }} + - name: VIDEO_CONVERTER_ENABLED + value: "false" diff --git a/.helm/values.yaml b/.helm/values.yaml index 509671f..e163427 100644 --- a/.helm/values.yaml +++ b/.helm/values.yaml @@ -183,6 +183,13 @@ app: # Если указано, будет смонтирован в /ca-cert secretName: "" + # File Processor - обработка файлов (конвертация, ресайз изображений) + file_processor: + # Docker образ file processor + image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-file-processor:1.0" + # Количество реплик + replicas: 1 + # Document Converter - конвертер документов (PDF, DOCX и др.) document_converter: # Docker образ document converter From a0a044ac327042d3ed84ba71584fa4be2c154629 Mon Sep 17 00:00:00 2001 From: Vlad Bubnov Date: Thu, 12 Feb 2026 11:37:14 +0300 Subject: [PATCH 6/6] docs --- CHANGELOG.md | 6 +++++- README.md | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 074ab63..0686a07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Goworker** (`09-goworker.yaml`) - Сервис интеграций с мессенджерами - Образ: `hrbox-goworker:2.7` - - Поддержка Telegram, WhatsApp и других мессенджеров - Prometheus metrics на порту 8686 - Настройки: `app.goworker` в values.yaml - Переменные: `GOWORKER_URL`, `GOWORKER_PUSH_MIN_INTERVAL`, `GOWORKER_SENTRY_DSN` @@ -33,6 +32,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Настройки: `app.document_converter` в values.yaml - Переменные: `PYTHONUNBUFFERED`, `DOCCONV_MAX_PARALLEL_TASKS` +- **File Processor** (`09-file-processor.yaml`) - Обработка файлов (конвертация, ресайз изображений) + - Образ: `hrbox-file-processor:1.0` + - Настройки: `app.file_processor` в values.yaml + - `VIDEO_CONVERTER_ENABLED` захардкожен в `false` (видео-конвертация отключена) + #### Новые переменные окружения - `SERVICES_INTERNAL_SECRET` - Секрет для межсервисной коммуникации diff --git a/README.md b/README.md index 726cb44..fdaf1f0 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,10 @@ kubectl create secret tls hrbox-tls --cert=cert.pem --key=key.pem - **cookieValidationKey** — 32 байта в hex (например: `openssl rand -hex 16`) - **encryptionKey** — 64 байта в base64 (например: `openssl rand -base64 48`) +- **servicesInternalSecret** — 64 байта в base64 (например: `openssl rand -base64 48`) +- **chatbox.wrappingKey** — 32 символа в hex (например: `openssl rand -hex 16`) -Эти ключи используются для защиты cookie и шифрования данных. +Эти ключи используются для защиты cookie, шифрования данных, межсервисной коммуникации и шифрования чатов. ### 4. Заполните обязательные параметры в `values.yaml`