Актуализация чарта по продовому .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>
23 KiB
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.1100-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_ENABLEDLIVEKIT_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.yaml99-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
- Ключи
values.yamlпереехали. Установка останавливается с подсказкой, молча ничего не игнорируется. secrets.*стали обязательными. Установка без них не пройдёт.- Появился Nanabush Player. Это дополнительный под, Service, Secret и маршрут; учтите ресурсы кластера. Плеер требует синхронизированного времени на нодах.
- Пробы
webстали строже. Под, где PHP-FPM не отвечает по HTTP, теперь не проходит readiness. Если приложение отдаёт/health-checkиначе, проверьте это до обновления. 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- Включение индексации документов через AIAI_SEMANTIC_INDEX_ENABLED- Семантическое индексированиеAI_SEMANTIC_INDEX_USE_BATCH- Пакетная обработка при индексацииCHATBOX_SENTRY_DSN- Sentry DSN для ChatboxCHATBOX_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-256Miresources.kedoca- CPU: 0.1-0.5, Memory: 196Mi-256Miresources.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
⚠️ Критические изменения, требующие действий:
-
WebSocket → Chatbox: Обязательное переименование конфигурации
- Service name изменился с
{chart}-websocketна{chart}-chatbox - Если есть зависимости от старого имени сервиса - обновите их
- Service name изменился с
-
Новые обязательные сервисы: Goworker, Kedoca, File Processor, Chatbox всегда деплоятся
- Требуются дополнительные ресурсы кластера
- Проверьте доступность ресурсов перед обновлением
-
Новый секрет:
secrets.servicesInternalSecretобязателен- Приложение не запустится без этого секрета
- Сгенерируйте перед деплоем
-
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