From b477348facb87d378f24b7fbb68dfc882e53ea22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D0=BB=D1=82=D0=BE=D0=B1=D0=B8=D0=BD=20=D0=95?= =?UTF-8?q?=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9?= Date: Thu, 14 Aug 2025 13:38:26 +0300 Subject: [PATCH] updated config.md --- config.md | 825 ++++-------------------------------------------------- 1 file changed, 47 insertions(+), 778 deletions(-) diff --git a/config.md b/config.md index 52b3332..e21bd46 100644 --- a/config.md +++ b/config.md @@ -1,807 +1,76 @@ -# Описание параметров конфигурации сервера приложений - -Файл /standalone/configuration/standalone.xml - -## Общие - -- `webbpm.security.login.case_sensitive`. Default value = true. Параметр отвечающий за чувствительность к регистру при обработке логина пользователя. - - true - Login и login, обрабатываются как разные логины. - - false - Login и login, обрабатывается как один и тот же логин. -- `webbpm.db.pool_size`. Нужен только для `webbpm.mode` = development. -- `webbpm.mode`. Режим работы приложения. Значения - development, production. - - development - в этом режиме используется соединение к БД проекта, заданное в Studio. - - production - в этом режиме используется соединение к БД проекта, заданное с помощью jndi имени. - -## jBPM - -- `com.arjuna.ats.arjuna.allowMultipleLastResources` -- `webbpm.jbpm.audit-log.disabled` - флаг, отвечающий за включение/отключение аудита jBPM -- `webbpm.jbpm.cleaner_cron` - cron расписание автоматической очистки БД JBPM, по умолчанию "-" т.е. выключен. Очищаются незавершенные процессы. -- `webbpm.jbpm.cleaner_timeout` - время, спустя которое процесс считается устаревшим. По умолчанию - 10 часов. -- `webbpm.jbpm.finished_process_cleaner_cron` - cron расписание автоматической очистки аудита процессов в БД JBPM, по умолчанию "-" - т.е. выключен -- `webbpm.jbpm.finished_process_cleaner_timeout` - время, спустя которое процесс считается устаревшим. По умолчанию - 10 часов. - -Пример: - -```xml - - - -``` - -### jBPM Runtime Strategy - -Возможные варианты runtime strategy: - -- SINGLETON -- PER_REQUEST (значение по умолчанию) -- PER_PROCESS_INSTANCE -- PER_CASE - -Пример: - -```xml - -``` - -## Способ аутентификации - -- authentication.method - способ аутентификации. Поддерживаемые способы аутентификации: form, kerberos, cert_over_db, cert_over_ldap - -### По логину и паролю - -Пример конфигурации: - -```xml - -``` - -### По сертификату - -- cert_over_db - проверка наличия пользователя в базе данных безопасности -- cert_over_ldap - проверка наличия пользователя в базе данных безопасности и в LDAP - -Примеры: - -```xml - - -``` - -Параметр способа аутентификации authentication.method должен быть также установлен на клиентской части приложения в app-config.json - -Также для аутентификации по сертификату нужны свойства для хранилища сертификатов: - -- certificate.keystore.location - путь до java key store. Key store - это хранилище доверенных сертификатов, с помощью которых можно проверить корневой сертификат. Сертификат устанавливается с помощью команды: - - ```text - keytool -importcert -alias myAlias -file Example.cer -keystore exampleKeyStore - ``` - -- certificate.keystore.password - пароль для keystore, установленный при импорте сертификата - -Примеры: - -```xml - - -``` - -### Kerberos - -Получите от администратора Kerberos .keytab файл, из которого командой `klist -k http.keytab` можно получить список principal-ов -Проверить успешность авторизации principal-а можно командой `kinit -t -i http.keytab %principal%`. -В -случае успешной авторизации команда `klist` в качестве default principal которым проводилась авторизация. -После этого в standalone.xml поправить параметр `app.service-principal` на principal, которым успешно авторизовались. principal имеет формат: `HTTP/%hostname%@%REALM%` - -Пример конфигурации: - -```xml - - - -``` - -- app.service-principal. Пример - HTTP/oleg-rxserver.alt.dom@ALT.DOM -- app.keytab-location - расположение keytab файла. Пример - ${jboss.home.dir}/ -- http.keytab. - -Также необходимо в настройках браузера на клиенте задать параметр `network.negotiate-auth.trusted-uris` задать значение `.%domain%`. -Пример: - -```xml -.ALT.DOM -``` - -### Ldap - -Аутентификация происходит посредством логина и пароля синхронизированного пользователя Ldap. -Логин и пароль введенные в форму входа, будут проверены сервисом Ldap. - -Пример конфигурации: - -```xml - - - - - -``` - -#### Настройка сервера приложений для работы с Kerberos - -1. создать учетные записи в домене: - - - тестовые для проверки работоспособности функционала (пользователи домена, почтовые ящики): - - `User1 pass1 user1@example.com` - - `User2 pass2 user2@example.com` - - - сервисную для доступа сервиса(приложения) к MS AD - (пользователь домена - снять устаревание пароля, ограничение по времени действия, почтовый ящик): - - `serviceUser servicePass serviceuser@example.com` - - --- - -2. завести учетную запись машины `appserver.machine.name` (fqdn-имя сервиса) в AD (вручную, как запись в computer) и в DNS (A-запись) - - `appserver.machine.name 10.250.216.91` - -3. сгенерировать keytab (утилита ktpass) для аутентификации сервисов(приложения) для единой точки входа - `serviceUser` - с именем test.file.name.keytab - привязав к ней пользователя serviceUser - - например, так: - - ``` - ktpass -princ http/appserverMachineName.example.com@example.com -mapuser example.com\serviceUser -pass "пароль_уз_serviceUser" -crypto All -ptype KRB5_NT_PRINCIPAL -out "путь_к_директории_выгрузки_файла\test.file.name.keytab" - ``` - -##### Kerberos FAQ - -- В случае, если авторизация не проходит и в логах сервера приложений присутствует следующий вывод: - - ``` - 2019-05-14 05:33:36,588 INFO [security.controller.KerberosAuthenticationController] (default task-3) Authentication request header Authorization not exists - 2019-05-14 05:33:36,588 INFO [security.controller.KerberosAuthenticationController] (default task-3) Authentication object is not presented - ``` - - необходимо проверить настройку браузера firefox `network.negotiate-auth.trusted-uris`, она должна соответствовать домену из principal-а. - Для этого в поисковую строку браузера вводим "about:config", в открывшемся окне нажимаем "accept with risk and continue", в поисковой строке открывшейся страницы ввести `network.negotiate-auth.trusted-uris`. - Пример: для principal-а `HTTP/oleg-rxserver.alt.dom@ALT.DOM` настройка в браузере должна быть `.alt.dom`, приложение в браузере должно открываться по `http:\\oleg-rxserver.alt.dom:8080\...` - -- если в логах сервера приложений есть ошибка: - - ```xml - 2019-05-13 14:13:07,095 WARN [org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter] (default task-1) Negotiate Header was invalid: Negotiate TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAGNFAAAADw==: org.springframework.security.authentication.BadCredentialsException: Kerberos validation not successful - ... - - Caused by: java.security.PrivilegedActionException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) - at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.8.0_211] - at javax.security.auth.Subject.doAs(Subject.java:422) [rt.jar:1.8.0_211] - at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:68) [spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE] - ... 66 more - Caused by: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) - at sun.security.jgss.GSSHeader.(GSSHeader.java:97) [rt.jar:1.8.0_211] - at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306) [rt.jar:1.8.0_211] - at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) [rt.jar:1.8.0_211] - at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidatorKerberosValidateAction.run(SunJaasKerberosTicketValidator.java:170) [spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE] - at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidatorKerberosValidateAction.run(SunJaasKerberosTicketValidator.java:153) [spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE] - ... 69 more - ``` - - необходимо проверить правильность указанного в standalone.xml principal-а. - -### Комбинации нескольких способов аутентификации - -Приложение может обрабатывать запросы на несколько способов аутентификации. Для этого необходимо переичислить нужные профили через запятую. -Примеры: - -```xml - - - - -``` - -### Время жизни токенов аутентификации - -```xml - - - -``` - -`webbpm.security.access_token.duration.minutes` - опциональный параметр (значение по умолчанию 60), время жизни в минутах, сколько будет действителен токен, после истечения этого времени токен будет обновлён `webbpm.security.refresh_token.duration.days` - опциональный параметр (значение по умолчанию 30), время жизни в днях, после истечения этого времени с последнего обновления, пользователю будет необходимо повторно войти `webbpm.security.session.active.count` - опциональный параметр (значение по умолчанию 1), количество сохраняемых в базу токенов обновления (количество активных сессий) - -Примечания. - -- Нельзя использовать одновременно профили cert_over_db c cert_over_ldap и kerberos с form. - -## Синхронизация пользователей с LDAP - -```xml - - - - - - - -``` - -Настройки подключения к LDAP: - -- `ldap.auto.sync.enabled` - включает/отключает автоматическую синхронизацию с LDAP -- `ldap.synchronizer.cron` - cron расписание автоматической синхронизации с LDAP -- `ldap.url`. Пример - ldap://localhost:389 -- `ldap.base`. Пример - dc=alt,dc=dom -- `ldap.username`. Пример - uid=test,ou=People,dc=alt,dc=dom -- `ldap.password` -- `webbpm.ldap.implementation`. Допускается два значения: open-ldap и active-directory. - -## WEBGUARD - -Для синхронизации пользователей в WEBGUARD и для корректной работы админки необходимо указать настройки соединения к REST API WEBGUARD - -```xml - - - -``` - -## Статистика - -### jbpm hibernate statistics - -Статистика hibernate jbpm доступна по jmx по пути `org.hibernate:type=Stats,name=jbpm`. -Полный список параметров можно посмотреть через jconsole. - -По умолчанию включена, отключить можно настройкой `webbpm.jbpm.hibernate_statistics.enabled`: - -```xml - -``` - -## Schedulers по очистке базы *jbpm*. - -- Очистка таблиц аудита от завершенных процессов по истечении таймаута - - - `webbpm.jbpm.finished_process_cleaner_cron` - задает расписание (*spring cron*), если настройка не задана - джоб не запускается - - `webbpm.jbpm.finished_process_cleaner_timeout` - таймаут в часах (*целое числовое значение*) - - Пример: - - ```xml - - - ``` - - ## Ограничения для запросов БД. - -- `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 секунд. - -Пример: - -```xml - - - - - - - - -``` - -## Добавление версии приложения в URL при запросах к backend-у - -При сборке приложения с профилем enable-version-in-url в URL будет добавляться версия приложения, указанная в pom.xml. -Шаблон URL: - -``` -//:/backend/ -``` - -## Включение регистрации пользователя - -1. Укажите конфигурацию почтового сервера для отправки писем с подтверждением регистрации. -Для этого в файле проекта *jndi-resources.xml* добавьте ресурс SmtpConfiguration. -Шаблон: -``` -{"host":"host","port":1234,"login":"user","password":"password","from":"email_from","senderName":"sender_name","isSecured":true} -``` -Почтовый сервер - зарегистрированный актуальный почтовый адрес. В поле password нужно указывать не пароль для входа в почту, а создать пароль для приложений в учетке почты и указать его. -2. Для включения регистрации добавьте в *standalone.xml* свойство -``` - -``` -3. Также в *standalone.xml* укажите ресурс для отправки писем для подтверждения регистрации (из п.1) -``` - -``` -4. При необходимости, отредактируйте шаблон письма для подтверждения регистрации -(resources/src/main/resources/mail/confirmation.html) - -5. При необходимости, отредактируйте шаблон письма для восстановления пароля -(resources/src/main/resources/mail/reset_password.html) - - -#### Настройка браузера для входа в систему с помощью 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(); - defaultConfiguration.setSQLDialect(SQLDialect.POSTGRES); - Queries ddl = DSL.using(defaultConfiguration).ddl(DefaultCatalog.DEFAULT_CATALOG); - - for (Query query : ddl.queries()) { - System.out.println(query); - } - } -} -``` - -** ВНИМАНИЕ: ** - -- этим способом нельзя восстановить функции/процедуры БД - -см. также [Generating DDL from objects](https://www.jooq.org/doc/latest/manual/sql-building/ddl-statements/generating-ddl/) - -## Распределенный кэш (Hazelcast) - -В платформе подключен кэш. Он используется для подсчёта количества пользователей и кэширования подсистемы безопасности - -- `webbpm.cache.hazelcast.port` - входящий порт hazelcast. по дефолту 5701. -- Обязательное задать одно из двух следующих параметров - - `webbpm.cache.hazelcast.hosts` - список хостов серверов приложений. - webbpm.cache.hazelcast.hosts = hostname1,hostname2,hostname3 - - `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 -- `webbpm.cache.hazelcast.async_backup_count` -- `webbpm.cache.hazelcast.public_address` -- `webbpm.cache.hazelcast.interfaces` - -Пример конфигурации: - -```xml - - ` -``` - -## Подключение компоненты адреса в режиме ГАР (Государственный адресный реестр) - -Необходимо задать параметры: - -- `gar.enable` - флаг, который включает/отключает сервис для работы с ГАР. Должен быть задан для работы компоненты в режиме ГАР. По умолчанию true, для отключения задать false. -- `gar.elastic.url.host` - хост на котором развернут elasticsearch. -- `gar.elastic.password` - пароль для аутентификации elasticsearch. - -Дополнительные параметры: - -- `gar.elastic.url.port` - порт на котором развернут elasticsearch. -- `gar.elastic.username` - логин для аутентификации elasticsearch. - -Пример конфигурации: - -```xml - - - -``` - -## Метрики - -Отчет - -Отчет собирается раз в 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 - - - -``` - -При этом компоненты используемые в проекте могут использовать другие категории. - -### Параметры конфигурации - -**Рекомендованное использование:** всегда в `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 - - - -``` - -Пример вывода: - -``` -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 : +-----------------+-------------+--------------------+--------------------+-------------+-------------+ -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |department_name |department_id|parent_department_id|parent_department_id|department_id|$$hasChildren| -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : +-----------------+-------------+--------------------+--------------------+-------------+-------------+ -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |Головной офис 1 | 8| {null}| {null}| 8|true | -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |Головной офис 2 | 9| {null}| {null}| 9|true | -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |Головной офис 3 | 10| {null}| {null}| 10|true | -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |Подразделение 1.1| 11| 8| 8| 11|true | -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |Подразделение 1.2| 12| 8| 8| 12|true | -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : +-----------------+-------------+--------------------+--------------------+-------------+-------------+ -2017-12-04 18:21:10,568 DEBUG [org.jooq.tools.LoggerListener] (default task-19) : |...55 record(s) truncated... -``` - -#### Логирование больших запросов - -**Рекомендованное использование:** всегда в `info`, с подобранными для проекта значениями. В проде значения должны быть проверены что они не вызывают излишнее логирование. - -1. Для отслеживания больших запросов в пользовательскую базу нужно задать параметры что считать большими запросами, логироваться будут запросы больше заданных показателей. - Чтобы логировать все запросы можно задать значение `-1`. Добавляются как property в раздел `system-properties`: - - ```xml - - - ``` - - В `info` режиме работают: - - - `webbpm.db.full_time_threshold` - полное время выполнения запроса в миллисекундах. Включает построение запроса библиотекой, выполнение и загрузку результатов. Пример сообщения
`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=[]` - - `webbpm.db.results_count_threshold` - количество записей, которое вернул запрос. Пример сообщения
`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=[]` - - В `debug` режиме дополнительно к работающим в info: - - - `webbpm.db.execution_time_threshold` - время выполнения запроса + построения запроса библиотекой. - - `webbpm.db.result_read_time_threshold` - время чтения результатов запроса - -2. После задания настроек нужно настроить логирование - категория `ru.cg.webbpm.modules.database.impl.analytics.PerformanceListener`, уровень `info` или `debug`. - - ```xml - - - - ``` - -### JBPM - -#### Основные настройки - -JBPM использует 3 корневых категории логирования – `org.jbpm`, `org.drools`, `org.kie`. Все они должны быть выставлены в `warn`. - -```xml - - - - - - - - - -``` - -#### Логирование запросов в БД - -**Рекомендованное использование:** только при разработке. - -Для логирования sql запросов нужно включить категорию `org.hibernate.SQL` в `debug`: - -```xml - - - -``` - -Чтобы вывести параметры запросов и результат выполнения – категорию `org.hibernate.type.descriptor.sql` в `trace`: - -```xml - - - -``` - -Пример вывода: - -``` -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=? -18:21:06,939 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-47) binding parameter [1] as [BIGINT] - [180] -18:21:06,940 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-47) extracted value ([id1_16_1_] : [BIGINT]) - [539] -18:21:06,940 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-47) extracted value ([language2_16_1_] : [VARCHAR]) - [en-UK] -18:21:06,940 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-47) extracted value ([shortTex3_16_1_] : [VARCHAR]) - [Список записей] -18:21:06,941 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-47) extracted value ([text4_16_1_] : [CLOB]) - [Список записей] -18:21:06,941 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-47) extracted value ([Task_Nam7_16_0_] : [BIGINT]) - [180] -18:21:06,942 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] (default task-47) extracted value ([id1_16_0_] : [BIGINT]) - [539] -``` - -#### Дополнительные логи hibernate - -**Рекомендованное использование:** только при разработке в случае необходимости. - -1. Время выполнения запроса и количество результатов. - - Включаются категорией `org.hibernate.stat` в `debug`. При этом в hibernate должен быть включен сбор статистики. - Похоже что логируется только hql select запросов. - - ```xml - - - - ``` - - Пример вывода: - - ``` - 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 { - 63408365 nanoseconds spent acquiring 17 JDBC connections; - 521509 nanoseconds spent releasing 17 JDBC connections; - 65732621 nanoseconds spent preparing 17 JDBC statements; - 31471897 nanoseconds spent executing 17 JDBC statements; - 0 nanoseconds spent executing 0 JDBC batches; - 0 nanoseconds spent performing 0 L2C puts; - 0 nanoseconds spent performing 0 L2C hits; - 0 nanoseconds spent performing 0 L2C misses; - 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 - - - -``` - -# Описание параметров конфигурации клиентской части - -Свойства задаются в файле 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` - адрес сервера службы штампов времени - -Пример: - -```text -"electronic_sign.esmart_extension_url": "http://dsig.ibsdemo.ru/ibs_dsig/ibs_dSig.asmx" -``` - -## Способ аутентификации - -- `auth_method` - способ аутентификации. Может принимать одно значение из списка: form, kerberos, cert_over_db, cert_over_ldap - -## Таймер очистки закешированных значений фильтров - -- `filter_cleanup_interval_hours` - время жизни закешированного значения фильтра в часах. По умолчанию - 720 часов, -- `filter_cleanup_check_period_minutes` - период проверки наличия просроченных закешированных значений в минутах. По умолчанию - 30 минут - -## Добавление версии приложения в URL при запросах к frontend-у - -В модуле frontend в src/resources/app-config.json добавлены 2 переменные - -- `"enable.version.in.url": "%enable.version.in.url%"` - подставлять ли версию в URL приложения. По умолчанию false. Если сборка произведена -- `"app.version": "%project.version%"` - версия приложения. - с профилем `enable-version-in-url`, то значение будет true. - -## Добавление Jivo чат в проект - -Свойства задаются в файле frontend/src/resources/app-config.json или frontend.war/src/resources/app-config.json - -- `jivo_chat_widget_api_url` - API url для работы Jivo чата. Необходимо заменить {WIDGET_ID} на реальный Widget API ID -- `jivo_chat_widget_enabled` - параметр отвечающий за активацию Jivo чата. По дефолту false, для активации задать true. - -Пример: - -```json - "jivo_chat_widget_api_url": "https://code.jivo.ru/widget/{WIDGET_ID}", - "jivo_chat_widget_enabled": false -``` - # Описание конфигурации параметров проекта В micord.env заданы следующие переменные окружения: -#### Подключение базы данных -- `DB_APP_USERNAME` - логин пользователя для подключения к базе данных -- `DB_APP_PASSWORD` - пароль пользователя для доступа к базе данных -- `DB_APP_HOST` - адрес сервера базы данных -- `DB_APP_PORT` - порт, на котором осуществляется подключение к базе данных -- `DB_APP_NAME` - имя базы данных, к которой необходимо подключиться +## Аутентификация через ЕСИА -#### Аутентификация через ЕСИА - `ESIA_SCOPES` - область доступа, позволяющие получить данные о пользователе. Тип данных, к которым система-клиент намерена получить доступ + - `ESIA_BASE_URI` - базовый url для обращения в ЕСИА + - `ESIA_CLIENT_ID` - идентификатор системы-клиента (мнемоника системы в ЕСИА указанная прописными буквами) + - `ESIA_REDIRECT_URL` - ссылка, по которой должен быть направлен пользователь Важно: `ESIA_REDIRECT_URL` должна содержать полный адрес вплоть до последнего слэша: -> - https://lkul.ervu.loc/ - правильное значение параметра -> - https://lkul.ervu.loc - неправильное значение параметра + + > - https://lkul.ervu.loc/ - правильное значение параметра + > - https://lkul.ervu.loc - неправильное значение параметра + - `ESIA_LOGOUT_REDIRECT_URL` - ссылка, по которой должен быть направлен пользователь после logout-a Важно: `ESIA_LOGOUT_REDIRECT_URL` должна содержать полный адрес вплоть до последнего слэша: -> - https://lkul.ervu.loc/home.html - правильное значение параметра -> - https://lkul.ervu.loc - неправильное значение параметра + + > - https://lkul.ervu.loc/home.html - правильное значение параметра + > - https://lkul.ervu.loc - неправильное значение параметра - `SIGN_URL` - url для подписания с помощью КриптоПро секрета клиента, необходимого для аутентификации через ЕСИА + - `ESIA_CLIENT_CERT_HASH` - параметр, содержащий хэш сертификата (fingerprint сертификата) системы-клиента в hex–формате -#### Конфигурация и топики Kafka -- `KAFKA_HOSTS` - список пар хост:порт, использующихся для установки первоначального соединения с кластером Kafka -- `KAFKA_USER` - пользователь для подключения к Kafka -- `KAFKA_PASS` - пароль для подключения к Kafka -- `KAFKA_AUTH_SASL_MECH` - механизм SASL, используемый для клиентских подключений -- `KAFKA_AUTH_SEC_PROTO` - протокол, используемый для взаимодействия с брокерами -- `KAFKA_AUTH_SASL_MODULE` - имя класса для входа в систему для SASL-соединений в формате, используемом конфигурационными файлами JAAS +- `SIGN_VERIFY_URL` - url для отправки маркера доступа от ЕСИА на верификацию + +- `ESIA_ISSUER_URL` - организация, выпустившая маркер. Нужен для верификации маркера доступа от ЕСИА + +- `ESIA_MARKER_VER` - версия маркера. Нужен для верификации маркера доступа от ЕСИА + +## Конфигурация Kafka + +- `ERVU_KAFKA_BOOTSTRAP_SERVERS` - список пар хост:порт, использующихся для установки первоначального соединения с кластером Kafka +- `ERVU_KAFKA_SASL_MECHANISM` - механизм SASL, используемый для клиентских подключений +- `ERVU_KAFKA_USERNAME` - пользователь для подключения к Kafka +- `ERVU_KAFKA_PASSWORD` - пароль для подключения к Kafka +- `ERVU_KAFKA_SECURITY_PROTOCOL` - протокол, используемый для взаимодействия с брокерами +- `ERVU_KAFKA_DOC_LOGIN_MODULE` - имя класса для входа в систему для SASL-соединений в формате, используемом конфигурационными файлами JAAS - `ERVU_KAFKA_GROUP_ID` - идентификатор группы потребителей, который отвечает за создание группы для объединения нескольких потребителей - `ERVU_KAFKA_REPLY_TIMEOUT` - таймаут ожидания ответа -- `ERVU_KAFKA_REQUEST_TOPIC` - топик для отправки запроса на получение id пользователя в системе ЕРВУ -- `ERVU_KAFKA_REPLY_TOPIC` - топик для получения id пользователя в системе ЕРВУ -- `ERVU_KAFKA_RECRUIT_REQUEST_TOPIC` - топик для отправки запроса на получение данных о повестке, временных мерах и воинском учете -- `ERVU_KAFKA_RECRUIT_REPLY_TOPIC` - топик для получения данных о повестке, временных мерах и воинском учете - `ERVU_KAFKA_RECRUIT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение данных о повестке, временных мерах и воинском учете -- `ERVU_KAFKA_SUBPOENA_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра повесток -- `ERVU_KAFKA_SUBPOENA_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра повесток -- `ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета при отсутствии ErvuId -- `ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета при наличии ErvuId -- `ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра воинского учета - `ERVU_KAFKA_EXTRACT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение выписки из Реестра повесток/Реестра воинского учета -- `AUDIT_KAFKA_AUTHORIZATION_TOPIC` - топик для отправки аудита в журнал авторизации -- `AUDIT_KAFKA_ACTION_TOPIC` - топик для отправки аудита в журнал действий пользователя -- `AUDIT_KAFKA_FILE_DOWNLOAD_TOPIC` - топик для отправки аудита в журнал загрузки ЮЛ и ФЛ - `AUDIT_KAFKA_BOOTSTRAP_SERVERS` - список пар хост:порт, использующихся для установки первоначального соединения с кластером Kafka - `AUDIT_KAFKA_SECURITY_PROTOCOL` - протокол, используемый для взаимодействия с брокерами -- `AUDIT_KAFKA_DOC_LOGIN_MODULE` - имя класса для входа в систему для SASL-соединений в формате, используемом конфигурационными файлами JAAS +- `AUDIT_KAFKA_LOGIN_MODULE` - имя класса для входа в систему для SASL-соединений в формате, используемом конфигурационными файлами JAAS - `AUDIT_KAFKA_USERNAME` - пользователь для подключения к Kafka - `AUDIT_KAFKA_PASSWORD` - пароль для подключения к Kafka - `AUDIT_KAFKA_SASL_MECHANISM` - механизм SASL, используемый для клиентских подключений - `AUDIT_KAFKA_ENABLED` - флажок для включения записи аудита в кафку -# Прочее +### Топики Kafka -## Смена удалённого репозитория +| Наименование | Описание | Пишет | Читает | Имя конфигурации | +| -------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------- | ---------------------------------- | ----------------------------------------------- | +| ervu.lkpr.person.search.request | топик для отправки запроса на получение id | ervu-lkrp-fl-backend | ervu-person-registry | ERVU_KAFKA_REQUEST_TOPIC | +| ervu.lkpr.person.search.response | топик для получения id пользователя в системе ЕРВУ | ervu-person-registry | ervu-lkrp-fl-backend | ERVU_KAFKA_REPLY_TOPIC | +| ervu.extract.empty.request | топик для отправки запроса на получение выписки из Реестра воинского учета при отсутствии ErvuId | ervu-lkrp-fl-backend | | ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC | +| ervu.recruit.info.request | топик для отправки запроса на получение данных о повестке, временных мерах и воинском учете | ervu-lkrp-fl-backend | ervu-rp-summons-service | ERVU_KAFKA_RECRUIT_REQUEST_TOPIC | +| ervu.recruit.info.response | топик для получения данных о повестке, временных мерах и воинском учете | ervu-rp-summons-service | ervu-lkrp-fl-backend | ERVU_KAFKA_RECRUIT_REPLY_TOPIC | +| ervu.extract.info.request | топик для отправки запроса на получение выписки из Реестра воинского учета при наличии ErvuId | ervu-lkrp-fl-backend | ervu-extract-from-registry-proider | ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC | +| ervu.extract.info.response | топик для получения выписки из Реестра воинского учета | ervu-extract-from-registry-proider | ervu-lkrp-fl-backend | ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC | +| ervu.lkrp.auth.events | топик для отправки аудита в журнал авторизации | ervu-lkrp-fl-backend | ervu-lkrp-journal-service | AUDIT_KAFKA_AUTHORIZATION_TOPIC | +| ervu.lkrp.action.events | топик для отправки аудита в журнал действий пользователя | ervu-lkrp-fl-backend | ervu-lkrp-journal-service | AUDIT_KAFKA_ACTION_TOPIC | +| ervu.lkrp.import.file | топик для отправки аудита в журнал загрузки ЮЛ и ФЛ | ervu-lkrp-fl-backend | ervu-lkrp-journal-service | AUDIT_KAFKA_FILE_DOWNLOAD_TOPIC | -1. Смените адрес NPM registry в файле frontend.npmrc. Пример - registry=https://repo.example.com/repository/npm-all/ -2. Поменяйте ссылки в блоке , файла pom.xml +## Прочее + +- `COOKIE_PATH` - путь для access token +- `COOKIE_SECURE` - параметр secure +- `COOKIE_DOMAIN` - домен для cookie +- `COOKIE_SAME_SITE` - параметр SameSite. Одно из значений: Strict, Lax, None +- `WEBBPM_SECURITY_TOKEN_SECRET_KEY` - секретный ключ для создания JWT токена. Значение должно быть в Base64 кодировке. \ No newline at end of file