c58465e7c8
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
4.0 KiB
4.0 KiB
Профиль клиента: предзаполнение мастера настройки под клиента
Цель: при подключении клиента часть настроек отличается от стандарта (коды НРД, базы QUIK/DEPO, папки, реквизиты). Эти отличия храним у себя на сервере лицензий (lic), администратор правит их в портале под конкретного клиента, а установка клиента получает их и предзаполняет мастер настройки. Оператор на месте всё может поправить — профиль ничего не перетирает.
Сторона bj (реализовано, internal/lkgateway/client_profile.go)
- Страница
/admin/setup/client-profile: «Скачать эталон» (текущая конфигурация стенда, секреты затёрты) и, для стенда, «Применить профиль» (вставить JSON). - Профиль применяется:
- при старте — если рядом с
setup.jsonлежитclient-profile.json(локальный фолбэк); - при активации/продлении ключа — из поля
config_profileответа сервера лицензий.
- при старте — если рядом с
- Семантика — предзаполнять только пустые разделы: раздел настроек, который ещё не настроен
(нулевой), заполняется из профиля; настроенный — не трогается. Разделы
License, служебные поля иquik_exportне заполняются никогда.
Формат профиля (JSON)
{
"tenant": "ООО Ромашка",
"note": "комментарий администратора",
"saved_at": "2026-10-16T09:00:00Z",
"settings": { "<подмножество разделов setup.json>": { ... } }
}
settings — то же дерево, что setup.json (разделы postgres, fancy_mssql, quik_mnp,
nsd, lk, alerts, auth, work_hours, … — заполнять только нужные клиенту). Секреты
(пароли, DSN, токены) в эталон не выгружаются — их заполняет администратор под клиента.
Сторона сервера лицензий (репозиторий zuevav/lic_Bridge-and-Join-s) — что сделать
- Хранить на каждого tenant объект профиля (структура выше), редактируемый администратором в портале (раздел клиента). Отправная точка — «эталон», выгруженный из стенда (кнопка на странице выше), дальше администратор подстраивает отличия.
- В ответы
POST /v1/activateиPOST /v1/renewдобавить необязательное полеconfig_profile— тот же объект профиля этого tenant (или опустить, если профиля нет). bj его примет без доработок (полеconfig_profileвlicenseReply,client_profile.go). - Формат токена/подписи не меняется —
config_profileидёт рядом сtoken, вне подписанного токена лицензии.
Договорённости
- Канал доставки профиля — обычный ответ сервера лицензий (не через M2M-шлюз).
- Профиль не перетирает настроенное: безопасен при повторной активации/продлении.
- Нет профиля (ни файла, ни
config_profile) — поведение мастера как раньше.