Справка Business Studio
Переход на сайт нейросети Perplexity AI для поиска информации о Business Studio. Подробнее о возможности см. по ссылке

Содержание справки

Настройка файла 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, то необходимо учесть следующию особенности:

  1. В Server самостоятельно указать IP и порт сервера MS SQL Server через запятую.
  2. В DbType указать MSSQL.
  3. Использовать параметр 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" // Идентификатор группы консюмера
            }
        }

        // Остальные очереди аналогичны по структуре
    }
}