| security.jwt.validation.enable | boolean | Включает базовую верификацию токена, включающее в себя поле exp. | true | false |
| security.jwt.validation.issuer | String | Включает верификацию по issuer, включается только при security.jwt.validation.enable = true. При пустом значении не верифицируется. | https://example.com | null |
| security.jwt.validation.public_key | String(base64) | Включает верификацию по ключу, включается только при security.jwt.validation.enable = true. При пустом значении не верифицируется. | ZGFzaGJvYXJk | null |
| security.roles.allowed | String[] | Включает авторизацию по ролям. В случае, если пользователь не имеет ни одной указанной роли, доступ к ресурсам отклоняется | role1,role2,role3 | null |
Собранный образ фронтенда имеет возможность работать как полноценное standalone приложение, так и как удалённый модуль MFe. Для настройки Mfe следует указать следующие переменные:
* MFE_BASE_URL - указывается frontend/.env, либо в переменных среды сборки приложения. При изменении переменной приложение надо пересобирать. По умолчанию /mfe/account-applications
-`webbpm.db.query_limit_enabled` - флаг, отвечающий за вывод сообщений о превышении лимитов на количество возвращаемых записей. По умолчанию - false.
-`webbpm.db.select_records_max_limit` - максимальный лимит возвращаемых строк для запросов в БД, при превышении/равенстве данного лимита будет выброшена ошибка (*целое числовое значение*). По умолчанию - 100000
-`webbpm.db.select_records_min_limit` - минимальный лимит возвращаемых строк для запросов в БД, при превышении/равенстве данного лимита в логи будет выведен warning (*целое числовое значение*). По умолчанию - 1000
-`webbpm.db.execution_time_threshold`. The threshold for time of executing a statement. Система выводит сообщение в логи при превышении. Действует для запросов, созданных в jOOQ. По умолчанию - 1000 миллисекунд
-`webbpm.db.result_read_time_threshold`. The threshold for time of fetching a set of records from a ResultSet.
. Система выводит сообщение в логи при превышении. Действует для запросов, созданных в jOOQ. По умолчанию - 50 миллисекунд
-`webbpm.db.results_count_threshold`. Система выводит сообщение в логи при превышении. Действует для запросов, созданных в jOOQ. По умолчанию - 1000 записей
-`webbpm.db.full_time_threshold`. Ограничение на полное время выполнения запроса. Система выводит сообщение в логи при превышении. Действует для запросов, созданных в jOOQ. По умолчанию sum(webbpm.db.result_read_time_threshold, webbpm.db.execution_time_threshold) миллисекунд
-`webbpm.db.query_timeout`. Ограничение на время выполнения запроса. При превышении запрос будет отклонен. Действует для запросов, созданных в jOOQ в dev режиме. По умолчанию 120 секунд.
Почтовый сервер - зарегистрированный актуальный почтовый адрес. В поле password нужно указывать не пароль для входа в почту, а создать пароль для приложений в учетке почты и указать его.
2. Для включения регистрации добавьте в *standalone.xml* свойство
#### Настройка браузера для входа в систему с помощью Kerberos
1. Запустите браузер firefox.
2.В адресной строке введите about:config, нажать кнопку "я принимаю на себя риск"
3.С помощью поиска найдите параметр network.negotiate-auth.trusted-uris и в качестве значения ввести домен(например для домена example.com надо ввести .example.com)
4. Откройте в браузере приложение. Пример [http://app.example.com/](http://app.example.com/) . Приложение должно открыться без запроса логина/пароля
## Восстановление структуры БД
На основе БД проекта с помощью jOOQ генерируются Java классы для каждого объекта БД. Это происходит по нажатию кнопки Обновить на панели БД в студии. При необходимости можно сформировать DDL на основе данных классов. Пример класса для генерации DDL
```
package ru.cg.webbpm.test_project.db_beans;
import org.jooq.*;
import org.jooq.impl.*;
public class Main {
public static void main (String args []) {
DefaultConfiguration defaultConfiguration = new DefaultConfiguration();
-`webbpm.cache.hazelcast.kubernetes.service_name` - имя сервиса в среде kubernetes,
используемый для обнаружения других подов. Подходит как стратегия обнаружения, если используется
kubernetes
-`webbpm.cache.hazelcast.outbound_port_definitions` - исходящие порты hazelcast. по дефолту не задано, система сама выбирает свободные порты. Задать диапазон 5801 - 5820
-`webbpm.cache.hazelcast.backup_count`. Нужны чтобы когда сервер выключается был доступен бекап. Если предполагается выключать несколько серверов за раз, то нужно увеличить.
Данный бекап делает копии синхронно с основной записью и операция записи ждет пока будет записана везде. Можно делать бекап асинхронно, настраивается через async_backup_count
подробнее про бекапы [Hazelcast IMDG Reference Manual](https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#backing-up-maps) . по дефолту 1
## Подключение компоненты адреса в режиме ГАР (Государственный адресный реестр)
Необходимо задать параметры:
-`gar.enable` - флаг, который включает/отключает сервис для работы с ГАР. Должен быть задан для работы компоненты в режиме ГАР. По умолчанию true, для отключения задать false.
-`gar.elastic.url.host` - хост на котором развернут elasticsearch.
-`gar.elastic.password` - пароль для аутентификации elasticsearch.
Дополнительные параметры:
-`gar.elastic.url.port` - порт на котором развернут elasticsearch.
-`gar.elastic.username` - логин для аутентификации elasticsearch.
Отчет собирается раз в 30 секунд по дефолту, меняется параметром `webbpm.metrics.report_period_ms`.
Все метрики идут за отчетный период, после сбора отчета они сбрасываются.
Получить json со всеми метриками можно по урлу `backend/metrics/v1/all` - метрики будут с последнего собранного отчета, запрос не триггерит сбор отчета - это независимые операции. Отчет содержит только метрики по которым был совершен хотя бы один вызов в отчетный период. То есть, если какая-то операция не была совершена в отчетный период, то соответствующая ей метрика не попадет в отчет - ее не будет в json.
### Значения метрик
Все метрики идут за отчетный период, после сбора отчета они сбрасываются.
Нас в основном интересуют `callsCountSum`, `latencyMin`, `latencyAvg`, `latencyMax`
-`callsCountSum` - количество завершенных вызовов
-`latencyMin` - минимальное время выполнения
-`latencyAvg` - среднее время выполнения
-`latencyMax` - максимальное время выполнения
-`activeCallsCountMax` - количество начатых, но еще не завершенных вызовов.
-`activeCallsLatencyMax` - длительность самого долгого еще не завершенного вызова
### Текущие метрики приложения
- Получение коннекта из пула
-`webbpm.jbpm.db.connection.acquire`
-`webbpm.security.db.connection.acquire`
-`webbpm.db.connection.acquire`
- Время с момента получения коннекта до возврата его в пул
-`webbpm.jbpm.db.connection.in_use`
-`webbpm.security.db.connection.in_use`
-`webbpm.db.connection.in_use`
- Время выполнения запроса на бд проекта
-`webbpm.db.query.success.execution_time`
- Время выполнения запроса на бд проекта + время получения коннекта из пула
-`webbpm.db.query.success.full_time`
- active-users-count.indicatorMax
- active-users-count-ttl.indicatorMax
# Количество пользователей
-`webbpm.active_users_counter.enabled` - включает подсчет пользователей, нужно чтобы не запускать hazelcast на дев машинах. по дефолту false. На боевых серверах необходимо установить в true.
-`webbpm.active_users_counter.max_time_between_operations_in_seconds` - время, которое пользователь считается активным после действия. по дефолту 15 минут.
-`webbpm.active_users_counter.hazelcast.app_pool_size`. Запись в hazelcast производится асинхронно в отдельном пуле, не блокируя обработку http запроса. Это размер этого пула. по дефолту 4. Можно пока оставить 4 и последить за метриками pool.hazelcast-executor.queue.indicatorMax и pool.hazelcast-executor.activeThreads.indicatorMax. Если очередь будет сильно копиться, то увеличить.
## Настройка логов
Все настройки делаются в файле `standalone.xml`, если не указано иначе.
### Общие настройки
Платформа Web-bpm использует корневую категорию логирования `ru.cg.webbpm`, рекомендуется выставлять ее в уровень `info`. todo check prod config
```xml
<loggercategory="ru.cg.webbpm">
<levelname="INFO"/>
</logger>
```
При этом компоненты используемые в проекте могут использовать другие категории.
### Параметры конфигурации
**Рекомендованное использование:** всегда в `info`.
Все параметры конфигурации загружаемые платформой web-bpm и пользовательским приложением через api webbpm логируются категорией `ru.cg.webbpm.modules.core.app_info.api.property.BaseProperty`. Она всегда должна быть выставлена в `info`.
Пример вывода:
```
2017-12-04 16:02:19,074 INFO [ru.cg.webbpm.modules.core.app_info.api.property.BaseProperty] (EclipseGeminiBlueprintExtenderThread-1) System property [webbpm.active_users_counter.enabled] not set. Using default value [false]
2017-12-04 16:02:19,074 INFO [ru.cg.webbpm.modules.core.app_info.api.property.BaseProperty] (EclipseGeminiBlueprintExtenderThread-1) System property [webbpm.active_users_counter.hazelcast.hosts] set to [127.0.0.1]
```
### БД проекта
#### Логирование запросов в бд security и бд проекта
**Рекомендованное использование:** только при разработке.
Использовать только при разработке. Категория `org.jooq.tools.LoggerListener` в `debug` уровень.
```xml
<loggercategory="org.jooq.tools.LoggerListener">
<levelname="DEBUG"/>
</logger>
```
Пример вывода:
```
2017-12-04 18:21:10,391 DEBUG [org.jooq.tools.LoggerListener] (default task-19) Executing query : select "department"."department_name", "department"."department_id", "department"."parent_department_id", "department"."parent_department_id", "department"."department_id", (select (count(*) <> ?) from "public"."department" as "$$child" where "$$child"."parent_department_id" = "department"."department_id") as "$$hasChildren" from "public"."department" as "department" limit ?
2017-12-04 18:21:10,395 DEBUG [org.jooq.tools.LoggerListener] (default task-19) -> with bind values : select "department"."department_name", "department"."department_id", "department"."parent_department_id", "department"."parent_department_id", "department"."department_id", (select (count(*) <> 0) from "public"."department" as "$$child" where "$$child"."parent_department_id" = "department"."department_id") as "$$hasChildren" from "public"."department" as "department" limit 2147483647
2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) Fetched result : +-----------------+-------------+--------------------+--------------------+-------------+-------------+
**Рекомендованное использование:** всегда в `info`, с подобранными для проекта значениями. В проде значения должны быть проверены что они не вызывают излишнее логирование.
1. Для отслеживания больших запросов в пользовательскую базу нужно задать параметры что считать большими запросами, логироваться будут запросы больше заданных показателей.
Чтобы логировать все запросы можно задать значение `-1`. Добавляются как property в раздел `system-properties`:
-`webbpm.db.full_time_threshold` - полное время выполнения запроса в миллисекундах. Включает построение запроса библиотекой, выполнение и загрузку результатов. Пример сообщения <br>`2023-01-11 13:09:38,361 WARN [ru.cg.webbpm.modules.database.impl.analytics.PerformanceListener] (default task-33) Query full time threshold exceeded. full_time=[6565ms] execution_time=[6565ms] read_time=[0ms] results_count=[4] query=[<your query>]`
-`webbpm.db.results_count_threshold` - количество записей, которое вернул запрос. Пример сообщения <br>`2023-01-11 13:10:34,088 WARN [ru.cg.webbpm.modules.database.impl.analytics.PerformanceListener] (default task-41) Query results count threshold exceeded. results_count=[11177] query=[<your query>]`
В`debug` режиме дополнительно к работающим в info:
-`webbpm.db.execution_time_threshold` - время выполнения запроса + построения запроса библиотекой.
-`webbpm.db.result_read_time_threshold` - время чтения результатов запроса
2. После задания настроек нужно настроить логирование - категория `ru.cg.webbpm.modules.database.impl.analytics.PerformanceListener`, уровень `info` или `debug`.
18:21:06,938 DEBUG [org.hibernate.SQL] (default task-47) select names0_.Task_Names_Id as Task_Nam7_16_0_, names0_.id as id1_16_0_, names0_.id as id1_16_1_, names0_.language as language2_16_1_, names0_.shortText as shortTex3_16_1_, names0_.text as text4_16_1_ from I18NText names0_ where names0_.Task_Names_Id=?
**Рекомендованное использование:** только при разработке в случае необходимости.
1. Время выполнения запроса и количество результатов.
Включаются категорией `org.hibernate.stat` в `debug`. При этом в hibernate должен быть включен сбор статистики.
Похоже что логируется только hql select запросов.
```xml
<loggercategory="org.hibernate.stat">
<levelname="DEBUG"/>
</logger>
```
Пример вывода:
```
18:21:06,858 DEBUG [org.hibernate.stat.internal.ConcurrentStatisticsImpl] (default task-41) HHH000117: HQL: select t from AuditTaskImpl t where t.taskId = :taskId, time: 6ms, rows: 1
```
2. Показатели hibernate сессий
Включаются категорией `org.hibernate.engine.internal.StatisticalLoggingSessionEventListener` в `info`.
При этом в hibernate должен быть включен сбор статистики. Тут может быть интересно количество запросов, флашей и общее время на все запросы сессией.
Пример вывода:
```
2017-12-04 17:25:58,493 INFO [org.hibernate.engine.internal.StatisticalLoggingSessionEventListener] (default task-21) Session Metrics {
297556 nanoseconds spent executing 1 flushes (flushing a total of 16 entities and 0 collections);
430168 nanoseconds spent executing 1 partial-flushes (flushing a total of 16 entities and 16 collections)
}
```
#### Логирование hbm2ddl
**Рекомендованное использование:** всегда в `trace`.
Должно быть включено всегда. Позволяет убедиться что hibernate не накатывал никакие миграции на базу. Этот функционал отключен у нас в коде.
```xml
<loggercategory="org.hibernate.tool.hbm2ddl">
<levelname="TRACE"/>
</logger>
```
# Описание параметров конфигурации клиентской части
Свойства задаются в файле frontend/src/resources/app-config.json или frontend.war/src/resources/app-config.json
## Общие
-`dev_mode` - настройка задающая dev_mode для просмотра логов (true/false). При отсутствие оставляет значение при сборке
-`guard.confirm_exit` - выводить или нет диалог подтверждения, если обнаружены несохраненные данные в форме. Значение по умолчанию - false.
-`password.pattern` - Регулярное выражение для валидации пароля.
-`password_pattern_error` - Сообщение об ошибке валидации.
-`show.client.errors` - отвечает за отображение ошибок javascript-a пользователю (должна использоваться только в тестовых контурах) по умолчанию выключена
- 'available_task.single_fetch' - Отвечает за количество запросов available_task при завершении процесса. true - одиночный запрос, false/не указано - 10 запросов(старая реализация).
## Вывод сообщений
-`message_service_error_timeout` время в мс, в течение которого будет отображено сообщение об ошибке. Значение по умолчанию - таймаут не задан (окно не закрывается).
-`message_service_warning_timeout` время в мс, в течение которого будет отображено предупреждающее сообщение. Значение по умолчанию - таймаут не задан (окно не закрывается).
-`message_service_success_timeout` время в мс, в течение которого будет отображено сообщение об успехе. Значение по умолчанию - таймаут не задан (окно не закрывается).
-`message_service_info_timeout` время в мс, в течение которого будет отображено информационное сообщение. Значение по умолчанию - таймаут не задан (окно не закрывается).
## Электронная подпись
### Esmart
-`electronic_sign.esmart_extension_url` - url для создания расширенной подписи. Подробная информация по ссылке [http://demo.esmart.ru](http://demo.esmart.ru)
-`electronic_sign.tsp_address` - адрес сервера службы штампов времени