chart 3.0
This commit is contained in:
+91
-92
@@ -7,63 +7,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [3.0.0] - 2026-09-02
|
||||
|
||||
Синхронизация с продовым окружением HRBox и приведение чарта в порядок:
|
||||
добавлен плеер учебных материалов, секреты перестали лежать открытым текстом
|
||||
в спеках подов, вместо девяти одинаковых блоков ресурсов — один хелпер,
|
||||
а неполная конфигурация теперь останавливает установку с внятным текстом.
|
||||
Чарт подтянут к тому, как HRBox работает в облаке: добавлен плеер учебных
|
||||
материалов, пароли и ключи уехали в Secret, повторяющиеся куски шаблонов
|
||||
заменены одним хелпером, а неполная конфигурация теперь останавливает
|
||||
установку с понятным сообщением.
|
||||
|
||||
### Added
|
||||
|
||||
#### Nanabush Player
|
||||
|
||||
Проигрыватель учебных материалов: SCORM 1.2 и 2004, cmi5, xAPI, нативные
|
||||
курсы, тесты и эссе.
|
||||
Плеер учебных материалов: 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` на общем Ingress
|
||||
- настройки `app.nanabushPlayer`, ресурсы `resources.nanabushPlayer`
|
||||
- переменные `NANABUSH_PLAYER_*` в HRBox и `PLAYER_*` в самом плеере
|
||||
|
||||
On-premise-топология отличается от облачной: выделенного поддомена нет,
|
||||
плеер монтируется на основной домен под путём. Отсюда два ограничения,
|
||||
описанные в README: нет изоляции cookie между HRBox и содержимым курсов,
|
||||
и нужны синхронизированные часы (тикет живёт 5 минут).
|
||||
В on-premise выделенного поддомена нет, поэтому плеер стоит на основном
|
||||
домене по пути. Отсюда два ограничения, они описаны в README: cookie HRBox
|
||||
доступны содержимому курсов, и нужны синхронизированные часы — тикет живёт
|
||||
5 минут.
|
||||
|
||||
Три независимых переключателя (`enabled`, `ingress.enabled`,
|
||||
`deployment.enabled`) сохранены для аварийного отката; чарт не даёт оставить
|
||||
маршрут без пода или раскатку без маршрута.
|
||||
Для быстрого отката оставлены три переключателя: `enabled`,
|
||||
`ingress.enabled`, `deployment.enabled`. Маршрут без пода или включённый
|
||||
плеер без маршрута чарт не пропустит.
|
||||
|
||||
#### Проверка конфигурации
|
||||
|
||||
- `00-validate.yaml` — объектов не создаёт, но останавливает рендер, если
|
||||
не заполнены обязательные значения, использованы ключи из версии 2.x или
|
||||
нарушены инварианты плеера. Сообщения на русском, с указанием, что править.
|
||||
- `00-validate.yaml` — объектов не создаёт, но останавливает установку, если
|
||||
не заполнены обязательные значения, остались ключи из версии 2.x или
|
||||
нарушены требования плеера. Сообщения на русском, с указанием, что править.
|
||||
|
||||
#### Секрет приложения
|
||||
#### Secret приложения
|
||||
|
||||
- `00-app-secret.yaml` — единый Secret с паролями и ключами. Контейнеры
|
||||
- `00-app-secret.yaml` — один Secret со всеми паролями и ключами. Поды
|
||||
читают его через `secretKeyRef`, поэтому `kubectl get deploy -o yaml`
|
||||
больше не показывает пароль базы и ключ шифрования.
|
||||
- `secrets.existingSecret` — подстановка Secret, созданного вне чарта.
|
||||
- `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`
|
||||
- `09-file-processor-video.yaml` — отдельные поды для конвертации видео,
|
||||
со своими ресурсами, `nodeSelector` и `tolerations`
|
||||
(`app.videoConverter.enabled`, по умолчанию выключено)
|
||||
- `02-web-pdb.yaml` — PodDisruptionBudget для `web`, создаётся от двух реплик
|
||||
- `01-otel-configmap.yaml` и коллектор OpenTelemetry рядом с `web`
|
||||
(`app.tracing.enabled`)
|
||||
- `01-nginx-assetlinks.yaml` — привязка мобильных приложений к домену
|
||||
(`app.mobileApps`)
|
||||
- `templates/NOTES.txt` — что делать после установки, с готовыми командами
|
||||
и предупреждениями о небезопасных настройках
|
||||
|
||||
#### Новые переменные окружения
|
||||
|
||||
- `NATS_STREAM_REPLICAS` — число реплик JetStream-стримов по размеру кластера
|
||||
- `NATS_STREAM_REPLICAS` — число реплик стримов JetStream по размеру кластера
|
||||
- `TELEGRAM_API_URL`, `AUTH_GOOGLE_ENABLED`
|
||||
- `LIVEKIT_URL`, `LIVEKIT_API_KEY`, `LIVEKIT_API_SECRET` — видеозвонки
|
||||
- `APP_INTERNAL_URL` — внутренний адрес HRBox для конвертера
|
||||
@@ -72,52 +70,53 @@ On-premise-топология отличается от облачной: выд
|
||||
|
||||
### Changed
|
||||
|
||||
#### Структура values.yaml
|
||||
#### values.yaml
|
||||
|
||||
- все образы собраны в блок `image` — обновление версии сервиса стало
|
||||
правкой одной строки
|
||||
- `imagePullSecrets` вынесен в настройки, `regsecret` больше не захардкожен
|
||||
- все образы собраны в блок `image`: сменить версию сервиса — это правка
|
||||
одной строки
|
||||
- `imagePullSecrets` вынесен в настройки, `regsecret` больше не зашит
|
||||
в шаблоны
|
||||
- ключи приведены к camelCase: `file_processor` → `fileProcessor`,
|
||||
`custom_policy` → `customPolicy`
|
||||
- `resources` дополнен компонентами `fileProcessor`, `fileProcessorVideo`,
|
||||
- в `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` без указания внешнего адреса
|
||||
теперь останавливает установку
|
||||
`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` и хелперы плеера
|
||||
`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 не пересоздаёт
|
||||
лейбл `app` остался, привычный `kubectl get pods -l app=worker` работает
|
||||
- селекторы Deployment не менялись, обновление 2.x → 3.0 не пересоздаёт
|
||||
объекты
|
||||
- аннотации `checksum/*` перезапускают поды при изменении конфигурации nginx
|
||||
или секрета приложения
|
||||
- аннотации `checksum/*` перезапускают поды при изменении конфигурации
|
||||
nginx или Secret приложения
|
||||
- образы, порты и таймауты вынесены из шаблонов в values.yaml
|
||||
|
||||
#### nginx
|
||||
|
||||
Набор `location` синхронизирован с продовым:
|
||||
Набор `location` синхронизирован с облачным:
|
||||
|
||||
- `/healthz` и `/health-check` — под них настроены пробы пода `web`
|
||||
- `/healthz` и `/health-check` — на них настроены пробы пода `web`
|
||||
(раньше проверялся только TCP-порт)
|
||||
- `/api/v1/integration/commit` — потоковая загрузка оргструктуры из 1С без
|
||||
буферизации тела, лимит 500 МБ
|
||||
- `/api/v1/integration/commit` — потоковая загрузка оргструктуры из 1С
|
||||
без буферизации, лимит 500 МБ
|
||||
- `/ai/` — увеличенные таймауты
|
||||
- `/.well-known/assetlinks.json` и `/.well-known/apple-app-site-association`
|
||||
- `/frontend/sw.js` — корректные заголовки service worker
|
||||
- `/frontend/sw.js` — правильные заголовки service worker
|
||||
- кеширование шрифтов
|
||||
- убран TLSv1 и TLSv1.1
|
||||
- убраны TLSv1 и TLSv1.1
|
||||
|
||||
#### Версии образов
|
||||
|
||||
@@ -132,56 +131,56 @@ On-premise-топология отличается от облачной: выд
|
||||
|
||||
#### Джобы
|
||||
|
||||
- имя содержит номер ревизии релиза: в `kubectl get jobs` видно, какой выкат
|
||||
запускал миграции, а повторный `upgrade` не спотыкается об уже существующий
|
||||
- в имени появился номер ревизии релиза: в `kubectl get jobs` видно, какой
|
||||
выкат запускал миграции, а повторный `upgrade` не спотыкается о старый
|
||||
объект
|
||||
- `ttlSecondsAfterFinished` — час у обеих джоб (было 100 секунд у миграций и
|
||||
ничего у обновления кластера): логи упавшей джобы успевают дожить до того,
|
||||
как их посмотрят
|
||||
- `ttlSecondsAfterFinished` — час у обеих джоб (было 100 секунд у миграций
|
||||
и ничего у обновления кластера), логи упавшей джобы успевают дожить до
|
||||
того, как их посмотрят
|
||||
|
||||
#### Переименования файлов
|
||||
|
||||
- `03-websocket.yaml` → `03-chatbox.yaml` (содержимое было chatbox с версии 2.0)
|
||||
- `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` имел захардкоженное
|
||||
значение по умолчанию, то есть все установки, где его не заполнили, работали
|
||||
- **Общий секрет у всех установок.** У `SERVICES_INTERNAL_SECRET` было
|
||||
значение по умолчанию, зашитое в чарт: все, кто его не заполнил, работали
|
||||
на одном и том же секрете межсервисной аутентификации. Теперь значение
|
||||
обязательно.
|
||||
- **Домен кластера игнорировался.** Маршруты кластера NATS были захардкожены
|
||||
на `cluster.local`, хотя `cluster.domain` присутствовал в values и
|
||||
использовался в соседней переменной. На кластере с нестандартным доменом
|
||||
ноды не находили друг друга.
|
||||
- **`CLUSTER_ADVERTISE` без сегмента `svc`.** Имя не резолвилось, и ноды NATS
|
||||
объявляли соседям недостижимый адрес.
|
||||
- **Рассинхрон реплик NATS.** `nats.replicas` и `nats.cluster.replicas`
|
||||
задавались независимо; при расхождении часть нод не входила в кластер.
|
||||
Теперь чарт требует их совпадения.
|
||||
обязательное.
|
||||
- **`cluster.domain` не использовался.** Маршруты кластера NATS были зашиты
|
||||
на `cluster.local`, хотя параметр в values был и применялся в соседней
|
||||
переменной. На кластере с другим доменом ноды не находили друг друга.
|
||||
- **`CLUSTER_ADVERTISE` без сегмента `svc`.** Имя не резолвилось, ноды NATS
|
||||
сообщали соседям недостижимый адрес.
|
||||
- **Разные значения реплик NATS.** `nats.replicas` и `nats.cluster.replicas`
|
||||
задавались независимо, при расхождении часть нод не входила в кластер.
|
||||
Теперь чарт требует, чтобы они совпадали.
|
||||
- **Пробы `web` не проверяли приложение.** Проверялся TCP-порт 9000, поэтому
|
||||
под с неработающим PHP считался готовым. Теперь readiness ходит в
|
||||
`/health-check` через FPM.
|
||||
под с неработающим PHP считался готовым. Теперь readiness ходит
|
||||
в `/health-check` через FPM.
|
||||
- Пароли и ключи больше не видны в спеках Deployment.
|
||||
- `imagePullPolicy` у части сервисов был `Always` на закреплённых тегах —
|
||||
- У части сервисов `imagePullPolicy` был `Always` на фиксированных тегах —
|
||||
лишние обращения к реестру при каждом рестарте пода.
|
||||
|
||||
### Removed
|
||||
|
||||
- `secrets` больше не имеет значений по умолчанию — пустые ключи
|
||||
останавливают установку вместо тихого запуска на предсказуемых секретах
|
||||
- убраны неиспользуемые хелперы `nats.name`, `nats.fullname`, `nats.chart`,
|
||||
- у `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
|
||||
`nats.clusterRoutes`, `nats.extraRoutes`, `nats.tlsConfig`,
|
||||
`tplvalues.render`
|
||||
- `SENDGRID_API_KEY` — в on-premise не используется
|
||||
|
||||
### Migration Guide
|
||||
|
||||
#### Переход с 2.x на 3.0
|
||||
|
||||
Все переехавшие ключи чарт распознаёт и сообщает, куда именно они переехали,
|
||||
поэтому надёжнее всего запустить `helm template` и править по сообщениям.
|
||||
Все переехавшие ключи чарт узнаёт и пишет, куда именно они переехали,
|
||||
поэтому проще всего запустить `helm template` и править по сообщениям.
|
||||
|
||||
**Шаг 1. Перенесите образы в блок `image`**
|
||||
|
||||
@@ -225,20 +224,20 @@ app:
|
||||
| `app.chatbox.sentryDsn` | `app.sentry.chatboxDsn` |
|
||||
| `nats.image` | `image.nats` |
|
||||
|
||||
**Шаг 3. Заполните ключи плеера**
|
||||
**Шаг 3. Сгенерируйте ключи плеера**
|
||||
|
||||
```bash
|
||||
openssl rand -base64 48 # app.nanabushPlayer.keys.ticketHs256
|
||||
openssl rand -base64 48 # app.nanabushPlayer.keys.sessionHs256
|
||||
```
|
||||
|
||||
Ключи должны отличаться друг от друга.
|
||||
Ключи должны быть разными.
|
||||
|
||||
**Шаг 4. Проверьте `secrets.servicesInternalSecret`**
|
||||
|
||||
Если поле было пустым, установка работала на общем значении по умолчанию.
|
||||
Сгенерируйте своё: `openssl rand -base64 48`. После обновления перезапустятся
|
||||
все сервисы, обменивающиеся внутренними вызовами, — это ожидаемо.
|
||||
все сервисы, которые ходят друг к другу, — это нормально.
|
||||
|
||||
**Шаг 5. Проверьте рендер и обновитесь**
|
||||
|
||||
@@ -249,21 +248,21 @@ helm upgrade hrbox .helm -n hrbox -f values.yaml
|
||||
|
||||
**Шаг 6. Включите плеер**
|
||||
|
||||
Порядок первого включения и проверки — в README, раздел «Nanabush Player».
|
||||
Порядок включения и проверки — в README, раздел «Nanabush Player».
|
||||
|
||||
#### Breaking Changes
|
||||
|
||||
1. **Ключи `values.yaml` переехали.** Установка останавливается с подсказкой,
|
||||
молча ничего не игнорируется.
|
||||
2. **`secrets.*` стали обязательными.** Установка без них не пройдёт.
|
||||
2. **`secrets.*` стали обязательными.** Без них установка не пройдёт.
|
||||
3. **Появился Nanabush Player.** Это дополнительный под, Service, Secret и
|
||||
маршрут; учтите ресурсы кластера. Плеер требует синхронизированного времени
|
||||
маршрут, учтите ресурсы кластера. Плееру нужно синхронизированное время
|
||||
на нодах.
|
||||
4. **Пробы `web` стали строже.** Под, где PHP-FPM не отвечает по HTTP, теперь
|
||||
не проходит readiness. Если приложение отдаёт `/health-check` иначе,
|
||||
проверьте это до обновления.
|
||||
5. **`app.replicas` расширился** полями `goworker`, `kedoca`, `fileProcessor`,
|
||||
`fileProcessorVideo`; соответствующие `replicas` внутри сервисов удалены.
|
||||
5. **В `app.replicas` добавились** `goworker`, `kedoca`, `fileProcessor`,
|
||||
`fileProcessorVideo`; поля `replicas` внутри самих сервисов удалены.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user