Files
hrbox-helm-chart/CHANGELOG.md
T
gnome627andClaude Opus 5 efc506e5de DEVOPS-117: чарт on-premise 3.0 — Nanabush Player, секреты в Secret, валидация values
Актуализация чарта по продовому .helm из HRBOX.

Nanabush Player перенесён из прода и упрощён под one-release-топологию
on-premise: без карт env/ci_dc, но с сохранёнными инвариантами (audience =
https://<host>, basePath отдельно от aud, allowlist обратного канала только
на внутрикластерный web, метрики на непубликуемом порту). Выделенного
поддомена в on-premise нет, поэтому плеер монтируется на основной домен под
/nanabush-player. Три переключателя для аварийного отката сохранены.

Из прода также перенесены: пул конвертации видео, PodDisruptionBudget для
web, OpenTelemetry-сайдкар, assetlinks, набор location в nginx (/healthz,
/health-check, потоковый /api/v1/integration/commit, /ai/, sw.js, шрифты).
Версии образов подтянуты к продовым.

Приведение чарта в порядок: все образы в блоке image, imagePullSecrets в
настройках, девять одинаковых define ресурсов заменены одним хелпером,
удалено ~100 строк мёртвого кода в _helpers.tpl, пароли и ключи уехали в
Secret и читаются через secretKeyRef, добавлены 00-validate.yaml и NOTES.txt.

Исправлено в 2.x:
- SERVICES_INTERNAL_SECRET имел захардкоженное значение по умолчанию, то есть
  все установки, где его не заполнили, работали на одном секрете межсервисной
  аутентификации;
- cluster.domain игнорировался: маршруты кластера NATS были захардкожены на
  cluster.local;
- CLUSTER_ADVERTISE без сегмента svc — ноды NATS объявляли соседям
  недостижимый адрес;
- nats.replicas и nats.cluster.replicas задавались независимо, при
  расхождении часть нод не входила в кластер;
- пробы web проверяли только TCP-порт 9000, поэтому под с неработающим PHP
  считался готовым;
- внутренние URL были захардкожены строками hrbox-* и молча ломались при
  nameOverride.

Имена объектов и селекторы Deployment не менялись — обновление 2.x -> 3.0 не
пересоздаёт объекты. Переехавшие ключи values.yaml чарт распознаёт и
останавливает установку с подсказкой; порядок перехода — в CHANGELOG.md.

Проверено: helm lint чистый; отрендерены 4 конфигурации (дефолт, всё
включено, плеер и инфра выключены, nameOverride); структурная проверка
рендера без замечаний; 20 негативных сценариев срабатывают с ожидаемыми
сообщениями; реалистичный values.yaml из 2.x последовательно ловится всеми
шестью guard'ами.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:37:42 +06:00

23 KiB
Raw Blame History

Changelog

All notable changes to the HRBox Helm chart will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

3.0.0 - 2026-09-02

Синхронизация с продовым окружением HRBox и приведение чарта в порядок: добавлен плеер учебных материалов, секреты перестали лежать открытым текстом в спеках подов, вместо девяти одинаковых блоков ресурсов — один хелпер, а неполная конфигурация теперь останавливает установку с внятным текстом.

Added

Nanabush Player

Проигрыватель учебных материалов: SCORM 1.2 и 2004, cmi5, xAPI, нативные курсы, тесты и эссе.

  • 09-nanabush-player.yaml — Deployment и Service, образ nanabush-player:1.0.11
  • 00-nanabush-player-secret.yaml — ключи launch-тикета и сессии
  • маршрут /nanabush-player на основном Ingress
  • настройки: app.nanabushPlayer в values.yaml, ресурсы — resources.nanabushPlayer
  • переменные NANABUSH_PLAYER_* в HRBox и PLAYER_* в самом плеере

On-premise-топология отличается от облачной: выделенного поддомена нет, плеер монтируется на основной домен под путём. Отсюда два ограничения, описанные в README: нет изоляции cookie между HRBox и содержимым курсов, и нужны синхронизированные часы (тикет живёт 5 минут).

Три независимых переключателя (enabled, ingress.enabled, deployment.enabled) сохранены для аварийного отката; чарт не даёт оставить маршрут без пода или раскатку без маршрута.

Проверка конфигурации

  • 00-validate.yaml — объектов не создаёт, но останавливает рендер, если не заполнены обязательные значения, использованы ключи из версии 2.x или нарушены инварианты плеера. Сообщения на русском, с указанием, что править.

Секрет приложения

  • 00-app-secret.yaml — единый Secret с паролями и ключами. Контейнеры читают его через secretKeyRef, поэтому kubectl get deploy -o yaml больше не показывает пароль базы и ключ шифрования.
  • secrets.existingSecret — подстановка Secret, созданного вне чарта.

Новые компоненты и возможности

  • 09-file-processor-video.yaml — отдельный пул конвертации видео с собственным профилем ресурсов, nodeSelector и tolerations (app.videoConverter.enabled, по умолчанию выключен)
  • 02-web-pdb.yaml — PodDisruptionBudget для web, создаётся начиная с двух реплик
  • 01-otel-configmap.yaml и sidecar-коллектор в поде web (app.tracing.enabled)
  • 01-nginx-assetlinks.yaml — привязка мобильных приложений к домену (app.mobileApps)
  • templates/NOTES.txt — что делать после установки, с готовыми командами и предупреждениями о небезопасных настройках

Новые переменные окружения

  • NATS_STREAM_REPLICAS — число реплик JetStream-стримов по размеру кластера
  • TELEGRAM_API_URL, AUTH_GOOGLE_ENABLED
  • LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET — видеозвонки
  • APP_INTERNAL_URL — внутренний адрес HRBox для конвертера
  • VIDEO_CONVERTER_ENABLED — отдельно для каждого пула
  • SENDER_ENV, IMAGE_RESIZE_MAX_PARALLEL, OTEL_*

Changed

Структура values.yaml

  • все образы собраны в блок image — обновление версии сервиса стало правкой одной строки
  • imagePullSecrets вынесен в настройки, regsecret больше не захардкожен
  • ключи приведены к camelCase: file_processor → fileProcessor, custom_policy → customPolicy
  • resources дополнен компонентами fileProcessor, fileProcessorVideo, nanabushPlayer, dragonfly, nats
  • адреса внутренних сервисов (app.geonames.url, app.goworker.url, app.kedoca.url, app.redis.host, app.nats.url) по умолчанию пустые и выводятся из имён, которые создаёт сам чарт. Раньше это были захардкоженные строки hrbox-*, которые молча ломались при nameOverride. Явно заданное значение по-прежнему используется как есть, поэтому старые values работают без правок. Выключение dragonfly или nats без указания внешнего адреса теперь останавливает установку

Шаблоны

  • _resources.tpl: девять почти одинаковых define заменены одним hrbox.resources; незаданные поля не рендерятся
  • _helpers.tpl: убрано около сотни строк мёртвого кода (хелперы nats.*, которыми ничего не пользовалось и которые ссылались на несуществующий nats.k8sClusterDomain); добавлены hrbox.component, hrbox.labels, hrbox.selectorLabels, hrbox.secretEnv и хелперы плеера
  • у всех объектов появились стандартные лейблы app.kubernetes.io/*; лейбл app сохранён, привычные kubectl get pods -l app=worker работают
  • селекторы Deployment не менялись — обновление 2.x → 3.0 не пересоздаёт объекты
  • аннотации checksum/* перезапускают поды при изменении конфигурации nginx или секрета приложения
  • образы, порты и таймауты вынесены из шаблонов в values.yaml

nginx

Набор location синхронизирован с продовым:

  • /healthz и /health-check — под них настроены пробы пода web (раньше проверялся только TCP-порт)
  • /api/v1/integration/commit — потоковая загрузка оргструктуры из 1С без буферизации тела, лимит 500 МБ
  • /ai/ — увеличенные таймауты
  • /.well-known/assetlinks.json и /.well-known/apple-app-site-association
  • /frontend/sw.js — корректные заголовки service worker
  • кеширование шрифтов
  • убран TLSv1 и TLSv1.1

Версии образов

Компонент Было Стало
chatbox 3.0 5.18
goworker 2.7 3.21.2
kedoca 0.8 1.0.6
geonames 3.1 3.3
file-processor 1.0 1.4.6
nanabush-player — 1.0.11

Джобы

  • имя содержит номер ревизии релиза: в kubectl get jobs видно, какой выкат запускал миграции, а повторный upgrade не спотыкается об уже существующий объект
  • ttlSecondsAfterFinished — час у обеих джоб (было 100 секунд у миграций и ничего у обновления кластера): логи упавшей джобы успевают дожить до того, как их посмотрят

Переименования файлов

  • 03-websocket.yaml → 03-chatbox.yaml (содержимое было chatbox с версии 2.0)
  • 09-geonames.yml → 09-geonames.yaml
  • 99-update-cluser-job.yaml → 99-update-cluster-job.yaml

Fixed

  • Общий секрет в коде чарта. SERVICES_INTERNAL_SECRET имел захардкоженное значение по умолчанию, то есть все установки, где его не заполнили, работали на одном и том же секрете межсервисной аутентификации. Теперь значение обязательно.
  • Домен кластера игнорировался. Маршруты кластера NATS были захардкожены на cluster.local, хотя cluster.domain присутствовал в values и использовался в соседней переменной. На кластере с нестандартным доменом ноды не находили друг друга.
  • CLUSTER_ADVERTISE без сегмента svc. Имя не резолвилось, и ноды NATS объявляли соседям недостижимый адрес.
  • Рассинхрон реплик NATS. nats.replicas и nats.cluster.replicas задавались независимо; при расхождении часть нод не входила в кластер. Теперь чарт требует их совпадения.
  • Пробы web не проверяли приложение. Проверялся TCP-порт 9000, поэтому под с неработающим PHP считался готовым. Теперь readiness ходит в /health-check через FPM.
  • Пароли и ключи больше не видны в спеках Deployment.
  • imagePullPolicy у части сервисов был Always на закреплённых тегах — лишние обращения к реестру при каждом рестарте пода.

Removed

  • secrets больше не имеет значений по умолчанию — пустые ключи останавливают установку вместо тихого запуска на предсказуемых секретах
  • убраны неиспользуемые хелперы nats.name, nats.fullname, nats.chart, nats.labels, nats.selectorLabels, nats.clusterAdvertise, nats.clusterRoutes, nats.extraRoutes, nats.tlsConfig, tplvalues.render
  • SENDGRID_API_KEY — не используется в on-premise

Migration Guide

Переход с 2.x на 3.0

Все переехавшие ключи чарт распознаёт и сообщает, куда именно они переехали, поэтому надёжнее всего запустить helm template и править по сообщениям.

Шаг 1. Перенесите образы в блок image

# было
app:
  image: "cr.yandex/.../hrbox:latest"
  chatbox:
    image: "cr.yandex/.../hrbox-chatbox:3.0"
  goworker:
    image: "cr.yandex/.../hrbox-goworker:2.7"
  kedoca:
    image: "cr.yandex/.../hrbox-kedoca:0.8"
  file_processor:
    image: "cr.yandex/.../hrbox-file-processor:1.0"
    replicas: 1

# стало
image:
  hrbox: "cr.yandex/.../hrbox:latest"
  chatbox: "cr.yandex/.../hrbox-chatbox:5.18"
  goworker: "cr.yandex/.../hrbox-goworker:3.21.2"
  kedoca: "cr.yandex/.../hrbox-kedoca:1.0.6"
  fileProcessor: "cr.yandex/.../hrbox-file-processor:1.4.6"
app:
  replicas:
    fileProcessor: 1

Шаг 2. Переименуйте ключи

Было Стало
app.file_processor app.fileProcessor
app.custom_policy app.customPolicy
app.custom_policy.privacy_url app.customPolicy.privacyUrl
app.custom_policy.terms_url app.customPolicy.termsUrl
app.goworker.replicas app.replicas.goworker
app.kedoca.replicas app.replicas.kedoca
app.goworker.sentryDsn app.sentry.goworkerDsn
app.chatbox.sentryDsn app.sentry.chatboxDsn
nats.image image.nats

Шаг 3. Заполните ключи плеера

openssl rand -base64 48   # app.nanabushPlayer.keys.ticketHs256
openssl rand -base64 48   # app.nanabushPlayer.keys.sessionHs256

Ключи должны отличаться друг от друга.

Шаг 4. Проверьте secrets.servicesInternalSecret

Если поле было пустым, установка работала на общем значении по умолчанию. Сгенерируйте своё: openssl rand -base64 48. После обновления перезапустятся все сервисы, обменивающиеся внутренними вызовами, — это ожидаемо.

Шаг 5. Проверьте рендер и обновитесь

helm template hrbox .helm -f values.yaml > /dev/null
helm upgrade hrbox .helm -n hrbox -f values.yaml

Шаг 6. Включите плеер

Порядок первого включения и проверки — в README, раздел «Nanabush Player».

Breaking Changes

  1. Ключи values.yaml переехали. Установка останавливается с подсказкой, молча ничего не игнорируется.
  2. secrets.* стали обязательными. Установка без них не пройдёт.
  3. Появился Nanabush Player. Это дополнительный под, Service, Secret и маршрут; учтите ресурсы кластера. Плеер требует синхронизированного времени на нодах.
  4. Пробы web стали строже. Под, где PHP-FPM не отвечает по HTTP, теперь не проходит readiness. Если приложение отдаёт /health-check иначе, проверьте это до обновления.
  5. app.replicas расширился полями goworker, kedoca, fileProcessor, fileProcessorVideo; соответствующие replicas внутри сервисов удалены.

2.0.0 - 2026-01-30

Масштабная актуализация чарта на основе продового окружения hrbox. Синхронизированы версии компонентов, добавлены новые микросервисы, обновлены переменные окружения.

Added

Новые микросервисы

  • Goworker (09-goworker.yaml) - Сервис интеграций с мессенджерами

    • Образ: hrbox-goworker:2.7
    • 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
  • File Processor (09-file-processor.yaml) - Обработка файлов (конвертация, ресайз изображений)

    • Образ: hrbox-file-processor:1.0
    • Настройки: app.file_processor в values.yaml
    • VIDEO_CONVERTER_ENABLED захардкожен в false (видео-конвертация отключена)

Новые переменные окружения

  • SERVICES_INTERNAL_SECRET - Секрет для межсервисной коммуникации
  • AI_DOCS_INDEX_ENABLED - Включение индексации документов через AI
  • 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)

Новые секреты

  • 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.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, File Processor, Chatbox всегда деплоятся

Templates

  • _envs.tpl:

    • Упрощена логика переменных окружения
    • Удалены условия для обязательных сервисов
    • Добавлен блок envs_kedoca для настроек криптографии
  • _resources.tpl:

    • Добавлены определения: goworker_resources, kedoca_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

# 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: ""

  file_processor:
    image: "cr.yandex/crphnph9c2s776j32sjd/hrbox-file-processor:1.0"
    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: Сгенерируйте новый секрет

# Генерация servicesInternalSecret
openssl rand -base64 48

Шаг 3: Обновите Chart

helm upgrade hrbox .helm/ \
  --namespace hrbox \
  --values your-values.yaml

Шаг 4: Проверьте новые поды

# Проверка новых сервисов
kubectl get pods -n hrbox -l app=goworker
kubectl get pods -n hrbox -l app=kedoca
kubectl get pods -n hrbox -l app=file-processor
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, File Processor, Chatbox всегда деплоятся

    • Требуются дополнительные ресурсы кластера
    • Проверьте доступность ресурсов перед обновлением
  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)
  • File Processor деплоится с VIDEO_CONVERTER_ENABLED=false (видео-конвертация отключена)

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