Настройка файла appsettings.json
Файл appsettings.json содержит конфигурацию сервиса bs-backend в формате JSON. Данный файл используется для управления доступом групп пользователей и настройки баз данных.
Внимание! Некоторые значения из .env могут переопределять параметры в файле appsettings.json. В связи с этим ряд параметров целесообразнее изменять через файл .env, чтобы избежать ручного поиска и правок соответствующих значений в appsettings.json. Какие параметры могут быть переопределены — указано в файле .env.
Файл appsettings.json находится по следующему пути:
.../DockerCompose/bs-backend/settings
Файл appsettings.json необходимо настраивать на основе файла "Содержимое appsettings.jsonc", в котором наглядно показано, какая настройка за что отвечает. Часть настроек в appsettings.json уже будет заполнена и изменений не требует (например, настройки «Queues» (очереди Kafka)).
В случае использования PostgreSQL в качестве СУБД дополнительные настройки не требуются. В файле appsettings.json уже приведена базовая конфигурация для подключения. Если вы используете MS SQL Server, то необходимо учесть следующию особенности:
- В
Serverсамостоятельно указать IP и порт сервера MS SQL Server через запятую. - В
DbTypeуказатьMSSQL. - Использовать параметр
TrustServerCertificate— используется для решения проблем с сертификатами со значениемtrueв случае возникновения ошибок проверки SSL-сертификата (например, при использовании самоподписанных сертификатов на стороне SQL-сервера). Данная настройка позволяет веб-серверу доверять сертификату сервера базы данных без дополнительной проверки цепочки доверия, если они есть.
Примеры для подключения баз PostgreSQL и MS SQL Server присутствуют в файле "Содержимое appsettings.jsonc".
Внимание! Блок "Настройки гипервизора WebServer" файла appsettings.json содержит настройки по умолчанию для минимальной конфигурации. В случае использования более производительных конфигураций рекомендуется изменить настройки этого блока для обеспечения лучшей производительности у пользователей.
Файл "Содержимое appsettings.jsonc"
Файл Содержимое appsettings.jsonc находится по следующему пути:
.../DockerCompose/bs-backend/settings
Он содержит подробный перечень параметров, которые можно использовать в файле appsettings.json и их подробное описание.
Для справочных целей текст файла Содержимое appsettings.jsonc из актуальной версии приведен ниже в данной статье справки. Если вы используете не последнюю версию программы, соответствующий файл у вас может отличаться, в этом случае вам следует руководствоваться вашей версией файла.
{
// === Язык пользователя по умолчанию ===
"DefaultLanguage": "ru",
// === Настройки логирования через Serilog ===
"Serilog": {
"Using": [ "Serilog.Sinks.Console" ], // Используем консольный sink для вывода логов
"MinimumLevel": {
"Default": "Information", // Минимальный уровень логов по умолчанию
"Override": {
"Microsoft": "Information", // Уровень логирования для пространства Microsoft
"System": "Information", // Уровень логирования для пространства System
"Yarp": "Error" // Уровень логирования для пространства Yarp
}
},
"WriteTo": [
{
"Name": "Console", // Вывод логов в консоль
"Args": {
"formatter": "WebServer.Services.CustomLogFormat, WebServer" // Пользовательский формат логов
}
}
]
},
"AllowedHosts": "*", // Разрешить подключение с любых хостов
// === Настройки интеграции с OnlyOffice Document Server ===
"DocService": {
"ServerUrl": "->env", // URL текущего WebServer’а, переопределяется в env
"DocumentServerUrl": "->env", // URL OnlyOffice сервера, переопределяется в env
"Token": "->env" // Токен авторизации для обмена документами, переопределяется в env
},
// === Настройки кэша (Redis) ===
"DistributedCache": {
"ConnectionString": "->env", // Строка подключения к Redis, переопределяется в env
"CommonKeyPrefix": "->env" // Префикс всех ключей, которых веб-сервер хранит в Redis, переопределяется в env
},
// === Настройки пользовательских сессий ===
"Session": {
"IdleTimeout": "00:30:00", // Время бездействия пользователя до перевода сессии в ждущий режим (высвобождется лицензия)
"TokenRefreshTimeout": "01:00:00", // Период обновления токена OpenId
"ExpireTimeout": "3.00:00:00", // Общий срок жизни сессии, по истечении которого она будет удалена (потребуется повторная аутентификация)
"UndoClearTimeout": "1.00:00:00", // Период очистки устаревшего кэша Undo операций
"UseSameSiteNoneCookie": false, // Использовать SameSite=None (разрешает передачу cookie в cross-site запросах) для куки сессии
"DefaultTimeZone": "->env", // Используемый часовой пояс, переопределяется в env
// Индивидуальные издания (лицензии) для пользователей и групп
// Записи обрабатываются сверху вниз по принципу первого совпадения
// Поэтому порядок должен быть от более специфичных к более общим
// Например: пользователь A состоит группе B, группа B состоит в группе C
// Чтобы у A, B и C были разные Edition, необходимо указывать:
// сначала A, затем B, и только потом C, как в примере ниже
"UsersEditions": [
{
"UserId": "S-1-5-21-...-1268", // Пользователь A
"Edition": "Professional" // Редакция: Professional
},
{
"UserId": "S-1-5-21-...-1238", // Группа B
"Edition": "Enterprise" // Редакция: Enterprise
},
{
"UserId": "S-1-1-0", // Группа "Все" (группа С)
"Edition": "Ultimate" // Редакция: Ultimate
}
],
// Приоритет выбора издания, если не удалось определить по настройкам выше
"EditionsPriority": [ "Ultimate", "Enterprise", "Professional", "Viewer" ]
},
// Назначение групп пользоватей/или пользователя администратором сервера (необходимо для выполнения некоторых технических url запросов)
"ServerAdministratorsIds": [
"S-1-5-21-...-1123"
],
// === Гипервизор WebServer ===
// Управляет клиентскими и фоновыми процессами
//
// === Группировка процессов ===
// Группа: [БД].[ветка].[редакция]
// Для фоновых процессов: [БД].[ветка].[редакция].[очередь]
//
// Все лимиты и параметры применяются на уровне группы
//
// === Именование процессов ===
// [БД].[ветка].[редакция]_[индекс процесса в группе]
"WebServerHypervisor": {
"WebServerInactivityTimeout": "00:10:00", // Время простоя, после которого веб-сервер будет остановлен гипервизором
"RequestAbortTimeout": "00:01:00", //Ттаймаут прерывания запроса
"EnableUnixDomainSockets": true, // Использовать Unix domain sockets для связи между гипервизором и клиентскими процессами
"DefaultClientProcessMaxCount": 5, // Максимум клиентских процессов в группе (по умолчанию)
"DefaultClientProcessPreloadCount": 3, // Предзапуск клиентских процессов в группе (по умолчанию)
"DefaultClientProcessIncrementCount": 1, // Шаг масштабирования клиентских процессов (по умолчанию)
"TotalMemoryLimit": 16384, // Максимальный размер оперативной памяти, потребляемый процессами WebServer’а, при достижении которого дополнительные процессы перестанут запускаться, MB
"ProcessMemoryLimit": 2048, //Максимальный размер оперативной памяти, которую может использовать один процесс; при превышении процесс будет остановлен, MB
"DefaultJobsProcessMaxCount": 3, // Максимум фоновых процессов в группе (по умолчанию)
"DefaultJobsProcessPreloadCount": 0, // Предзапуск фоновых процессов в группе (по умолчанию)
"DefaultJobsProcessIncrementCount": 1, // Шаг масштабирования фоновых процессов (по умолчанию)
"DefaultJobsQueues": [ // Конфигурация очередей фоновых задач по умолчанию
{
"Name": "server_actions", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"All"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"AppPlatform.Web.FileUtils.RebuildReportLongOp", // Построение отчёта при полном переформировании кэша отчётов в БД
"AppPlatform.Web.WebUtils.BuildReportsCache" // Сформировать кэш всех отчётов БД и поставить их в очередь на формирование
]
},
{
"Name": "ui_actions", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"All"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"AppPlatform.Web.Deletion.DeleteObjectsFromDialog", // Удалить объекты
"BizArch.Web.ExplorerActions.CopyLinkNodes", // Копировать связи в дереве объектов
"BizArch.Web.ExplorerActions.MoveLinkNodes", // Переместить связи в дереве объектов
"BizArch.Web.ExplorerActions.CopyObjectsFromDialog", // Копировать объекты
"BizArch.Web.ExplorerActions.DropObjectsFromDialog", // Переместить объекты
"BizArch.Web.WebUtils.ImitateAndShowResults", // Провести имитацию риска
"BizArch.Web.ImportExportUtils.ImportBPMN" // Выполнить импорт BPMN
],
"JobsProcessPreloadCount": 1 // Переопределение дефолтного параметра для данной очереди; возможно переопределение любого дефолтного параметра для любой очереди
},
{
"Name": "ui_low_priority_actions", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"All"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"AppPlatform.Web.FileUtils.RebuildReport" // Построить отчет
]
},
{
"Name": "default", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"All"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"All"
]
}
],
"DbConnections": [ // Перечень подключений к базам данных
// Подключение к PostgreSQL
{
"Server": "postgresql:5432", // Адрес сервера
"Db": "empty_ru_pg", // Имя БД
"Name": "empty_ru_pg", // Алиас подключения
"DisplayName": "empty_ru_pg", // Отображаемое имя
"DbType": "PGSQL", // Тип СУБД
"SqlUser": "SqlUser", // Пользователь
"SqlPass": "SqlPass", // Пароль
// Конфигурация веток и редакций
// Ключ "Branches" является опциональным и используется в случае особой конфигурации группы
// Например, необходимо для ветки 0 иметь 2 предзапущеных процесса с редакцией "Ultimate"
"Branches": [
{
"Branch": 0, // Идентификатор ветки
"Editions": [
{
"Edition": "Ultimate", // Редакция
"ClientProcessMaxCount": 4, // Максимум клиентских процессов в группе
"ClientProcessPreLoadCount": 2, // Предзапуск процессов в группе
"ClientProcessIncrementCount": 1 // Шаг масштабирования процессов
}
],
"JobsQueues": [ // Опциональный список очередей задач для группы (ветка + редакция)
// Используется для приоритизации выполнения задач (например, генерации отчётов) для конкретных групп пользователей в заданной ветке.
// Наличие очереди гарантирует минимальные задержки обработки.
{
"Name": "server_actions_custom", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"S-1-5-21-...-1023"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"AppPlatform.Web.FileUtils.RebuildReportLongOp", // Построение отчёта при полном переформировании кэша отчётов в БД
"AppPlatform.Web.WebUtils.BuildReportsCache" // Сформировать кэш всех отчётов БД и поставить их в очередь на формирование
]
},
{
"Name": "ui_low_priority_actions_custom", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"S-1-5-21-...-1023"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"AppPlatform.Web.FileUtils.RebuildReport" // Построить отчет
]
}
]
}
],
"DefaultJobsQueues": [ // Очереди задач по умолчанию для БД, является опциональным
{
"Name": "ui_actions_custom", // Название очереди
"Users": [ // Пользователи, для которых эта очередь доступна
"All"
],
"ServerMethods": [ // Методы, выполняемые в очереди
"AppPlatform.Web.Deletion.DeleteObjectsFromDialog", // Удалить объекты
"BizArch.Web.ExplorerActions.CopyLinkNodes", // Копировать связи в дереве объектов
"BizArch.Web.ExplorerActions.MoveLinkNodes", // Переместить связи в дереве объектов
"BizArch.Web.ExplorerActions.CopyObjectsFromDialog", // Копировать объекты
"BizArch.Web.ExplorerActions.DropObjectsFromDialog", // Переместить объекты
"BizArch.Web.WebUtils.ImitateAndShowResults", // Провести имитацию риска
"BizArch.Web.ImportExportUtils.ImportBPMN" // Выполнить импорт BPMN
],
"JobsProcessPreloadCount": 3 // Переопределение дефолтного параметра для данной очереди; возможно переопределение любого дефолтного параметра для любой очереди
}
]
},
// Подключение к MSSQL
{
"Server": "***,***", // Адрес сервера (IP,PORT)
"Db": "empty_ru_db", // Имя БД
"Name": "empty_ru_db", // Алиас подключения
"DisplayName": "empty_ru_db", // Отображаемое имя
"DbType": "MSSQL", // Тип СУБД
"TrustServerCertificate": true, // Доверие сертификату сервера
"SqlUser": "SqlUser", // Пользователь
"SqlPass": "SqlPass", // Пароль
// Конфигурация веток и редакций
"Branches": [
{
"Branch": 0, // Идентификатор ветки
"Editions": [
{
"Edition": "Ultimate", // Редакция
"ClientProcessMaxCount": 4, // Максимум клиентских процессов в группе
"ClientProcessPreLoadCount": 2, // Предзапуск процессов в группе
"ClientProcessIncrementCount": 1 // Шаг масштабирования процессов
}
]
// "JobsQueues": [] // Опциональный список очередей задач для группы (ветка + редакция)
}
]
// "DefaultJobsQueues": [] // Очереди задач по умолчанию для БД, является опциональным
}
],
// настройки NodeJS-службы
"NodeJSSettings": {
"NODE_JS_PROTOCOL": "->env", // Протокол взаимодействия, переопределяется в env
"NODE_JS_HOST": "->env", // Хост, где работает NodeJS-сервис, переопределяется в env
"NODE_JS_PORT": 111 // Порт NodeJS, переопределяется в env
},
"MainHost": "***", // Основной хост для веб-сервера
"Synonyms": [ "***" ], // Альтернативное доменное имя
"OldHosts": [] // Список устаревших хостов (для обратной совместимости)
},
// === Настройки подключения к LDAP (Active Directory) ===
"Ldap": {
"Server": "***", // Адрес LDAP/LDAPS сервера (например: ldap.local )
"Port": "***", // Порт для подключения к LDAP/LDAPS серверу
"UseSsl": false, // Использовать ли SSL (LDAPS): false - обычный LDAP, true – защищенное соединение LDAPS
"Login": "***", // Учётные данные для подключения к LDAP/AD
"Password": "***",
// Дополнительные настройки (опционально)
// Фильтр поиска пользователя в каталоге.
// {UserIdClaimValue} — значение пользователя, полученное из OpenID (например, логин или email).
// По умолчанию используется поиск по userPrincipalName.
// Пример альтернативы — поиск по objectSid:
"UserFilter": "(&(objectCategory=person)(objectClass=user)(objectSid={UserIdClaimValue}))",
// Фильтр поиска групп пользователя.
// {groupCN} — имя группы (CN) в каталоге.
"GroupFilter": "(&(objectCategory=group)(name={groupCN}))",
// Атрибут LDAP, который будет использоваться для сопоставления пользователя,
// если он найден по фильтру (заменяет значение UserIdClaim).
// По умолчанию используется objectSid.
"UserMatchAttribute": "objectSid",
// Указывает, является ли значение атрибута строкой.
// true — если атрибут строковый
// false — если бинарный (например, objectSid)
"UserMatchAttributeIsStringValue": false
},
// === Настройки OpenID Connect (Keycloak) ===
"OpenId": {
"Authority": "->env", // Адрес сервера аутентификации, переопределяется в env
"ClientId": "->env", // Идентификатор клиента, переопределяется в env
"ClientSecret": "->env", // Секретный ключ клиента, переопределяется в env
"Scopes": [ "openid", "email" ], // Запрашиваемые области данных о пользователе
"UserNameClaim": "name", // Поле с именем пользователя в JWT токене
"UserIdClaim": "email", // Поле с уникальным идентификатором пользователя в JWT токене
"UserRolesClaim": "roles", // Поле со списком идентификаторов ролей (групп) пользователя в JWT токене
"UserRolesSeparator": "|" // Разделитель идентификаторов ролей пользователя, если в одном значении указан список
},
// === Настройки Proxy ===
"ProxyHeadersForwarding": {
"ForwardedHeaders": [ // Задаёт заголовки, которые нужно обрабатывать
"None" // Означает, что обработка отключена; нужно убрать, если требуется задать конкретные заголовки
//"XForwardedFor", // Типичная конфигурация
//"XForwardedProto",
//"XForwardedHost"
],
"KnownProxies": [ // Список адресов доверенных прокси-серверов; пустой список означает доверие всем
//"127.0.0.1",
//"::1"
],
"KnownNetworks": [ // Список доверенных подсетей; пустой список означает доверие всем
/*{
"Prefix": "0.0.0.0",
"PrefixLength": 0
}*/
],
"ForwardLimit": 1 // Допустимое число промежуточных прокси-узлов между клиентом и сервером
},
// === Настройки Kafka (очереди сообщений) ===
"Queues": {
"ClientConfig": {
"bootstrap.servers": "kafka:9092", // Адрес брокера Kafka
"security.protocol": "Plaintext" // Используемый протокол
},
// Пример описания очереди
"messages": {
"enabled": "true", // Флаг включения очереди
"ClientConfig": { "client.id": "messages admin client" },
"TopicSpecification": {
"Name": "messages", // Имя топика
"ReplicationFactor": "1", // Фактор репликации
"NumPartitions": "1", // Количество партиций
"Configs": { "cleanup.policy": "delete" } // Политика очистки
},
"ProducerConfig": { "client.id": "Messages producer" }, // Настройки продюсера
"ConsumerConfig": {
"client.id": "Messages consumer", // Настройки консюмера
"group.id": "messages_consumer" // Идентификатор группы консюмера
}
}
// Остальные очереди аналогичны по структуре
}
}