Иерархия настроек ВКС¶
Три уровня настроек¶
┌─────────────────────────────────────────────────────────┐
│ Уровень 1: JitsiServiceSettings (глобальный) │
│ Одна запись на площадку. Настраивается в │
│ Администрирование → Сервисы → ВКС │
│ │
│ Определяет: │
│ • Домен, секрет, префикс комнат │
│ • Модератор (SmartScript/SmartFilter) │
│ • Security bypass │
│ • Робот-пользователь (ConferenceUserId) │
│ • Очередь + поток (для AI-саммаризации) │
│ • CanTranscribe (глобальное вкл/выкл транскрибации) │
│ • Группа пользователей с персональными комнатами │
├─────────────────────────────────────────────────────────┤
│ Уровень 2: Subcategories (уровень Категории) │
│ По записи на каждую Категорию. Настраивается в │
│ Администрирование → Категории → [Категория] → ВКС │
│ │
│ Определяет: │
│ • Кто может управлять записью/расшифровкой/лобби/паролем│
│ • Дефолтные значения для новых комнат в этой категории │
│ • Авто-запуск записи и расшифровки при старте │
├─────────────────────────────────────────────────────────┤
│ Уровень 3: ConferenceRooms (уровень комнаты) │
│ По записи на каждую комнату. Настраивается │
│ пользователем через UI (шестерёнка в шапке задачи) │
│ │
│ Определяет: │
│ • Конкретные значения для этой комнаты │
│ • HasLobby, Password, Recording, Transcription │
└─────────────────────────────────────────────────────────┘
Уровень 1: JitsiServiceSettings¶
Глобальная конфигурация ВКС-сервиса. Одна запись на площадку.
| Колонка | Тип | Описание |
|---|---|---|
ServiceId |
int FK | Ссылка на ServicesSettings |
Domain |
nchar(50) | Домен Jitsi (<видео-сервер>) |
Secret |
varchar(100) | JWT_APP_SECRET |
ConferenceUserId |
int? FK | Робот для комментариев |
QueueId |
int? FK | Очередь для AI-обработки |
MessageFlowId |
int? FK | Поток для саммаризации |
CanTranscribe |
bit | Глобальное разрешение транскрибации |
UserRoomPrefix |
— | Префикс комнат (в ExtInfo) |
IsModeratorSmartFilterId |
int? | SmartFilter модератора (deprecated) |
CheckIsModeratorSmartScriptId |
int? | SmartScript модератора |
CheckSecurityBypassSmartFilterId |
int? | SmartFilter bypass lobby |
CheckSecurityBypassSmartScriptId |
int? | SmartScript bypass lobby |
ExtInfo (JSON): externalModuleKey, roomCreationKey, recordHost, recordsApiKey, internalModuleKey.
Подробнее: ../integrations/README.md.
Уровень 2: Subcategories (настройки Категории)¶
Добавлены в v2.266 (add-vks-settings.sql). 9 колонок в таблице Subcategories:
Уровни разрешений (ConfPermLevel)¶
| Id | Значение | Описание |
|---|---|---|
| 1 | ByChatRights |
По правам чата — заказчик, исполнитель, подписчик |
| 2 | AdminOnly |
Только администратор категории |
| 3 | Forbidden |
Запрещено всем |
Колонки¶
| Колонка | Тип | Default | Описание |
|---|---|---|---|
ConfRecordingPermLevelId |
tinyint FK | 2 (AdminOnly) | Кто управляет записью |
ConfTranscriptionPermLevelId |
tinyint FK | 2 (AdminOnly) | Кто управляет расшифровкой |
ConfLobbyPermLevelId |
tinyint FK | 2 (AdminOnly) | Кто управляет лобби |
ConfPasswordPermLevelId |
tinyint FK | 2 (AdminOnly) | Кто управляет паролем |
IsConfRecordingEnabledByDefault |
bit | 1 | Разрешить запись для новых комнат |
IsConfTranscriptionEnabledByDefault |
bit | 1 | Разрешить расшифровку для новых комнат |
IsConfLobbyEnabledByDefault |
bit | 1 | Лобби по умолчанию для новых комнат |
IsConfRecordingOnStart |
bit | 1 | Авто-запуск записи при старте |
IsConfTranscriptionOnStart |
bit | 1 | Авто-запуск расшифровки при старте |
Дефолты для чатов: категории P2P и групповых чатов (Settings.ChatSubcatID, GroupChatSubCatID) получают ByChatRights (1) вместо AdminOnly (2).
Видимость настроек в UI¶
Логика в conference-settings-visibility.util.ts:
| Пользователь | Условие видимости опции |
|---|---|
| Администратор категории или площадки | Опция видна при любом значении кроме Forbidden |
| Заказчик / владелец чата / модератор | Опция видна только если ByChatRights |
Меню настроек ВКС скрывается полностью, если все 4 группы = Forbidden.
Уровень 3: ConferenceRooms (настройки комнаты)¶
Создаётся при первом изменении настроек конкретной комнаты пользователем.
| Колонка | Тип | Default | Описание |
|---|---|---|---|
RoomKey |
varchar(32) | — | user{id} / task{id} / random |
HasLobby |
bit | 0 | Лобби включено |
Password |
nvarchar(100) | null | Пароль (зашифрован) |
IsRecordingAllowed |
bit | 1 | Запись разрешена |
IsRecordingOnByDefault |
bit | 1 | Запись при старте |
IsTranscribationAllowed |
bit | 1 | Расшифровка разрешена |
IsTranscribationOnByDefault |
bit | 1 | Расшифровка при старте |
Кто может менять¶
| Тип комнаты | Кто может |
|---|---|
Персональная (user{id}) |
Только владелец |
Задачная (task{id}) |
Только заказчик задачи |
Проверка в ConferenceSettingsService.UpdateRoomSettingsForTask/ForUser.
Взаимодействие уровней¶
Записи и расшифровка¶
Пользователь нажимает «Запись»
│
├─ Глобально разрешено? (CanTranscribe для расшифровки)
│ └─ Нет → запрещено
│
├─ Категория разрешает? (ConfRecordingPermLevelId != Forbidden)
│ └─ Нет → запрещено
│ └─ AdminOnly → только администратор
│ └─ ByChatRights → любой участник
│
└─ Комната разрешает? (IsRecordingAllowed)
└─ Нет → запрещено
└─ Да → запись
Лобби¶
Новая комната
│
├─ Категория: IsConfLobbyEnabledByDefault = 1?
│ └─ Да → лобби включено по умолчанию
│ └─ Нет → лобби выключено
│
└─ Пользователь меняет настройку (если ConfLobbyPermLevelId != Forbidden)
└─ ConferenceRooms.HasLobby = true/false
Авто-запуск при старте¶
Конференция начинается
│
├─ Категория: IsConfRecordingOnStart = 1 И ConfRecordingPermLevelId != Forbidden?
│ └─ Да → iframe-клиент запускает запись автоматически
│
└─ Комната: IsRecordingOnByDefault?
└─ Значение передаётся в room-info, клиент решает
Как настройки попадают в JWT и room-info¶
GET /api/conference/room-token → JWT:
• moderator: true/false (из SmartScript)
• context.user.security_bypass: true/false
• context.room.lobby: HasLobby
• context.room.password: Password (зашифрован)
GET /api/conference/room-info → JSON:
• IsPrivate, HasLobby, Password
• IsRecordingAllowed, IsRecordingOnByDefault
• IsTranscribationAllowed, IsTranscribationOnByDefault
iframe-клиент (conference/main.js) использует room-info для решения об авто-запуске записи/расшифровки.
Диагностика¶
Пользователь не видит настройки ВКС¶
- Проверить
ConfRecordingPermLevelId,ConfTranscriptionPermLevelId,ConfLobbyPermLevelId,ConfPasswordPermLevelIdвSubcategoriesдля категории задачи - Если все = 3 (Forbidden) → меню скрыто
- Проверить роль пользователя:
isUserAdminInCategoryдля AdminOnly-опций
Запись не запускается автоматически¶
Subcategories.IsConfRecordingOnStart= 1?Subcategories.ConfRecordingPermLevelId!= 3 (Forbidden)?ConferenceRooms.IsRecordingAllowed= 1?ConferenceRooms.IsRecordingOnByDefault= 1?- Jibri доступен? (проверить Brewery MUC)
SQL¶
-- Настройки категории
SELECT SubcatID, ConfRecordingPermLevelId, ConfTranscriptionPermLevelId,
ConfLobbyPermLevelId, ConfPasswordPermLevelId,
IsConfRecordingEnabledByDefault, IsConfTranscriptionEnabledByDefault,
IsConfLobbyEnabledByDefault, IsConfRecordingOnStart, IsConfTranscriptionOnStart
FROM Subcategories WHERE SubcatID = @subcatId;
-- Настройки комнаты
SELECT * FROM ConferenceRooms WHERE RoomKey = @roomKey;
-- Глобальные
SELECT CanTranscribe FROM JitsiServiceSettings;
Связанные документы¶
docs/platform/meet/backend-integration.md— API настроек комнат (секция 2.4)docs/platform/meet/moderator.md— определение модератораdocs/domains/conferences/frontend.md— видимость настроек в UI (секция 8)- архивной инструкции по настройкам категории — настройки категории в админке