<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chernykov+sv</id>
	<title>Svacer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chernykov+sv"/>
	<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Special:Contributions/Chernykov_sv"/>
	<updated>2026-04-26T15:30:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3462</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3462"/>
		<updated>2026-02-09T06:31:42Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-1 ===&lt;br /&gt;
&lt;br /&gt;
* Убраны ограничения на размер поля advanced filter в пользовательских фильтрах&lt;br /&gt;
* В публичных запросах возвращающих маркеры добавлено поле &amp;lt;code&amp;gt;checker_situation&amp;lt;/code&amp;gt; соответствующее полю `situation` в детекторах&lt;br /&gt;
* Добавлена возможность фильтрации по &amp;lt;code&amp;gt;checker_situation&amp;lt;/code&amp;gt; в advanced filter&lt;br /&gt;
* Добавлена возможность фильтрации по &amp;lt;code&amp;gt;checker_labels&amp;lt;/code&amp;gt; в advanced filter&lt;br /&gt;
* Добавлен публичный фильтр по детекторам, соответствующим &amp;lt;code&amp;gt;ГОСТ 71207-2024&amp;lt;/code&amp;gt; . Импортировано описание детекторов из &amp;lt;code&amp;gt;Svace version 5.0.251220&amp;lt;/code&amp;gt;&lt;br /&gt;
* При миграции со старых версий баз (а так же при миграциях, связанных с  изменением схемы генерации инвариантов) реализовано полное сохранение разметки и комментариев на маркерах и последующее восстановление пропущенных, после миграций, разметок и комментариев (при обнаружении таковых)&lt;br /&gt;
* Вынесен ряд timeout-ов на уровень переменных окружения для адаптации под пользовательские сценарии&lt;br /&gt;
* Добавлена подсветка синтаксиса для языка Lua&lt;br /&gt;
* Исправлены проблемы безопасности, связанные с импортом данных и механизмом токенов доступа (PAT)&lt;br /&gt;
&lt;br /&gt;
=== Release 12-0-0 ===&lt;br /&gt;
28.11.2025&lt;br /&gt;
&lt;br /&gt;
* API методы на fullmarkers позволяют [[Help:Public API#Примеры использования фильтров в public api|указать фильтр]] с полем фильтрации по checker reliability&lt;br /&gt;
* В функциональность полнотекстового поиска добавлен поиск маркеров по id и инварианту&lt;br /&gt;
* Промежуточное хранилище при импорте результатов командой &amp;lt;code&amp;gt;svacer import / svacer sarif2 import&amp;lt;/code&amp;gt; теперь использует новый формат представления. Это должно снизить использование памяти при импорте&lt;br /&gt;
* Сериализация JSON переведена на jsonv2 библиотеку в Go&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; для [[Help:Configuration#Переменные окружения|контроля таймаута]] на ожидание начала импорта результатов и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; на [[Help:Configuration#Переменные окружения|ограничение числа параллельных импортов]]. По умолчанию значения 15 минут и &amp;lt;code&amp;gt;(максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничения необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В метрики Prometheus добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера, показываемого в Web-интерфейсе, ограничен. Размер [[Help:Configuration#Переменные окружения|задается переменной окружения]] SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл не ограничивается в размерах и кнопка выгрузки лога выгружает полный лог&lt;br /&gt;
* ['''Экспериментально'''] Можно [[Help:Configuration#Переменные окружения|указать JSON-формат]] лог-файла посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, также формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции также работают для CLI-клиента svacer&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов. Это может решить проблему с переносом разметки&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных заданий при регенерации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* Добавлена возможность создания [[Afilters|сложных пользовательских фильтров]] по условиям, выраженным предикатом &lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant#Активация и запуск ИИ-ассистента|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* ['''Экспериментально'''] Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции &amp;lt;code&amp;gt;quick-stat&amp;lt;/code&amp;gt;. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграция с внешними системами посредством механизма [[Help:Configuration#Механизм интеграции с внешними системами посредством Webhook-ов|Webhooks]]&lt;br /&gt;
* Добавлена [[Help:Configuration#Настройка защиты от перебора паролей пользователей|защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Configuration#Настройка парольной политики внутреннего механизма аутентификации Svacer|парольную политику безопасности]] для пользователей, использующих встроенный механизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Configuration#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутреннего механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
* Форма [[Help:UI manual#Разметка маркера с помощью ассистента AI|разметки]] с помощью [[Help:XSvacer:AIAssistant|ИИ-ассистента]] реализована в основном интерфейсе Svacer&lt;br /&gt;
* [[Help:XSvacer:Webide#Запуск функциональности при использовании docker compose|Упрощён запуск функциональности Webide]] при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#deb/rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=LDAP_configuration&amp;diff=3396</id>
		<title>LDAP configuration</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=LDAP_configuration&amp;diff=3396"/>
		<updated>2025-11-27T11:24:38Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Некоторые замечания для пользователей, которые использовали LDAP, начиная с версии Svacer 5-1-0 до 5-2-0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====  Общий принцип аутентификации ====&lt;br /&gt;
Схема аутентификации с помощью протокола LDAP следующая:&lt;br /&gt;
&lt;br /&gt;
# Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации&lt;br /&gt;
# В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP) &lt;br /&gt;
# При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер Svacer&lt;br /&gt;
# Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя&lt;br /&gt;
# В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя&lt;br /&gt;
# Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей&lt;br /&gt;
&lt;br /&gt;
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:&lt;br /&gt;
* Пользователю нельзя сменить пароль&lt;br /&gt;
* Пользователь не может сменить пароль самостоятельно&lt;br /&gt;
* В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему&lt;br /&gt;
&lt;br /&gt;
====  Запуск сервера с поддержкой LDAP ====&lt;br /&gt;
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap print&lt;br /&gt;
&lt;br /&gt;
Запуск сервера с поддержкой LDAP осуществляется командой:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --ldap ldap.json&lt;br /&gt;
&lt;br /&gt;
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. В логах сервера должна появится информация о добавлении сервера вида: &amp;quot;LDAP Server added: xxxx&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP ([[Help:UI manual#Авторизация в пользовательском интерфейсе сервера Svacer|Авторизация]]).&lt;br /&gt;
&lt;br /&gt;
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. &lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. &lt;br /&gt;
В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки. &lt;br /&gt;
&lt;br /&gt;
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию '''disable-svacer-auth'''. &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
  svacer-server run --ldap ldap.json --disable-svacer-auth&lt;br /&gt;
&lt;br /&gt;
====  Конфигурационный файл сервера для поддержки LDAP  ====&lt;br /&gt;
Типовой пример конфигурации:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;servers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;active_directory&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: &amp;quot;dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
        &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
        &amp;quot;hideURL&amp;quot;: true,&lt;br /&gt;
        &amp;quot;checkAlivePeriod&amp;quot;: 60,	&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;ldaps://192.168.11.71:636&amp;quot;,&lt;br /&gt;
          &amp;quot;mirrors&amp;quot;:[&amp;quot;ldaps://192.168.11.72:636&amp;quot;,&amp;quot;ldaps://192.168.11.73:636&amp;quot;]&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
          &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
          &amp;quot;ignoreCertCheck&amp;quot;: false,&lt;br /&gt;
          &amp;quot;caCertFiles&amp;quot;:[&amp;quot;/etc/ssl/certs/a*&amp;quot;,&amp;quot;/etc/ssl/certs/my_certs/*&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;group&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Group)(cn=dep_devops))&amp;quot;,&lt;br /&gt;
          &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
          &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,&lt;br /&gt;
          &amp;quot;svacerRole&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Person)(sAMAccountName=*))&amp;quot;,&lt;br /&gt;
          &amp;quot;login&amp;quot;: &amp;quot;sAMAccountName&amp;quot;,&lt;br /&gt;
          &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;open_ldap&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
        &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;ldap://127.0.0.1:389&amp;quot;,&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
          &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;group&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;ou=groups&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=svacer))&amp;quot;,&lt;br /&gt;
          &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
          &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;ou=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=PosixAccount))&amp;quot;,&lt;br /&gt;
          &amp;quot;login&amp;quot;: &amp;quot;uid&amp;quot;,&lt;br /&gt;
          &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. &lt;br /&gt;
* name — произвольное имя (уникальное для каждого сервера)&lt;br /&gt;
* trace — флаг, позволяющий получить детальную информацию по этапам обработки запроса на вход пользователя LDAP в Svacer&lt;br /&gt;
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге &lt;br /&gt;
* useGroup — проверять ли принадлежность пользователя к группе &lt;br /&gt;
* hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка&lt;br /&gt;
* checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.&lt;br /&gt;
* connection — подсекция, описывающая параметры соединения с сервером &lt;br /&gt;
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636)&lt;br /&gt;
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL&lt;br /&gt;
:* connectAs — имя пользователя в формате DN, от которого будут производится операции в LDAP каталоге &lt;br /&gt;
:* password — пароль пользователя &lt;br /&gt;
:* ignoreCertCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles&lt;br /&gt;
:* CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM&lt;br /&gt;
* group — подсекция, описывает параметры проверки принадлежности пользователя к группе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп &lt;br /&gt;
:* userMember — атрибут, содержащий пользователей группы&lt;br /&gt;
:* display — атрибут, содержащий имя группы для отображения &lt;br /&gt;
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем&lt;br /&gt;
* user — подсекция, описывает параметры получения информации о пользователе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске пользователей&lt;br /&gt;
:* login — атрибут, в котором находится login пользователя&lt;br /&gt;
:* group — атрибут, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)&lt;br /&gt;
:* defaultRole — роль Svacer, автоматически добавляемая всем пользователям LDAP, успешно вошедшим в Svacer&lt;br /&gt;
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе &lt;br /&gt;
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО)&lt;br /&gt;
::* email — атрибут с почтовым адресом &lt;br /&gt;
::* firstName — атрибут с именем &lt;br /&gt;
::* lastName — атрибут с фамилией &lt;br /&gt;
* enabled — использовать или нет данный сервер &lt;br /&gt;
&lt;br /&gt;
Конфигурацию для подключения к серверам '''LDAP''' можно также задать в конфигурационном файле '''Svacer'''. Например:&lt;br /&gt;
&lt;br /&gt;
 auth:&lt;br /&gt;
   ldap:&lt;br /&gt;
     servers:&lt;br /&gt;
     - name: freeIPA&lt;br /&gt;
       basedn: dc=example,dc=com&lt;br /&gt;
       useGroup: false&lt;br /&gt;
       type: freeIPA&lt;br /&gt;
       hideURL: true&lt;br /&gt;
       checkAlivePeriod: 1&lt;br /&gt;
       connection:&lt;br /&gt;
         url: ldap://svacer.local:7001&lt;br /&gt;
         connectAs: cn=admin,dc=example,dc=com&lt;br /&gt;
         password: 12345678&lt;br /&gt;
       user:&lt;br /&gt;
         basedn: ou=users&lt;br /&gt;
         filter: &amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberOf=*))&amp;quot;&lt;br /&gt;
         login: cn&lt;br /&gt;
         info:&lt;br /&gt;
           display: cn&lt;br /&gt;
           email: mail&lt;br /&gt;
           firstName: givenName&lt;br /&gt;
           lastName: sn&lt;br /&gt;
       enabled: true&lt;br /&gt;
     - name: example1&lt;br /&gt;
       basedn: dc=example,dc=com&lt;br /&gt;
       useGroup: false&lt;br /&gt;
       hideURL: true&lt;br /&gt;
       checkAlivePeriod: 1&lt;br /&gt;
       connection:&lt;br /&gt;
         url: ldap://svacer.local:7001&lt;br /&gt;
         connectAs: cn=admin,dc=example,dc=com&lt;br /&gt;
         password: 12345678&lt;br /&gt;
       user:&lt;br /&gt;
         basedn: &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
         filter: &amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberOf=*))&amp;quot;&lt;br /&gt;
         login: cn&lt;br /&gt;
         group: dn&lt;br /&gt;
         info:&lt;br /&gt;
           display: cn&lt;br /&gt;
           email: mail&lt;br /&gt;
           firstName: givenName&lt;br /&gt;
           lastName: sn&lt;br /&gt;
       enabled: true&lt;br /&gt;
&lt;br /&gt;
[[LDAP configuration|Подробное описание взаимодействия SVACER с LDAP сервером]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше&lt;br /&gt;
:# Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами &lt;br /&gt;
:#* используется TLS соединение (ldaps префикс)&lt;br /&gt;
:#* порт 636&lt;br /&gt;
:#* проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)&lt;br /&gt;
:#* логин для подключения к LDAP серверу: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot; (connectAs); пароль: 12345678 (password)&lt;br /&gt;
:# Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1&lt;br /&gt;
:# Если подключение невозможно, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами:&lt;br /&gt;
:#* строка запроса: (&amp;amp;(sAMAccountName=ivanov_ii)((&amp;amp;(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&amp;amp;(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла&lt;br /&gt;
:#*начальный узел, с которого будет произведен поиск: cn=users,dc=domain,dc=home,dc=org&lt;br /&gt;
:#*поиск производится по всему поддереву&lt;br /&gt;
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой&lt;br /&gt;
:# Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя&lt;br /&gt;
:#* выполняется поиск групп в каталоге LDAP со следующими параметрами:&lt;br /&gt;
:#**строка запроса: (&amp;amp;(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter&lt;br /&gt;
:#**начальный узел: cn=users,dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла&lt;br /&gt;
:#**поиск производится по всему поддереву&lt;br /&gt;
:#**определяется список пользователей группы, каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла)&lt;br /&gt;
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой&lt;br /&gt;
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.  &lt;br /&gt;
:#* Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)&lt;br /&gt;
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой&lt;br /&gt;
:# Процесс аутентификации пользователя произведен успешно&lt;br /&gt;
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет {{Note|type=warn|text=С версии 11 наличие двух пользователей с одинаковым логином: локального и пользователя LDAP — не допускается}}&lt;br /&gt;
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)&lt;br /&gt;
&lt;br /&gt;
==== Привязка группы LDAP к роли Svacer ====&lt;br /&gt;
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:&lt;br /&gt;
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins,ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer&lt;br /&gt;
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins,ou=svacer,dc=example,dc=com)&lt;br /&gt;
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins&lt;br /&gt;
:* Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole=&amp;quot;cn&amp;quot;&lt;br /&gt;
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:&lt;br /&gt;
:* Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла {{Note|text=На первом этапе будет произведен поиск всех групп, которые подпадают под условие фильтра в секции group. По этой причине необходимо указывать наиболее точное значение для фильтра группы, чтобы не было чрезмерно большого количества записей в результатах поиска (для MSAD — 2000 записей)}} Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)&lt;br /&gt;
:* Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev (это те группы, которые могут быть привязаны к ролям Svacer)&lt;br /&gt;
:* Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.&lt;br /&gt;
&lt;br /&gt;
Удаление ролей автоматически не производится. Вместо этого предлагается ручной режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli&lt;br /&gt;
&lt;br /&gt;
  svacer ldap sync_roles --login [user_login] --server [server_name] --apply&lt;br /&gt;
&lt;br /&gt;
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет &amp;quot;оценить&amp;quot; получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.&lt;br /&gt;
&lt;br /&gt;
Автоматическое назначение пользователю LDAP некоторой роли также возможно осуществить, указав необходимую роль в параметре '''user.defaultRole''' конфигурационного файла LDAP. Данная роль будет назначена в том случае, если она существует на момент входа пользователя в систему. Добавление роли будет происходить при каждом входе пользователя в систему. Поэтому даже если у пользователя эту роль удалить явно, она все равно будет добавлена пользователю при следующем входе. Данный механизм назначения роли работает независимо от настройки привязки роли к группе LDAP. &lt;br /&gt;
&lt;br /&gt;
==== Использование CLI сервера Svacer с поддержкой LDAP ====&lt;br /&gt;
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля  имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо).  Например:&lt;br /&gt;
    &lt;br /&gt;
  svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:&lt;br /&gt;
&lt;br /&gt;
  SVACER_LDAP_SERVER=&amp;quot;openLDAP2&amp;quot; svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Для получения списка поддерживаемых свейсером LDAP серверов используйте команду:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
&lt;br /&gt;
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных LDAP пользователей ====&lt;br /&gt;
Для каждого LDAP пользователя создается соответствующая ему запись в  БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты.  Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. &lt;br /&gt;
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера (см. раздел [[Help:UI manual#Управление пользователями|Управление пользователями]]).&lt;br /&gt;
&lt;br /&gt;
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap updateUsers --onlyEmpty&lt;br /&gt;
&lt;br /&gt;
Флаг '''onlyEmpty''' позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример конфигурации сервера Svacer для поддержки аутентификации по LDAP протоколу ====&lt;br /&gt;
&lt;br /&gt;
Для упрощения настройки интеграции с LDAP сервером, процесс настройки можно разбить на этапы и переходить к следующему только если успешно завершен предыдущий этап. В первую очередь необходимо выяснить актуальные параметры подключения к ldap серверу:&lt;br /&gt;
* URL; Например ldap://10.11.12.13:389 или  ldaps://10.11.12.13:636&lt;br /&gt;
* Учетные данные с которыми будет осуществляться подключение к LDAP серверу при каждой попытке входа пользователем; Например, login: cn=admin,dc=example,dc=com, пароль: 12345678&lt;br /&gt;
* Определиться с корнем LDAP дерева (базовый узел), относительно которого будут выполняться все операции; Например: dc=example,dc=com&lt;br /&gt;
* Проверить, что с указанными учетными данными  возможно подключение к серверу LDAP и просмотр его содержимого с некоторого узла, расположенного ниже базового; Например, с узла ou=users,dc=example,dc=com для рассматриваемого примера. Проверить можно, например, используя следующую команду:&lt;br /&gt;
:&amp;lt;pre&amp;gt;LDAPTLS_REQCERT=never ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldaps://127.0.0.1:636&amp;lt;/pre&amp;gt;&lt;br /&gt;
:для случая поддержки TLS, или &lt;br /&gt;
:&amp;lt;pre&amp;gt;ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldap://127.0.0.1:389&amp;lt;/pre&amp;gt;&lt;br /&gt;
:для случая без поддержки TLS&lt;br /&gt;
* Определиться с атрибутом записи, по которой будет осуществляться вход. Например cn, mail или  sAMAccountName&lt;br /&gt;
* Если используется Active Directory, целесообразно в качестве фильтра для поиска записей о пользователе указать значение (&amp;amp;(objectCategory=Person)(sAMAccountName=*))&lt;br /&gt;
&lt;br /&gt;
===== Основные настройки LDAP =====&lt;br /&gt;
* Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;servers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: '''&amp;quot;dc=example,dc=com&amp;quot;''',&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: '''&amp;quot;ldap://ldap1.example.com:389&amp;quot;''',&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: '''&amp;quot;cn=admin,dc=example,dc=com&amp;quot;''',&lt;br /&gt;
          &amp;quot;password&amp;quot;: '''&amp;quot;12345678&amp;quot;'''&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: '''&amp;quot;ou=users&amp;quot;''',&lt;br /&gt;
          &amp;quot;filter&amp;quot;: '''&amp;quot;(&amp;amp;(objectClass=PosixAccount)(cn=*))&amp;quot;''',&lt;br /&gt;
          &amp;quot;login&amp;quot;: '''&amp;quot;cn&amp;quot;''',&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Поиск пользователя в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений user.basedn и basedn. В примере это будет узел ou=users,dc=example,dc=com. Полный DN пользователя указывать в user.basedn не нужно (можно указать пустой или не указывать вообще)&lt;br /&gt;
* Убедиться, что при старте сервера в логах присутствуют строки:&lt;br /&gt;
  2023-04-24T12:35:44.650+0300	info	Loading ldap configuration from file: ldap2.json&lt;br /&gt;
  2023-04-24T12:35:44.650+0300	info	LDAP server added: test_ldap&lt;br /&gt;
* Выполнить команду, заменив хост и порт актуальными значениями&lt;br /&gt;
  svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
* Убедиться, что в выводе команды присутствуют записи вида:&lt;br /&gt;
  Available LDAP servers list:&lt;br /&gt;
  Name: test_ldap	Url: ldap://ldap1.example.com:389&lt;br /&gt;
* Убедиться, что возможен вход тестовым пользователем через cli:&lt;br /&gt;
  curl -X POST --data '{&amp;quot;login&amp;quot;:&amp;quot;test_login&amp;quot;,&amp;quot;password&amp;quot;:&amp;quot;test_password&amp;quot;,&amp;quot;auth_type&amp;quot;:&amp;quot;ldap&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;test_ldap&amp;quot;}' 127.0.0.1:8080/api/public/login&lt;br /&gt;
Вывод должен быть вида:   &lt;br /&gt;
  {&amp;quot;token&amp;quot;:&amp;quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODI5MzYxODcsImlhdCI6MTY4MjMzMTM4Nywicm9sZXMiOlsiYWRtaW5zIl0sInVzZXIiO ...&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
===== Добавление проверки по группе LDAP =====&lt;br /&gt;
Принадлежность пользователя к группе определяется следующим образом:&lt;br /&gt;
* Формируется список всех возможных групп на основе значения group.filter&lt;br /&gt;
* Для каждой сформированной группы формируется список входящих в нее пользователей по следующему принципу:&lt;br /&gt;
** Каждое значение атрибута group.userMember (их может быть несколько) узла LDAP (соответствующего группе) однозначно идентифицирует некоторого пользователя&lt;br /&gt;
** Пользователь входит в группу, если значение атрибута user.group пользователя входит в множество записей, полученных в пункте выше&lt;br /&gt;
&lt;br /&gt;
Для настройки проверки по группе целесообразно выполнить следующие действия:&lt;br /&gt;
* Определиться с узлом в LDAP, относительно которого будет производится поиск групп (поле group.basedn). Поиск групп в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений group.basedn и basedn. В примере это будет узел ou=svacer_groups,ou=groups,dc=example,dc=com&lt;br /&gt;
* Для Active Directory в поле filter можно указать, например, (&amp;amp;(objectCategory=Group)(cn=dep_ivanov)), что будет означать группу dep_ivanov.&lt;br /&gt;
* Изменить конфигурационный файл следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
     ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
      '''&amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;''',&lt;br /&gt;
    },      &lt;br /&gt;
    '''&amp;quot;useGroup&amp;quot;: true,'''&lt;br /&gt;
    '''&amp;quot;group&amp;quot;: {''''&lt;br /&gt;
    '''&amp;quot;basedn&amp;quot;: &amp;quot;ou=svacer_groups,ou=groups&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=*))&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Перезапустить Svacer&lt;br /&gt;
* Убедиться, что возможен вход пользователей, состоящих в группе/группах, и не возможен вход пользователей, не состоящих в группе/группах.&lt;br /&gt;
===== Добавление привязки ролей Svacer к группам LDAP =====&lt;br /&gt;
* Добавить нужные группы в Svacer. Например admins и users.&lt;br /&gt;
* Определиться в каком атрибуте LDAP группы будет хранится имя роли (все сравнения будут чувствительны к регистру). Например, пусть это будет атрибут cn&lt;br /&gt;
* Изменить конфигурационный файл следующим образом&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
 	   ...&lt;br /&gt;
    },      &lt;br /&gt;
    ''' &amp;quot;useGroup&amp;quot;: true, '''&lt;br /&gt;
    ''' &amp;quot;group&amp;quot;: { '''&lt;br /&gt;
    ''' &amp;quot;basedn&amp;quot;: &amp;quot;ou=svacer_groups,ou=groups&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=*))&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;svacerRole&amp;quot;: &amp;quot;cn&amp;quot; '''&lt;br /&gt;
    ''' }, '''&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin / admin). Для проверки привязки ролей Svacer к пользователю loginok можно использовать следующую команду:&lt;br /&gt;
  svacer ldap sync_roles --login loginok --host 127.0.0.1 --port 8080 --user admin --password admin --server test_ldap&lt;br /&gt;
Вывод должен быть следующий:&lt;br /&gt;
  SvacerUserID: 457039b4-4aef-4857-831d-1c080ea154d4&lt;br /&gt;
  SvacerUserLogin: loginok&lt;br /&gt;
  LDAPUserDN: cn=loginok,ou=users,dc=example,dc=com&lt;br /&gt;
  Roles: [314e7571-706c-4463-9280-6a4eee03b42d]&lt;br /&gt;
  Links: [cn=admins,ou=svacer_groups,ou=groups,dc=example,dc=com -&amp;gt; admins (314e7571-706c-4463-9280-6a4eee03b42d)]&lt;br /&gt;
  Applied: false&lt;br /&gt;
&lt;br /&gt;
===== Добавление серверов LDAP, работающих по TLS =====&lt;br /&gt;
* Изменить конфигурационный файл следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;'''ldaps'''://ldap1.example.com:'''636'''&amp;quot;,&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      &amp;quot;ignoreCertCheck&amp;quot;: '''true'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками&lt;br /&gt;
* Для проверки сертификата LDAP сервера добавить сертификат CA (например, ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;ldaps://ldap1.example.com:636&amp;quot;,&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      &amp;quot;ignoreCertCheck&amp;quot;: '''false''',  &lt;br /&gt;
      '''&amp;quot;caCertFiles&amp;quot;: [&amp;quot;/etc/ssl/certs/ldap.crt&amp;quot;]'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что в логах сервера присутствуют записи вида:&lt;br /&gt;
  2023-04-24T13:49:49.298+0300	info	added 1 ca certs from ldap.crt&lt;br /&gt;
* Убедиться, что пользователь LDAP может зайти в систему&lt;br /&gt;
&lt;br /&gt;
===== Добавление резервных серверов LDAP =====&lt;br /&gt;
* Добавить в конфигурационный файл резервные сервера в поле mirrors:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;ldaps://ldap1.example.com:636&amp;quot;,&lt;br /&gt;
      '''&amp;quot;mirrors&amp;quot;: [&amp;quot;ldaps://ldap2.example.com:636&amp;quot;,&amp;quot;ldaps://ldap3.example.com:636&amp;quot;],'''&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Проверить, что вход пользователя LDAP в систему возможен&lt;br /&gt;
* Изменить значение в URL на любое (чтобы сервер, указанный в URL, был не доступен)&lt;br /&gt;
* Перезапустить Svacer&lt;br /&gt;
* Убедиться, что вход пользователя LDAP в систему возможен&lt;br /&gt;
* Поменять значение в URL на верное&lt;br /&gt;
&lt;br /&gt;
==== Возможные ошибки конфигурации ==== &lt;br /&gt;
В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt; при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе '''Settings &amp;gt; Server information'''. Ниже приводится таблица с перечислением возможных ошибок входа пользователя LDAP в систему.&lt;br /&gt;
&lt;br /&gt;
'''Сообщения об ошибках и их возможные причины'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Действие !! Сообщение !! Причина !! Решение&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP server unavailable || 1. Нет соединения с сервером&amp;lt;br/&amp;gt;2. Неверные учетные данные для соединения с сервером || Проверить доступность сервера LDAP с хоста, на котором установлен Svacer. См. утилиту ldapsearch&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP user is not in group||Пользователь не состоит в заданной конфигурацией группе/группах||Проверить поля user.group, group.filter, group.userMember. В списке групп, полученных с использованием group.filter должна быть хотя бы одна группа, в которую входит пользователь&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP group not found. Check configuration || Во время поиска групп, подходящих под фильтр, не найдено ни одной группы || Проверить значение поля group.filter и значения basedn, group.basedn&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP user not allowed or not found || Во время поиска пользователей, подходящих под фильтр, не найдено ни одного пользователя || Проверить значение поля user.filter и значения basedn, user.basedn&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || too much record for user ('%s') found || Поиск пользователя в LDAP с указанными в конфигурации парамтерами дал несколько записей|| Проверить значение поля user.filter и значения basedn, user.basedn. Поиск всегда должен давать одну запись&lt;br /&gt;
|-&lt;br /&gt;
| Запуск сервера || caCert source [%v] ignored || Ошибка поиска сертификатов по указанному шаблону || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными&lt;br /&gt;
|-&lt;br /&gt;
|Запуск сервера || Server [%v] configuration has ignoreCertCheck=false, but no CA certs added. In this case LDAP auth may be impossible || Ошибка конфигурации TLS. В результате обработки значений из поля connection.CaCertFiles не было добавлено ни одного сертификата. Это приводит к тому, что Svacer не может проверить сертификат LDAP сервера, а флаг ignoreCertCheck указан в значении false, что приведет к заведомо ошибочной проверке пользователя || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными&lt;br /&gt;
|}&lt;br /&gt;
Для определения проблем с входом пользователей LDAP в систему при первоначальной настройке интеграции, полезно установить флаг trace в значение true. Результатом станет вывод в лог сервера Debug сообщения с указанием этапа обработки запроса и его параметров.&lt;br /&gt;
&lt;br /&gt;
==== Некоторые замечания для пользователей, которые использовали LDAP в версиях Svacer 5-1-X ====&lt;br /&gt;
&lt;br /&gt;
Если использовался функционал по интеграции Svacer с LDAP серверами в версиях 5-1-X (с 30.03.2022 по 15.07.2022), желательно выполнить модификацию базы данных, так как в ней могут быть ошибки, влияющие на &lt;br /&gt;
&lt;br /&gt;
* механизм тегирования пользователей в комментариях&lt;br /&gt;
* механизм уведомления&lt;br /&gt;
&lt;br /&gt;
Если наблюдаются сбои в работе указанных механизмов, то следует выполнить следующйи sql запрос в БД, с которой работает Svacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;insert into users_status (user_id,status) &lt;br /&gt;
select id,1 from users&lt;br /&gt;
left join users_status us on us.user_id=users.id&lt;br /&gt;
where status is null;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3395</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3395"/>
		<updated>2025-11-27T11:22:11Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Upgrade notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
Если вы использовали аутентификацию с помощью LDAP в версиях Svacer  5-1-X и у вас не работает механизм тегирования или уведомлений (подписки), см [[LDAP configuration#Некоторые замечания для пользователей, которые использовали LDAP, начиная с версии Svacer 5-1-0 до 5-2-0|Решение проблем с отстутствием статуса пользователя в БД]]&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При импорте результатов на сервер индексация идет в фоновой задачи. Появление новых данных в результатах поиска может занять некоторое время.&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
&lt;br /&gt;
=== Переменные окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TAIL_LOG_SIZE&amp;lt;/code&amp;gt;&lt;br /&gt;
|1Мб&lt;br /&gt;
|Число. Размер буффера для показа лога сервера в WEB. Показывается последние SVACER_TAIL_LOG_SIZE байт из лога. &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_LOG_FORMAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;пусто&amp;gt;&lt;br /&gt;
|При указании формата json вывод формат лога заменяется на JSON. Предназначено для интеграции с агрегаторами логов. Так же можно указать через флаг при старте&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server --log-format=json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_INV_GEN_JOBS&amp;lt;/code&amp;gt;&lt;br /&gt;
|0.7 * runtime.GOMAXPROCS&lt;br /&gt;
|Максимальное число параллельных job-ов для генерации инвариантов при миграции старой базы или импорте результатов. &lt;br /&gt;
При ограниченных ресурсах сервера устанавливать в значение 1 или 2.  Пользователь не может увеличить больше, чем GOMAXPROCS&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Пересчет инвариантов ===&lt;br /&gt;
При миграции со старых версий иногда могут быть проблемы с переносом разметки. Для принудительного пересчета инвариантов пользователь может запустить сервер с опцией &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Объектное хранилище ===&lt;br /&gt;
При больших размерах объектного хранилища (object store) пользователь может запустить сервер с параметром &amp;lt;code&amp;gt;--compact-object-store&amp;lt;/code&amp;gt; - это приведет к поиску недостижимых объектов в объектном хранилище и сокращении размера базы. Операция может занять продолжительное время.&lt;br /&gt;
&lt;br /&gt;
'''ЭКСПЕРИМЕНТАЛЬНО''': Для быстрого получения копии текущего объектного хранилища пользователь может использовать CLI команду &lt;br /&gt;
 svacer server backup --host &amp;lt;nowiki&amp;gt;http://localhost:8080&amp;lt;/nowiki&amp;gt; --user admin --password &amp;lt;admin pwd&amp;gt; --checkpoint &amp;lt;path&amp;gt;&lt;br /&gt;
Данная команда создаст по пути ''&amp;lt;path&amp;gt;'' на '''хосте, где работает сервер''',  копию object store. При создании копии по возможности используются hard link-и, для ускорения процесса. Процесс работает в background-е и можно запускать для работающего сервера.&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3394</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3394"/>
		<updated>2025-11-27T10:43:15Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* 12-x-x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
Если вы использовали аутентификацию с помощью LDAP в версиях Svacer с 5-1-0 по 5-2-0 и у вас не работает механизм тегирования или уведомлений (подписки), см [[LDAP configuration#Некоторые замечания для пользователей, которые использовали LDAP, начиная с версии Svacer 5-1-0 до 5-2-0|Решение проблем с отстутствием статуса пользователя в БД]]&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны четыре способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal Access Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель поддерживаемых событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&lt;br /&gt;
&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-host.local:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):&lt;br /&gt;
&lt;br /&gt;
 ==================== #1 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 6 ms&lt;br /&gt;
 ==================== #2 ======================&lt;br /&gt;
 Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
 Created by: admin&lt;br /&gt;
 Error: &lt;br /&gt;
 Success: true&lt;br /&gt;
 SvacerKind: UpdateMarkerReview&lt;br /&gt;
 EventType: EventReviewMarker&lt;br /&gt;
 TargetURL: &amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 ProcessTime: 3 ms&lt;br /&gt;
&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модель поддерживаемых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При импорте результатов на сервер индексация идет в фоновой задачи. Появление новых данных в результатах поиска может занять некоторое время.&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Расширенные параметры настройки сервера ==&lt;br /&gt;
&lt;br /&gt;
=== Переменные окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для изменения внутренних параметров сервера:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Переменная&lt;br /&gt;
!Значение по умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|15 минут&lt;br /&gt;
|Таймаут ожидания процесса начала импорта на сервере. При превышении, запрос на импорт будет отклонен с ошибкой. Формат Go Duration string:  1h2m3s.  Переменная затрагивает только ожидание начала, но не ограничивает сам процесс импорта.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|(&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|Число одновременных параллельных импортов. Остальные ждут в очереди. На ожидание влияет переменная &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_TAIL_LOG_SIZE&amp;lt;/code&amp;gt;&lt;br /&gt;
|1Мб&lt;br /&gt;
|Число. Размер буффера для показа лога сервера в WEB. Показывается последние SVACER_TAIL_LOG_SIZE байт из лога. &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_LOG_FORMAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;пусто&amp;gt;&lt;br /&gt;
|При указании формата json вывод формат лога заменяется на JSON. Предназначено для интеграции с агрегаторами логов. Так же можно указать через флаг при старте&lt;br /&gt;
&amp;lt;code&amp;gt;svacer-server --log-format=json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;SVACER_INV_GEN_JOBS&amp;lt;/code&amp;gt;&lt;br /&gt;
|0.7 * runtime.GOMAXPROCS&lt;br /&gt;
|Максимальное число параллельных job-ов для генерации инвариантов при миграции старой базы или импорте результатов. &lt;br /&gt;
При ограниченных ресурсах сервера устанавливать в значение 1 или 2.  Пользователь не может увеличить больше, чем GOMAXPROCS&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Пересчет инвариантов ===&lt;br /&gt;
При миграции со старых версий иногда могут быть проблемы с переносом разметки. Для принудительного пересчета инвариантов пользователь может запустить сервер с опцией &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Объектное хранилище ===&lt;br /&gt;
При больших размерах объектного хранилища (object store) пользователь может запустить сервер с параметром &amp;lt;code&amp;gt;--compact-object-store&amp;lt;/code&amp;gt; - это приведет к поиску недостижимых объектов в объектном хранилище и сокращении размера базы. Операция может занять продолжительное время.&lt;br /&gt;
&lt;br /&gt;
'''ЭКСПЕРИМЕНТАЛЬНО''': Для быстрого получения копии текущего объектного хранилища пользователь может использовать CLI команду &lt;br /&gt;
 svacer server backup --host &amp;lt;nowiki&amp;gt;http://localhost:8080&amp;lt;/nowiki&amp;gt; --user admin --password &amp;lt;admin pwd&amp;gt; --checkpoint &amp;lt;path&amp;gt;&lt;br /&gt;
Данная команда создаст по пути ''&amp;lt;path&amp;gt;'' на '''хосте, где работает сервер''',  копию object store. При создании копии по возможности используются hard link-и, для ускорения процесса. Процесс работает в background-е и можно запускать для работающего сервера.&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=LDAP_configuration&amp;diff=3392</id>
		<title>LDAP configuration</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=LDAP_configuration&amp;diff=3392"/>
		<updated>2025-11-27T10:40:12Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====  Общий принцип аутентификации ====&lt;br /&gt;
Схема аутентификации с помощью протокола LDAP следующая:&lt;br /&gt;
&lt;br /&gt;
# Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации&lt;br /&gt;
# В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP) &lt;br /&gt;
# При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер Svacer&lt;br /&gt;
# Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя&lt;br /&gt;
# В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя&lt;br /&gt;
# Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей&lt;br /&gt;
&lt;br /&gt;
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:&lt;br /&gt;
* Пользователю нельзя сменить пароль&lt;br /&gt;
* Пользователь не может сменить пароль самостоятельно&lt;br /&gt;
* В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему&lt;br /&gt;
&lt;br /&gt;
====  Запуск сервера с поддержкой LDAP ====&lt;br /&gt;
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap print&lt;br /&gt;
&lt;br /&gt;
Запуск сервера с поддержкой LDAP осуществляется командой:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --ldap ldap.json&lt;br /&gt;
&lt;br /&gt;
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. В логах сервера должна появится информация о добавлении сервера вида: &amp;quot;LDAP Server added: xxxx&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP ([[Help:UI manual#Авторизация в пользовательском интерфейсе сервера Svacer|Авторизация]]).&lt;br /&gt;
&lt;br /&gt;
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. &lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. &lt;br /&gt;
В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки. &lt;br /&gt;
&lt;br /&gt;
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию '''disable-svacer-auth'''. &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
  svacer-server run --ldap ldap.json --disable-svacer-auth&lt;br /&gt;
&lt;br /&gt;
====  Конфигурационный файл сервера для поддержки LDAP  ====&lt;br /&gt;
Типовой пример конфигурации:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;servers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;active_directory&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: &amp;quot;dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
        &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
        &amp;quot;hideURL&amp;quot;: true,&lt;br /&gt;
        &amp;quot;checkAlivePeriod&amp;quot;: 60,	&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;ldaps://192.168.11.71:636&amp;quot;,&lt;br /&gt;
          &amp;quot;mirrors&amp;quot;:[&amp;quot;ldaps://192.168.11.72:636&amp;quot;,&amp;quot;ldaps://192.168.11.73:636&amp;quot;]&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
          &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
          &amp;quot;ignoreCertCheck&amp;quot;: false,&lt;br /&gt;
          &amp;quot;caCertFiles&amp;quot;:[&amp;quot;/etc/ssl/certs/a*&amp;quot;,&amp;quot;/etc/ssl/certs/my_certs/*&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;group&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Group)(cn=dep_devops))&amp;quot;,&lt;br /&gt;
          &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
          &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,&lt;br /&gt;
          &amp;quot;svacerRole&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Person)(sAMAccountName=*))&amp;quot;,&lt;br /&gt;
          &amp;quot;login&amp;quot;: &amp;quot;sAMAccountName&amp;quot;,&lt;br /&gt;
          &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;open_ldap&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
        &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;ldap://127.0.0.1:389&amp;quot;,&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
          &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;group&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;ou=groups&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=svacer))&amp;quot;,&lt;br /&gt;
          &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
          &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;ou=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=PosixAccount))&amp;quot;,&lt;br /&gt;
          &amp;quot;login&amp;quot;: &amp;quot;uid&amp;quot;,&lt;br /&gt;
          &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. &lt;br /&gt;
* name — произвольное имя (уникальное для каждого сервера)&lt;br /&gt;
* trace — флаг, позволяющий получить детальную информацию по этапам обработки запроса на вход пользователя LDAP в Svacer&lt;br /&gt;
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге &lt;br /&gt;
* useGroup — проверять ли принадлежность пользователя к группе &lt;br /&gt;
* hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка&lt;br /&gt;
* checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.&lt;br /&gt;
* connection — подсекция, описывающая параметры соединения с сервером &lt;br /&gt;
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636)&lt;br /&gt;
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL&lt;br /&gt;
:* connectAs — имя пользователя в формате DN, от которого будут производится операции в LDAP каталоге &lt;br /&gt;
:* password — пароль пользователя &lt;br /&gt;
:* ignoreCertCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles&lt;br /&gt;
:* CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM&lt;br /&gt;
* group — подсекция, описывает параметры проверки принадлежности пользователя к группе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп &lt;br /&gt;
:* userMember — атрибут, содержащий пользователей группы&lt;br /&gt;
:* display — атрибут, содержащий имя группы для отображения &lt;br /&gt;
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем&lt;br /&gt;
* user — подсекция, описывает параметры получения информации о пользователе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске пользователей&lt;br /&gt;
:* login — атрибут, в котором находится login пользователя&lt;br /&gt;
:* group — атрибут, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)&lt;br /&gt;
:* defaultRole — роль Svacer, автоматически добавляемая всем пользователям LDAP, успешно вошедшим в Svacer&lt;br /&gt;
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе &lt;br /&gt;
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО)&lt;br /&gt;
::* email — атрибут с почтовым адресом &lt;br /&gt;
::* firstName — атрибут с именем &lt;br /&gt;
::* lastName — атрибут с фамилией &lt;br /&gt;
* enabled — использовать или нет данный сервер &lt;br /&gt;
&lt;br /&gt;
Конфигурацию для подключения к серверам '''LDAP''' можно также задать в конфигурационном файле '''Svacer'''. Например:&lt;br /&gt;
&lt;br /&gt;
 auth:&lt;br /&gt;
   ldap:&lt;br /&gt;
     servers:&lt;br /&gt;
     - name: freeIPA&lt;br /&gt;
       basedn: dc=example,dc=com&lt;br /&gt;
       useGroup: false&lt;br /&gt;
       type: freeIPA&lt;br /&gt;
       hideURL: true&lt;br /&gt;
       checkAlivePeriod: 1&lt;br /&gt;
       connection:&lt;br /&gt;
         url: ldap://svacer.local:7001&lt;br /&gt;
         connectAs: cn=admin,dc=example,dc=com&lt;br /&gt;
         password: 12345678&lt;br /&gt;
       user:&lt;br /&gt;
         basedn: ou=users&lt;br /&gt;
         filter: &amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberOf=*))&amp;quot;&lt;br /&gt;
         login: cn&lt;br /&gt;
         info:&lt;br /&gt;
           display: cn&lt;br /&gt;
           email: mail&lt;br /&gt;
           firstName: givenName&lt;br /&gt;
           lastName: sn&lt;br /&gt;
       enabled: true&lt;br /&gt;
     - name: example1&lt;br /&gt;
       basedn: dc=example,dc=com&lt;br /&gt;
       useGroup: false&lt;br /&gt;
       hideURL: true&lt;br /&gt;
       checkAlivePeriod: 1&lt;br /&gt;
       connection:&lt;br /&gt;
         url: ldap://svacer.local:7001&lt;br /&gt;
         connectAs: cn=admin,dc=example,dc=com&lt;br /&gt;
         password: 12345678&lt;br /&gt;
       user:&lt;br /&gt;
         basedn: &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
         filter: &amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberOf=*))&amp;quot;&lt;br /&gt;
         login: cn&lt;br /&gt;
         group: dn&lt;br /&gt;
         info:&lt;br /&gt;
           display: cn&lt;br /&gt;
           email: mail&lt;br /&gt;
           firstName: givenName&lt;br /&gt;
           lastName: sn&lt;br /&gt;
       enabled: true&lt;br /&gt;
&lt;br /&gt;
[[LDAP configuration|Подробное описание взаимодействия SVACER с LDAP сервером]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше&lt;br /&gt;
:# Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами &lt;br /&gt;
:#* используется TLS соединение (ldaps префикс)&lt;br /&gt;
:#* порт 636&lt;br /&gt;
:#* проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)&lt;br /&gt;
:#* логин для подключения к LDAP серверу: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot; (connectAs); пароль: 12345678 (password)&lt;br /&gt;
:# Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1&lt;br /&gt;
:# Если подключение невозможно, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами:&lt;br /&gt;
:#* строка запроса: (&amp;amp;(sAMAccountName=ivanov_ii)((&amp;amp;(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&amp;amp;(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла&lt;br /&gt;
:#*начальный узел, с которого будет произведен поиск: cn=users,dc=domain,dc=home,dc=org&lt;br /&gt;
:#*поиск производится по всему поддереву&lt;br /&gt;
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой&lt;br /&gt;
:# Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя&lt;br /&gt;
:#* выполняется поиск групп в каталоге LDAP со следующими параметрами:&lt;br /&gt;
:#**строка запроса: (&amp;amp;(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter&lt;br /&gt;
:#**начальный узел: cn=users,dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла&lt;br /&gt;
:#**поиск производится по всему поддереву&lt;br /&gt;
:#**определяется список пользователей группы, каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла)&lt;br /&gt;
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой&lt;br /&gt;
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.  &lt;br /&gt;
:#* Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)&lt;br /&gt;
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой&lt;br /&gt;
:# Процесс аутентификации пользователя произведен успешно&lt;br /&gt;
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет {{Note|type=warn|text=С версии 11 наличие двух пользователей с одинаковым логином: локального и пользователя LDAP — не допускается}}&lt;br /&gt;
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)&lt;br /&gt;
&lt;br /&gt;
==== Привязка группы LDAP к роли Svacer ====&lt;br /&gt;
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:&lt;br /&gt;
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins,ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer&lt;br /&gt;
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins,ou=svacer,dc=example,dc=com)&lt;br /&gt;
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins&lt;br /&gt;
:* Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole=&amp;quot;cn&amp;quot;&lt;br /&gt;
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:&lt;br /&gt;
:* Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла {{Note|text=На первом этапе будет произведен поиск всех групп, которые подпадают под условие фильтра в секции group. По этой причине необходимо указывать наиболее точное значение для фильтра группы, чтобы не было чрезмерно большого количества записей в результатах поиска (для MSAD — 2000 записей)}} Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)&lt;br /&gt;
:* Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev (это те группы, которые могут быть привязаны к ролям Svacer)&lt;br /&gt;
:* Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.&lt;br /&gt;
&lt;br /&gt;
Удаление ролей автоматически не производится. Вместо этого предлагается ручной режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli&lt;br /&gt;
&lt;br /&gt;
  svacer ldap sync_roles --login [user_login] --server [server_name] --apply&lt;br /&gt;
&lt;br /&gt;
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет &amp;quot;оценить&amp;quot; получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.&lt;br /&gt;
&lt;br /&gt;
Автоматическое назначение пользователю LDAP некоторой роли также возможно осуществить, указав необходимую роль в параметре '''user.defaultRole''' конфигурационного файла LDAP. Данная роль будет назначена в том случае, если она существует на момент входа пользователя в систему. Добавление роли будет происходить при каждом входе пользователя в систему. Поэтому даже если у пользователя эту роль удалить явно, она все равно будет добавлена пользователю при следующем входе. Данный механизм назначения роли работает независимо от настройки привязки роли к группе LDAP. &lt;br /&gt;
&lt;br /&gt;
==== Использование CLI сервера Svacer с поддержкой LDAP ====&lt;br /&gt;
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля  имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо).  Например:&lt;br /&gt;
    &lt;br /&gt;
  svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:&lt;br /&gt;
&lt;br /&gt;
  SVACER_LDAP_SERVER=&amp;quot;openLDAP2&amp;quot; svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Для получения списка поддерживаемых свейсером LDAP серверов используйте команду:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
&lt;br /&gt;
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных LDAP пользователей ====&lt;br /&gt;
Для каждого LDAP пользователя создается соответствующая ему запись в  БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты.  Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. &lt;br /&gt;
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера (см. раздел [[Help:UI manual#Управление пользователями|Управление пользователями]]).&lt;br /&gt;
&lt;br /&gt;
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap updateUsers --onlyEmpty&lt;br /&gt;
&lt;br /&gt;
Флаг '''onlyEmpty''' позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример конфигурации сервера Svacer для поддержки аутентификации по LDAP протоколу ====&lt;br /&gt;
&lt;br /&gt;
Для упрощения настройки интеграции с LDAP сервером, процесс настройки можно разбить на этапы и переходить к следующему только если успешно завершен предыдущий этап. В первую очередь необходимо выяснить актуальные параметры подключения к ldap серверу:&lt;br /&gt;
* URL; Например ldap://10.11.12.13:389 или  ldaps://10.11.12.13:636&lt;br /&gt;
* Учетные данные с которыми будет осуществляться подключение к LDAP серверу при каждой попытке входа пользователем; Например, login: cn=admin,dc=example,dc=com, пароль: 12345678&lt;br /&gt;
* Определиться с корнем LDAP дерева (базовый узел), относительно которого будут выполняться все операции; Например: dc=example,dc=com&lt;br /&gt;
* Проверить, что с указанными учетными данными  возможно подключение к серверу LDAP и просмотр его содержимого с некоторого узла, расположенного ниже базового; Например, с узла ou=users,dc=example,dc=com для рассматриваемого примера. Проверить можно, например, используя следующую команду:&lt;br /&gt;
:&amp;lt;pre&amp;gt;LDAPTLS_REQCERT=never ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldaps://127.0.0.1:636&amp;lt;/pre&amp;gt;&lt;br /&gt;
:для случая поддержки TLS, или &lt;br /&gt;
:&amp;lt;pre&amp;gt;ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldap://127.0.0.1:389&amp;lt;/pre&amp;gt;&lt;br /&gt;
:для случая без поддержки TLS&lt;br /&gt;
* Определиться с атрибутом записи, по которой будет осуществляться вход. Например cn, mail или  sAMAccountName&lt;br /&gt;
* Если используется Active Directory, целесообразно в качестве фильтра для поиска записей о пользователе указать значение (&amp;amp;(objectCategory=Person)(sAMAccountName=*))&lt;br /&gt;
&lt;br /&gt;
===== Основные настройки LDAP =====&lt;br /&gt;
* Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;servers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: '''&amp;quot;dc=example,dc=com&amp;quot;''',&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: '''&amp;quot;ldap://ldap1.example.com:389&amp;quot;''',&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: '''&amp;quot;cn=admin,dc=example,dc=com&amp;quot;''',&lt;br /&gt;
          &amp;quot;password&amp;quot;: '''&amp;quot;12345678&amp;quot;'''&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: '''&amp;quot;ou=users&amp;quot;''',&lt;br /&gt;
          &amp;quot;filter&amp;quot;: '''&amp;quot;(&amp;amp;(objectClass=PosixAccount)(cn=*))&amp;quot;''',&lt;br /&gt;
          &amp;quot;login&amp;quot;: '''&amp;quot;cn&amp;quot;''',&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Поиск пользователя в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений user.basedn и basedn. В примере это будет узел ou=users,dc=example,dc=com. Полный DN пользователя указывать в user.basedn не нужно (можно указать пустой или не указывать вообще)&lt;br /&gt;
* Убедиться, что при старте сервера в логах присутствуют строки:&lt;br /&gt;
  2023-04-24T12:35:44.650+0300	info	Loading ldap configuration from file: ldap2.json&lt;br /&gt;
  2023-04-24T12:35:44.650+0300	info	LDAP server added: test_ldap&lt;br /&gt;
* Выполнить команду, заменив хост и порт актуальными значениями&lt;br /&gt;
  svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
* Убедиться, что в выводе команды присутствуют записи вида:&lt;br /&gt;
  Available LDAP servers list:&lt;br /&gt;
  Name: test_ldap	Url: ldap://ldap1.example.com:389&lt;br /&gt;
* Убедиться, что возможен вход тестовым пользователем через cli:&lt;br /&gt;
  curl -X POST --data '{&amp;quot;login&amp;quot;:&amp;quot;test_login&amp;quot;,&amp;quot;password&amp;quot;:&amp;quot;test_password&amp;quot;,&amp;quot;auth_type&amp;quot;:&amp;quot;ldap&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;test_ldap&amp;quot;}' 127.0.0.1:8080/api/public/login&lt;br /&gt;
Вывод должен быть вида:   &lt;br /&gt;
  {&amp;quot;token&amp;quot;:&amp;quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODI5MzYxODcsImlhdCI6MTY4MjMzMTM4Nywicm9sZXMiOlsiYWRtaW5zIl0sInVzZXIiO ...&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
===== Добавление проверки по группе LDAP =====&lt;br /&gt;
Принадлежность пользователя к группе определяется следующим образом:&lt;br /&gt;
* Формируется список всех возможных групп на основе значения group.filter&lt;br /&gt;
* Для каждой сформированной группы формируется список входящих в нее пользователей по следующему принципу:&lt;br /&gt;
** Каждое значение атрибута group.userMember (их может быть несколько) узла LDAP (соответствующего группе) однозначно идентифицирует некоторого пользователя&lt;br /&gt;
** Пользователь входит в группу, если значение атрибута user.group пользователя входит в множество записей, полученных в пункте выше&lt;br /&gt;
&lt;br /&gt;
Для настройки проверки по группе целесообразно выполнить следующие действия:&lt;br /&gt;
* Определиться с узлом в LDAP, относительно которого будет производится поиск групп (поле group.basedn). Поиск групп в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений group.basedn и basedn. В примере это будет узел ou=svacer_groups,ou=groups,dc=example,dc=com&lt;br /&gt;
* Для Active Directory в поле filter можно указать, например, (&amp;amp;(objectCategory=Group)(cn=dep_ivanov)), что будет означать группу dep_ivanov.&lt;br /&gt;
* Изменить конфигурационный файл следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
     ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
      '''&amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;''',&lt;br /&gt;
    },      &lt;br /&gt;
    '''&amp;quot;useGroup&amp;quot;: true,'''&lt;br /&gt;
    '''&amp;quot;group&amp;quot;: {''''&lt;br /&gt;
    '''&amp;quot;basedn&amp;quot;: &amp;quot;ou=svacer_groups,ou=groups&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=*))&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Перезапустить Svacer&lt;br /&gt;
* Убедиться, что возможен вход пользователей, состоящих в группе/группах, и не возможен вход пользователей, не состоящих в группе/группах.&lt;br /&gt;
===== Добавление привязки ролей Svacer к группам LDAP =====&lt;br /&gt;
* Добавить нужные группы в Svacer. Например admins и users.&lt;br /&gt;
* Определиться в каком атрибуте LDAP группы будет хранится имя роли (все сравнения будут чувствительны к регистру). Например, пусть это будет атрибут cn&lt;br /&gt;
* Изменить конфигурационный файл следующим образом&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
 	   ...&lt;br /&gt;
    },      &lt;br /&gt;
    ''' &amp;quot;useGroup&amp;quot;: true, '''&lt;br /&gt;
    ''' &amp;quot;group&amp;quot;: { '''&lt;br /&gt;
    ''' &amp;quot;basedn&amp;quot;: &amp;quot;ou=svacer_groups,ou=groups&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=*))&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;svacerRole&amp;quot;: &amp;quot;cn&amp;quot; '''&lt;br /&gt;
    ''' }, '''&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin / admin). Для проверки привязки ролей Svacer к пользователю loginok можно использовать следующую команду:&lt;br /&gt;
  svacer ldap sync_roles --login loginok --host 127.0.0.1 --port 8080 --user admin --password admin --server test_ldap&lt;br /&gt;
Вывод должен быть следующий:&lt;br /&gt;
  SvacerUserID: 457039b4-4aef-4857-831d-1c080ea154d4&lt;br /&gt;
  SvacerUserLogin: loginok&lt;br /&gt;
  LDAPUserDN: cn=loginok,ou=users,dc=example,dc=com&lt;br /&gt;
  Roles: [314e7571-706c-4463-9280-6a4eee03b42d]&lt;br /&gt;
  Links: [cn=admins,ou=svacer_groups,ou=groups,dc=example,dc=com -&amp;gt; admins (314e7571-706c-4463-9280-6a4eee03b42d)]&lt;br /&gt;
  Applied: false&lt;br /&gt;
&lt;br /&gt;
===== Добавление серверов LDAP, работающих по TLS =====&lt;br /&gt;
* Изменить конфигурационный файл следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;'''ldaps'''://ldap1.example.com:'''636'''&amp;quot;,&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      &amp;quot;ignoreCertCheck&amp;quot;: '''true'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками&lt;br /&gt;
* Для проверки сертификата LDAP сервера добавить сертификат CA (например, ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;ldaps://ldap1.example.com:636&amp;quot;,&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      &amp;quot;ignoreCertCheck&amp;quot;: '''false''',  &lt;br /&gt;
      '''&amp;quot;caCertFiles&amp;quot;: [&amp;quot;/etc/ssl/certs/ldap.crt&amp;quot;]'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что в логах сервера присутствуют записи вида:&lt;br /&gt;
  2023-04-24T13:49:49.298+0300	info	added 1 ca certs from ldap.crt&lt;br /&gt;
* Убедиться, что пользователь LDAP может зайти в систему&lt;br /&gt;
&lt;br /&gt;
===== Добавление резервных серверов LDAP =====&lt;br /&gt;
* Добавить в конфигурационный файл резервные сервера в поле mirrors:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;ldaps://ldap1.example.com:636&amp;quot;,&lt;br /&gt;
      '''&amp;quot;mirrors&amp;quot;: [&amp;quot;ldaps://ldap2.example.com:636&amp;quot;,&amp;quot;ldaps://ldap3.example.com:636&amp;quot;],'''&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Проверить, что вход пользователя LDAP в систему возможен&lt;br /&gt;
* Изменить значение в URL на любое (чтобы сервер, указанный в URL, был не доступен)&lt;br /&gt;
* Перезапустить Svacer&lt;br /&gt;
* Убедиться, что вход пользователя LDAP в систему возможен&lt;br /&gt;
* Поменять значение в URL на верное&lt;br /&gt;
&lt;br /&gt;
==== Возможные ошибки конфигурации ==== &lt;br /&gt;
В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt; при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе '''Settings &amp;gt; Server information'''. Ниже приводится таблица с перечислением возможных ошибок входа пользователя LDAP в систему.&lt;br /&gt;
&lt;br /&gt;
'''Сообщения об ошибках и их возможные причины'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Действие !! Сообщение !! Причина !! Решение&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP server unavailable || 1. Нет соединения с сервером&amp;lt;br/&amp;gt;2. Неверные учетные данные для соединения с сервером || Проверить доступность сервера LDAP с хоста, на котором установлен Svacer. См. утилиту ldapsearch&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP user is not in group||Пользователь не состоит в заданной конфигурацией группе/группах||Проверить поля user.group, group.filter, group.userMember. В списке групп, полученных с использованием group.filter должна быть хотя бы одна группа, в которую входит пользователь&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP group not found. Check configuration || Во время поиска групп, подходящих под фильтр, не найдено ни одной группы || Проверить значение поля group.filter и значения basedn, group.basedn&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP user not allowed or not found || Во время поиска пользователей, подходящих под фильтр, не найдено ни одного пользователя || Проверить значение поля user.filter и значения basedn, user.basedn&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || too much record for user ('%s') found || Поиск пользователя в LDAP с указанными в конфигурации парамтерами дал несколько записей|| Проверить значение поля user.filter и значения basedn, user.basedn. Поиск всегда должен давать одну запись&lt;br /&gt;
|-&lt;br /&gt;
| Запуск сервера || caCert source [%v] ignored || Ошибка поиска сертификатов по указанному шаблону || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными&lt;br /&gt;
|-&lt;br /&gt;
|Запуск сервера || Server [%v] configuration has ignoreCertCheck=false, but no CA certs added. In this case LDAP auth may be impossible || Ошибка конфигурации TLS. В результате обработки значений из поля connection.CaCertFiles не было добавлено ни одного сертификата. Это приводит к тому, что Svacer не может проверить сертификат LDAP сервера, а флаг ignoreCertCheck указан в значении false, что приведет к заведомо ошибочной проверке пользователя || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными&lt;br /&gt;
|}&lt;br /&gt;
Для определения проблем с входом пользователей LDAP в систему при первоначальной настройке интеграции, полезно установить флаг trace в значение true. Результатом станет вывод в лог сервера Debug сообщения с указанием этапа обработки запроса и его параметров.&lt;br /&gt;
&lt;br /&gt;
==== Некоторые замечания для пользователей, которые использовали LDAP, начиная с версии Svacer 5-1-0 до 5-2-0 ====&lt;br /&gt;
&lt;br /&gt;
Для пользователей, которые использовали функционал по интеграции с LDAP серверами в период между релизами Svacer 5-1-0 и 5-2-0 (с 30.03.2022 по 15.07.2022) желательная ручная модификации базы данных, так как в ней могут быть ошибки, влияющие на &lt;br /&gt;
&lt;br /&gt;
* механизм тегирования пользователей в комментариях&lt;br /&gt;
* механизм уведомления&lt;br /&gt;
&lt;br /&gt;
Если в процессе функционирования сервера наблюдаются сбои в работе указанных механизмов, то следует выполнить следующйи sql запрос в БД, с которой работает Svacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;insert into users_status (user_id,status) &lt;br /&gt;
select id,1 from users&lt;br /&gt;
left join users_status us on us.user_id=users.id&lt;br /&gt;
where status is null;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=LDAP_configuration&amp;diff=3391</id>
		<title>LDAP configuration</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=LDAP_configuration&amp;diff=3391"/>
		<updated>2025-11-27T10:39:55Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====  Общий принцип аутентификации ====&lt;br /&gt;
Схема аутентификации с помощью протокола LDAP следующая:&lt;br /&gt;
&lt;br /&gt;
# Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации&lt;br /&gt;
# В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP) &lt;br /&gt;
# При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер Svacer&lt;br /&gt;
# Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя&lt;br /&gt;
# В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя&lt;br /&gt;
# Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей&lt;br /&gt;
&lt;br /&gt;
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:&lt;br /&gt;
* Пользователю нельзя сменить пароль&lt;br /&gt;
* Пользователь не может сменить пароль самостоятельно&lt;br /&gt;
* В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему&lt;br /&gt;
&lt;br /&gt;
====  Запуск сервера с поддержкой LDAP ====&lt;br /&gt;
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap print&lt;br /&gt;
&lt;br /&gt;
Запуск сервера с поддержкой LDAP осуществляется командой:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --ldap ldap.json&lt;br /&gt;
&lt;br /&gt;
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. В логах сервера должна появится информация о добавлении сервера вида: &amp;quot;LDAP Server added: xxxx&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP ([[Help:UI manual#Авторизация в пользовательском интерфейсе сервера Svacer|Авторизация]]).&lt;br /&gt;
&lt;br /&gt;
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. &lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. &lt;br /&gt;
В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки. &lt;br /&gt;
&lt;br /&gt;
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию '''disable-svacer-auth'''. &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
  svacer-server run --ldap ldap.json --disable-svacer-auth&lt;br /&gt;
&lt;br /&gt;
====  Конфигурационный файл сервера для поддержки LDAP  ====&lt;br /&gt;
Типовой пример конфигурации:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;servers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;active_directory&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: &amp;quot;dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
        &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
        &amp;quot;hideURL&amp;quot;: true,&lt;br /&gt;
        &amp;quot;checkAlivePeriod&amp;quot;: 60,	&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;ldaps://192.168.11.71:636&amp;quot;,&lt;br /&gt;
          &amp;quot;mirrors&amp;quot;:[&amp;quot;ldaps://192.168.11.72:636&amp;quot;,&amp;quot;ldaps://192.168.11.73:636&amp;quot;]&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot;,&lt;br /&gt;
          &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
          &amp;quot;ignoreCertCheck&amp;quot;: false,&lt;br /&gt;
          &amp;quot;caCertFiles&amp;quot;:[&amp;quot;/etc/ssl/certs/a*&amp;quot;,&amp;quot;/etc/ssl/certs/my_certs/*&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;group&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Group)(cn=dep_devops))&amp;quot;,&lt;br /&gt;
          &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
          &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,&lt;br /&gt;
          &amp;quot;svacerRole&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;cn=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectCategory=Person)(sAMAccountName=*))&amp;quot;,&lt;br /&gt;
          &amp;quot;login&amp;quot;: &amp;quot;sAMAccountName&amp;quot;,&lt;br /&gt;
          &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;open_ldap&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
        &amp;quot;useGroup&amp;quot;: true,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;ldap://127.0.0.1:389&amp;quot;,&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
          &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;group&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;ou=groups&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=svacer))&amp;quot;,&lt;br /&gt;
          &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,&lt;br /&gt;
          &amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: &amp;quot;ou=users&amp;quot;,&lt;br /&gt;
          &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=PosixAccount))&amp;quot;,&lt;br /&gt;
          &amp;quot;login&amp;quot;: &amp;quot;uid&amp;quot;,&lt;br /&gt;
          &amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;dn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. &lt;br /&gt;
* name — произвольное имя (уникальное для каждого сервера)&lt;br /&gt;
* trace — флаг, позволяющий получить детальную информацию по этапам обработки запроса на вход пользователя LDAP в Svacer&lt;br /&gt;
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге &lt;br /&gt;
* useGroup — проверять ли принадлежность пользователя к группе &lt;br /&gt;
* hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка&lt;br /&gt;
* checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.&lt;br /&gt;
* connection — подсекция, описывающая параметры соединения с сервером &lt;br /&gt;
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636)&lt;br /&gt;
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL&lt;br /&gt;
:* connectAs — имя пользователя в формате DN, от которого будут производится операции в LDAP каталоге &lt;br /&gt;
:* password — пароль пользователя &lt;br /&gt;
:* ignoreCertCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles&lt;br /&gt;
:* CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM&lt;br /&gt;
* group — подсекция, описывает параметры проверки принадлежности пользователя к группе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп &lt;br /&gt;
:* userMember — атрибут, содержащий пользователей группы&lt;br /&gt;
:* display — атрибут, содержащий имя группы для отображения &lt;br /&gt;
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем&lt;br /&gt;
* user — подсекция, описывает параметры получения информации о пользователе &lt;br /&gt;
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы &lt;br /&gt;
:* filter — фильтр, используемый при поиске пользователей&lt;br /&gt;
:* login — атрибут, в котором находится login пользователя&lt;br /&gt;
:* group — атрибут, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)&lt;br /&gt;
:* defaultRole — роль Svacer, автоматически добавляемая всем пользователям LDAP, успешно вошедшим в Svacer&lt;br /&gt;
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе &lt;br /&gt;
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО)&lt;br /&gt;
::* email — атрибут с почтовым адресом &lt;br /&gt;
::* firstName — атрибут с именем &lt;br /&gt;
::* lastName — атрибут с фамилией &lt;br /&gt;
* enabled — использовать или нет данный сервер &lt;br /&gt;
&lt;br /&gt;
Конфигурацию для подключения к серверам '''LDAP''' можно также задать в конфигурационном файле '''Svacer'''. Например:&lt;br /&gt;
&lt;br /&gt;
 auth:&lt;br /&gt;
   ldap:&lt;br /&gt;
     servers:&lt;br /&gt;
     - name: freeIPA&lt;br /&gt;
       basedn: dc=example,dc=com&lt;br /&gt;
       useGroup: false&lt;br /&gt;
       type: freeIPA&lt;br /&gt;
       hideURL: true&lt;br /&gt;
       checkAlivePeriod: 1&lt;br /&gt;
       connection:&lt;br /&gt;
         url: ldap://svacer.local:7001&lt;br /&gt;
         connectAs: cn=admin,dc=example,dc=com&lt;br /&gt;
         password: 12345678&lt;br /&gt;
       user:&lt;br /&gt;
         basedn: ou=users&lt;br /&gt;
         filter: &amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberOf=*))&amp;quot;&lt;br /&gt;
         login: cn&lt;br /&gt;
         info:&lt;br /&gt;
           display: cn&lt;br /&gt;
           email: mail&lt;br /&gt;
           firstName: givenName&lt;br /&gt;
           lastName: sn&lt;br /&gt;
       enabled: true&lt;br /&gt;
     - name: example1&lt;br /&gt;
       basedn: dc=example,dc=com&lt;br /&gt;
       useGroup: false&lt;br /&gt;
       hideURL: true&lt;br /&gt;
       checkAlivePeriod: 1&lt;br /&gt;
       connection:&lt;br /&gt;
         url: ldap://svacer.local:7001&lt;br /&gt;
         connectAs: cn=admin,dc=example,dc=com&lt;br /&gt;
         password: 12345678&lt;br /&gt;
       user:&lt;br /&gt;
         basedn: &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
         filter: &amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberOf=*))&amp;quot;&lt;br /&gt;
         login: cn&lt;br /&gt;
         group: dn&lt;br /&gt;
         info:&lt;br /&gt;
           display: cn&lt;br /&gt;
           email: mail&lt;br /&gt;
           firstName: givenName&lt;br /&gt;
           lastName: sn&lt;br /&gt;
       enabled: true&lt;br /&gt;
&lt;br /&gt;
[[LDAP configuration|Подробное описание взаимодействия SVACER с LDAP сервером]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше&lt;br /&gt;
:# Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами &lt;br /&gt;
:#* используется TLS соединение (ldaps префикс)&lt;br /&gt;
:#* порт 636&lt;br /&gt;
:#* проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)&lt;br /&gt;
:#* логин для подключения к LDAP серверу: &amp;quot;cn=ldap_service,cn=users,dc=domain,dc=home,dc=org&amp;quot; (connectAs); пароль: 12345678 (password)&lt;br /&gt;
:# Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1&lt;br /&gt;
:# Если подключение невозможно, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами:&lt;br /&gt;
:#* строка запроса: (&amp;amp;(sAMAccountName=ivanov_ii)((&amp;amp;(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&amp;amp;(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла&lt;br /&gt;
:#*начальный узел, с которого будет произведен поиск: cn=users,dc=domain,dc=home,dc=org&lt;br /&gt;
:#*поиск производится по всему поддереву&lt;br /&gt;
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой&lt;br /&gt;
:# Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя&lt;br /&gt;
:#* выполняется поиск групп в каталоге LDAP со следующими параметрами:&lt;br /&gt;
:#**строка запроса: (&amp;amp;(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter&lt;br /&gt;
:#**начальный узел: cn=users,dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла&lt;br /&gt;
:#**поиск производится по всему поддереву&lt;br /&gt;
:#**определяется список пользователей группы, каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла)&lt;br /&gt;
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой&lt;br /&gt;
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.  &lt;br /&gt;
:#* Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой&lt;br /&gt;
:# Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)&lt;br /&gt;
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой&lt;br /&gt;
:# Процесс аутентификации пользователя произведен успешно&lt;br /&gt;
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет {{Note|type=warn|text=С версии 11 наличие двух пользователей с одинаковым логином: локального и пользователя LDAP — не допускается}}&lt;br /&gt;
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)&lt;br /&gt;
&lt;br /&gt;
==== Привязка группы LDAP к роли Svacer ====&lt;br /&gt;
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:&lt;br /&gt;
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins,ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer&lt;br /&gt;
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins,ou=svacer,dc=example,dc=com)&lt;br /&gt;
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins&lt;br /&gt;
:* Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole=&amp;quot;cn&amp;quot;&lt;br /&gt;
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:&lt;br /&gt;
:* Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла {{Note|text=На первом этапе будет произведен поиск всех групп, которые подпадают под условие фильтра в секции group. По этой причине необходимо указывать наиболее точное значение для фильтра группы, чтобы не было чрезмерно большого количества записей в результатах поиска (для MSAD — 2000 записей)}} Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)&lt;br /&gt;
:* Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev (это те группы, которые могут быть привязаны к ролям Svacer)&lt;br /&gt;
:* Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.&lt;br /&gt;
&lt;br /&gt;
Удаление ролей автоматически не производится. Вместо этого предлагается ручной режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli&lt;br /&gt;
&lt;br /&gt;
  svacer ldap sync_roles --login [user_login] --server [server_name] --apply&lt;br /&gt;
&lt;br /&gt;
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет &amp;quot;оценить&amp;quot; получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.&lt;br /&gt;
&lt;br /&gt;
Автоматическое назначение пользователю LDAP некоторой роли также возможно осуществить, указав необходимую роль в параметре '''user.defaultRole''' конфигурационного файла LDAP. Данная роль будет назначена в том случае, если она существует на момент входа пользователя в систему. Добавление роли будет происходить при каждом входе пользователя в систему. Поэтому даже если у пользователя эту роль удалить явно, она все равно будет добавлена пользователю при следующем входе. Данный механизм назначения роли работает независимо от настройки привязки роли к группе LDAP. &lt;br /&gt;
&lt;br /&gt;
==== Использование CLI сервера Svacer с поддержкой LDAP ====&lt;br /&gt;
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля  имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо).  Например:&lt;br /&gt;
    &lt;br /&gt;
  svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:&lt;br /&gt;
&lt;br /&gt;
  SVACER_LDAP_SERVER=&amp;quot;openLDAP2&amp;quot; svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140&lt;br /&gt;
&lt;br /&gt;
Для получения списка поддерживаемых свейсером LDAP серверов используйте команду:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
&lt;br /&gt;
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных LDAP пользователей ====&lt;br /&gt;
Для каждого LDAP пользователя создается соответствующая ему запись в  БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты.  Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. &lt;br /&gt;
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера (см. раздел [[Help:UI manual#Управление пользователями|Управление пользователями]]).&lt;br /&gt;
&lt;br /&gt;
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
  svacer ldap updateUsers --onlyEmpty&lt;br /&gt;
&lt;br /&gt;
Флаг '''onlyEmpty''' позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример конфигурации сервера Svacer для поддержки аутентификации по LDAP протоколу ====&lt;br /&gt;
&lt;br /&gt;
Для упрощения настройки интеграции с LDAP сервером, процесс настройки можно разбить на этапы и переходить к следующему только если успешно завершен предыдущий этап. В первую очередь необходимо выяснить актуальные параметры подключения к ldap серверу:&lt;br /&gt;
* URL; Например ldap://10.11.12.13:389 или  ldaps://10.11.12.13:636&lt;br /&gt;
* Учетные данные с которыми будет осуществляться подключение к LDAP серверу при каждой попытке входа пользователем; Например, login: cn=admin,dc=example,dc=com, пароль: 12345678&lt;br /&gt;
* Определиться с корнем LDAP дерева (базовый узел), относительно которого будут выполняться все операции; Например: dc=example,dc=com&lt;br /&gt;
* Проверить, что с указанными учетными данными  возможно подключение к серверу LDAP и просмотр его содержимого с некоторого узла, расположенного ниже базового; Например, с узла ou=users,dc=example,dc=com для рассматриваемого примера. Проверить можно, например, используя следующую команду:&lt;br /&gt;
:&amp;lt;pre&amp;gt;LDAPTLS_REQCERT=never ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldaps://127.0.0.1:636&amp;lt;/pre&amp;gt;&lt;br /&gt;
:для случая поддержки TLS, или &lt;br /&gt;
:&amp;lt;pre&amp;gt;ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldap://127.0.0.1:389&amp;lt;/pre&amp;gt;&lt;br /&gt;
:для случая без поддержки TLS&lt;br /&gt;
* Определиться с атрибутом записи, по которой будет осуществляться вход. Например cn, mail или  sAMAccountName&lt;br /&gt;
* Если используется Active Directory, целесообразно в качестве фильтра для поиска записей о пользователе указать значение (&amp;amp;(objectCategory=Person)(sAMAccountName=*))&lt;br /&gt;
&lt;br /&gt;
===== Основные настройки LDAP =====&lt;br /&gt;
* Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;servers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
        &amp;quot;basedn&amp;quot;: '''&amp;quot;dc=example,dc=com&amp;quot;''',&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
          &amp;quot;url&amp;quot;: '''&amp;quot;ldap://ldap1.example.com:389&amp;quot;''',&lt;br /&gt;
          &amp;quot;connectAs&amp;quot;: '''&amp;quot;cn=admin,dc=example,dc=com&amp;quot;''',&lt;br /&gt;
          &amp;quot;password&amp;quot;: '''&amp;quot;12345678&amp;quot;'''&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;user&amp;quot;: {&lt;br /&gt;
          &amp;quot;basedn&amp;quot;: '''&amp;quot;ou=users&amp;quot;''',&lt;br /&gt;
          &amp;quot;filter&amp;quot;: '''&amp;quot;(&amp;amp;(objectClass=PosixAccount)(cn=*))&amp;quot;''',&lt;br /&gt;
          &amp;quot;login&amp;quot;: '''&amp;quot;cn&amp;quot;''',&lt;br /&gt;
          &amp;quot;info&amp;quot;: {&lt;br /&gt;
            &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;,&lt;br /&gt;
            &amp;quot;email&amp;quot;: &amp;quot;mail&amp;quot;,&lt;br /&gt;
            &amp;quot;firstName&amp;quot;: &amp;quot;givenName&amp;quot;,&lt;br /&gt;
            &amp;quot;lastName&amp;quot;: &amp;quot;sn&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Поиск пользователя в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений user.basedn и basedn. В примере это будет узел ou=users,dc=example,dc=com. Полный DN пользователя указывать в user.basedn не нужно (можно указать пустой или не указывать вообще)&lt;br /&gt;
* Убедиться, что при старте сервера в логах присутствуют строки:&lt;br /&gt;
  2023-04-24T12:35:44.650+0300	info	Loading ldap configuration from file: ldap2.json&lt;br /&gt;
  2023-04-24T12:35:44.650+0300	info	LDAP server added: test_ldap&lt;br /&gt;
* Выполнить команду, заменив хост и порт актуальными значениями&lt;br /&gt;
  svacer ldap servers --host 127.0.0.1 --port 8080&lt;br /&gt;
* Убедиться, что в выводе команды присутствуют записи вида:&lt;br /&gt;
  Available LDAP servers list:&lt;br /&gt;
  Name: test_ldap	Url: ldap://ldap1.example.com:389&lt;br /&gt;
* Убедиться, что возможен вход тестовым пользователем через cli:&lt;br /&gt;
  curl -X POST --data '{&amp;quot;login&amp;quot;:&amp;quot;test_login&amp;quot;,&amp;quot;password&amp;quot;:&amp;quot;test_password&amp;quot;,&amp;quot;auth_type&amp;quot;:&amp;quot;ldap&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;test_ldap&amp;quot;}' 127.0.0.1:8080/api/public/login&lt;br /&gt;
Вывод должен быть вида:   &lt;br /&gt;
  {&amp;quot;token&amp;quot;:&amp;quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODI5MzYxODcsImlhdCI6MTY4MjMzMTM4Nywicm9sZXMiOlsiYWRtaW5zIl0sInVzZXIiO ...&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
===== Добавление проверки по группе LDAP =====&lt;br /&gt;
Принадлежность пользователя к группе определяется следующим образом:&lt;br /&gt;
* Формируется список всех возможных групп на основе значения group.filter&lt;br /&gt;
* Для каждой сформированной группы формируется список входящих в нее пользователей по следующему принципу:&lt;br /&gt;
** Каждое значение атрибута group.userMember (их может быть несколько) узла LDAP (соответствующего группе) однозначно идентифицирует некоторого пользователя&lt;br /&gt;
** Пользователь входит в группу, если значение атрибута user.group пользователя входит в множество записей, полученных в пункте выше&lt;br /&gt;
&lt;br /&gt;
Для настройки проверки по группе целесообразно выполнить следующие действия:&lt;br /&gt;
* Определиться с узлом в LDAP, относительно которого будет производится поиск групп (поле group.basedn). Поиск групп в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений group.basedn и basedn. В примере это будет узел ou=svacer_groups,ou=groups,dc=example,dc=com&lt;br /&gt;
* Для Active Directory в поле filter можно указать, например, (&amp;amp;(objectCategory=Group)(cn=dep_ivanov)), что будет означать группу dep_ivanov.&lt;br /&gt;
* Изменить конфигурационный файл следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
     ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
      '''&amp;quot;group&amp;quot;: &amp;quot;dn&amp;quot;''',&lt;br /&gt;
    },      &lt;br /&gt;
    '''&amp;quot;useGroup&amp;quot;: true,'''&lt;br /&gt;
    '''&amp;quot;group&amp;quot;: {''''&lt;br /&gt;
    '''&amp;quot;basedn&amp;quot;: &amp;quot;ou=svacer_groups,ou=groups&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=*))&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;,'''&lt;br /&gt;
    '''&amp;quot;display&amp;quot;:&amp;quot;cn&amp;quot;,'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Перезапустить Svacer&lt;br /&gt;
* Убедиться, что возможен вход пользователей, состоящих в группе/группах, и не возможен вход пользователей, не состоящих в группе/группах.&lt;br /&gt;
===== Добавление привязки ролей Svacer к группам LDAP =====&lt;br /&gt;
* Добавить нужные группы в Svacer. Например admins и users.&lt;br /&gt;
* Определиться в каком атрибуте LDAP группы будет хранится имя роли (все сравнения будут чувствительны к регистру). Например, пусть это будет атрибут cn&lt;br /&gt;
* Изменить конфигурационный файл следующим образом&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
 	   ...&lt;br /&gt;
    },      &lt;br /&gt;
    ''' &amp;quot;useGroup&amp;quot;: true, '''&lt;br /&gt;
    ''' &amp;quot;group&amp;quot;: { '''&lt;br /&gt;
    ''' &amp;quot;basedn&amp;quot;: &amp;quot;ou=svacer_groups,ou=groups&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;filter&amp;quot;: &amp;quot;(&amp;amp;(objectClass=groupOfNames)(cn=*))&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;userMember&amp;quot;: &amp;quot;member&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;display&amp;quot;: &amp;quot;cn&amp;quot;, '''&lt;br /&gt;
    ''' &amp;quot;svacerRole&amp;quot;: &amp;quot;cn&amp;quot; '''&lt;br /&gt;
    ''' }, '''&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin / admin). Для проверки привязки ролей Svacer к пользователю loginok можно использовать следующую команду:&lt;br /&gt;
  svacer ldap sync_roles --login loginok --host 127.0.0.1 --port 8080 --user admin --password admin --server test_ldap&lt;br /&gt;
Вывод должен быть следующий:&lt;br /&gt;
  SvacerUserID: 457039b4-4aef-4857-831d-1c080ea154d4&lt;br /&gt;
  SvacerUserLogin: loginok&lt;br /&gt;
  LDAPUserDN: cn=loginok,ou=users,dc=example,dc=com&lt;br /&gt;
  Roles: [314e7571-706c-4463-9280-6a4eee03b42d]&lt;br /&gt;
  Links: [cn=admins,ou=svacer_groups,ou=groups,dc=example,dc=com -&amp;gt; admins (314e7571-706c-4463-9280-6a4eee03b42d)]&lt;br /&gt;
  Applied: false&lt;br /&gt;
&lt;br /&gt;
===== Добавление серверов LDAP, работающих по TLS =====&lt;br /&gt;
* Изменить конфигурационный файл следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;'''ldaps'''://ldap1.example.com:'''636'''&amp;quot;,&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      &amp;quot;ignoreCertCheck&amp;quot;: '''true'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками&lt;br /&gt;
* Для проверки сертификата LDAP сервера добавить сертификат CA (например, ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;ldaps://ldap1.example.com:636&amp;quot;,&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      &amp;quot;ignoreCertCheck&amp;quot;: '''false''',  &lt;br /&gt;
      '''&amp;quot;caCertFiles&amp;quot;: [&amp;quot;/etc/ssl/certs/ldap.crt&amp;quot;]'''&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Убедиться, что в логах сервера присутствуют записи вида:&lt;br /&gt;
  2023-04-24T13:49:49.298+0300	info	added 1 ca certs from ldap.crt&lt;br /&gt;
* Убедиться, что пользователь LDAP может зайти в систему&lt;br /&gt;
&lt;br /&gt;
===== Добавление резервных серверов LDAP =====&lt;br /&gt;
* Добавить в конфигурационный файл резервные сервера в поле mirrors:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;test_ldap&amp;quot;,&lt;br /&gt;
    &amp;quot;basedn&amp;quot;: &amp;quot;dc=example,dc=com&amp;quot;,&lt;br /&gt;
    &amp;quot;connection&amp;quot;: {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;ldaps://ldap1.example.com:636&amp;quot;,&lt;br /&gt;
      '''&amp;quot;mirrors&amp;quot;: [&amp;quot;ldaps://ldap2.example.com:636&amp;quot;,&amp;quot;ldaps://ldap3.example.com:636&amp;quot;],'''&lt;br /&gt;
      &amp;quot;connectAs&amp;quot;: &amp;quot;cn=admin,dc=example,dc=com&amp;quot;,&lt;br /&gt;
      &amp;quot;password&amp;quot;: &amp;quot;12345678&amp;quot;,&lt;br /&gt;
      ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;user&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },      &lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Проверить, что вход пользователя LDAP в систему возможен&lt;br /&gt;
* Изменить значение в URL на любое (чтобы сервер, указанный в URL, был не доступен)&lt;br /&gt;
* Перезапустить Svacer&lt;br /&gt;
* Убедиться, что вход пользователя LDAP в систему возможен&lt;br /&gt;
* Поменять значение в URL на верное&lt;br /&gt;
&lt;br /&gt;
==== Возможные ошибки конфигурации ==== &lt;br /&gt;
В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt; при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе '''Settings &amp;gt; Server information'''. Ниже приводится таблица с перечислением возможных ошибок входа пользователя LDAP в систему.&lt;br /&gt;
&lt;br /&gt;
'''Сообщения об ошибках и их возможные причины'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Действие !! Сообщение !! Причина !! Решение&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP server unavailable || 1. Нет соединения с сервером&amp;lt;br/&amp;gt;2. Неверные учетные данные для соединения с сервером || Проверить доступность сервера LDAP с хоста, на котором установлен Svacer. См. утилиту ldapsearch&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP user is not in group||Пользователь не состоит в заданной конфигурацией группе/группах||Проверить поля user.group, group.filter, group.userMember. В списке групп, полученных с использованием group.filter должна быть хотя бы одна группа, в которую входит пользователь&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP group not found. Check configuration || Во время поиска групп, подходящих под фильтр, не найдено ни одной группы || Проверить значение поля group.filter и значения basedn, group.basedn&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || LDAP user not allowed or not found || Во время поиска пользователей, подходящих под фильтр, не найдено ни одного пользователя || Проверить значение поля user.filter и значения basedn, user.basedn&lt;br /&gt;
|-&lt;br /&gt;
| Вход в систему || too much record for user ('%s') found || Поиск пользователя в LDAP с указанными в конфигурации парамтерами дал несколько записей|| Проверить значение поля user.filter и значения basedn, user.basedn. Поиск всегда должен давать одну запись&lt;br /&gt;
|-&lt;br /&gt;
| Запуск сервера || caCert source [%v] ignored || Ошибка поиска сертификатов по указанному шаблону || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными&lt;br /&gt;
|-&lt;br /&gt;
|Запуск сервера || Server [%v] configuration has ignoreCertCheck=false, but no CA certs added. In this case LDAP auth may be impossible || Ошибка конфигурации TLS. В результате обработки значений из поля connection.CaCertFiles не было добавлено ни одного сертификата. Это приводит к тому, что Svacer не может проверить сертификат LDAP сервера, а флаг ignoreCertCheck указан в значении false, что приведет к заведомо ошибочной проверке пользователя || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными&lt;br /&gt;
|}&lt;br /&gt;
Для определения проблем с входом пользователей LDAP в систему при первоначальной настройке интеграции, полезно установить флаг trace в значение true. Результатом станет вывод в лог сервера Debug сообщения с указанием этапа обработки запроса и его параметров.&lt;br /&gt;
&lt;br /&gt;
===== Некоторые замечания для пользователей, которые использовали LDAP, начиная с версии Svacer 5-1-0 до 5-2-0 =====&lt;br /&gt;
&lt;br /&gt;
Для пользователей, которые использовали функционал по интеграции с LDAP серверами в период между релизами Svacer 5-1-0 и 5-2-0 (с 30.03.2022 по 15.07.2022) желательная ручная модификации базы данных, так как в ней могут быть ошибки, влияющие на &lt;br /&gt;
&lt;br /&gt;
* механизм тегирования пользователей в комментариях&lt;br /&gt;
* механизм уведомления&lt;br /&gt;
&lt;br /&gt;
Если в процессе функционирования сервера наблюдаются сбои в работе указанных механизмов, то следует выполнить следующйи sql запрос в БД, с которой работает Svacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;insert into users_status (user_id,status) &lt;br /&gt;
select id,1 from users&lt;br /&gt;
left join users_status us on us.user_id=users.id&lt;br /&gt;
where status is null;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3389</id>
		<title>Help:Public API</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3389"/>
		<updated>2025-11-27T09:46:47Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Примеры использования фильтров в public api */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публичные REST запросы ==&lt;br /&gt;
&lt;br /&gt;
Для работы с сервером через различные приложения реализованы публичные запросы, которые не будут меняться при обновлении самого сервера. Если будут происходить значимые изменения, то запрос будет помечаться как deprecated и создаваться новый такой же запрос с пометкой '''/api/some/request/v2'''. &lt;br /&gt;
&lt;br /&gt;
=== Получение токена ===&lt;br /&gt;
&lt;br /&gt;
Для большинства запросов требуется JWT-токен, чтобы его получить нужно пройти аутентификацию. Это можно сделать двумя способами:&lt;br /&gt;
&lt;br /&gt;
* Простой способ — POST запрос с basic auth на '''/api/login''', который вернёт JWT-токен в body. Использование данного способа не желательно, так как он может меняться в будущем, а также не всегда правильно обрабатывает спец. символы и кириллицу в логине/пароле. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -u admin:admin http://svacer.example.com/api/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Предпочтительный способ — POST запрос на '''/api/public/login''' с передачей данных в теле запроса, как описано [[Help:Public API#public-api-login|ниже]]. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -d '{&amp;quot;login&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot;}' http://svacer.example.com/api/public/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученный токен надо добавлять в header всех запросов: &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;token&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Базовые публичные запросы ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''/api/public/login'''&lt;br /&gt;
| POST&lt;br /&gt;
| &amp;lt;span id=&amp;quot;public-api-login&amp;quot; /&amp;gt;Аутентификация пользователя. Тело запроса имеет формат JSON и выглядит следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auth_type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;server&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    &amp;quot;login&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
* auth_type — тип аутентификации: при указании значения &amp;quot;ldap&amp;quot; — аутентификация через LDAP, во всех остальных случаях, или если поле не указано — по внутренней базе пользователей Svacer&lt;br /&gt;
* server — имя LDAP-сервера, как он указан в конфигурационном файле LDAP (поле name) при запуске Svacer. Значение поля учитывается, только если &amp;lt;code&amp;gt;&amp;quot;auth_type&amp;quot;: &amp;quot;ldap&amp;quot;&amp;lt;/code&amp;gt;, в иных случаях его можно не указывать&lt;br /&gt;
* login — логин пользователя, обязательное поле&lt;br /&gt;
* password — пароль пользователя, обязательное поле&lt;br /&gt;
|-      &lt;br /&gt;
| '''/api/public/help'''&lt;br /&gt;
| GET&lt;br /&gt;
| Дополнительная информация по public REST API. Работает без авторизации&lt;br /&gt;
|-&lt;br /&gt;
| '''/api/health'''&lt;br /&gt;
| GET&lt;br /&gt;
| Проверка доступности сервера. Не требует авторизации. Возвращает статус 200 OK если сервер работает&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Описание остальных запросов смотрите в спецификации OpenAPI на вашем сервере Svacer по адресу &amp;lt;code&amp;gt;/api/public/swagger/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можете посмотреть на нашем демо-сервере: https://svacer-demo.ispras.ru/api/public/swagger/&lt;br /&gt;
&lt;br /&gt;
== Управление контейнерами ==&lt;br /&gt;
См. [[Help:Public API/management/containers]]&lt;br /&gt;
&lt;br /&gt;
== Экспорт, импорт и копирование разметки == &lt;br /&gt;
См. [[Markup2]]&lt;br /&gt;
&lt;br /&gt;
== Примеры использования public REST API ==&lt;br /&gt;
&lt;br /&gt;
=== Получение URL загруженного снимка ===&lt;br /&gt;
&lt;br /&gt;
Этот пример работает только с python3 и не работает при аутентификации в Svacer через LDAP.&lt;br /&gt;
&lt;br /&gt;
Скачайте и распакуйте [[index.php?title=Media:Get link.zip|get_link.zip]]&lt;br /&gt;
&lt;br /&gt;
Запрос:&lt;br /&gt;
  &amp;lt;pre&amp;gt;python get_link.py --url http://svacer.example.com:8080 --user admin --password admin --project bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
  &amp;lt;pre&amp;gt;http://svacer.example.com:8080/mode/review/project/0fd645aa-8e70-4a4f-b68b-766c4f337bf2/branch/8925df5a-7a98-4f07-bc88-ee4ea5b43813/snapshot/e3367efa-a804-4c05-9a7a-a7cb052bef1d&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования фильтров в public api ===&lt;br /&gt;
Данные фильтры служат только для ограничения вывода некоторых методов в public api. Они являются отдельной сущностью, наравне с глобальными фильтрами и пользовательскими фильтрами. Основное отличие в том, что время их жизни соответствует одному запросу, в котором они заданы.&lt;br /&gt;
&lt;br /&gt;
==== Вспомогательные модули ====&lt;br /&gt;
&lt;br /&gt;
В некоторых примерах API используется фильтр, с помощью которого можно ограничить вывод данных и получить более точные результаты. Для работы с этим фильтром используются следующие классы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
from requests import auth&lt;br /&gt;
from requests.models import HTTPBasicAuth&lt;br /&gt;
import json&lt;br /&gt;
from dataclasses import dataclass&lt;br /&gt;
import sys&lt;br /&gt;
import base64&lt;br /&gt;
&lt;br /&gt;
def printerr(text):&lt;br /&gt;
    #print in stderr and exit&lt;br /&gt;
    print(f&amp;amp;quot;{text}&amp;amp;quot;, file=sys.stderr, flush=True)&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class ProjectFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
class ProjectFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class BranchFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
class BranchFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class SnapshotFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
class SnapshotFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class MarkerFilter:&lt;br /&gt;
    severity: str&lt;br /&gt;
    file: str&lt;br /&gt;
    checker: str&lt;br /&gt;
    review: str&lt;br /&gt;
&lt;br /&gt;
class MarkerFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class Filter:&lt;br /&gt;
    project: ProjectFilter&lt;br /&gt;
    branch: BranchFilter&lt;br /&gt;
    snapshot: SnapshotFilter&lt;br /&gt;
    marker: MarkerFilter&lt;br /&gt;
&lt;br /&gt;
class FilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
def CreateFilterParam(filter: Filter):&lt;br /&gt;
    jsoned = FilterEncoder().encode(filter)&lt;br /&gt;
    b64ed = base64.b64encode(jsoned.encode(&amp;amp;quot;utf-8&amp;amp;quot;))&lt;br /&gt;
    return b64ed.decode(&amp;amp;quot;utf-8&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Принцип использования классов следующий:&lt;br /&gt;
&lt;br /&gt;
# Создается экземпляр нужного класса XXXXFilter&lt;br /&gt;
# Создается base64 строка на основе объекта пункта 1, которая в дальнейшем передается в url запросе. Для этого используется метод CreateFilterParam()&lt;br /&gt;
&lt;br /&gt;
Например. Для создания фильтра, ограничивающего множество проектов выражением &amp;lt;code&amp;gt;darpa*&amp;lt;/code&amp;gt;, можно использовать следующие строчки кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darpa*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Для проекта, ветки и снимка можно указать как имя так и ID. Имя можно указать с использованием регулярного выражения. ID необходимо указать полностью.&lt;br /&gt;
&lt;br /&gt;
==== Метод /api/public/login ====&lt;br /&gt;
&lt;br /&gt;
Данный класс может быть использован для соединения с сервером Svacer. В данном модуле демонстрируется взаимодействие с методом /api/public/login. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
&lt;br /&gt;
class SvacerClient:&lt;br /&gt;
    def __init__(self, host, user, password):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Initialize the Svacer client        &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        self.host = host&lt;br /&gt;
        self.user = user&lt;br /&gt;
        self.password = password&lt;br /&gt;
        self.token = None&lt;br /&gt;
        self.auth_header = None&lt;br /&gt;
        self.session = requests.Session()  # Use session for connection pooling&lt;br /&gt;
        self.set_auth_token()&lt;br /&gt;
    &lt;br /&gt;
    def set_auth_token(self):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Get authorization token using /api/public/login and setup in session&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            response = requests.post(&lt;br /&gt;
                url=f&amp;amp;quot;{self.host}/api/public/login&amp;amp;quot;,&lt;br /&gt;
                json={&lt;br /&gt;
                    &amp;amp;quot;login&amp;amp;quot;:self.user,&lt;br /&gt;
                    &amp;amp;quot;password&amp;amp;quot;:self.password,&lt;br /&gt;
                },&lt;br /&gt;
                verify=False&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()  # Raise an exception for bad status codes            &lt;br /&gt;
            body = response.json()&lt;br /&gt;
            self.token = body[&amp;amp;quot;token&amp;amp;quot;]&lt;br /&gt;
            self.auth_header = {'Authorization': f'Bearer {self.token}'}&lt;br /&gt;
            &lt;br /&gt;
            # Set the authorization header in the session&lt;br /&gt;
            self.session.headers.update(self.auth_header)&lt;br /&gt;
            &lt;br /&gt;
            return self.token&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Failed to get authentication token: {e}&amp;amp;quot;)&lt;br /&gt;
        except KeyError as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Token not found in response: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def post(self, endpoint, data=None, json=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a POST request to the API&lt;br /&gt;
&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.post(&lt;br /&gt;
                url, &lt;br /&gt;
                data=data, &lt;br /&gt;
                json=json, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;POST request failed: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def get(self, endpoint, params=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a GET request to the API&lt;br /&gt;
  &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.get(&lt;br /&gt;
                url, &lt;br /&gt;
                params=params, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;GET request failed: {e}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Метод /api/public/projects ====&lt;br /&gt;
&lt;br /&gt;
В данном примере выводится в формате json список проектов, имя которых соответствует регулярному выражению &amp;lt;code&amp;gt;darpa*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
&lt;br /&gt;
cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darpa*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&lt;br /&gt;
resp=cl.get(f&amp;amp;quot;/api/public/projects?filters={param}&amp;amp;quot;)&lt;br /&gt;
print(f&amp;amp;quot;Response: {resp.json()}&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Результат может быть следующим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-8cd3-7437-957d-aed0c87e603a&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa-clone&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:43.79526Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-83b1-7d80-8d23-ce849387bd6e&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:41.457887Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Метод /api/public/projects/{project_id}/branch/{branch_id}/snapshots ====&lt;br /&gt;
&lt;br /&gt;
С помощью данно метода можно получить список снимков указанной ветки. Пример кода для получения снимков с именем &amp;lt;code&amp;gt;ver.&amp;amp;nbsp;2.7.0*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
def get_snapshots(pr_id, br_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None,None,SnapshotFilter(id=&amp;amp;quot;&amp;amp;quot;,name=&amp;amp;quot;ver. 2.7.0*&amp;amp;quot;), None)&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots?filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
get_snapshots(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;4d1f1413-c638-4a8b-aa4d-d9fccd8df3e9&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: true,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;354c9c94-7b57-4427-8ce0-c41f1e59e6c2&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:58:53.618464Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;c472aab7-d53f-496c-9d3d-069c0901d9bb&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;edca1583aa41489d37ae9fb2c348ad066ecd3ab3&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;cf032d99-2efe-4ee0-8db8-ee85ff17b296&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Метод /api/public/projects/{project_id}/branch/{branch_id}/snapshots/{snapshot_id}/fullmarkers ====&lt;br /&gt;
&lt;br /&gt;
Данный метод служит для получения информации о маркерах указанного снимка. Информация о маркере может включать в себя:&lt;br /&gt;
&lt;br /&gt;
* трассу ошибки (параметр traces, возможные значения true,false)&lt;br /&gt;
* информацию о чекере (параметр checker_info, возможные значения true,false)&lt;br /&gt;
* историю разметки (параметр review_history, возможные значения true,false)&lt;br /&gt;
* история комментария (параметр comment_history, возможные значения true,false)&lt;br /&gt;
* идентификатор пользовательского фильтра (параметр custom_filter)&lt;br /&gt;
* фильтр на параметры маркера&lt;br /&gt;
&lt;br /&gt;
Данный метод может требовать длительного времени выполнения для проектов с большим количеством предупреждений.&lt;br /&gt;
&lt;br /&gt;
Пример кода для получения всего множества информации о маркерах, размеченных со статусом &amp;lt;code&amp;gt;Conf*&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;def get_markers (pr_id, br_id, snap_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None, None, None, MarkerFilter(severity=&amp;amp;quot;*&amp;amp;quot;,&lt;br /&gt;
                       file=&amp;amp;quot;*&amp;amp;quot;, checker=&amp;amp;quot;*&amp;amp;quot;, review=&amp;amp;quot;Conf*&amp;amp;quot;))&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots/{snap_id}/fullmarkers?traces=true&amp;amp;amp;checker_info=true&amp;amp;amp;review_history=true&amp;amp;amp;comment_history=true&amp;amp;amp;filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
get_markers(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;)  &amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;function&amp;amp;quot;: &amp;amp;quot;_ZN6StringaSERKS_&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
    &amp;amp;quot;locID&amp;amp;quot;: 1006,&lt;br /&gt;
    &amp;amp;quot;lang&amp;amp;quot;: &amp;amp;quot;CXX&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;tool&amp;amp;quot;: &amp;amp;quot;SvEng&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;warnClass&amp;amp;quot;: &amp;amp;quot;ASSIGN_NO_CHECK_FOR_THIS&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;mtid&amp;amp;quot;: &amp;amp;quot;SvEng.LA.4&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;msg&amp;amp;quot;: &amp;amp;quot;Method 'operator=' doesn't check its argument with 'this' pointer.&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;details&amp;amp;quot;: &amp;amp;quot;d96c832835f414a119ea8c7575a8926378fd7cf6&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;flags&amp;amp;quot;: 0,&lt;br /&gt;
    &amp;amp;quot;traces&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;role&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;locations&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
            &amp;amp;quot;col&amp;amp;quot;: 0,&lt;br /&gt;
            &amp;amp;quot;spec&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;info&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;checker_severity&amp;amp;quot;: &amp;amp;quot;Normal&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_reliability&amp;amp;quot;: &amp;amp;quot;High&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_origin&amp;amp;quot;: &amp;amp;quot;builtin&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;review&amp;amp;quot;: {&lt;br /&gt;
      &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;amp;quot;review_history&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65795&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:21.683963Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;63495&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Unspecified&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;reviewer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;077fdd75-b382-4008-97c4-ec6ef8732ccd&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2022-04-05T11:47:47.026161Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;reviewer_attrs&amp;amp;quot;: [&amp;amp;quot;review_master&amp;amp;quot;]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;comments&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaaaaaaa&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;txt&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;updateTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:17.220568Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;history&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb8b-4244-7931-81f7-a7d1a4512de0&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;1pQ3T5bq6AMYEYJqzFsW+Q&amp;amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3379</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3379"/>
		<updated>2025-11-26T10:42:48Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
* Исправлена ошибка, связанная с невозможностью в ряде случаев использовать механизм подписок&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3378</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3378"/>
		<updated>2025-11-26T10:41:40Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]]&lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]]&lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3377</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3377"/>
		<updated>2025-11-26T10:40:42Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* Импорт SARIF теперь более устойчив к пропускам в файле (отсутствие таких полей как location)&lt;br /&gt;
* Добавлены переменные окружения &amp;lt;code&amp;gt;SVACER_TIMEOUT_IMPORT_RESULTS&amp;lt;/code&amp;gt;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат Go Duration string) и &amp;lt;code&amp;gt;SVACER_NUM_PARALLEL_IMPORTS&amp;lt;/code&amp;gt;  на ограничение числа параллельных импортов (задачи на импорт выстраиваются в очередь).  По умолчанию значения 15 минут  и  (&amp;lt;code&amp;gt;максимальное число коннектов к БД) / 2&amp;lt;/code&amp;gt;. Ограничение необходимы для предотвращения бесконечных ожиданий и зависаний при импорте данных.&lt;br /&gt;
* Убраны лишние сообщения об устаревших детекторах при старте сервера или импорте снимков&lt;br /&gt;
* В prometheus метрики добавлен ряд показателей размеров object store&lt;br /&gt;
* Размер лога сервера показываемого в WEB интерфейсе ограничен. Размер задается переменной окружения SVACER_TAIL_LOG_SIZE (по умолчанию 1Мб). Показывается не последний кусок не более SVACER_TAIL_LOG_SIZE. Сам лог файл может быть не ограничивается в размерах&lt;br /&gt;
* ['''Экспериментально'''] Можно указать формат лог файла в JSON посредством параметра &amp;lt;code&amp;gt;svacer-server --log-format=json ...&amp;lt;/code&amp;gt;, так же формат может быть указан через переменную окружения &amp;lt;code&amp;gt;SVACER_LOG_FORMAT=json&amp;lt;/code&amp;gt;. Опции так же работают для CLI клиента &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;&lt;br /&gt;
* При запуске сервера можно указать флаг &amp;lt;code&amp;gt;--force-invariant-refresh&amp;lt;/code&amp;gt; для принудительной регенерации инвариантов (может решить проблему с переносом разметки)&lt;br /&gt;
* Добавлена переменная окружения SVACER_INV_GEN_JOBS для контроля числа параллельных job-ов при регенарации инвариантов. При ограниченных ресурсах машины рекомендуем ставить значение 2. По умолчанию значение ставится в 70% от &amp;lt;code&amp;gt;runtime.GOMAXPROCS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена функциональность по чистке object store при удалении снимков&lt;br /&gt;
* ['''Экспериментально''']  Добавлена экспериментальная функциональность по модификации маркеров при импорте результатов и снимков&lt;br /&gt;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом&lt;br /&gt;
* Проведена работа по предотвращению зависаний при исчерпывании доступных соединений с PostgreSQL сервером&lt;br /&gt;
* Добавлен файл с чексуммой бинарника сервера &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; и проверка чексуммы при запуске&lt;br /&gt;
* Упростили [[Help:XSvacer:AIAssistant:Deploy|деплой ИИ-ассистента]]: добавили его сервис в docker-compose и deb/rpm пакеты&lt;br /&gt;
* Расширили возможности конфигурации при запуске сервера через [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose]: теперь можно включить debug, указать конфиг LDAP и параметр public-url&lt;br /&gt;
* Добавлена возможность указания минимального количества снимков, которое необходимо оставлять в ветке, тип очистки и период удаления в [[Help:CLI/cleanup|автоматическом удалении снимков]]&lt;br /&gt;
* Добавлена возможность [[Edit markers (command line)|автоматически обрабатывать маркеры]] при импорте данных. Также обработка маркеров доступна через [[Help:UI manual#Работа со снимками|UI]]&lt;br /&gt;
* Добавлен флаг &amp;lt;code&amp;gt;diff-url&amp;lt;/code&amp;gt; для команды &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI, также как и для команд &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; с указанием опции quick-stat. Данный флаг позволяет получать ссылку на diff снимков&lt;br /&gt;
* Добавлены предупреждения если в командах &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sarif2 import&amp;lt;/code&amp;gt; используются флаги, которые используются флагом &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt;, но флаг &amp;lt;code&amp;gt;upload&amp;lt;/code&amp;gt; не установлен &lt;br /&gt;
* Добавлена интеграциия с внешними системами посредством механизма [[Help:Installation#Механизм интеграции с внешними системами посредством Webhook-ов|Webhook-ов]] &lt;br /&gt;
* Добавлена [[Help:Installation#Настройка защиты от перебора паролей пользователей|Защита от перебора пароля пользователя]] &lt;br /&gt;
* Добавлена возможно задать [[Help:Installation#Настройка парольной политики внутреннего механизма аутентификации Svacer|Парольную политику безопасности]] для пользователей, использующих встроенный мханизм аутентификации Svacer &lt;br /&gt;
* Добавлена возможность задать [[Help:Installation#Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)|вкладку по умолчанию]] для страницы входа в систему &lt;br /&gt;
* Исправлена ошибка, приводящая к разрастанию базы данных&lt;br /&gt;
&lt;br /&gt;
=== Release 11-2-0 ===&lt;br /&gt;
22.07.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлены зависания сервера&lt;br /&gt;
* Добавлено автоматическое удаление архивов и прочих временных файлов при импорте .svace-dir и SARIF-файлов через REST API&lt;br /&gt;
&lt;br /&gt;
=== Release 11-1-0 ===&lt;br /&gt;
08.07.2025&lt;br /&gt;
&lt;br /&gt;
* Команды  &amp;lt;code&amp;gt;--project-group, --if-no-group, --autoclean, --autoclean-svace&amp;lt;/code&amp;gt; можно использовать в REST API для импорта svace-dir&lt;br /&gt;
* При использовании REST API для импорта svace-dir сервер будет автоматически удалять директории &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.svacer&amp;lt;/code&amp;gt; если не указаны явные опции &amp;lt;code&amp;gt;--autoclean=false, --autoclean-svace=false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена опция запуска сервера &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; для включения режима совместимости по генерации инвариантов с версией &amp;lt;= 8.x.x&lt;br /&gt;
* Исправлены ошибки в работе &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;, добавлена возможность учета статусов разметки. Добавлена возможность [[Help:Import from Svace#Флаг --baseline|указания baseline]] для сравнений при использовании опции &amp;lt;code&amp;gt;--quality-gate&amp;lt;/code&amp;gt;&lt;br /&gt;
* Исправлены ошибки при подключении к PostgreSQL в SSL-режиме&lt;br /&gt;
* Исправлен ряд ошибок при работе с LDAP&lt;br /&gt;
* Команда &amp;lt;code&amp;gt;quickdiff&amp;lt;/code&amp;gt; в CLI теперь выдает информацию также о Same и Matched предупреждениях&lt;br /&gt;
&lt;br /&gt;
=== Release 11-0-0 ===&lt;br /&gt;
19.05.2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для [[Help:Sarif|импорта и экспорта]] следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания [[Help:Sarif#Мэппинг severity|мэппинга severity]] детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка [[OIDC]]&lt;br /&gt;
* Улучшена поддержка [[LDAP configuration|LDAP]]&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов [[Infisical]]&lt;br /&gt;
* Добавлена [[Notifications|служба нотификаций]] пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации и [[Help:UI manual#Управление токенами доступа|управления]] персональными токенами доступа&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* В разделе Статистика добавлен дашборд с [[Release notes 11-0-0#Изменения в разделе Статистика|Общей статистикой]], содержащей метрики по последним импортированным снимкам в ветках проектов&lt;br /&gt;
* В статистике по активности пользователей добавлена возможность просмотра панели с актуальной информацией о маркере и опция показа только действий с актуальной разметкой&lt;br /&gt;
* Большинство CLI команд, работающих с сервером, теперь делают явный logout после завершения&lt;br /&gt;
* Svacer при импорте результатов Svace автоматически импортирует файлы &amp;lt;code&amp;gt;*.warn, *.err&amp;lt;/code&amp;gt; с предупреждениями от самого анализатора Svace. Автоматический импорт не будет происходить при размере этих файлов более 30Мб (большой размер может свидетельствовать о проблемах в ходе анализа)&lt;br /&gt;
* Переменная окружения &amp;lt;code&amp;gt;SVACER_CACHE_DIR&amp;lt;/code&amp;gt; теперь учитывается во всех местах (ранее в ряде случаев мог неявно использоваться &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Добавлена возможность [[Help:CLI/cleanup|автоматического удаления снимков]]&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3366</id>
		<title>Help:Public API</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3366"/>
		<updated>2025-11-25T15:19:28Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Примеры использования фильтров в public api */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публичные REST запросы ==&lt;br /&gt;
&lt;br /&gt;
Для работы с сервером через различные приложения реализованы публичные запросы, которые не будут меняться при обновлении самого сервера. Если будут происходить значимые изменения, то запрос будет помечаться как deprecated и создаваться новый такой же запрос с пометкой '''/api/some/request/v2'''. &lt;br /&gt;
&lt;br /&gt;
=== Получение токена ===&lt;br /&gt;
&lt;br /&gt;
Для большинства запросов требуется JWT-токен, чтобы его получить нужно пройти аутентификацию. Это можно сделать двумя способами:&lt;br /&gt;
&lt;br /&gt;
* Простой способ — POST запрос с basic auth на '''/api/login''', который вернёт JWT-токен в body. Использование данного способа не желательно, так как он может меняться в будущем, а также не всегда правильно обрабатывает спец. символы и кириллицу в логине/пароле. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -u admin:admin http://svacer.example.com/api/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Предпочтительный способ — POST запрос на '''/api/public/login''' с передачей данных в теле запроса, как описано [[Help:Public API#public-api-login|ниже]]. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -d '{&amp;quot;login&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot;}' http://svacer.example.com/api/public/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученный токен надо добавлять в header всех запросов: &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;token&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Базовые публичные запросы ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''/api/public/login'''&lt;br /&gt;
| POST&lt;br /&gt;
| &amp;lt;span id=&amp;quot;public-api-login&amp;quot; /&amp;gt;Аутентификация пользователя. Тело запроса имеет формат JSON и выглядит следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auth_type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;server&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    &amp;quot;login&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
* auth_type — тип аутентификации: при указании значения &amp;quot;ldap&amp;quot; — аутентификация через LDAP, во всех остальных случаях, или если поле не указано — по внутренней базе пользователей Svacer&lt;br /&gt;
* server — имя LDAP-сервера, как он указан в конфигурационном файле LDAP (поле name) при запуске Svacer. Значение поля учитывается, только если &amp;lt;code&amp;gt;&amp;quot;auth_type&amp;quot;: &amp;quot;ldap&amp;quot;&amp;lt;/code&amp;gt;, в иных случаях его можно не указывать&lt;br /&gt;
* login — логин пользователя, обязательное поле&lt;br /&gt;
* password — пароль пользователя, обязательное поле&lt;br /&gt;
|-      &lt;br /&gt;
| '''/api/public/help'''&lt;br /&gt;
| GET&lt;br /&gt;
| Дополнительная информация по public REST API. Работает без авторизации&lt;br /&gt;
|-&lt;br /&gt;
| '''/api/health'''&lt;br /&gt;
| GET&lt;br /&gt;
| Проверка доступности сервера. Не требует авторизации. Возвращает статус 200 OK если сервер работает&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Описание остальных запросов смотрите в спецификации OpenAPI на вашем сервере Svacer по адресу &amp;lt;code&amp;gt;/api/public/swagger/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можете посмотреть на нашем демо-сервере: https://svacer-demo.ispras.ru/api/public/swagger/&lt;br /&gt;
&lt;br /&gt;
== Управление контейнерами ==&lt;br /&gt;
См. [[Help:Public API/management/containers]]&lt;br /&gt;
&lt;br /&gt;
== Экспорт, импорт и копирование разметки == &lt;br /&gt;
См. [[Markup2]]&lt;br /&gt;
&lt;br /&gt;
== Примеры использования public REST API ==&lt;br /&gt;
&lt;br /&gt;
=== Получение URL загруженного снимка ===&lt;br /&gt;
&lt;br /&gt;
Этот пример работает только с python3 и не работает при аутентификации в Svacer через LDAP.&lt;br /&gt;
&lt;br /&gt;
Скачайте и распакуйте [[Index.php?title=Media:Get link.zip|get_link.zip]] &lt;br /&gt;
&lt;br /&gt;
Запрос:&lt;br /&gt;
  &amp;lt;pre&amp;gt;python get_link.py --url http://svacer.example.com:8080 --user admin --password admin --project bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
  &amp;lt;pre&amp;gt;http://svacer.example.com:8080/mode/review/project/0fd645aa-8e70-4a4f-b68b-766c4f337bf2/branch/8925df5a-7a98-4f07-bc88-ee4ea5b43813/snapshot/e3367efa-a804-4c05-9a7a-a7cb052bef1d&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования фильтров в public api ===&lt;br /&gt;
Данные фильтры служат только для ограничения вывода некоторых методов в public api. Они являются отдельной сущностью, наравне с глобальными фильтрами и пользовательскими фильтрами. Их основное отличие от последних двух в том, что время их жизни соответствует одному запросу, в котором они заданы.&lt;br /&gt;
&lt;br /&gt;
==== Вспомогательные модули ====&lt;br /&gt;
&lt;br /&gt;
В некоторых примерах API используется фильтр, с помощью которого можно ограничить вывод данных и получить более точные результаты. Для работы с этим фильтром используются следующие классы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
from requests import auth&lt;br /&gt;
from requests.models import HTTPBasicAuth&lt;br /&gt;
import json&lt;br /&gt;
from dataclasses import dataclass&lt;br /&gt;
import sys&lt;br /&gt;
import base64&lt;br /&gt;
&lt;br /&gt;
def printerr(text):&lt;br /&gt;
    #print in stderr and exit&lt;br /&gt;
    print(f&amp;amp;quot;{text}&amp;amp;quot;, file=sys.stderr, flush=True)&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class ProjectFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ProjectFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class BranchFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class BranchFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class SnapshotFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class SnapshotFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class MarkerFilter:&lt;br /&gt;
    severity: str&lt;br /&gt;
    file: str&lt;br /&gt;
    checker: str&lt;br /&gt;
    review: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class MarkerFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class Filter:&lt;br /&gt;
    project: ProjectFilter&lt;br /&gt;
    branch: BranchFilter&lt;br /&gt;
    snapshot: SnapshotFilter&lt;br /&gt;
    marker: MarkerFilter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class FilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def CreateFilterParam(filter: Filter):&lt;br /&gt;
    jsoned = FilterEncoder().encode(filter)&lt;br /&gt;
    b64ed = base64.b64encode(jsoned.encode(&amp;amp;quot;utf-8&amp;amp;quot;))&lt;br /&gt;
    return b64ed.decode(&amp;amp;quot;utf-8&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Принцип использования классов следующий:&lt;br /&gt;
&lt;br /&gt;
# Создается экземпляр нужного класса XXXXFilter&lt;br /&gt;
# Создается base64 строка на основе объекта пункта 1, которая в дальнейшем передается в url запросе. Для этого используется метод CreateFilterParam()&lt;br /&gt;
&lt;br /&gt;
Например. Для создания фильтра, ограничивающего множество проектов выражением darpa*, можно использовать следующие строчки кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darp*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Как можно заметить из определения фильтра, для проекта, ветки и снимка - можно указать как имя так и ID. Имя можно указать с использованием регулярного выражения. ID необходимо указать полностью.&lt;br /&gt;
&lt;br /&gt;
==== Точка входа api/public/login ====&lt;br /&gt;
&lt;br /&gt;
Данный класс может быть использован для соединения с сервером Svacer. В данном модуле демонстрируется взаимодействие с точкой входа /api/public/login. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
&lt;br /&gt;
class SvacerClient:&lt;br /&gt;
    def __init__(self, host, user, password):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Initialize the Svacer client        &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        self.host = host&lt;br /&gt;
        self.user = user&lt;br /&gt;
        self.password = password&lt;br /&gt;
        self.token = None&lt;br /&gt;
        self.auth_header = None&lt;br /&gt;
        self.session = requests.Session()  # Use session for connection pooling&lt;br /&gt;
        self.set_auth_token()&lt;br /&gt;
    &lt;br /&gt;
    def set_auth_token(self):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Get authorization token using /api/public/login and setup in session&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            response = requests.post(&lt;br /&gt;
                url=f&amp;amp;quot;{self.host}/api/public/login&amp;amp;quot;,&lt;br /&gt;
                json={&lt;br /&gt;
                    &amp;amp;quot;login&amp;amp;quot;:self.user,&lt;br /&gt;
                    &amp;amp;quot;password&amp;amp;quot;:self.password,&lt;br /&gt;
                },&lt;br /&gt;
                verify=False&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()  # Raise an exception for bad status codes            &lt;br /&gt;
            body = response.json()&lt;br /&gt;
            self.token = body[&amp;amp;quot;token&amp;amp;quot;]&lt;br /&gt;
            self.auth_header = {'Authorization': f'Bearer {self.token}'}&lt;br /&gt;
            &lt;br /&gt;
            # Set the authorization header in the session&lt;br /&gt;
            self.session.headers.update(self.auth_header)&lt;br /&gt;
            &lt;br /&gt;
            return self.token&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Failed to get authentication token: {e}&amp;amp;quot;)&lt;br /&gt;
        except KeyError as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Token not found in response: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def post(self, endpoint, data=None, json=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a POST request to the API&lt;br /&gt;
&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.post(&lt;br /&gt;
                url, &lt;br /&gt;
                data=data, &lt;br /&gt;
                json=json, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;POST request failed: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def get(self, endpoint, params=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a GET request to the API&lt;br /&gt;
  &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.get(&lt;br /&gt;
                url, &lt;br /&gt;
                params=params, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;GET request failed: {e}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects ====&lt;br /&gt;
&lt;br /&gt;
В данном примере выводятся в формате json список проектов, имя которых соответствует регулярному выражению darpa*&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
&lt;br /&gt;
cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darp*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&lt;br /&gt;
resp=cl.get(f&amp;amp;quot;/api/public/projects?filters={param}&amp;amp;quot;)&lt;br /&gt;
print(f&amp;amp;quot;Response: {resp.json()}&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Результат может быть следующим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-8cd3-7437-957d-aed0c87e603a&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa-clone&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:43.79526Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-83b1-7d80-8d23-ce849387bd6e&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:41.457887Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects/{project_id}/branch/{branch_id}/snapshots ====&lt;br /&gt;
&lt;br /&gt;
С помощью данной точки входа можно получить список снимков, указанной ветки. Пример кода, для получения снимков с именем &amp;amp;quot;ver. 2.7.0*&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
def get_snapshots(pr_id, br_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None,None,SnapshotFilter(id=&amp;amp;quot;&amp;amp;quot;,name=&amp;amp;quot;ver. 2.7.0*&amp;amp;quot;), None)&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots?filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
get_snapshots(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;4d1f1413-c638-4a8b-aa4d-d9fccd8df3e9&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: true,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;354c9c94-7b57-4427-8ce0-c41f1e59e6c2&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:58:53.618464Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;c472aab7-d53f-496c-9d3d-069c0901d9bb&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;edca1583aa41489d37ae9fb2c348ad066ecd3ab3&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;cf032d99-2efe-4ee0-8db8-ee85ff17b296&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects/{project_id}/branch/{branch_id}/snapshots/{snapshot_id}/fullmarkers ====&lt;br /&gt;
&lt;br /&gt;
Данная точка входа служит для получения информации о получении информации о маркерах указанного снимка. Информация о маркере может включать в себя:&lt;br /&gt;
&lt;br /&gt;
* трассу ошибки (параметр traces, возможные значения true,false)&lt;br /&gt;
* информацию о чекере (параметр checker_info, возможные значения true,false)&lt;br /&gt;
* историю разметки (параметр review_history, возможные значения true,false)&lt;br /&gt;
* история комментария (параметр comment_history, возможные значения true,false)&lt;br /&gt;
* идентификатор пользовательского фильтра (параметр custom_filter)&lt;br /&gt;
* фильтр на параметры маркера&lt;br /&gt;
&lt;br /&gt;
Пример кода, для получения всего множества информации о маркерах в некотором снимке, размеченных со статусом Conf*:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;def get_markers (pr_id, br_id, snap_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None, None, None, MarkerFilter(severity=&amp;amp;quot;*&amp;amp;quot;,&lt;br /&gt;
                       file=&amp;amp;quot;*&amp;amp;quot;, checker=&amp;amp;quot;*&amp;amp;quot;, review=&amp;amp;quot;Conf*&amp;amp;quot;))&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots/{snap_id}/fullmarkers?traces=true&amp;amp;amp;checker_info=true&amp;amp;amp;review_history=true&amp;amp;amp;comment_history=true&amp;amp;amp;filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
get_markers(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;)  &amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;function&amp;amp;quot;: &amp;amp;quot;_ZN6StringaSERKS_&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
    &amp;amp;quot;locID&amp;amp;quot;: 1006,&lt;br /&gt;
    &amp;amp;quot;lang&amp;amp;quot;: &amp;amp;quot;CXX&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;tool&amp;amp;quot;: &amp;amp;quot;SvEng&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;warnClass&amp;amp;quot;: &amp;amp;quot;ASSIGN_NO_CHECK_FOR_THIS&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;mtid&amp;amp;quot;: &amp;amp;quot;SvEng.LA.4&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;msg&amp;amp;quot;: &amp;amp;quot;Method 'operator=' doesn't check its argument with 'this' pointer.&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;details&amp;amp;quot;: &amp;amp;quot;d96c832835f414a119ea8c7575a8926378fd7cf6&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;flags&amp;amp;quot;: 0,&lt;br /&gt;
    &amp;amp;quot;traces&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;role&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;locations&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
            &amp;amp;quot;col&amp;amp;quot;: 0,&lt;br /&gt;
            &amp;amp;quot;spec&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;info&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;checker_severity&amp;amp;quot;: &amp;amp;quot;Normal&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_reliability&amp;amp;quot;: &amp;amp;quot;High&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_origin&amp;amp;quot;: &amp;amp;quot;builtin&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;review&amp;amp;quot;: {&lt;br /&gt;
      &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;amp;quot;review_history&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65795&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:21.683963Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;63495&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Unspecified&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;reviewer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;077fdd75-b382-4008-97c4-ec6ef8732ccd&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2022-04-05T11:47:47.026161Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;reviewer_attrs&amp;amp;quot;: [&amp;amp;quot;review_master&amp;amp;quot;]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;comments&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaaaaaaa&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;txt&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;updateTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:17.220568Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;history&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb8b-4244-7931-81f7-a7d1a4512de0&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;1pQ3T5bq6AMYEYJqzFsW+Q&amp;amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Следует заметить, что данный метод может требовать достаточно большого времени выполнения для проектов с большим количеством предупреждений.&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3365</id>
		<title>Help:Public API</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3365"/>
		<updated>2025-11-25T15:16:41Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Вспомогательные модули */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публичные REST запросы ==&lt;br /&gt;
&lt;br /&gt;
Для работы с сервером через различные приложения реализованы публичные запросы, которые не будут меняться при обновлении самого сервера. Если будут происходить значимые изменения, то запрос будет помечаться как deprecated и создаваться новый такой же запрос с пометкой '''/api/some/request/v2'''. &lt;br /&gt;
&lt;br /&gt;
=== Получение токена ===&lt;br /&gt;
&lt;br /&gt;
Для большинства запросов требуется JWT-токен, чтобы его получить нужно пройти аутентификацию. Это можно сделать двумя способами:&lt;br /&gt;
&lt;br /&gt;
* Простой способ — POST запрос с basic auth на '''/api/login''', который вернёт JWT-токен в body. Использование данного способа не желательно, так как он может меняться в будущем, а также не всегда правильно обрабатывает спец. символы и кириллицу в логине/пароле. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -u admin:admin http://svacer.example.com/api/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Предпочтительный способ — POST запрос на '''/api/public/login''' с передачей данных в теле запроса, как описано [[Help:Public API#public-api-login|ниже]]. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -d '{&amp;quot;login&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot;}' http://svacer.example.com/api/public/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученный токен надо добавлять в header всех запросов: &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;token&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Базовые публичные запросы ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''/api/public/login'''&lt;br /&gt;
| POST&lt;br /&gt;
| &amp;lt;span id=&amp;quot;public-api-login&amp;quot; /&amp;gt;Аутентификация пользователя. Тело запроса имеет формат JSON и выглядит следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auth_type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;server&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    &amp;quot;login&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
* auth_type — тип аутентификации: при указании значения &amp;quot;ldap&amp;quot; — аутентификация через LDAP, во всех остальных случаях, или если поле не указано — по внутренней базе пользователей Svacer&lt;br /&gt;
* server — имя LDAP-сервера, как он указан в конфигурационном файле LDAP (поле name) при запуске Svacer. Значение поля учитывается, только если &amp;lt;code&amp;gt;&amp;quot;auth_type&amp;quot;: &amp;quot;ldap&amp;quot;&amp;lt;/code&amp;gt;, в иных случаях его можно не указывать&lt;br /&gt;
* login — логин пользователя, обязательное поле&lt;br /&gt;
* password — пароль пользователя, обязательное поле&lt;br /&gt;
|-      &lt;br /&gt;
| '''/api/public/help'''&lt;br /&gt;
| GET&lt;br /&gt;
| Дополнительная информация по public REST API. Работает без авторизации&lt;br /&gt;
|-&lt;br /&gt;
| '''/api/health'''&lt;br /&gt;
| GET&lt;br /&gt;
| Проверка доступности сервера. Не требует авторизации. Возвращает статус 200 OK если сервер работает&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Описание остальных запросов смотрите в спецификации OpenAPI на вашем сервере Svacer по адресу &amp;lt;code&amp;gt;/api/public/swagger/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можете посмотреть на нашем демо-сервере: https://svacer-demo.ispras.ru/api/public/swagger/&lt;br /&gt;
&lt;br /&gt;
== Управление контейнерами ==&lt;br /&gt;
См. [[Help:Public API/management/containers]]&lt;br /&gt;
&lt;br /&gt;
== Экспорт, импорт и копирование разметки == &lt;br /&gt;
См. [[Markup2]]&lt;br /&gt;
&lt;br /&gt;
== Примеры использования public REST API ==&lt;br /&gt;
&lt;br /&gt;
=== Получение URL загруженного снимка ===&lt;br /&gt;
&lt;br /&gt;
Этот пример работает только с python3 и не работает при аутентификации в Svacer через LDAP.&lt;br /&gt;
&lt;br /&gt;
Скачайте и распакуйте [[index.php?title=Media:Get link.zip|get_link.zip]] &lt;br /&gt;
&lt;br /&gt;
Запрос:&lt;br /&gt;
  &amp;lt;pre&amp;gt;python get_link.py --url http://svacer.example.com:8080 --user admin --password admin --project bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
  &amp;lt;pre&amp;gt;http://svacer.example.com:8080/mode/review/project/0fd645aa-8e70-4a4f-b68b-766c4f337bf2/branch/8925df5a-7a98-4f07-bc88-ee4ea5b43813/snapshot/e3367efa-a804-4c05-9a7a-a7cb052bef1d&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования фильтров в public api ===&lt;br /&gt;
Данные фильтры служат только для ограничения вывода некоторых методов в public api. Они являются отдельной сущностью, наравне с глобальными фильтрами и пользовательскими фильтрами.&lt;br /&gt;
&lt;br /&gt;
==== Вспомогательные модули ====&lt;br /&gt;
&lt;br /&gt;
В некоторых примерах API используется фильтр, с помощью которого можно ограничить вывод данных и получить более точные результаты. Для работы с этим фильтром используются следующие классы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
from requests import auth&lt;br /&gt;
from requests.models import HTTPBasicAuth&lt;br /&gt;
import json&lt;br /&gt;
from dataclasses import dataclass&lt;br /&gt;
import sys&lt;br /&gt;
import base64&lt;br /&gt;
&lt;br /&gt;
def printerr(text):&lt;br /&gt;
    #print in stderr and exit&lt;br /&gt;
    print(f&amp;amp;quot;{text}&amp;amp;quot;, file=sys.stderr, flush=True)&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class ProjectFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ProjectFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class BranchFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class BranchFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class SnapshotFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class SnapshotFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class MarkerFilter:&lt;br /&gt;
    severity: str&lt;br /&gt;
    file: str&lt;br /&gt;
    checker: str&lt;br /&gt;
    review: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class MarkerFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class Filter:&lt;br /&gt;
    project: ProjectFilter&lt;br /&gt;
    branch: BranchFilter&lt;br /&gt;
    snapshot: SnapshotFilter&lt;br /&gt;
    marker: MarkerFilter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class FilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def CreateFilterParam(filter: Filter):&lt;br /&gt;
    jsoned = FilterEncoder().encode(filter)&lt;br /&gt;
    b64ed = base64.b64encode(jsoned.encode(&amp;amp;quot;utf-8&amp;amp;quot;))&lt;br /&gt;
    return b64ed.decode(&amp;amp;quot;utf-8&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Принцип использования классов следующий:&lt;br /&gt;
&lt;br /&gt;
# Создается экземпляр нужного класса XXXXFilter&lt;br /&gt;
# Создается base64 строка на основе объекта пункта 1, которая в дальнейшем передается в url запросе. Для этого используется метод CreateFilterParam()&lt;br /&gt;
&lt;br /&gt;
Например. Для создания фильтра, ограничивающего множество проектов выражением darpa*, можно использовать следующие строчки кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darp*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Как можно заметить из определения фильтра, для проекта, ветки и снимка - можно указать как имя так и ID. Имя можно указать с использованием регулярного выражения. ID необходимо указать полностью.&lt;br /&gt;
&lt;br /&gt;
==== Точка входа api/public/login ====&lt;br /&gt;
&lt;br /&gt;
Данный класс может быть использован для соединения с сервером Svacer. В данном модуле демонстрируется взаимодействие с точкой входа /api/public/login. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
&lt;br /&gt;
class SvacerClient:&lt;br /&gt;
    def __init__(self, host, user, password):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Initialize the Svacer client        &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        self.host = host&lt;br /&gt;
        self.user = user&lt;br /&gt;
        self.password = password&lt;br /&gt;
        self.token = None&lt;br /&gt;
        self.auth_header = None&lt;br /&gt;
        self.session = requests.Session()  # Use session for connection pooling&lt;br /&gt;
        self.set_auth_token()&lt;br /&gt;
    &lt;br /&gt;
    def set_auth_token(self):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Get authorization token using /api/public/login and setup in session&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            response = requests.post(&lt;br /&gt;
                url=f&amp;amp;quot;{self.host}/api/public/login&amp;amp;quot;,&lt;br /&gt;
                json={&lt;br /&gt;
                    &amp;amp;quot;login&amp;amp;quot;:self.user,&lt;br /&gt;
                    &amp;amp;quot;password&amp;amp;quot;:self.password,&lt;br /&gt;
                },&lt;br /&gt;
                verify=False&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()  # Raise an exception for bad status codes            &lt;br /&gt;
            body = response.json()&lt;br /&gt;
            self.token = body[&amp;amp;quot;token&amp;amp;quot;]&lt;br /&gt;
            self.auth_header = {'Authorization': f'Bearer {self.token}'}&lt;br /&gt;
            &lt;br /&gt;
            # Set the authorization header in the session&lt;br /&gt;
            self.session.headers.update(self.auth_header)&lt;br /&gt;
            &lt;br /&gt;
            return self.token&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Failed to get authentication token: {e}&amp;amp;quot;)&lt;br /&gt;
        except KeyError as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Token not found in response: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def post(self, endpoint, data=None, json=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a POST request to the API&lt;br /&gt;
&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.post(&lt;br /&gt;
                url, &lt;br /&gt;
                data=data, &lt;br /&gt;
                json=json, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;POST request failed: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def get(self, endpoint, params=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a GET request to the API&lt;br /&gt;
  &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.get(&lt;br /&gt;
                url, &lt;br /&gt;
                params=params, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;GET request failed: {e}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects ====&lt;br /&gt;
&lt;br /&gt;
В данном примере выводятся в формате json список проектов, имя которых соответствует регулярному выражению darpa*&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
&lt;br /&gt;
cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darp*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&lt;br /&gt;
resp=cl.get(f&amp;amp;quot;/api/public/projects?filters={param}&amp;amp;quot;)&lt;br /&gt;
print(f&amp;amp;quot;Response: {resp.json()}&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Результат может быть следующим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-8cd3-7437-957d-aed0c87e603a&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa-clone&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:43.79526Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-83b1-7d80-8d23-ce849387bd6e&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:41.457887Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects/{project_id}/branch/{branch_id}/snapshots ====&lt;br /&gt;
&lt;br /&gt;
С помощью данной точки входа можно получить список снимков, указанной ветки. Пример кода, для получения снимков с именем &amp;amp;quot;ver. 2.7.0*&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
def get_snapshots(pr_id, br_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None,None,SnapshotFilter(id=&amp;amp;quot;&amp;amp;quot;,name=&amp;amp;quot;ver. 2.7.0*&amp;amp;quot;), None)&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots?filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
get_snapshots(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;4d1f1413-c638-4a8b-aa4d-d9fccd8df3e9&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: true,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;354c9c94-7b57-4427-8ce0-c41f1e59e6c2&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:58:53.618464Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;c472aab7-d53f-496c-9d3d-069c0901d9bb&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;edca1583aa41489d37ae9fb2c348ad066ecd3ab3&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;cf032d99-2efe-4ee0-8db8-ee85ff17b296&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects/{project_id}/branch/{branch_id}/snapshots/{snapshot_id}/fullmarkers ====&lt;br /&gt;
&lt;br /&gt;
Данная точка входа служит для получения информации о получении информации о маркерах указанного снимка. Информация о маркере может включать в себя:&lt;br /&gt;
&lt;br /&gt;
* трассу ошибки (параметр traces, возможные значения true,false)&lt;br /&gt;
* информацию о чекере (параметр checker_info, возможные значения true,false)&lt;br /&gt;
* историю разметки (параметр review_history, возможные значения true,false)&lt;br /&gt;
* история комментария (параметр comment_history, возможные значения true,false)&lt;br /&gt;
* идентификатор пользовательского фильтра (параметр custom_filter)&lt;br /&gt;
* фильтр на параметры маркера&lt;br /&gt;
&lt;br /&gt;
Пример кода, для получения всего множества информации о маркерах в некотором снимке, размеченных со статусом Conf*:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;def get_markers (pr_id, br_id, snap_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None, None, None, MarkerFilter(severity=&amp;amp;quot;*&amp;amp;quot;,&lt;br /&gt;
                       file=&amp;amp;quot;*&amp;amp;quot;, checker=&amp;amp;quot;*&amp;amp;quot;, review=&amp;amp;quot;Conf*&amp;amp;quot;))&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots/{snap_id}/fullmarkers?traces=true&amp;amp;amp;checker_info=true&amp;amp;amp;review_history=true&amp;amp;amp;comment_history=true&amp;amp;amp;filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
get_markers(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;)  &amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;function&amp;amp;quot;: &amp;amp;quot;_ZN6StringaSERKS_&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
    &amp;amp;quot;locID&amp;amp;quot;: 1006,&lt;br /&gt;
    &amp;amp;quot;lang&amp;amp;quot;: &amp;amp;quot;CXX&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;tool&amp;amp;quot;: &amp;amp;quot;SvEng&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;warnClass&amp;amp;quot;: &amp;amp;quot;ASSIGN_NO_CHECK_FOR_THIS&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;mtid&amp;amp;quot;: &amp;amp;quot;SvEng.LA.4&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;msg&amp;amp;quot;: &amp;amp;quot;Method 'operator=' doesn't check its argument with 'this' pointer.&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;details&amp;amp;quot;: &amp;amp;quot;d96c832835f414a119ea8c7575a8926378fd7cf6&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;flags&amp;amp;quot;: 0,&lt;br /&gt;
    &amp;amp;quot;traces&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;role&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;locations&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
            &amp;amp;quot;col&amp;amp;quot;: 0,&lt;br /&gt;
            &amp;amp;quot;spec&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;info&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;checker_severity&amp;amp;quot;: &amp;amp;quot;Normal&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_reliability&amp;amp;quot;: &amp;amp;quot;High&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_origin&amp;amp;quot;: &amp;amp;quot;builtin&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;review&amp;amp;quot;: {&lt;br /&gt;
      &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;amp;quot;review_history&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65795&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:21.683963Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;63495&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Unspecified&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;reviewer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;077fdd75-b382-4008-97c4-ec6ef8732ccd&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2022-04-05T11:47:47.026161Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;reviewer_attrs&amp;amp;quot;: [&amp;amp;quot;review_master&amp;amp;quot;]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;comments&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaaaaaaa&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;txt&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;updateTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:17.220568Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;history&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb8b-4244-7931-81f7-a7d1a4512de0&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;1pQ3T5bq6AMYEYJqzFsW+Q&amp;amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Следует заметить, что данный метод может требовать достаточно большого времени выполнения для проектов с большим количеством предупреждений.&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3364</id>
		<title>Help:Public API</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API&amp;diff=3364"/>
		<updated>2025-11-25T15:14:16Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Примеры использования public REST API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публичные REST запросы ==&lt;br /&gt;
&lt;br /&gt;
Для работы с сервером через различные приложения реализованы публичные запросы, которые не будут меняться при обновлении самого сервера. Если будут происходить значимые изменения, то запрос будет помечаться как deprecated и создаваться новый такой же запрос с пометкой '''/api/some/request/v2'''. &lt;br /&gt;
&lt;br /&gt;
=== Получение токена ===&lt;br /&gt;
&lt;br /&gt;
Для большинства запросов требуется JWT-токен, чтобы его получить нужно пройти аутентификацию. Это можно сделать двумя способами:&lt;br /&gt;
&lt;br /&gt;
* Простой способ — POST запрос с basic auth на '''/api/login''', который вернёт JWT-токен в body. Использование данного способа не желательно, так как он может меняться в будущем, а также не всегда правильно обрабатывает спец. символы и кириллицу в логине/пароле. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -u admin:admin http://svacer.example.com/api/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Предпочтительный способ — POST запрос на '''/api/public/login''' с передачей данных в теле запроса, как описано [[#public-api-login|ниже]]. Пример:&lt;br /&gt;
  &amp;lt;pre&amp;gt;curl -X POST -d '{&amp;quot;login&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot;}' http://svacer.example.com/api/public/login&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученный токен надо добавлять в header всех запросов: &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;token&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Базовые публичные запросы ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''/api/public/login'''&lt;br /&gt;
| POST&lt;br /&gt;
| &amp;lt;span id=&amp;quot;public-api-login&amp;quot; /&amp;gt;Аутентификация пользователя. Тело запроса имеет формат JSON и выглядит следующим образом:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auth_type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;server&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    &amp;quot;login&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
* auth_type — тип аутентификации: при указании значения &amp;quot;ldap&amp;quot; — аутентификация через LDAP, во всех остальных случаях, или если поле не указано — по внутренней базе пользователей Svacer&lt;br /&gt;
* server — имя LDAP-сервера, как он указан в конфигурационном файле LDAP (поле name) при запуске Svacer. Значение поля учитывается, только если &amp;lt;code&amp;gt;&amp;quot;auth_type&amp;quot;: &amp;quot;ldap&amp;quot;&amp;lt;/code&amp;gt;, в иных случаях его можно не указывать&lt;br /&gt;
* login — логин пользователя, обязательное поле&lt;br /&gt;
* password — пароль пользователя, обязательное поле&lt;br /&gt;
|-      &lt;br /&gt;
| '''/api/public/help'''&lt;br /&gt;
| GET&lt;br /&gt;
| Дополнительная информация по public REST API. Работает без авторизации&lt;br /&gt;
|-&lt;br /&gt;
| '''/api/health'''&lt;br /&gt;
| GET&lt;br /&gt;
| Проверка доступности сервера. Не требует авторизации. Возвращает статус 200 OK если сервер работает&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Описание остальных запросов смотрите в спецификации OpenAPI на вашем сервере Svacer по адресу &amp;lt;code&amp;gt;/api/public/swagger/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можете посмотреть на нашем демо-сервере: https://svacer-demo.ispras.ru/api/public/swagger/&lt;br /&gt;
&lt;br /&gt;
== Управление контейнерами ==&lt;br /&gt;
См. [[Help:Public API/management/containers]]&lt;br /&gt;
&lt;br /&gt;
== Экспорт, импорт и копирование разметки == &lt;br /&gt;
См. [[Markup2]]&lt;br /&gt;
&lt;br /&gt;
== Примеры использования public REST API ==&lt;br /&gt;
&lt;br /&gt;
=== Получение URL загруженного снимка ===&lt;br /&gt;
&lt;br /&gt;
Этот пример работает только с python3 и не работает при аутентификации в Svacer через LDAP.&lt;br /&gt;
&lt;br /&gt;
Скачайте и распакуйте [[Media:get_link.zip|get_link.zip]] &lt;br /&gt;
&lt;br /&gt;
Запрос:&lt;br /&gt;
  &amp;lt;pre&amp;gt;python get_link.py --url http://svacer.example.com:8080 --user admin --password admin --project bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
  &amp;lt;pre&amp;gt;http://svacer.example.com:8080/mode/review/project/0fd645aa-8e70-4a4f-b68b-766c4f337bf2/branch/8925df5a-7a98-4f07-bc88-ee4ea5b43813/snapshot/e3367efa-a804-4c05-9a7a-a7cb052bef1d&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования фильтров в public api ===&lt;br /&gt;
&lt;br /&gt;
==== Вспомогательные модули ====&lt;br /&gt;
&lt;br /&gt;
В некоторых примерах API используется фильтр, с помощью которого можно ограничить вывод данных и получить более точные результаты. Для работы с этим фильтром используются следующие классы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
from requests import auth&lt;br /&gt;
from requests.models import HTTPBasicAuth&lt;br /&gt;
import json&lt;br /&gt;
from dataclasses import dataclass&lt;br /&gt;
import sys&lt;br /&gt;
import base64&lt;br /&gt;
&lt;br /&gt;
def printerr(text):&lt;br /&gt;
    #print in stderr and exit&lt;br /&gt;
    print(f&amp;amp;quot;{text}&amp;amp;quot;, file=sys.stderr, flush=True)&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class ProjectFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ProjectFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class BranchFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class BranchFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class SnapshotFilter:&lt;br /&gt;
    id: str&lt;br /&gt;
    name: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class SnapshotFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class MarkerFilter:&lt;br /&gt;
    severity: str&lt;br /&gt;
    file: str&lt;br /&gt;
    checker: str&lt;br /&gt;
    review: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class MarkerFilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@dataclass&lt;br /&gt;
class Filter:&lt;br /&gt;
    project: ProjectFilter&lt;br /&gt;
    branch: BranchFilter&lt;br /&gt;
    snapshot: SnapshotFilter&lt;br /&gt;
    marker: MarkerFilter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class FilterEncoder(json.JSONEncoder):&lt;br /&gt;
    def default(self, o):&lt;br /&gt;
        return o.__dict__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def CreateFilterParam(filter: Filter):&lt;br /&gt;
    jsoned = FilterEncoder().encode(filter)&lt;br /&gt;
    b64ed = base64.b64encode(jsoned.encode(&amp;amp;quot;utf-8&amp;amp;quot;))&lt;br /&gt;
    return b64ed.decode(&amp;amp;quot;utf-8&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Принцип использования классов следующий:&lt;br /&gt;
&lt;br /&gt;
# Создается экземпляр нужного класса XXXXFilter&lt;br /&gt;
# Создается base64 строка на основе объекта пункта 1, которая в дальнейшем передается в url запросе. Для этого используется метод CreateFilterParam()&lt;br /&gt;
&lt;br /&gt;
Например. Для создания фильтра, ограничивающего множество проектов выражением darpa*, можно использовать следующие строчки кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darp*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Как можно заметить из определения фильтра, для проекта, ветки и снимка - можно указать как имя так и ID. Имя можно указать с использованием регулярного выражения. ID необходимо указать полностью.&lt;br /&gt;
&lt;br /&gt;
==== Точка входа api/public/login ====&lt;br /&gt;
&lt;br /&gt;
Данный класс может быть использован для соединения с сервером Svacer. В данном модуле демонстрируется взаимодействие с точкой входа /api/public/login. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;import requests&lt;br /&gt;
&lt;br /&gt;
class SvacerClient:&lt;br /&gt;
    def __init__(self, host, user, password):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Initialize the Svacer client        &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        self.host = host&lt;br /&gt;
        self.user = user&lt;br /&gt;
        self.password = password&lt;br /&gt;
        self.token = None&lt;br /&gt;
        self.auth_header = None&lt;br /&gt;
        self.session = requests.Session()  # Use session for connection pooling&lt;br /&gt;
        self.set_auth_token()&lt;br /&gt;
    &lt;br /&gt;
    def set_auth_token(self):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Get authorization token using /api/public/login and setup in session&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            response = requests.post(&lt;br /&gt;
                url=f&amp;amp;quot;{self.host}/api/public/login&amp;amp;quot;,&lt;br /&gt;
                json={&lt;br /&gt;
                    &amp;amp;quot;login&amp;amp;quot;:self.user,&lt;br /&gt;
                    &amp;amp;quot;password&amp;amp;quot;:self.password,&lt;br /&gt;
                },&lt;br /&gt;
                verify=False&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()  # Raise an exception for bad status codes            &lt;br /&gt;
            body = response.json()&lt;br /&gt;
            self.token = body[&amp;amp;quot;token&amp;amp;quot;]&lt;br /&gt;
            self.auth_header = {'Authorization': f'Bearer {self.token}'}&lt;br /&gt;
            &lt;br /&gt;
            # Set the authorization header in the session&lt;br /&gt;
            self.session.headers.update(self.auth_header)&lt;br /&gt;
            &lt;br /&gt;
            return self.token&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Failed to get authentication token: {e}&amp;amp;quot;)&lt;br /&gt;
        except KeyError as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;Token not found in response: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def post(self, endpoint, data=None, json=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a POST request to the API&lt;br /&gt;
&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.post(&lt;br /&gt;
                url, &lt;br /&gt;
                data=data, &lt;br /&gt;
                json=json, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;POST request failed: {e}&amp;amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def get(self, endpoint, params=None, **kwargs):&lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        Make a GET request to the API&lt;br /&gt;
  &lt;br /&gt;
        &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
        if self.auth_header is None:&lt;br /&gt;
            raise Exception(&amp;amp;quot;No authentication token available. Call get_auth_token() first.&amp;amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        url = f&amp;amp;quot;{self.host}{endpoint}&amp;amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            response = self.session.get(&lt;br /&gt;
                url, &lt;br /&gt;
                params=params, &lt;br /&gt;
                verify=False,&lt;br /&gt;
                **kwargs&lt;br /&gt;
            )&lt;br /&gt;
            response.raise_for_status()&lt;br /&gt;
            return response&lt;br /&gt;
            &lt;br /&gt;
        except requests.exceptions.RequestException as e:&lt;br /&gt;
            raise Exception(f&amp;amp;quot;GET request failed: {e}&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects ====&lt;br /&gt;
&lt;br /&gt;
В данном примере выводятся в формате json список проектов, имя которых соответствует регулярному выражению darpa*&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
&lt;br /&gt;
cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
f: Filter = Filter(ProjectFilter(id=&amp;amp;quot;&amp;amp;quot;, name=&amp;amp;quot;darp*&amp;amp;quot;), None, None, None)&lt;br /&gt;
param = CreateFilterParam(f)&lt;br /&gt;
resp=cl.get(f&amp;amp;quot;/api/public/projects?filters={param}&amp;amp;quot;)&lt;br /&gt;
print(f&amp;amp;quot;Response: {resp.json()}&amp;amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Результат может быть следующим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-8cd3-7437-957d-aed0c87e603a&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa-clone&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:43.79526Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb61-83b1-7d80-8d23-ce849387bd6e&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T14:18:41.457887Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;project&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;branches&amp;amp;quot;:&lt;br /&gt;
        [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:54:13.754864Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;created_by_id&amp;amp;quot;: null&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects/{project_id}/branch/{branch_id}/snapshots ====&lt;br /&gt;
&lt;br /&gt;
С помощью данной точки входа можно получить список снимков, указанной ветки. Пример кода, для получения снимков с именем &amp;amp;quot;ver. 2.7.0*&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;from filters import *&lt;br /&gt;
from svacer import *&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
def get_snapshots(pr_id, br_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None,None,SnapshotFilter(id=&amp;amp;quot;&amp;amp;quot;,name=&amp;amp;quot;ver. 2.7.0*&amp;amp;quot;), None)&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots?filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
get_snapshots(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;4d1f1413-c638-4a8b-aa4d-d9fccd8df3e9&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: true,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-20T04:26:52Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;2af625b5faad4083be881135ad1daf6b304e4c99.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;354c9c94-7b57-4427-8ce0-c41f1e59e6c2&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;name&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:58:53.618464Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;link&amp;amp;quot;: &amp;amp;quot;http://swarm-mgr.home:10142/mode/review/project/e6abca1b-23a0-4107-9120-4d8d3596030b/branch/ab179fad-c96a-498d-8407-2a3c82719385/snapshot/4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;import_time&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;details&amp;amp;quot;:&lt;br /&gt;
        {&lt;br /&gt;
            &amp;amp;quot;branch&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;branchIDHint&amp;amp;quot;: &amp;amp;quot;c472aab7-d53f-496c-9d3d-069c0901d9bb&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;buildObject&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;dxrIncluded&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;host&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;hostname&amp;amp;quot;: &amp;amp;quot;seroshki&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;sergey&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;4f706c3a-fdac-475e-bb0a-8bdd753879ca&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;importTime&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;migration-data&amp;amp;quot;:&lt;br /&gt;
            {&lt;br /&gt;
                &amp;amp;quot;DXR&amp;amp;quot;: &amp;amp;quot;ce03cd6d1bd54eac92e227d4184356a90b64b7c1&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;SOURCE_TREE&amp;amp;quot;: &amp;amp;quot;0949114563f48d5a2df6e94816b7b1095b6c6540&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;date&amp;amp;quot;: &amp;amp;quot;2019-04-13T04:33:46Z&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;description&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;owner&amp;amp;quot;: &amp;amp;quot;7a831745d52244db2a4f1692f0c473e61f0f0157&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;parent_id&amp;amp;quot;: &amp;amp;quot;edca1583aa41489d37ae9fb2c348ad066ecd3ab3&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;sourceData&amp;amp;quot;: &amp;amp;quot;cf43335308de8b7b3ae03735a7f738a6e9246f52&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;svres&amp;amp;quot;: &amp;amp;quot;0d491fde062e2795a4b38758488a47bf8481d03c.svres.gzip&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;snapshot&amp;amp;quot;,&lt;br /&gt;
                &amp;amp;quot;user&amp;amp;quot;: &amp;amp;quot;jenkins&amp;amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;amp;quot;project&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;projectIDHint&amp;amp;quot;: &amp;amp;quot;cf032d99-2efe-4ee0-8db8-ee85ff17b296&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;snapshot&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 130419 07:39&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;sourceIncluded&amp;amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Точка входа /api/public/projects/{project_id}/branch/{branch_id}/snapshots/{snapshot_id}/fullmarkers ====&lt;br /&gt;
&lt;br /&gt;
Данная точка входа служит для получения информации о получении информации о маркерах указанного снимка. Информация о маркере может включать в себя:&lt;br /&gt;
&lt;br /&gt;
* трассу ошибки (параметр traces, возможные значения true,false)&lt;br /&gt;
* информацию о чекере (параметр checker_info, возможные значения true,false)&lt;br /&gt;
* историю разметки (параметр review_history, возможные значения true,false)&lt;br /&gt;
* история комментария (параметр comment_history, возможные значения true,false)&lt;br /&gt;
* идентификатор пользовательского фильтра (параметр custom_filter)&lt;br /&gt;
* фильтр на параметры маркера&lt;br /&gt;
&lt;br /&gt;
Пример кода, для получения всего множества информации о маркерах в некотором снимке, размеченных со статусом Conf*:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;def get_markers (pr_id, br_id, snap_id):&lt;br /&gt;
    cl = SvacerClient(host=&amp;amp;quot;http://swarm-mgr:10142&amp;amp;quot;,user=&amp;amp;quot;admin&amp;amp;quot;,password=&amp;amp;quot;admin&amp;amp;quot;)&lt;br /&gt;
    f: Filter = Filter(None, None, None, MarkerFilter(severity=&amp;amp;quot;*&amp;amp;quot;,&lt;br /&gt;
                       file=&amp;amp;quot;*&amp;amp;quot;, checker=&amp;amp;quot;*&amp;amp;quot;, review=&amp;amp;quot;Conf*&amp;amp;quot;))&lt;br /&gt;
    param = CreateFilterParam(f)&lt;br /&gt;
    resp=cl.get(f&amp;amp;quot;/api/public/projects/{pr_id}/branch/{br_id}/snapshots/{snap_id}/fullmarkers?traces=true&amp;amp;amp;checker_info=true&amp;amp;amp;review_history=true&amp;amp;amp;comment_history=true&amp;amp;amp;filters={param}&amp;amp;quot;)&lt;br /&gt;
    fmt = json.dumps(resp.json())&lt;br /&gt;
    print(f&amp;amp;quot;Response: {fmt}&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
get_markers(&amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;)  &amp;lt;/pre&amp;gt;&lt;br /&gt;
Возможный вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;function&amp;amp;quot;: &amp;amp;quot;_ZN6StringaSERKS_&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
    &amp;amp;quot;locID&amp;amp;quot;: 1006,&lt;br /&gt;
    &amp;amp;quot;lang&amp;amp;quot;: &amp;amp;quot;CXX&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;tool&amp;amp;quot;: &amp;amp;quot;SvEng&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;warnClass&amp;amp;quot;: &amp;amp;quot;ASSIGN_NO_CHECK_FOR_THIS&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;mtid&amp;amp;quot;: &amp;amp;quot;SvEng.LA.4&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;msg&amp;amp;quot;: &amp;amp;quot;Method 'operator=' doesn't check its argument with 'this' pointer.&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;details&amp;amp;quot;: &amp;amp;quot;d96c832835f414a119ea8c7575a8926378fd7cf6&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;flags&amp;amp;quot;: 0,&lt;br /&gt;
    &amp;amp;quot;traces&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;role&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;locations&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;file&amp;amp;quot;: &amp;amp;quot;/mnt/scratch/sources/darpa-source/challenges/Divelogger2/lib/string.cc&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;line&amp;amp;quot;: 179,&lt;br /&gt;
            &amp;amp;quot;col&amp;amp;quot;: 0,&lt;br /&gt;
            &amp;amp;quot;spec&amp;amp;quot;: false,&lt;br /&gt;
            &amp;amp;quot;info&amp;amp;quot;: &amp;amp;quot;declaration&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;checker_severity&amp;amp;quot;: &amp;amp;quot;Normal&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_reliability&amp;amp;quot;: &amp;amp;quot;High&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;checker_origin&amp;amp;quot;: &amp;amp;quot;builtin&amp;amp;quot;,&lt;br /&gt;
    &amp;amp;quot;review&amp;amp;quot;: {&lt;br /&gt;
      &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
      &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;amp;quot;review_history&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65796&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Fix required&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:25.216816Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;65795&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Major&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:21.683963Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;250a4ff1-bfc8-439a-834d-18b62a545d8d&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 300319 07:08&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:40.524836Z&amp;amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;63495&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;status&amp;amp;quot;: &amp;amp;quot;Confirmed&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;severity&amp;amp;quot;: &amp;amp;quot;Unspecified&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;action&amp;amp;quot;: &amp;amp;quot;Undecided&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;reviewer&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;077fdd75-b382-4008-97c4-ec6ef8732ccd&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;time&amp;amp;quot;: &amp;amp;quot;2022-04-05T11:47:47.026161Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFrom&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdFromContext&amp;amp;quot;: {&lt;br /&gt;
          &amp;amp;quot;projectID&amp;amp;quot;: &amp;amp;quot;e6abca1b-23a0-4107-9120-4d8d3596030b&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchID&amp;amp;quot;: &amp;amp;quot;ab179fad-c96a-498d-8407-2a3c82719385&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotID&amp;amp;quot;: &amp;amp;quot;4242b43a-da44-44ca-9b28-770295b98493&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;markerID&amp;amp;quot;: &amp;amp;quot;a94f92f4-4e3e-4071-9f10-aa8e4389dd0a&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;projectName&amp;amp;quot;: &amp;amp;quot;darpa&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;branchName&amp;amp;quot;: &amp;amp;quot;master&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;snapshotName&amp;amp;quot;: &amp;amp;quot; ver. 2.7.1 200419 05:55&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;importer&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000002&amp;amp;quot;,&lt;br /&gt;
          &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2020-04-03T04:56:49.006218Z&amp;amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;amp;quot;reviewer_attrs&amp;amp;quot;: [&amp;amp;quot;review_master&amp;amp;quot;]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;comments&amp;amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaaaaaaa&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;type&amp;amp;quot;: &amp;amp;quot;txt&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createdBy&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;createTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;updateTs&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:17.220568Z&amp;amp;quot;,&lt;br /&gt;
        &amp;amp;quot;history&amp;amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;amp;quot;id&amp;amp;quot;: &amp;amp;quot;019abb8b-4244-7931-81f7-a7d1a4512de0&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_id&amp;amp;quot;: &amp;amp;quot;e3287eb2-9e64-4780-a1c0-22ed9393a226&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;comment_ref&amp;amp;quot;: &amp;amp;quot;ab877a02-03ac-41ac-8b87-46f7e76791ba&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;text&amp;amp;quot;: &amp;amp;quot;aaaa&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by&amp;amp;quot;: &amp;amp;quot;admin&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;created_by_id&amp;amp;quot;: &amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;,&lt;br /&gt;
            &amp;amp;quot;create_ts&amp;amp;quot;: &amp;amp;quot;2025-11-25T15:04:11.358138Z&amp;amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;amp;quot;invariant&amp;amp;quot;: &amp;amp;quot;1pQ3T5bq6AMYEYJqzFsW+Q&amp;amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Следует заметить, что данный метод может требовать достаточно большого времени выполнения для проектов с большим количеством предупреждений.&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3344</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3344"/>
		<updated>2025-11-19T08:08:51Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
     uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3343</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3343"/>
		<updated>2025-11-19T07:55:19Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Настройка защиты от перебора паролей пользователей */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock --user admin --password admin --login locked_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
 syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
 import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
 option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
 package webhook;&lt;br /&gt;
 &lt;br /&gt;
 enum EventType {&lt;br /&gt;
     EventNone = 0;&lt;br /&gt;
     EventTest = 1;&lt;br /&gt;
     EventReviewMarker = 2;&lt;br /&gt;
     EventPurgeReview = 3;&lt;br /&gt;
     EventGroupReview = 4;&lt;br /&gt;
     EventImportSnapshot = 5;&lt;br /&gt;
     EventCopySnapshot = 6;&lt;br /&gt;
     EventNewComment = 7;&lt;br /&gt;
     EventUpdateComment = 8;&lt;br /&gt;
     EventNewContainer = 9;&lt;br /&gt;
     EventDeleteContainer = 10;&lt;br /&gt;
     EventUpdateContainer  =11;&lt;br /&gt;
     EventImportMarkup = 12;&lt;br /&gt;
     EventDeleteSnapshot = 13;&lt;br /&gt;
     UpdateSnapshot = 14;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 message MarkerDetails {&lt;br /&gt;
     string id = 1;&lt;br /&gt;
     string file = 2;&lt;br /&gt;
     string line = 3;&lt;br /&gt;
     string lang = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message Event {&lt;br /&gt;
     uint64 timestamp = 1;&lt;br /&gt;
     EventType type = 2;&lt;br /&gt;
     string created_by = 3;&lt;br /&gt;
     google.protobuf.Any payload = 4;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     repeated MarkerDetails markers = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string severity = 9;&lt;br /&gt;
     string action = 10;&lt;br /&gt;
     string status = 11;&lt;br /&gt;
     bool group_review = 12;&lt;br /&gt;
     string created_by_id = 13;&lt;br /&gt;
     string created_by_login = 14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadPurgeReview {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string created_by_id = 5;&lt;br /&gt;
     string created_by_login = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportSnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message PayloadMarkerComment {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     MarkerDetails marker = 7;&lt;br /&gt;
     string comment = 8;&lt;br /&gt;
     string created_by_id = 9;&lt;br /&gt;
     string created_by_login = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadCopySnapshot {&lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     string snapshot_id = 5;&lt;br /&gt;
     string snapshot_name = 6;&lt;br /&gt;
     string created_by_id = 7;&lt;br /&gt;
     string created_by_login = 8;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Container {    &lt;br /&gt;
     string project_id = 1;&lt;br /&gt;
     string project_name = 2;&lt;br /&gt;
     string branch_id = 3;&lt;br /&gt;
     string branch_name = 4;&lt;br /&gt;
     Container source = 5;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadNewContainer {&lt;br /&gt;
     repeated Container containers = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 message PayloadDeleteContainer {&lt;br /&gt;
     repeated Container projects = 1;&lt;br /&gt;
     repeated Container branches = 2;    &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateContainer {&lt;br /&gt;
     Container container = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message CopyResult {&lt;br /&gt;
     uint64 total = 1;&lt;br /&gt;
 	uint64 applied_reviews = 2;&lt;br /&gt;
 	uint64 applied_comments = 3;&lt;br /&gt;
 	uint64 skipped_reviews = 4;&lt;br /&gt;
 	uint64 duplicate_reviews = 5;&lt;br /&gt;
 	uint64 duplicate_comments = 6;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadImportMarkup {&lt;br /&gt;
     Container source=1;&lt;br /&gt;
     Container target=2;&lt;br /&gt;
     CopyResult copy_result =3;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message Snapshot {    &lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container = 3;&lt;br /&gt;
 }&lt;br /&gt;
 message PayloadDeleteSnapshots {&lt;br /&gt;
      repeated Snapshot snapshots = 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 message PayloadUpdateSnapshot {&lt;br /&gt;
     string snapshot_id = 1;&lt;br /&gt;
     string snapshot_name = 2;&lt;br /&gt;
     Container container  = 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3340</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3340"/>
		<updated>2025-11-18T14:05:49Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Веб-хуки для нотификаций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login user&lt;br /&gt;
&lt;br /&gt;
Более подробно см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%B0_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_Svacer| Парольная политика Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
Более подробную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation| Вкладка LDAP в GUI Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%BC%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE%D0%BC_Webhook-%D0%BE%D0%B2| Настройка webhook]]&lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3339</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3339"/>
		<updated>2025-11-18T14:05:35Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Открытие вкладки LDAP по умолчанию */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login user&lt;br /&gt;
&lt;br /&gt;
Более подробно см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%B0_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_Svacer| Парольная политика Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
Более подробную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation| Вкладка LDAP в GUI Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%BC%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE%D0%BC_Webhook-%D0%BE%D0%B2|Настройка webhook]]&lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3338</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3338"/>
		<updated>2025-11-18T14:05:26Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Парольная политика */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login user&lt;br /&gt;
&lt;br /&gt;
Более подробно см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%B0_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_Svacer| Парольная политика Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
Более подробную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation|Вкладка LDAP в GUI Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%BC%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE%D0%BC_Webhook-%D0%BE%D0%B2|Настройка webhook]]&lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3337</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3337"/>
		<updated>2025-11-18T14:05:12Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Парольная политика */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login user&lt;br /&gt;
&lt;br /&gt;
Более подробно см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%B0_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_Svacer|Парольная политика Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
Более подробную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation|Вкладка LDAP в GUI Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%BC%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE%D0%BC_Webhook-%D0%BE%D0%B2|Настройка webhook]]&lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3336</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3336"/>
		<updated>2025-11-18T14:04:26Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Открытие вкладки LDAP по умолчанию */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login chernykov_sv&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
Более подробную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation|Вкладка LDAP в GUI Svacer]]&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%BC%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE%D0%BC_Webhook-%D0%BE%D0%B2|Настройка webhook]]&lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3335</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3335"/>
		<updated>2025-11-18T14:03:11Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Веб-хуки для нотификаций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login chernykov_sv&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation#%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%BC%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%BE%D0%BC_Webhook-%D0%BE%D0%B2|Настройка webhook]]&lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3334</id>
		<title>Release notes 12-0-0</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Release_notes_12-0-0&amp;diff=3334"/>
		<updated>2025-11-18T14:01:20Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Парольная политика */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Разметка маркеров с помощью AI ==&lt;br /&gt;
Добавлена возможность разметки маркеров с помощью ассистента AI, который на основании модели, обученной на множестве размеченных данных, предсказывает статус разметки маркера False Positive или Confirmed. &lt;br /&gt;
&lt;br /&gt;
Если пользователь применяет предсказанный статус маркера, то к маркеру автоматически добавляется комментарий с информацией о дате разметки, используемой модели AI и уровне доверия, также маркеру добавляется метка '''AI'''.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Прогнозируемый ассистентом AI статус разметки маркера носит рекомендательный характер. Окончательное решение о применении предсказанного моделью статуса остается за пользователем.''}}&lt;br /&gt;
&lt;br /&gt;
Форма разметки с помощью AI открывается включением параметра '''Режим разметки с помощью AI''' на стандартных формах разметки маркера или групповой разметки маркера.&lt;br /&gt;
&lt;br /&gt;
Если текущий статус разметки маркера совпадает со статусом, предсказанным моделью AI, то такой маркер повторно разметить с помощью AI нельзя.&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-1.png|thumb|none|x250px|Форма разметки одного маркера]]&lt;br /&gt;
&lt;br /&gt;
[[File:Review marker-2.png|thumb|none|x250px|Форма групповой разметки маркеров]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в пользовательских фильтрах ==&lt;br /&gt;
В пользовательских фильтрах реализованы дополнительные возможности фильтрации маркеров:&lt;br /&gt;
&lt;br /&gt;
1. Атрибут «'''Период последнего изменения'''» для фильтрации маркеров по дате (периоду) актуальной разметки.&lt;br /&gt;
&lt;br /&gt;
2. Поле ввода шаблона расширенного фильтра для фильтрации маркеров по сложным предикатам, таким как:&lt;br /&gt;
&lt;br /&gt;
* поля маркера, его трассы, разметки и комментариев;&lt;br /&gt;
* информацию из контекста (имя проекта, ветки, снимка и т. п.);&lt;br /&gt;
* атрибуты снимка (включая пользовательские атрибуты, заданные при импорте);&lt;br /&gt;
* статусы разметки;&lt;br /&gt;
* текст и атрибуты комментариев.&lt;br /&gt;
&lt;br /&gt;
Описание, как составить выражение для расширенного фильтра, можно получить, кликнув на [[File:icon_question_mark2.png|x25px]].&lt;br /&gt;
[[File:Custom filter v12.png|thumb|none|x450px]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Поиск''' ==&lt;br /&gt;
В разделе '''Поиск''' выполнены следующие доработки:&lt;br /&gt;
&lt;br /&gt;
1. Реализована возможность просмотра информации о маркере непосредственно в разделе '''Поиск'''.&lt;br /&gt;
[[File:Search-1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
2. Поиск маркеров по полям расширен дополнительными атрибутами:&lt;br /&gt;
&lt;br /&gt;
* Инвариант маркера;&lt;br /&gt;
* ID маркера.&lt;br /&gt;
&lt;br /&gt;
[[File:Search-2.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Изменения на вкладке с исходным кодом файла ==&lt;br /&gt;
1. Панель функций перенесена на верх вкладки с файлом исходного кода.&lt;br /&gt;
&lt;br /&gt;
2. Реализована возможность добавления файла в фильтр по файлам, а также исключения файла из фильтра, если он был добавлен ранее.&lt;br /&gt;
[[File:Cove view.png|thumb|none|upright=4.5]]&lt;br /&gt;
&lt;br /&gt;
== Сравнение маркеров при их сопоставлении ==&lt;br /&gt;
В процессе сопоставления маркеров реализована возможность сравнения маркеров. Это помогает определить причину, почему при импорте снимка маркеры не сопоставились автоматически.&lt;br /&gt;
[[File:Match markers-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Форма сравнения маркеров открывается в отдельном диалоговом окне.&lt;br /&gt;
[[File:Match markers-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Просмотр JSON маркера ==&lt;br /&gt;
В дополнение к команде копирования JSON маркера добавлена команда просмотра JSON маркера в таблице маркеров и правой панели.&lt;br /&gt;
[[File:JSON-1.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
Просмотр JSON осуществляется в отдельном диалоговом окне.&lt;br /&gt;
[[File:JSON-2.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Проекты''' ==&lt;br /&gt;
1. Фокусировка на ветке master при создании нового проекта.&lt;br /&gt;
&lt;br /&gt;
2. В действия над снимком в списке снимков добавлена команда экспорта кода с разметкой. Все команды экспорта снимка вынесены в отдельное меню.&lt;br /&gt;
[[File:Project 1.png|thumb|none|upright=4]]&lt;br /&gt;
&lt;br /&gt;
== Редактирование маркеров при импорте ==&lt;br /&gt;
&lt;br /&gt;
При импорте .svace-dir, SARIF или snap-файла добавлена возможность (опция) задать правила трансформации, пропуска и дедупликации маркеров. Правила задаются в JSON-формате. &lt;br /&gt;
&lt;br /&gt;
При импорте в CLI данная опция называется edit-markers и позволяет указать путь к JSON-файлу с правилами. Подробнее здесь: [[Edit markers (command line)]]. &lt;br /&gt;
&lt;br /&gt;
В пользовательском интерфейсе при импорте .svace-dir или SARIF возможно задать данную опцию и в ней указать путь к JSON-файлу в архиве .svace-dir или SARIF. А при импорте snap-файла возможно как подгрузить JSON-файл, так и ввести выражение в формате JSON в поле ввода. &lt;br /&gt;
&lt;br /&gt;
[[File:Edit markers svace-dir.png|thumb|none|upright=3|Форма импорта .svace-dir]]&lt;br /&gt;
[[File:Edit_markers_sarif.png|thumb|none|upright=3|Форма импорта SARIF]]&lt;br /&gt;
[[File:Edit markers snap.png|thumb|none|upright=3|Форма импорта snap-файла]]&lt;br /&gt;
&lt;br /&gt;
== Добавлена форма управления асинхронными задачами ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Асинхронные задачи''', где доступен просмотр и управление (отмена и откат) следующими асинхронными операциями:&lt;br /&gt;
&lt;br /&gt;
* Экспорт snap-файлов;&lt;br /&gt;
* Экспорт SARIF;&lt;br /&gt;
* Копирование снимков.&lt;br /&gt;
&lt;br /&gt;
Пользователь с серверным доступом '''Администрирование сервера''' может просматривать и управлять запущенными или выполненными асинхронными задачами всех пользователей. Пользователю без данного доступа доступно управление только своими асинхронными задачами.&lt;br /&gt;
&lt;br /&gt;
[[File:Async tasks.png|thumb|none|upright=4|Форма Асинхронные задачи]]&lt;br /&gt;
&lt;br /&gt;
В следующем релизе планируем интегрировать в данный раздел оставшиеся асинхронные операции, которые запускаются пользователями, а именно:&lt;br /&gt;
&lt;br /&gt;
* Импорт snapshot;&lt;br /&gt;
* Импорт svace-dir;&lt;br /&gt;
* Импорт SARIF;&lt;br /&gt;
* Копирование проекта;&lt;br /&gt;
* Копирование ветки.&lt;br /&gt;
&lt;br /&gt;
== Изменения в разделе '''Информация о сервере''' ==&lt;br /&gt;
В разделе '''Настройки &amp;gt; Информация о сервере''', который доступен пользователям с серверным доступом '''Администрирование сервера''', представление информации разделено на три вкладки:&lt;br /&gt;
&lt;br /&gt;
* Параметры;&lt;br /&gt;
* Системный лог;&lt;br /&gt;
* Системный журнал.&lt;br /&gt;
&lt;br /&gt;
Т. к. системный лог может иметь большой размер, то вывод информации на форме ограничен последними 1Мб (значение регулируется переменной окружения SVACER_TAIL_LOG_SIZE). Скачивание лога позволяет выгрузить файл полностью.&lt;br /&gt;
&lt;br /&gt;
[[File:Server info-1.png|thumb|none|upright=4|Информация о сервере — вкладка Параметры]]&lt;br /&gt;
[[File:Server info-2.png|thumb|none|upright=4|Информация о сервере — вкладка Системный лог]]&lt;br /&gt;
[[File:Server info-3.png|thumb|none|upright=4|Информация о сервере — вкладка Системный журнал]]&lt;br /&gt;
&lt;br /&gt;
== Лицензирование Svacer ==&lt;br /&gt;
Реализован механизм лицензирования. Просмотр и применение лицензии доступно в CLI, а также в UI, где добавлен раздел Лицензия. Просмотр лицензии доступен всем пользователям, а активация лицензии — пользователям с серверным доступом «Администрирование сервера».&lt;br /&gt;
&lt;br /&gt;
[[File:Licence.png|thumb|none|upright=3.5]]&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=''Функциональность добавлена для возможности будущего развития продукта. В дистрибутив Svacer v.12 лицензия встроена и не вносит никаких ограничений. Срок действия встроенной лицензии — до 31.12.2027.''}}&lt;br /&gt;
&lt;br /&gt;
== Парольная политика ==&lt;br /&gt;
Реализована возможность задать парольную политику в конфигурационном файле:&lt;br /&gt;
&lt;br /&gt;
1. Механизм установки минимальной сложности паролей.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     password:&lt;br /&gt;
        min_length: 10&lt;br /&gt;
        complexity:&lt;br /&gt;
         - &amp;quot;[a-z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
         - &amp;quot;[0-9]&amp;quot;&lt;br /&gt;
         - &amp;quot;[!#]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В поле min_length — минимальная длина пароля. В поле complexity список регулярных выражений, задающих группу требуемых символов. В примере требуется наличие строчных, заглавных букв, цифр и спецсимволов &amp;lt;code&amp;gt;!#&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Механизм блокировки учетной записи пользователя при нескольких неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   login:&lt;br /&gt;
     max_attempts: 5&lt;br /&gt;
     lock_time: 2m&lt;br /&gt;
&lt;br /&gt;
Т. е. учетная запись будет блокироваться на 2 минуты при 5 неудачных попытках авторизации.&lt;br /&gt;
&lt;br /&gt;
Также реализована команда CLI для разблокировки учетной записи пользователя:&lt;br /&gt;
 svacer user-proiver unlock -login chernykov_sv&lt;br /&gt;
&lt;br /&gt;
== Открытие вкладки LDAP по умолчанию ==&lt;br /&gt;
Добавлен параметр конфигурации default. Если он true, то на странице авторизации в пользовательском интерфейсе по умолчанию будет открываться вкладка Svacer, если false — то при наличии сконфигурированного LDAP по умолчанию будет открываться вкладка LDAP, иначе флаг default игнорируется.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
 auth:&lt;br /&gt;
   svacer:&lt;br /&gt;
     enabled: true&lt;br /&gt;
     default: false&lt;br /&gt;
&lt;br /&gt;
== Автоочистка снимков/веток/проектов ==&lt;br /&gt;
Расширены опции команды cleanup, вызываемой в CLI:&lt;br /&gt;
&lt;br /&gt;
* cleanup-type — удалять пустые ветки и проекты;&lt;br /&gt;
* min-snapshots — нижняя граница по количеству снимков в ветке.&lt;br /&gt;
&lt;br /&gt;
Подробное описание функции и ее опций: [[Help:CLI/cleanup]].&lt;br /&gt;
&lt;br /&gt;
== Веб-хуки для нотификаций ==&lt;br /&gt;
Реализован механизм веб-хуков для отправки нотификаций по API во внешние системы. Механизм настраивается в конфигурационном файле в секции webhook.&lt;br /&gt;
&lt;br /&gt;
Реализована отправка нотификаций по следующим событиям:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера / групповая разметка маркеров;&lt;br /&gt;
* добавление / обновление комментария маркера;&lt;br /&gt;
* добавление / копирование / изменение / удаление контейнеров (группа / проект / ветка);&lt;br /&gt;
* импорт / копирование / удаление / изменение снимков;&lt;br /&gt;
* копирование разметки.&lt;br /&gt;
&lt;br /&gt;
Пример задания конфигурационных настроек:&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journalLength: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
    - url: &amp;quot;&amp;lt;nowiki&amp;gt;https://swarm-mgr.home:8080/webhook&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
      workersCount: 1&lt;br /&gt;
      enabled: true     &lt;br /&gt;
      filter: &amp;quot;Type == 1 and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
      caCerts: &amp;quot;&amp;quot;&lt;br /&gt;
      retryCount: 1&lt;br /&gt;
      timeout: 500&lt;br /&gt;
&lt;br /&gt;
Управление механизмом осуществляется в CLI с помощью команд:&lt;br /&gt;
&lt;br /&gt;
* просмотра записей журнала отправки событий:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook journal&lt;br /&gt;
&lt;br /&gt;
* просмотр статистики по работе службы:&lt;br /&gt;
&lt;br /&gt;
 svacer server webhook stat&lt;br /&gt;
Более детальную информацию см. [[Help:Installation|Настройка внутреннего механизма аутентификации Svacer]]  &lt;br /&gt;
&lt;br /&gt;
== Удаление неактуальных разделов интерфейса ==&lt;br /&gt;
В интерфейсе Svacer были удалены неиспользуемые и не поддерживаемые в актуальном состоянии разделы:&lt;br /&gt;
&lt;br /&gt;
* '''Отчеты'''&lt;br /&gt;
* Настройки &amp;gt; '''Oauth Clients'''&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3332</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3332"/>
		<updated>2025-11-18T13:35:25Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Модель поддерживамых событий */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
package webhook;&lt;br /&gt;
&lt;br /&gt;
 enum EventType {&lt;br /&gt;
    EventNone = 0;&lt;br /&gt;
    EventTest = 1;&lt;br /&gt;
	EventReviewMarker = 2;&lt;br /&gt;
	EventPurgeReview = 3;&lt;br /&gt;
	EventGroupReview = 4;&lt;br /&gt;
	EventImportSnapshot = 5;&lt;br /&gt;
	EventCopySnapshot = 6;&lt;br /&gt;
	EventNewComment = 7;&lt;br /&gt;
	EventUpdateComment = 8;&lt;br /&gt;
    EventNewContainer = 9;&lt;br /&gt;
    EventDeleteContainer = 10;&lt;br /&gt;
    EventUpdateContainer  =11;&lt;br /&gt;
    EventImportMarkup = 12;&lt;br /&gt;
    EventDeleteSnapshot = 13;&lt;br /&gt;
    UpdateSnapshot = 14;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
message MarkerDetails {&lt;br /&gt;
    string id = 1;&lt;br /&gt;
    string file = 2;&lt;br /&gt;
    string line = 3;&lt;br /&gt;
    string lang = 4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
message Event {&lt;br /&gt;
    uint64 timestamp = 1;&lt;br /&gt;
    EventType type = 2;&lt;br /&gt;
    string created_by = 3;&lt;br /&gt;
    google.protobuf.Any payload = 4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadMarkerReview {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
    repeated MarkerDetails markers = 7;&lt;br /&gt;
    string comment = 8;&lt;br /&gt;
    string severity = 9;&lt;br /&gt;
    string action = 10;&lt;br /&gt;
    string status = 11;&lt;br /&gt;
    bool group_review = 12;&lt;br /&gt;
    string created_by_id = 13;&lt;br /&gt;
    string created_by_login = 14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadPurgeReview {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string created_by_id = 5;&lt;br /&gt;
    string created_by_login = 6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadImportSnapshot {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
message PayloadMarkerComment {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
    MarkerDetails marker = 7;&lt;br /&gt;
    string comment = 8;&lt;br /&gt;
    string created_by_id = 9;&lt;br /&gt;
    string created_by_login = 10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadCopySnapshot {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
    string created_by_id = 7;&lt;br /&gt;
    string created_by_login = 8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message Container {    &lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    Container source = 5;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadNewContainer {&lt;br /&gt;
    repeated Container containers = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
message PayloadDeleteContainer {&lt;br /&gt;
    repeated Container projects = 1;&lt;br /&gt;
    repeated Container branches = 2;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadUpdateContainer {&lt;br /&gt;
    Container container = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
	uint64 applied_reviews = 2;&lt;br /&gt;
	uint64 applied_comments = 3;&lt;br /&gt;
	uint64 skipped_reviews = 4;&lt;br /&gt;
	uint64 duplicate_reviews = 5;&lt;br /&gt;
	uint64 duplicate_comments = 6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadImportMarkup {&lt;br /&gt;
    Container source=1;&lt;br /&gt;
    Container target=2;&lt;br /&gt;
    CopyResult copy_result =3;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message Snapshot {    &lt;br /&gt;
    string snapshot_id = 1;&lt;br /&gt;
    string snapshot_name = 2;&lt;br /&gt;
    Container container = 3;&lt;br /&gt;
}&lt;br /&gt;
message PayloadDeleteSnapshots {&lt;br /&gt;
     repeated Snapshot snapshots = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadUpdateSnapshot {&lt;br /&gt;
    string snapshot_id = 1;&lt;br /&gt;
    string snapshot_name = 2;&lt;br /&gt;
    Container container  = 3;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3331</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3331"/>
		<updated>2025-11-18T13:35:09Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Модель поддерживамых событий */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;&lt;br /&gt;
import &amp;quot;google/protobuf/any.proto&amp;quot;;&lt;br /&gt;
option go_package=&amp;quot;svacer/proto/webhook&amp;quot;;&lt;br /&gt;
package webhook;&lt;br /&gt;
&lt;br /&gt;
enum EventType {&lt;br /&gt;
    EventNone = 0;&lt;br /&gt;
    EventTest = 1;&lt;br /&gt;
	EventReviewMarker = 2;&lt;br /&gt;
	EventPurgeReview = 3;&lt;br /&gt;
	EventGroupReview = 4;&lt;br /&gt;
	EventImportSnapshot = 5;&lt;br /&gt;
	EventCopySnapshot = 6;&lt;br /&gt;
	EventNewComment = 7;&lt;br /&gt;
	EventUpdateComment = 8;&lt;br /&gt;
    EventNewContainer = 9;&lt;br /&gt;
    EventDeleteContainer = 10;&lt;br /&gt;
    EventUpdateContainer  =11;&lt;br /&gt;
    EventImportMarkup = 12;&lt;br /&gt;
    EventDeleteSnapshot = 13;&lt;br /&gt;
    UpdateSnapshot = 14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message MarkerDetails {&lt;br /&gt;
    string id = 1;&lt;br /&gt;
    string file = 2;&lt;br /&gt;
    string line = 3;&lt;br /&gt;
    string lang = 4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
message Event {&lt;br /&gt;
    uint64 timestamp = 1;&lt;br /&gt;
    EventType type = 2;&lt;br /&gt;
    string created_by = 3;&lt;br /&gt;
    google.protobuf.Any payload = 4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadMarkerReview {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
    repeated MarkerDetails markers = 7;&lt;br /&gt;
    string comment = 8;&lt;br /&gt;
    string severity = 9;&lt;br /&gt;
    string action = 10;&lt;br /&gt;
    string status = 11;&lt;br /&gt;
    bool group_review = 12;&lt;br /&gt;
    string created_by_id = 13;&lt;br /&gt;
    string created_by_login = 14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadPurgeReview {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string created_by_id = 5;&lt;br /&gt;
    string created_by_login = 6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadImportSnapshot {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
message PayloadMarkerComment {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
    MarkerDetails marker = 7;&lt;br /&gt;
    string comment = 8;&lt;br /&gt;
    string created_by_id = 9;&lt;br /&gt;
    string created_by_login = 10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadCopySnapshot {&lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    string snapshot_id = 5;&lt;br /&gt;
    string snapshot_name = 6;&lt;br /&gt;
    string created_by_id = 7;&lt;br /&gt;
    string created_by_login = 8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message Container {    &lt;br /&gt;
    string project_id = 1;&lt;br /&gt;
    string project_name = 2;&lt;br /&gt;
    string branch_id = 3;&lt;br /&gt;
    string branch_name = 4;&lt;br /&gt;
    Container source = 5;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadNewContainer {&lt;br /&gt;
    repeated Container containers = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
message PayloadDeleteContainer {&lt;br /&gt;
    repeated Container projects = 1;&lt;br /&gt;
    repeated Container branches = 2;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadUpdateContainer {&lt;br /&gt;
    Container container = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message CopyResult {&lt;br /&gt;
    uint64 total = 1;&lt;br /&gt;
	uint64 applied_reviews = 2;&lt;br /&gt;
	uint64 applied_comments = 3;&lt;br /&gt;
	uint64 skipped_reviews = 4;&lt;br /&gt;
	uint64 duplicate_reviews = 5;&lt;br /&gt;
	uint64 duplicate_comments = 6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadImportMarkup {&lt;br /&gt;
    Container source=1;&lt;br /&gt;
    Container target=2;&lt;br /&gt;
    CopyResult copy_result =3;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message Snapshot {    &lt;br /&gt;
    string snapshot_id = 1;&lt;br /&gt;
    string snapshot_name = 2;&lt;br /&gt;
    Container container = 3;&lt;br /&gt;
}&lt;br /&gt;
message PayloadDeleteSnapshots {&lt;br /&gt;
     repeated Snapshot snapshots = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
message PayloadUpdateSnapshot {&lt;br /&gt;
    string snapshot_id = 1;&lt;br /&gt;
    string snapshot_name = 2;&lt;br /&gt;
    Container container  = 3;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3330</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3330"/>
		<updated>2025-11-18T13:33:21Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Механизм интеграции с внешними системами посредством Webhook-ов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
 }&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3329</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3329"/>
		<updated>2025-11-18T13:32:29Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Механизм интеграции с внешними системами посредством Webhook-ов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3328</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3328"/>
		<updated>2025-11-18T13:31:35Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Конфигурация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
 webhook:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  journal_length: 86400&lt;br /&gt;
  targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3327</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3327"/>
		<updated>2025-11-18T13:31:13Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Конфигурация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
webhook:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 journal_length: 86400&lt;br /&gt;
 targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3326</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3326"/>
		<updated>2025-11-18T13:30:10Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Механизм интеграции с внешними системами посредством Webhook-ов ===&lt;br /&gt;
&lt;br /&gt;
==== Общий принцип работы ====&lt;br /&gt;
&lt;br /&gt;
Механизм webhook-ов настривается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см.Модель поддерживаемых событий) и отправляется на обработку в каждую из настроеных целей, которыми являются http обработчики. Отправкой занимаются работники (их количествово настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог файле Svacer.&lt;br /&gt;
&lt;br /&gt;
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию - одна попытка, параметр retry_count).&lt;br /&gt;
&lt;br /&gt;
В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr (см https://github.com/expr-lang/expr ). Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.&lt;br /&gt;
&lt;br /&gt;
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 штук записей - по 1 штуку на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http запроса, выполняемого работником.&lt;br /&gt;
&lt;br /&gt;
==== Конфигурация ====&lt;br /&gt;
&lt;br /&gt;
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;webhook:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 journal_length: 86400&lt;br /&gt;
 targets:&lt;br /&gt;
   - url: &amp;quot;https://test-host.local:8080/webhook&amp;quot;&lt;br /&gt;
     workers_count: 1&lt;br /&gt;
     enabled: true     &lt;br /&gt;
     filter: &amp;quot;Type == EventReviewMarker and Payload.Status != 'Undecided'&amp;quot;&lt;br /&gt;
     ca_certs: &amp;quot;/etc/ssl/certs/ca.crt&amp;quot;&lt;br /&gt;
     retry_count: 3&lt;br /&gt;
     timeout: 1000&lt;br /&gt;
     headers:&lt;br /&gt;
        - &amp;quot;password:12345&amp;quot;&lt;br /&gt;
        - &amp;quot;Authorization: Bearer eyJh .... &amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
==== CLI ====&lt;br /&gt;
&lt;br /&gt;
Для взаимодействия с механизмом webhook реализованы две cli команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;svacer server webhook journal&lt;br /&gt;
svacer serever webhook stat&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (осообенно интересными могут быть поля sendError и skip)&lt;br /&gt;
&lt;br /&gt;
Пример вывода для первой команды (с флагом --humanize; если флага нет - то будет вывод в формате json):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;==================== #1 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:52.25343534 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 6 ms&lt;br /&gt;
==================== #2 ======================&lt;br /&gt;
Time: 2025-07-01 12:25:54.202850322 +0300 MSK&lt;br /&gt;
Created by: admin&lt;br /&gt;
Error: &lt;br /&gt;
Success: true&lt;br /&gt;
SvacerKind: UpdateMarkerReview&lt;br /&gt;
EventType: EventReviewMarker&lt;br /&gt;
TargetURL: https://swarm-mgr.home:8080/webhook&lt;br /&gt;
ProcessTime: 3 ms&lt;br /&gt;
[01_07_2025-12:26:13] user@gp-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вывода команды статистики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
 &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
 &amp;quot;targets&amp;quot;: [&lt;br /&gt;
  {&lt;br /&gt;
   &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
   &amp;quot;url&amp;quot;: &amp;quot;https://swarm-mgr.home:8080/webhook&amp;quot;,&lt;br /&gt;
   &amp;quot;filtered&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;sendSuccess&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;sentError&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;submitted&amp;quot;: 3,&lt;br /&gt;
   &amp;quot;skip&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
 ]&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Модель поддерживамых событий ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3324</id>
		<title>Help:Installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Installation&amp;diff=3324"/>
		<updated>2025-11-18T12:41:54Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Расширенная конфигурация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Установка и запуск ==&lt;br /&gt;
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.&lt;br /&gt;
&lt;br /&gt;
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
==== PostgreSQL ====&lt;br /&gt;
{{Note|type=info|text=Disclaimer&lt;br /&gt;
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}&lt;br /&gt;
&lt;br /&gt;
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.&lt;br /&gt;
&lt;br /&gt;
Пример для Ubuntu 22:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install -y postgresql-common&lt;br /&gt;
 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh&lt;br /&gt;
 sudo apt install -y postgresql-17&lt;br /&gt;
&lt;br /&gt;
Пример для Rocky Linux 9.4:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf -qy module disable postgresql&lt;br /&gt;
 sudo dnf install -y postgresql17-server postgresql17-contrib&lt;br /&gt;
 sudo /usr/pgsql-17/bin/postgresql-17-setup initdb&lt;br /&gt;
 sudo systemctl enable postgresql-17&lt;br /&gt;
 sudo systemctl start postgresql-17&lt;br /&gt;
&lt;br /&gt;
==== Браузер для PDF-отчетов ====&lt;br /&gt;
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google]. &lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию &amp;lt;code&amp;gt;--pdf-generator=native&amp;lt;/code&amp;gt; при запуске сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться &amp;lt;code&amp;gt;chromium-browser&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;chromium&amp;lt;/code&amp;gt;. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install -y svacer&lt;br /&gt;
&lt;br /&gt;
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo dnf install -y svacer&lt;br /&gt;
&lt;br /&gt;
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres''' &lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
И выполните следующие запросы:&lt;br /&gt;
 create database svace;&lt;br /&gt;
 create user svace with encrypted password 'svace';&lt;br /&gt;
 grant all privileges on database svace to svace;&lt;br /&gt;
 alter user svace superuser;&lt;br /&gt;
&lt;br /&gt;
В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.&lt;br /&gt;
&lt;br /&gt;
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''&lt;br /&gt;
&lt;br /&gt;
 SVACER_ARGS=&amp;quot;--pg postgres://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@127.0.0.1:5432/&amp;lt;database&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.&lt;br /&gt;
&lt;br /&gt;
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр &amp;lt;code&amp;gt;zero_if_notfound: yes&amp;lt;/code&amp;gt;, иначе при запуске Svacer будет ошибка подключения к БД вида&lt;br /&gt;
&lt;br /&gt;
 error obtaining MAC configuration for user &amp;quot;svace&amp;quot; (SQLSTATE 57P03)&lt;br /&gt;
&lt;br /&gt;
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl enable svacer&lt;br /&gt;
 sudo systemctl start svacer&lt;br /&gt;
&lt;br /&gt;
После чего проверить успешность запуска командой&lt;br /&gt;
&lt;br /&gt;
 systemctl status svacer&lt;br /&gt;
&lt;br /&gt;
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.&lt;br /&gt;
&lt;br /&gt;
=== Установка и запуск на Windows ===&lt;br /&gt;
PostgreSQL нужен только для сервера Svacer, для клиента не требуется. &lt;br /&gt;
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows&lt;br /&gt;
* Установите PostgreSQL, выбрав, как минимум, компоненты &amp;quot;PostgreSQL Server&amp;quot; и &amp;quot;Command Line Tools&amp;quot;&lt;br /&gt;
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя&lt;br /&gt;
* Остальные параметры при установке можно оставить по умолчанию&lt;br /&gt;
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя &amp;quot;postgres&amp;quot; и авторизуйтесь с паролем, заданным во время установки&lt;br /&gt;
  cd c:\Program Files\PostgreSQL\15\bin&lt;br /&gt;
  psql -U postgres&lt;br /&gt;
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer&lt;br /&gt;
  create database svace;&lt;br /&gt;
  create user svace with encrypted password 'svace';&lt;br /&gt;
  grant all privileges on database svace to svace;&lt;br /&gt;
  alter user svace superuser;&lt;br /&gt;
* Выйдите из консоли PostgreSQL&lt;br /&gt;
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно&lt;br /&gt;
  svacer-server.exe run&lt;br /&gt;
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно&lt;br /&gt;
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database&lt;br /&gt;
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin&lt;br /&gt;
&lt;br /&gt;
== Обновление ==&lt;br /&gt;
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}&lt;br /&gt;
&lt;br /&gt;
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера. &lt;br /&gt;
&lt;br /&gt;
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes ===&lt;br /&gt;
==== 12-x-x ====&lt;br /&gt;
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.&lt;br /&gt;
&lt;br /&gt;
==== 11-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 10-x-x ====&lt;br /&gt;
Нет специфических рекомендаций по обновлению.&lt;br /&gt;
&lt;br /&gt;
==== 9-0-0 ====&lt;br /&gt;
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}&lt;br /&gt;
&lt;br /&gt;
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.&lt;br /&gt;
&lt;br /&gt;
'''1.''' &lt;br /&gt;
&lt;br /&gt;
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.&lt;br /&gt;
&lt;br /&gt;
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:&lt;br /&gt;
&lt;br /&gt;
 svacer-server kvconvert --from &amp;lt;path&amp;gt; --to &amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].&lt;br /&gt;
&lt;br /&gt;
'''2.'''&lt;br /&gt;
&lt;br /&gt;
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.&lt;br /&gt;
&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.&lt;br /&gt;
&lt;br /&gt;
'''3.'''&lt;br /&gt;
&lt;br /&gt;
После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt; в PostgreSQL для очистки и оптимизации базы данных.&lt;br /&gt;
&lt;br /&gt;
 psql -h &amp;lt;postgres_host&amp;gt; -U &amp;lt;username&amp;gt; &amp;lt;svacer_database_name&amp;gt; -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
&lt;br /&gt;
 psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'&lt;br /&gt;
&lt;br /&gt;
==== 8-0-0 ====&lt;br /&gt;
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка&lt;br /&gt;
 Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated&lt;br /&gt;
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:&lt;br /&gt;
 delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));&lt;br /&gt;
&lt;br /&gt;
== Расширенная конфигурация ==&lt;br /&gt;
&lt;br /&gt;
=== Настройки аутентификации в Svacer ===&lt;br /&gt;
В Svacer возможны три способа аутентификации пользователей&lt;br /&gt;
&lt;br /&gt;
# Встроенный&lt;br /&gt;
# С помощью LDAP сервера&lt;br /&gt;
# Через утилиту oauth_proxy (по протоколу OIDC)&lt;br /&gt;
# Посредством Personal Access Token (PAT)&lt;br /&gt;
&lt;br /&gt;
Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см соответствующие разделы документации.&lt;br /&gt;
&lt;br /&gt;
==== Настройка внутреннего механизма аутентификации Svacer ====&lt;br /&gt;
&lt;br /&gt;
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====&lt;br /&gt;
Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла svacer. Ниже приведен пример настроек:&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    password:&lt;br /&gt;
       min_length: 10&lt;br /&gt;
       complexity:&lt;br /&gt;
        - &amp;amp;quot;[a-z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[A-Z]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[0-9]&amp;amp;quot;&lt;br /&gt;
        - &amp;amp;quot;[!#]&amp;amp;quot;&amp;lt;/pre&amp;gt;Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.&lt;br /&gt;
&lt;br /&gt;
Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке - полноценное выражение, поддерживаемое языком golang.&lt;br /&gt;
&lt;br /&gt;
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля)&lt;br /&gt;
&lt;br /&gt;
===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====&lt;br /&gt;
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку Svacer или LDAP использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию - будет вкладка Svacer, иначе - вкладка LDAP.&lt;br /&gt;
&lt;br /&gt;
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помозью параметра auth.svacer.enabled.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен пример конфигурационного файла svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;auth:&lt;br /&gt;
  svacer:&lt;br /&gt;
    enabled: true&lt;br /&gt;
    default: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка защиты от перебора паролей пользователей ====&lt;br /&gt;
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том, случае если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:&amp;lt;pre class=&amp;quot;plaintext&amp;quot;&amp;gt;security:&lt;br /&gt;
  login:&lt;br /&gt;
    max_attempts: 5&lt;br /&gt;
    lock_time: 2m&amp;lt;/pre&amp;gt;Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: (1s,1m,60m и т.д.) .&lt;br /&gt;
&lt;br /&gt;
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.&lt;br /&gt;
&lt;br /&gt;
Блокировка не влияет на работу уже зарегистрированных пользователей.&lt;br /&gt;
&lt;br /&gt;
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer user-provider unlock&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Настройка TLS ===&lt;br /&gt;
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.&lt;br /&gt;
&lt;br /&gt;
==== Reverse proxy ====&lt;br /&gt;
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.&lt;br /&gt;
&lt;br /&gt;
===== Nginx =====&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
    server_name svacer.ispras.ru;&lt;br /&gt;
&lt;br /&gt;
    # for large data transfers and continuous connections&lt;br /&gt;
    client_max_body_size        0;&lt;br /&gt;
    proxy_connect_timeout       600;&lt;br /&gt;
    proxy_send_timeout          600;&lt;br /&gt;
    proxy_read_timeout          600;&lt;br /&gt;
    send_timeout                600;&lt;br /&gt;
&lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        include proxy_params;&lt;br /&gt;
&lt;br /&gt;
        # to make WebSockets work&lt;br /&gt;
        proxy_http_version  1.1;&lt;br /&gt;
        proxy_set_header    Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header    Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # svacer HTTP URL&lt;br /&gt;
        proxy_pass http://127.0.0.1:8080;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# proxy gRPC port if required&lt;br /&gt;
server {&lt;br /&gt;
    listen 13002 http2;&lt;br /&gt;
    underscores_in_headers on;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        grpc_pass grpc://127.0.0.1:3002;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].&lt;br /&gt;
&lt;br /&gt;
===== Apache =====&lt;br /&gt;
Включите нужные модули в Apache&lt;br /&gt;
  sudo a2enmod ssl proxy proxy_http rewrite&lt;br /&gt;
&lt;br /&gt;
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    SSLEngine On&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyTimeout 600&lt;br /&gt;
    &lt;br /&gt;
    # path to ssl-certificate and key&lt;br /&gt;
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key&lt;br /&gt;
    &lt;br /&gt;
    # svacer HTTP URL&lt;br /&gt;
    ProxyPass / http://127.0.0.1:8080/&lt;br /&gt;
    ProxyPassReverse / http://127.0.0.1:8080/&lt;br /&gt;
&lt;br /&gt;
    # to make WebSockets work&lt;br /&gt;
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]&lt;br /&gt;
&lt;br /&gt;
    ServerName svacer.ispras.ru&lt;br /&gt;
    ServerAdmin svacer@ispras.ru&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.&lt;br /&gt;
  systemctl restart apache2&lt;br /&gt;
&lt;br /&gt;
==== Нативно ====&lt;br /&gt;
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.&lt;br /&gt;
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.&lt;br /&gt;
 TLS for REST and gRPC DISABLED&lt;br /&gt;
&lt;br /&gt;
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.&lt;br /&gt;
 svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key&lt;br /&gt;
&lt;br /&gt;
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC. &lt;br /&gt;
&lt;br /&gt;
Работа сервера по проктолу TLS сопровождается следующей записью в логе:&lt;br /&gt;
 Using TLS for REST and gRPC protocols&lt;br /&gt;
&lt;br /&gt;
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svacer upload --host https://example.com&lt;br /&gt;
 svacer upload --ssl --host example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:&lt;br /&gt;
 Using weak TLS configuration, because no CA certificate found&lt;br /&gt;
&lt;br /&gt;
Если сертификаты были загружены, в логе будет строчка:&lt;br /&gt;
 added 1 ca certs from /home/user/svacer/svacer.crt&lt;br /&gt;
&lt;br /&gt;
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.&lt;br /&gt;
 &lt;br /&gt;
* '''show''' — отображает текущий используемый сертификат&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационом файле указать параметры &amp;lt;code&amp;gt;minVersion&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;maxVersion&amp;lt;/code&amp;gt; в разделе security.tls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
security:&lt;br /&gt;
  tls:&lt;br /&gt;
    minVersion: tls11&lt;br /&gt;
    maxVersion: tls12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интеграция с хранилищем секретов Infisical ===&lt;br /&gt;
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].&lt;br /&gt;
&lt;br /&gt;
=== Выбор сетевых интерфейсов и портов сервера ===&lt;br /&gt;
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen &amp;lt;network interface&amp;gt;''', для указания другого порта: '''--port &amp;lt;port_number&amp;gt;.&lt;br /&gt;
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc &amp;lt;network_interface&amp;gt;''', для указания другого порта: '''--grpc &amp;lt;port_number&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
 svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004&lt;br /&gt;
&lt;br /&gt;
При попытке запуска на порту &amp;lt; 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой &lt;br /&gt;
&lt;br /&gt;
 ERROR: port 443 is privileged, please check current user permissions or set another rest api port&lt;br /&gt;
&lt;br /&gt;
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера&lt;br /&gt;
&lt;br /&gt;
 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server&lt;br /&gt;
&lt;br /&gt;
=== Увеличение лимита открытых файлов ===&lt;br /&gt;
Актуально только для Linux.&lt;br /&gt;
&lt;br /&gt;
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов. &lt;br /&gt;
&lt;br /&gt;
В POSIX таких лимита два:&lt;br /&gt;
* soft nofiles — текущее максимальное значение&lt;br /&gt;
* hard nofiles — общесистемное максимальное значение&lt;br /&gt;
&lt;br /&gt;
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:&lt;br /&gt;
&lt;br /&gt;
  $ ulimit -Sn&lt;br /&gt;
  1024&lt;br /&gt;
  $ ulimit -Hn&lt;br /&gt;
  1048576&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.&lt;br /&gt;
&lt;br /&gt;
  Open files limit (soft and hard): 1048576&lt;br /&gt;
&lt;br /&gt;
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:&lt;br /&gt;
&lt;br /&gt;
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии&lt;br /&gt;
  ulimit -Sn 16384&lt;br /&gt;
&lt;br /&gt;
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить&lt;br /&gt;
&lt;br /&gt;
  * soft nofile 16384&lt;br /&gt;
&lt;br /&gt;
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.&lt;br /&gt;
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  LimitNOFILE=16384&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Установка пути к директории для кэша ===&lt;br /&gt;
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd&lt;br /&gt;
&lt;br /&gt;
  [Service]&lt;br /&gt;
  Environment=&amp;quot;SVACER_CACHE_DIR=/path/to/some/dir&amp;quot;&lt;br /&gt;
&lt;br /&gt;
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl daemon-reload&lt;br /&gt;
  sudo systemctl restart svacer.service&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные параметры при запуске в docker-контейнере ===&lt;br /&gt;
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].&lt;br /&gt;
&lt;br /&gt;
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:&lt;br /&gt;
&lt;br /&gt;
 command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл с описанием хуков примонтируйте как volume:&lt;br /&gt;
&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
&lt;br /&gt;
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью &amp;lt;code&amp;gt;$$&amp;lt;/code&amp;gt; и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных&lt;br /&gt;
&lt;br /&gt;
 environment:&lt;br /&gt;
   - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
   - STORE=/data/store&lt;br /&gt;
   - HOOKS_FILE=/svacer/hooks.json&lt;br /&gt;
 volumes:&lt;br /&gt;
   - ./hooks.json:/svacer/hooks.json&lt;br /&gt;
 command: sh -c &amp;quot;/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.&lt;br /&gt;
&lt;br /&gt;
== Обновление детекторов ==&lt;br /&gt;
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:&lt;br /&gt;
&lt;br /&gt;
  svacer checkers --upload &amp;lt;/path/to/svace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.&lt;br /&gt;
&lt;br /&gt;
== Генерация PDF на основе HTML ==&lt;br /&gt;
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения&lt;br /&gt;
&lt;br /&gt;
 SVACER_PDF_GEN_LIMITS=&amp;lt;pdf tool limit&amp;gt;:&amp;lt;chrome limit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первое значение &amp;lt;code&amp;gt;&amp;lt;pdf tool limit&amp;gt;&amp;lt;/code&amp;gt; определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение &amp;lt;code&amp;gt;&amp;lt;chrome limit&amp;gt;&amp;lt;/code&amp;gt; определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.&lt;br /&gt;
&lt;br /&gt;
== Полнотекстовый поиск ==&lt;br /&gt;
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в &amp;lt;code&amp;gt;$HOME/.cache/svacer&amp;lt;/code&amp;gt;, для указания иной директории можно использовать переменную окружения &amp;lt;code&amp;gt;SVACER_SEARCH_INDEX_DIR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду&lt;br /&gt;
&lt;br /&gt;
 svacer search --host &amp;lt;nowiki&amp;gt;http://some_host:port&amp;lt;/nowiki&amp;gt; --user &amp;lt;login&amp;gt; --password &amp;lt;pwd&amp;gt; --drop-cache&lt;br /&gt;
&lt;br /&gt;
Используемая при этом учетная запись должна быть с правами на &amp;lt;code&amp;gt;Server administration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указание public-url ==&lt;br /&gt;
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; при запуске сервера&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacer-server run --public-url http://svacer.intra.net:8080&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Notifications&amp;diff=3067</id>
		<title>Notifications</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Notifications&amp;diff=3067"/>
		<updated>2025-09-01T07:19:31Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Описание параметров конфигурации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Механизм подписок на внутренние события Svacer ==&lt;br /&gt;
&lt;br /&gt;
=== Общие принципы ===&lt;br /&gt;
&lt;br /&gt;
В Svacer реализован механизм оповещения пользователей на некоторые классы событий, возникающих в Svacer в результате работы пользователей в системе. Оповещение пользователей возможны с использованием следующих сервисов:&lt;br /&gt;
&lt;br /&gt;
* Электронная почта&lt;br /&gt;
* Индивидуальный чат пользователя мессенджера telegram с ботом&lt;br /&gt;
&lt;br /&gt;
Существует три класса внутренних событий, на которые возможно получение оповещения:&lt;br /&gt;
&lt;br /&gt;
* разметка маркера(ов), в том числе групповая (REVIEW)&lt;br /&gt;
* создание/редактирование и удаление комментария к маркеру (COMMENT)&lt;br /&gt;
* добавление/удаление снимков (SNAPSHOT)&lt;br /&gt;
* удаление контейнеров (веток, проектов)&lt;br /&gt;
&lt;br /&gt;
Задание условий, по которым происходит оповещение конкретного пользователя определяется сущностью – подписка. Подписки для каждого пользователя индивидуальны и не ограничены в количестве. Каждая подписка отражает следующие условия сработки механизма оповещения:&lt;br /&gt;
&lt;br /&gt;
* Цель&lt;br /&gt;
* Класс события&lt;br /&gt;
* Флаг&lt;br /&gt;
* Тип подписки&lt;br /&gt;
&lt;br /&gt;
'''Цель''' – определяет объект, в отношении которого должно произойти событие, чтобы пользователь получил оповещение. Возможна подписка на проекты и ветки&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Класс события''' – определяет один из трех классов события, описанных выше (кроме удаления контейнеров)&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Флаг''' – дополнительное условие к активации подписки. Возможны следующие значения:&amp;lt;br /&amp;gt;&lt;br /&gt;
:''Участие'' – подписка приведет к созданию сообщения пользователю только в том случае, если в указанной цели есть какая-либо активность пользователя (разметка или комментарий), кому подписка принадлежит&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Тип подписки''' – подписка может иметь &amp;quot;исключающее&amp;quot; свойство, когда она подавляет создание сообщений. Полезно при исключении некоторых целей из списка срабатывания (например, когда есть подписка на проект, но некоторые ветки не требуют внимания)&lt;br /&gt;
&lt;br /&gt;
Пользователи могут настраивать каналы оповещения (почта или telegram) посредством изменения своего '''профиля подписок'''. Профиль подписок не включает в себя сами подписки, а позволяет контролировать только механизм доставки создаваемых подписками сообщений. Профиль можно изменять как в GUI, так и через команды CLI.&lt;br /&gt;
&lt;br /&gt;
==== Некоторые детали работы механизма подписок ====&lt;br /&gt;
&lt;br /&gt;
Механизм подписок может удерживать некоторые сообщения, накапливая их в очереди, для минимизации числа соединений с сервером (почтовым или telegram). Отправка сообщений происходит 1 раз в 30 секунд, в связи с чем могут быть задержки с получением сообщений.&lt;br /&gt;
&lt;br /&gt;
Кроме того, действия по разметке маркера могут быть аккумулированы в одно сообщение, если они происходят достаточно быстро (несколько событий на одном маркере для одной подписки в пределах 20 секунд).&lt;br /&gt;
&lt;br /&gt;
В некоторых случаях, при активности большого количества пользователей со средней суммарной активностью пользователей приблизительно в 3072 события разметки в минуту, сообщения могут быть отброшены системой, чтобы не приводить к спаму.&lt;br /&gt;
&lt;br /&gt;
Для предотвращения создания большого количества соединений с почтовым сервером (при активной работе пользователей или средств автоматизации) возможно использование специального флага в конфигурации – saveConection, который позволяет переиспользовать уже созданное ранее соединение с почтовым сервером. Соединение закрывается автоматически через 10 секунд простоя.&lt;br /&gt;
&lt;br /&gt;
Для отправки сообщений через мессенджер telegram сервер Svacer требует идентификатор заранее созданного бота. При этом бот используется только для отправки сообщений и не находится в запущенном состоянии постоянно (нет постоянного соединения с серверами telegram). &lt;br /&gt;
&lt;br /&gt;
=== Конфигурация  ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию механизм подписок не активен. Для его активации необходимо подготовить секцию subscription в конфигурационном файле Svacer. Примерный конфигурационный файл указан ниже&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;subscription:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 trace: false&lt;br /&gt;
 advanced: &lt;br /&gt;
  transport_queue_len: 256&lt;br /&gt;
  transport_worker_period: 30000000000&lt;br /&gt;
  trace_dir: /tmp&lt;br /&gt;
 telegram:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  botID: &amp;amp;quot;7865..........&amp;amp;quot;&lt;br /&gt;
 mail:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;smtp.local&amp;amp;quot;&lt;br /&gt;
  smtpPort: 25&lt;br /&gt;
  smtpUsername: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  caCerts: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;noauth&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;mailer@local&amp;amp;quot;&lt;br /&gt;
  tls: true&lt;br /&gt;
  saveConnection: false&lt;br /&gt;
  debug: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=При конфигурировании службы необходимо явно указать значение advanced.transport_worker_period для избежания проблемы повышенной загрузки CPU. Значение указывается в наносекундах}}&lt;br /&gt;
&lt;br /&gt;
==== Описание параметров конфигурации ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| subscription.enabled&lt;br /&gt;
| Состояние службы при старте сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
| subscription.trace&lt;br /&gt;
| Позволяет фиксировать работу службы в виде набора файлов, создаваемых во временной папке ОС (/tmp/ для ОС Linux)&lt;br /&gt;
|-&lt;br /&gt;
| telegram.enabled&lt;br /&gt;
| Состояние канала доставки сообщений посредством мессенджера telegram при запуске сервера&lt;br /&gt;
|-&lt;br /&gt;
| telegram.botID&lt;br /&gt;
| Идентификатор бота, который будет использован для отправки сообщений&lt;br /&gt;
|-&lt;br /&gt;
| mail.enabled&lt;br /&gt;
| Состояние канала доставки сообщений с помощью электронной почты при запуске сервера&lt;br /&gt;
|-&lt;br /&gt;
| mail.smtpAddress&lt;br /&gt;
| Адрес почтового сервера, который будет использован для отправки сообщений&lt;br /&gt;
|-&lt;br /&gt;
| mail.smtpPort&lt;br /&gt;
| Параметр, задающий порт на котором работает почтовый сервер. По умолчанию используется значение 25&lt;br /&gt;
|-&lt;br /&gt;
| mail.smtpAuth&lt;br /&gt;
| Параметр, задающий тип аутентификации, используемой клиентом. Возможны варианты: noauth, plain, login&lt;br /&gt;
|-&lt;br /&gt;
| mail.smtpUsername (mail.smtpPassword)&lt;br /&gt;
| Параметры, задающие учетную запись от имени которой будет происходить рассылка сообщений. В случае аутентификации noauth, должны быть указаны пустые значения&lt;br /&gt;
|-&lt;br /&gt;
| mail.caCerts&lt;br /&gt;
| Параметр, задающий сертификаты CA. Значения поля аналогичны значениям соответствующего поля из конфигурации сервера для работы по протоколу TLS (нативный режим). Если указано пустое значение, то поддержка TLS будет сконфигурирована в небезопасном режиме с доверием любому сертификату сервера&lt;br /&gt;
|-&lt;br /&gt;
| mail.from&lt;br /&gt;
| Поле, указывающее почтовый адрес, от имени которого будет осуществлять рассылка&lt;br /&gt;
|-&lt;br /&gt;
| mail.tls&lt;br /&gt;
| Использовать или нет tls для соединения с сервером&lt;br /&gt;
|-&lt;br /&gt;
| mail.debug&lt;br /&gt;
| Выводить отладочную информацию протокола взаимодействия с почтовым сервером&lt;br /&gt;
|-&lt;br /&gt;
| saveConnection&lt;br /&gt;
| Сохранять уже установленное соединение с почтовым сервером (в течении 10 секунд после последней активности)&lt;br /&gt;
|-&lt;br /&gt;
|advanced.transport_queue_len&lt;br /&gt;
|Значение по умолчанию — 256. Определяет максимальный размер буфера накапливаемых сообщений. Если буфер полный, новые сообщения будут игнорироваться (о чем будет сообщение в логах сервера)&lt;br /&gt;
|-&lt;br /&gt;
|advanced.transport_worker_period&lt;br /&gt;
|Значение по умолчанию — 30. Определяет период срабатывания очереди сообщения в наносекундах.&lt;br /&gt;
|-&lt;br /&gt;
|advanced.trace_dir&lt;br /&gt;
|Значение по умолчанию определяется типом системы (Для Linux — /tmp). Позволяет указать папку, в которой будут размещаться отладочные файлы работы службы оповещений&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Для работы службы необходимо запускать Svacer  с опцией '''[[Help:Installation#Указание_public-url|public-url]]'''. Без указания этой опции служба не будет активирована, так как создаваемые в процессе ее работы ссылки должны содержать правильные URL}}&lt;br /&gt;
&lt;br /&gt;
==== Особенности работы почтового клиента, используемого Svacer ====&lt;br /&gt;
&lt;br /&gt;
''Поддержка TLS''. Если флаг mail.tls установлен, то соединение с сервером изначально будет установлено по протоколу TLS. В противном случае, изначально будет установлено обычное TCP соединение, и уже после команды STARTTLS стороны перейдут на протокол TLS. В случае если TLS соединение не сможет быть установлено, клиент будет пытаться работать без TLS соединения. &lt;br /&gt;
&lt;br /&gt;
Для облегчения проверки конфигурации сервера Svacer для отправки почтовых сообщений можно использовать команду cli (см. подробнее ниже): &lt;br /&gt;
&lt;br /&gt;
 svacer subscription transport mail test --config mail.yaml&lt;br /&gt;
&lt;br /&gt;
=== Команды CLI для работы с механизмом подписок ===&lt;br /&gt;
&lt;br /&gt;
Все команды собраны в группу ''svacer subscription''. Доступны следующие подкоманды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;transport&amp;lt;/code&amp;gt; – функции по работе (конфигурации) используемых механизмов доставки сообщений (mail, tg)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile&amp;lt;/code&amp;gt; – управление профилем подписки пользователя&lt;br /&gt;
* &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt; – управление службой подписок&lt;br /&gt;
* &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt; – cоздание новой подписки&lt;br /&gt;
* &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; – просмотр списка подписок&lt;br /&gt;
* &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; – удаление подписок&lt;br /&gt;
* &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; – обновление существующей подписки&lt;br /&gt;
&lt;br /&gt;
==== Команды управления подписками ====&lt;br /&gt;
&lt;br /&gt;
Для управления подписками пользователя используются следующие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt; – создание подписки&lt;br /&gt;
* &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; – перечесление подписок пользователя&lt;br /&gt;
* &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; – удаление подписки&lt;br /&gt;
* &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; – редактирование подписки&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Во всех командах присутствуют стандартные для CLI Svacer флаги подключения к серверу (--host, --port, --grpc, --user, --password, --ssl и другие). Группа этих флагов в дальнейшем будет обозначаться как [svacer_conn]}}&lt;br /&gt;
&lt;br /&gt;
===== Создание подписки (команда 'create') =====&lt;br /&gt;
&lt;br /&gt;
Общий формат команды:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription create [svacer_conn] [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt; – имя или ID проекта&lt;br /&gt;
* &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt; – имя или ID ветки&lt;br /&gt;
* &amp;lt;code&amp;gt;marker&amp;lt;/code&amp;gt; – ID маркера&lt;br /&gt;
* &amp;lt;code&amp;gt;exclude&amp;lt;/code&amp;gt; – подписка имеет исключающий характер (по умолчанию &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;my-activities&amp;lt;/code&amp;gt; – оповещение только в случае событий на маркерах, где была собственная активность (разметка, комментарий) (по умолчанию &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; – подписаться на события REVIEW&lt;br /&gt;
* &amp;lt;code&amp;gt;snapshot&amp;lt;/code&amp;gt; – подписаться на события SNAPSHOT&lt;br /&gt;
* &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt; – подписаться на события COMMENT&lt;br /&gt;
* &amp;lt;code&amp;gt;all-events&amp;lt;/code&amp;gt; – подписаться на все классы событий&lt;br /&gt;
&lt;br /&gt;
{{Note}} При создании подписки важно указывать имена или ID одновременно во всех требуемых флагах. Например, команда:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription create --project darpa --branch 1111-2222-333333333&lt;br /&gt;
&lt;br /&gt;
не будет корректно обработана. При использовании ID цели можно не указывать родительские сущности (например, проект для ветки)&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
&lt;br /&gt;
Подписаться на события REVIEW в проекте &amp;amp;quot;MyProject&amp;amp;quot; и ветке &amp;amp;quot;MyBranch&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription create --project MyProject --branch MyBranch --review&amp;lt;/pre&amp;gt;&lt;br /&gt;
Подписаться на все события в проекте &amp;amp;quot;MyProject&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription create --project MyProject --all-events&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Получение списка подписок (команда list) =====&lt;br /&gt;
&lt;br /&gt;
Общий формат команды:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription list [svacer_conn] [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – вывести все подписки всех пользователей (требуется роль admin)&lt;br /&gt;
* &amp;lt;code&amp;gt;humanize&amp;lt;/code&amp;gt; – вывести в удобном для чтения виде&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
&lt;br /&gt;
Вывести все подписки пользователя 'user' в формате JSON (по умолчанию):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription list --user user --password 1234&amp;lt;/pre&amp;gt;&lt;br /&gt;
Вывести все подписки пользователя 'user' в удобном формате&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription list --user user --password 1234 --humanize&amp;lt;/pre&amp;gt;&lt;br /&gt;
Вывести все подписки всех пользователей&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription list --user admin --password admin --all --humanize&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Удаление подписки (команда delete) =====&lt;br /&gt;
&lt;br /&gt;
Общий формат команды:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription delete [svacer_conn] [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; – удаление всех подписок пользователя&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – удаление конкретной подписки&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
&lt;br /&gt;
Удалить подписку пользователя user1&lt;br /&gt;
&lt;br /&gt;
 svacer subscription delete --user user1 --password 1234 --id 1234&lt;br /&gt;
&lt;br /&gt;
Полный ID можно не указывать, достаточно указать несколько первых символов идентификатора, достаточных для однозначной идентификации подписки&lt;br /&gt;
&lt;br /&gt;
===== Обновление подписки (команда update) =====&lt;br /&gt;
&lt;br /&gt;
Общий формат команды:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription update [svacer_conn] [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; – ID подписки для обновления&lt;br /&gt;
* &amp;lt;code&amp;gt;only-my-activities&amp;lt;/code&amp;gt; – установка флага my-activities для подписки (по умолчанию &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
&lt;br /&gt;
Установить флаг my-activities для подписки, ID которой начинается с символов f1f2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription update --id f1f2 --only-my-activities true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Команды настройки и управления каналами доставки сообщений ====&lt;br /&gt;
&lt;br /&gt;
В Svacer поддерживаются два канала доставки сообщений — электронная почта и мессенджер Telegram. Для облегчения конфигурации данных каналов используются подкоманды команды &amp;lt;code&amp;gt;svacer subscription transport&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Подкоманда 'mail''''&lt;br /&gt;
&lt;br /&gt;
Предназначена для облегчения конфигурации почтового клиента Svacer. Общий формат команды:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription transport mail [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--to&amp;lt;/code&amp;gt; — почтовый адрес для отправки тестового сообщения&lt;br /&gt;
* &amp;lt;code&amp;gt;--config&amp;lt;/code&amp;gt; — секция mail конфигурационного файла в формате YAML&lt;br /&gt;
&lt;br /&gt;
В качестве параметра обязательно передать файл в формате yaml, содержимое которого соответствует секции mail конфигурационного файла для службы. Содержимое такого файла может следующим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;smtp.mail.local&amp;amp;quot;&lt;br /&gt;
  smtpPort: 25&lt;br /&gt;
  smtpUsername: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;noauth&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;sender@mail.local&amp;amp;quot;&lt;br /&gt;
  debug: true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
&lt;br /&gt;
Отправить тестовое письмо на адрес &amp;lt;code&amp;gt;admin@mail.org&amp;lt;/code&amp;gt;, используя конфигурацию &amp;lt;code&amp;gt;test.yaml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription transport mail test --config test.yaml --to admin@mail.org&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Группа команд администрирования службы (admin) ====&lt;br /&gt;
&lt;br /&gt;
Данные команды требуют роль admin и предназначены для управления некоторыми параметрами самой службы. Доступные подкоманды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt; – управление службой подписок&amp;lt;br /&amp;gt;&lt;br /&gt;
Общий формат команды:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription admin service [svacer_conn] [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; – включение/выключение службы&lt;br /&gt;
* &amp;lt;code&amp;gt;use-mail&amp;lt;/code&amp;gt; – включение/выключение канала передачи сообщений через электронную почту&lt;br /&gt;
* &amp;lt;code&amp;gt;use-tg&amp;lt;/code&amp;gt; – включение/выключение канала передачи сообщений через Telegram&lt;br /&gt;
&lt;br /&gt;
Если запускать команду без указания флагов, то будет выведена информация о текущем состоянии службы с рядом параметров.&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При использовании флагов use-mail, use-tg не происходит повторное считывание конфигурационного файла. Для того, чтобы флаги use-mail и use-tg корректно применились их необходимо запускать одновременно с флагом --enable true, предварительно отключив службу с помощью флага --enable false}}&lt;br /&gt;
&lt;br /&gt;
==== Группа команд управления профилем пользователя (profile) ====&lt;br /&gt;
&lt;br /&gt;
Команда предназначена для управление профилем пользователя и имеет следующий формат:&lt;br /&gt;
&lt;br /&gt;
 svacer subscription profile [svacer_conn] [update] [опции]&lt;br /&gt;
&lt;br /&gt;
'''Опции (актуальны для подкоманды update):'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;use-mail&amp;lt;/code&amp;gt; – использовать канал передачи сообщений через электронную почту&lt;br /&gt;
* &amp;lt;code&amp;gt;use-tg&amp;lt;/code&amp;gt; – использовать канал передачи сообщений через Telegram&lt;br /&gt;
* &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; – изменить почтовый адрес&lt;br /&gt;
* &amp;lt;code&amp;gt;tg-chat-id&amp;lt;/code&amp;gt; – установить ID чата для сообщений Telegram&lt;br /&gt;
* &amp;lt;code&amp;gt;tg-user-id&amp;lt;/code&amp;gt; – установить ID пользователя для сообщений Telegram&lt;br /&gt;
* &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; – включение/отключение механизма оповещения для конкретного пользователя&lt;br /&gt;
&lt;br /&gt;
Если опции и подкоманда &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; не указаны, то будет выведен текущий профиль пользователя. &lt;br /&gt;
&lt;br /&gt;
=== Пример скрипта для создания подписок пользователей ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;#!/bin/bash -x&lt;br /&gt;
#Общие параметры подключения к Svacer&lt;br /&gt;
HOST=&amp;amp;quot;--host 10.0.0.10 --port 8888&amp;amp;quot;&lt;br /&gt;
#Тестовые проекты&lt;br /&gt;
PROJECT1=&amp;amp;quot;NET6&amp;amp;quot;&lt;br /&gt;
PROJECT2=&amp;amp;quot;darpa&amp;amp;quot;&lt;br /&gt;
PROJECT3=&amp;amp;quot;large&amp;amp;quot;&lt;br /&gt;
PROJECT3_BRANCH1=&amp;amp;quot;master&amp;amp;quot;&lt;br /&gt;
#Параметры аутентификации пользователей&lt;br /&gt;
USER1=&amp;amp;quot;--user admin_1 --password password&amp;amp;quot;&lt;br /&gt;
USER2=&amp;amp;quot;--user admin_2 --password password&amp;amp;quot;&lt;br /&gt;
USER3=&amp;amp;quot;--user admin_3 --password password&amp;amp;quot;&lt;br /&gt;
USER4=&amp;amp;quot;--user admin_4 --password password&amp;amp;quot;&lt;br /&gt;
USER5=&amp;amp;quot;--user admin_5 --password password&amp;amp;quot;&lt;br /&gt;
USER6=&amp;amp;quot;--user admin_6 --password password&amp;amp;quot;&lt;br /&gt;
USER7=&amp;amp;quot;--user admin_7 --password password&amp;amp;quot;&lt;br /&gt;
#ID пользователя в Telegram&lt;br /&gt;
TG_USER_ID=721941843&lt;br /&gt;
TG_CHAT_ID=$TG_USER_ID&lt;br /&gt;
&lt;br /&gt;
#Команда создания подписки&lt;br /&gt;
CREATE_SN=&amp;amp;quot;./svacer subscription create&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
#User1 - подписка на все, но с флагом myactivities&lt;br /&gt;
$CREATE_SN $HOST $USER1 --all-events --my-activities&lt;br /&gt;
#User2 - подписка на проект1, только снимки&lt;br /&gt;
$CREATE_SN $HOST $USER2 --project $PROJECT1 --snapshot&lt;br /&gt;
#User2 - подписка на проект2, только разметка&lt;br /&gt;
$CREATE_SN $HOST $USER2 --project $PROJECT2 --review&lt;br /&gt;
#User2 - подписка на проект3, только комментарии&lt;br /&gt;
$CREATE_SN $HOST $USER2 --project $PROJECT3 --comment&lt;br /&gt;
#User3 - подписка на проект3, исключая ветку1, все события&lt;br /&gt;
$CREATE_SN $HOST $USER3 --project $PROJECT3 --all-events&lt;br /&gt;
$CREATE_SN $HOST $USER3 --project $PROJECT3 --branch $PROJECT3_BRANCH1 --exclude&lt;br /&gt;
#User4 - подписка на проект2,  все события&lt;br /&gt;
$CREATE_SN $HOST $USER4 --project $PROJECT2 --all-events&lt;br /&gt;
#User5 - подписка на проект3,  все события&lt;br /&gt;
$CREATE_SN $HOST $USER5 --project $PROJECT3 --all-events&lt;br /&gt;
#User6 - подписка на все проекты, все события&lt;br /&gt;
$CREATE_SN $HOST $USER6  --all-events&lt;br /&gt;
#User7 - подписка на все проекты, все события&lt;br /&gt;
$CREATE_SN $HOST $USER7  --all-events&lt;br /&gt;
&lt;br /&gt;
#Команда работы с профилем&lt;br /&gt;
ENABLE_NTFY_MAIL=&amp;amp;quot;./svacer subscription profile&amp;amp;quot;&lt;br /&gt;
#User1, включить получение сообщений по почте, по Telegram, установить адрес электронной почты для сообщений, указать ID пользователя для получения сообщений в Telegram&lt;br /&gt;
$ENABLE_NTFY_MAIL $HOST $USER1  update --enable true --use-mail true --mail user1@mb1lo.ru --use-tg true --tg-user-id $TG_USER_ID --tg-chat-id $TG_CHAT_ID&lt;br /&gt;
#User2, отключить получение всех сообщений (подписки останутся)&lt;br /&gt;
$ENABLE_NTFY_MAIL $HOST $USER2  update --enable false&lt;br /&gt;
#User3, отключить получение собщений по Telegram&lt;br /&gt;
$ENABLE_NTFY_MAIL $HOST $USER3  update --use-tg false&lt;br /&gt;
#User4, изменить параметры канала Telegram&lt;br /&gt;
$ENABLE_NTFY_MAIL $HOST $USER4  update --tg-user-id $TG_USER_ID --tg-chat-id $TG_CHAT_ID&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример конфигурационного файла для активации службы уведомлений при запуске Svacer ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;subscription:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 telegram:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  botID: &amp;amp;quot;7861931704:AAEHfp035U10pJk0lIjo1lYJj1e837qv7j4&amp;amp;quot;&lt;br /&gt;
 mail:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;mail-server.ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPort: 25&lt;br /&gt;
  smtpUsername: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;noauth&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;relay@ispras.ru&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере выше подразумевается наличие почтового сервера, не требующего аутентификации. В примере ниже указан случай отправки сообщений от конкретного пользователя&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;subscription:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 telegram:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  botID: &amp;amp;quot;7861931704:AAEHfp035U10pJk0lIjo1lYJj1e837qv7j4&amp;amp;quot;&lt;br /&gt;
 mail:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;mail.ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPort: 25&lt;br /&gt;
  smtpUsername: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;abrakadabra&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;plain&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В следующем примере устанавливается соединение TLS с почтовым сервером&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;subscription:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 telegram:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  botID: &amp;amp;quot;7861931704:AAEHfp035U10pJk0lIjo1lYJj1e837qv7j4&amp;amp;quot;&lt;br /&gt;
 mail:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;mail.ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPort: 465&lt;br /&gt;
  smtpUsername: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;abrakadabra&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;plain&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  tls: true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В следующем примере устанавливается соединение TLS с помощью команды STARTTLS с почтовым сервером (в консоль будут также выведены отладочные сообщения почтового клиента)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;subscription:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 telegram:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  botID: &amp;amp;quot;7861931704:AAEHfp035U10pJk0lIjo1lYJj1e837qv7j4&amp;amp;quot;&lt;br /&gt;
 mail:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;mail.ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPort: 587&lt;br /&gt;
  smtpUsername: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;abrakadabra&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;plain&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  tls: false&lt;br /&gt;
  debug: true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом сервер mail.ispras.ru работает на всех портах: на 465 принимаются только TLS соединения, на 587 — обычные соединения с переходом на TLS впоследствии, на 25 — обычные соединения (без TLS)&lt;br /&gt;
&lt;br /&gt;
=== Пример конфигурации службы с запуском ее вручную через команду cli ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;subscription:&lt;br /&gt;
 enabled: false&lt;br /&gt;
 telegram:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  botID: &amp;amp;quot;7861931704:AAEHfp035U10pJk0lIjo1lYJj1e837qv7j4&amp;amp;quot;&lt;br /&gt;
 mail:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  smtpAddress: &amp;amp;quot;mail.ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPort: 587&lt;br /&gt;
  smtpUsername: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  smtpPassword: &amp;amp;quot;abrakadabra&amp;amp;quot;&lt;br /&gt;
  smtpAuth: &amp;amp;quot;plain&amp;amp;quot;&lt;br /&gt;
  from: &amp;amp;quot;user@ispras.ru&amp;amp;quot;&lt;br /&gt;
  tls: false&amp;lt;/pre&amp;gt;&lt;br /&gt;
После запуска сервера Svacer можно активировать службу с помощью команды&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;svacer subscription admin service --user admin --password admin --enable true&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=OIDC&amp;diff=2959</id>
		<title>OIDC</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=OIDC&amp;diff=2959"/>
		<updated>2025-05-20T07:52:24Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Автоназначение ролей пользователю на основе содержимого Claims токена */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Основные концепции ==&lt;br /&gt;
&lt;br /&gt;
Аутентификация с помощью протокола ''OpenID Connect'' (далее ''OIDC'') реализована с помощью утилиты [https://oauth2-proxy.github.io/oauth2-proxy/ oauth2-proxy]. Общая схема аутентификации представлена на рисунке ниже:&lt;br /&gt;
&lt;br /&gt;
[[File:Image-20240531112418954.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
Пояснения к картинке указаны в таблице. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| 1. Запрос ресурса&lt;br /&gt;
| Если запрос включен в список запросов без аутентификации (см. skip_auth_routes), то он перенаправляется к серверу Svacer (Входа на сервер Svacer при этом не происходит. Будут доступны только те ресурсы, которые не требуют аутентификации). Если запроса нет в списке, то переходим к шагу 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. Проверка необходимости аутентификации OAuth2&lt;br /&gt;
| Утилита oAuth2-proxy, на основе имеющихся в куках данных, определяет необходимость перенаправления пользователя на сервер OAuth2. Если аутентификация необходима, то по URL, который был указан в параметре oidc_issuer_url, прокси запросит точки входа в соответствии с протоколом OIDC. После получения нужной точки входа, пользователь будет перенаправлен на нее (шаг 3), при этом в параметре redirect этого запроса будет указано значение параметра конфигурации прокси redirect_url. Если аутентификация не нужна (уже есть действительный токен от OIDC сервера), то запрос перенаправляется на сервер Svacer с токеном доступа (Access Token) от сервера OAuth2 в заголовке X-Forwarded-Access-Token — шаг 1* на рисунке&lt;br /&gt;
|-&lt;br /&gt;
| 3. Аутентификация пользователя на OAuth2 сервере&lt;br /&gt;
| Если в куках сервера OAuth2 есть данные об активной сессии аутентификации, то пользователь будет перенаправлен обратно на прокси сервер по указанному в параметре запроса URL. При этом, в параметрах URL будет передан Authorization Code для дальнейшего использования клиентом OAuth2 (в терминологии OAuth2 клиентом является oauth2-proxy). Если активной сессии нет, то будет отображена форма для логина и пароля пользователя. После успешного входа, OAuth2 сервер запомнит сессию пользователя, сформирует Authorization Code и перенаправит пользователя обратно на прокси, передав в URL значение Authorization Code&lt;br /&gt;
|-&lt;br /&gt;
| 4. Получение AccessToken&lt;br /&gt;
| Прокси осуществляет получение Access Token от сервера OAuth2, используя полученный Authorization Code и точку входа сервера OAuth2 для получения токенов, которую он получил ранее на шаге 2&lt;br /&gt;
|-&lt;br /&gt;
| 5. Отправка запроса к Svacer&lt;br /&gt;
| Первоначальный запрос (из шага 1), отправляется серверу Svacer. При этом в заголовки этого запроса добавляется Access Token от OAuth сервера, а также другие специфичные для oauth2-proxy заголовки. Состав дополнительной информации, передаваемой в заголовках, определяется конфигурацией oauth2-proxy&lt;br /&gt;
|-&lt;br /&gt;
| 6. Выпуск токена Svacer&lt;br /&gt;
| Svacer определяет наличие заголовка X-Forwarded-Access-Token в запросе. Если конфигурация сервера подразумевает использование OIDC протокола, то полученный токен проверяется и на его основе создается токен Svacer, после чего выполняется вход в систему и создается пользователь Svacer (если еще не создан), соответствующий пользователю, указанному в токене доступа от OAuth2 сервера&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация Svacer для поддержки протокола OIDC ==&lt;br /&gt;
&lt;br /&gt;
Для конфигурации Svacer необходимо использовать секцию ''auth'' стандартного конфигурационного файла Svacer, указываемого через опцию ''--config'' при его запуске. &lt;br /&gt;
&lt;br /&gt;
 svacer-server run --config config.yaml&lt;br /&gt;
&lt;br /&gt;
Пример секции ''auth'' конфигурационного файла представлен ниже&lt;br /&gt;
 oidc:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  debug: true&lt;br /&gt;
  oauth_proxy:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   clock: 1&lt;br /&gt;
   sign_in: &amp;quot;&amp;lt;nowiki&amp;gt;http://keycloak:12800/realms/svacer/protocol/openid-connect/token&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
   sign_out: &amp;quot;&amp;lt;nowiki&amp;gt;http://oauth_proxy:4180/oauth2/sign_out?rd=/oauth2/sign_in&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
   tokens:&lt;br /&gt;
    - claims:&lt;br /&gt;
       subject: preferred_username&lt;br /&gt;
       role: svacer_role&lt;br /&gt;
       sync_roles: svacer_roles&lt;br /&gt;
       first_name: given_name&lt;br /&gt;
       second_name: second_name&lt;br /&gt;
       last_name: family_name&lt;br /&gt;
       email: email&lt;br /&gt;
      sign:&lt;br /&gt;
       - key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvR/zIW/acyWFVSuSD/8iDM3epguHljKZkaB4ITojRwisXNcn6S0ArlI8v69qV1tBFi+RH3Ys4L5Pj+xDFlemlml6wPp5X0tcD2Gax51KHqQcFjViBGVSqJUdts/bkvfiIfZLkurybkhR0ALToWvbNyD7&amp;gt;&lt;br /&gt;
         name: rsa&lt;br /&gt;
В секции используются следующие поля:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Название&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''''enabled'''''&lt;br /&gt;
| Использовать ''OIDC'' провайдер. Значение ''false'' отключает данный функционал&lt;br /&gt;
|-&lt;br /&gt;
| '''''debug'''''&lt;br /&gt;
| Выводить в логи сервера дополнительные отладочные сообщения. Полезно при первичной настройке, в дальнейшем желательно установить в значение ''false''&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.enabled'''''&lt;br /&gt;
| Использовать утилиту ''oauth2-proxy'' в качестве механизма поддержки протокола OIDC. На текущий момент это единственная реализация поддержки ''OIDC'' протокола&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.clock'''''&lt;br /&gt;
| Допускаемая погрешность расхождения времени между сервером аутентификации и клиентом. Указывается значение в минутах&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.sign_in'''''&lt;br /&gt;
| Точка входа сервера OAuth2 для получения токена. Используется в Svacer только для работы CLI команд и сервисной учетной записи. При некорректном значении работа клиента Svacer с сервером Svacer через ''OIDC'' будет невозможна, но при правильной настройке других параметров, в GUI пользователи работать смогут&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.sign_out'''''&lt;br /&gt;
| Ссылка, которая будет использована при выходе пользователя из системы (logout в GUI). Более подробно см. [[OIDC#Выход пользователя из системы|Выход пользователя из системы]]&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.tokens'''''&lt;br /&gt;
| Массив объектов (''token''), описывающих структуру ''JWT'' токена ''OIDC'' сервера и данные, необходимые для проверки выпускаемого им токена&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims'''''&lt;br /&gt;
| Описывает структуру токена. Поля этой сущности определяют свойства создаваемого внутреннего пользователя Svacer и его права&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.subject'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Логин'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.first_name'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Имя'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.second_name'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Отчество'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.last_name'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Фамилия'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.email'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''E-Mail'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.role'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для добавления роли пользователю Svacer. Значение должно быть именем уже существующей роли или значением &amp;quot;admin&amp;quot; для добавления роли администратора. Автоматическое назначение роли происходит только при первом создании пользователя&lt;br /&gt;
|-&lt;br /&gt;
|'''''token.claims.sync_roles'''''&lt;br /&gt;
|Название поля из Claims токена, которое содержит полный список доступных ролей Svacer для механизма автоназначения ролей&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.sign'''''&lt;br /&gt;
| Содержит данные, необходимые для проверки подписи ''JWT'' токена&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.sign.key'''''&lt;br /&gt;
| Открытый ключ, используемый OIDC сервером для проверки токена. Формат: BASE64(ASN1.DER)&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.sign.name'''''&lt;br /&gt;
| Имя алгоритма ЭЦП. Поддерживаются: RSA, ECDSA&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация OAuth2-proxy  ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация OAauth2-proxy может выполнятся через параметры CLI, через указание параметров в конфигурационном файле, а также через переменные окружения. Названия параметров, передаваемых в CLI, в конфигурационном файле и через переменные окружения находятся в следующем соответствии друг с другом (на примере параметра ''client_secret''):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Конфигурационный файл&lt;br /&gt;
! CLI&lt;br /&gt;
! Переменная окружения&lt;br /&gt;
|-&lt;br /&gt;
| client_secret&lt;br /&gt;
| --client-secret&lt;br /&gt;
| OAUTH2_PROXY_CLIENT_SECRET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Для нормальной работы желательно наличие DNS имен для хостов (OAuth2-proxy использует Cookies для хранения там информации о сессии аутентификации пользователя а также для хранения csrf токена).'''&lt;br /&gt;
&lt;br /&gt;
Ниже приводится пример конфигурации oauth2-proxy для подключения Svacer сервера к OAuth2 серверу Keycloak&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;standard_logging = true&lt;br /&gt;
standard_logging_format = &amp;quot;[{{.Timestamp}}] [{{.File}}] {{.Message}}&amp;quot;&lt;br /&gt;
auth_logging = true&lt;br /&gt;
auth_logging_format = &amp;quot;{{.Client}} - {{.Username}} [{{.Timestamp}}] [{{.Status}}] {{.Message}}&amp;quot;&lt;br /&gt;
pass_user_headers = true&lt;br /&gt;
pass_host_header = true&lt;br /&gt;
email_domains = [&lt;br /&gt;
 &amp;quot;*&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
client_id = &amp;quot;svacer-auth-proxy&amp;quot;&lt;br /&gt;
client_secret = &amp;quot;q2rNKGofxpw7FzmZDstSIyNNyzkW1BsW&amp;quot;&lt;br /&gt;
pass_access_token = true&lt;br /&gt;
cookie_name = &amp;quot;_oauth2_proxy2&amp;quot;&lt;br /&gt;
cookie_secret = &amp;quot;2-W9DDrnlfBEK75F3zGpszuwTSqwBcUFQm6OQa3dHgU=&amp;quot;&lt;br /&gt;
cookie_expire = &amp;quot;11m&amp;quot;&lt;br /&gt;
cookie_refresh = &amp;quot;10m&amp;quot;&lt;br /&gt;
cookie_secure = false&lt;br /&gt;
provider = &amp;quot;keycloak-oidc&amp;quot;&lt;br /&gt;
show_debug_on_error = true&lt;br /&gt;
cookie_csrf_per_request = true&lt;br /&gt;
cookie_csrf_expire = &amp;quot;36h&amp;quot;&lt;br /&gt;
skip_auth_routes = [&amp;quot;GET=/static/.*&amp;quot;,&amp;quot;/api/public/*&amp;quot;,&amp;quot;GET=/api/auth_settings&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В файле выше указаны не все требуемые параметры для нормальной работы OAuth2-proxy. Ниже приведены наиболее важные параметры конфигурационного файла OAuth2-proxy с пояснениями&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Название&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| client_id&lt;br /&gt;
| Название клиента (в терминах OAuth2), от имени которого пользователь будет аутентифицироваться на сервере OAuth&lt;br /&gt;
|-&lt;br /&gt;
| client_secret&lt;br /&gt;
| Секрет клиента (в терминах OAuth2)&lt;br /&gt;
|-&lt;br /&gt;
| pass_access_token&lt;br /&gt;
| Передавать токен доступа от Oauth2 сервера в Svacer (через заголовки). Данный токен будет использован сервером Svacer для идентификации и аутентификации пользователя, а также для получения первоначальной информации о нем&lt;br /&gt;
|-&lt;br /&gt;
| provider&lt;br /&gt;
| Имя провайдера OAuth2&lt;br /&gt;
|-&lt;br /&gt;
| cookie_csrf_per_request&lt;br /&gt;
| Возможность отправки нескольких запросов одновременно&lt;br /&gt;
|-&lt;br /&gt;
| skip_auth_routes&lt;br /&gt;
| Указывается список запросов, которые не требуют аутентификации. Для корректной работы Svacer необходимо указать значения из примера выше&lt;br /&gt;
|-&lt;br /&gt;
| http_address&lt;br /&gt;
| Имя хоста, на котором будет работать OAuth2-proxy, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]&lt;br /&gt;
|-&lt;br /&gt;
| upstreams&lt;br /&gt;
| Хост, на котором работает Svacer, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]&lt;br /&gt;
|-&lt;br /&gt;
| redirect_url&lt;br /&gt;
| URL на который будет осуществлено перенаправление после успешной аутентификации на OAuth2 сервере, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]&lt;br /&gt;
|-&lt;br /&gt;
| oidc_issuer_url&lt;br /&gt;
| URL сервера OAuth2 для начала аутентификации, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]. С помощью данного URL будет получен список точек входа для поддержки разных потоков аутентификации (в терминах OAuth2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Детали работы OAuth2-proxy с куками и токенами ===&lt;br /&gt;
&lt;br /&gt;
Для корректной настройки OAuth2-proxy полезно понимать детали работы OAath2-proxy. На шаге 2 прокси определяет необходимость выполнения аутентификации пользователя. Прокси проверяет наличие куки ''_oauth2_proxy'' и его срок действия. Срок действия создаваемых кук указывается в поле ''cookie_expire''. Если срок действия куки закончен, то пользователь будут перенаправлен на точку входа прокси: ''/oauth2/sign_in''.&lt;br /&gt;
&lt;br /&gt;
Важным полем конфигурации является поле ''cookie_refresh''. При каждом запросе прокси обновляет свои куки с периодичностью, указанной в ''cookie_refresh''. Вместе с обновлением своих куки прокси проверяет состояние сессии на OAuth2 сервере и получает новый токен доступа. То есть, если в поле ''cookie_refresh'' стоит значение 1 минута, 1 раз в минуту (если пользователь отправляет запросы 1 раз в 10 секунд, то каждый 6 запрос будет обновлять куки прокси) OAuth2-proxy будет обновлять свои куки ''_oauth2_proxy'' и обновлять состоянии сессии аутентификации на сервере OAuth2 с получением токена доступа. Если сессия OAuth2 завершена, пользователь будет перенаправлен на точку входа аутентификации сервера OAuth2. &lt;br /&gt;
&lt;br /&gt;
== Выход пользователя из системы ==&lt;br /&gt;
&lt;br /&gt;
Процедура выхода пользователя из Svacer состоит из двух этапов. На первом этапе производится инвалидация токена Svacer, далее осуществляется переход по ссылке указанной в параметре ''oauth_proxy.sign_out'' с тем, чтобы прокси сервер или/и OAuth2 сервер смогли выполнить инвалидацию сущностей аутентификации, выданных пользователю. Явным признаком корректной работы выхода пользователя из системы является отсутствие данных аутентификации в куках сервера OAuth2 (и/или прокси) после выхода пользователя из системы.&lt;br /&gt;
&lt;br /&gt;
== Работа со Svacer через CLI ==&lt;br /&gt;
Для работы в Svacer через CLI необходимо создать Personal Token в графическом интерфейсе и передавать его каким-либо предусмотренным способом (например, через переменную окружения SVACER_AUTH_TOKEN).&lt;br /&gt;
&lt;br /&gt;
== Автоназначение ролей пользователю на основе содержимого Claims токена ==&lt;br /&gt;
В Svacer реализован механизм автоназначения ролей пользователю на основе получаемого от провайдера аутентификации (например KeyCloak) токена. Для работы этого механизма необходимо:&lt;br /&gt;
&lt;br /&gt;
# В Svacer создать необходимые роли (доступные для автоназначения)&lt;br /&gt;
# Посредством настройки провайдера аутентификации добавить в Claims пользователя два поля. Первое поле (token.claims.sync_roles) - содержит список администрируемых ролей. Второе поле  содержит список ролей, доступных в текущий момент пользователю (token.claims.role). &lt;br /&gt;
# Указать название полей из пункта 2 в полях конфигурации token.claims.role и token.claims.sync_roles&lt;br /&gt;
&lt;br /&gt;
Механизм автоназначения ролей будет обеспечивать наличие у пользователя ролей, получаемых по следующей формуле: &amp;lt;code&amp;gt;haveSet.Sub(syncSet).Add(tokenSet.Mul(syncSet))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
* haveSet — текущее множество ролей пользователя&lt;br /&gt;
* syncSet — роли из списка sync_roles&lt;br /&gt;
* token_set — роли из списка role&lt;br /&gt;
* Sub, Add, Mul — соответствующие операции над множествами&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С версии 11 в поле Claims, указанном в конфигурации в '''token.Claims.role''', должен находится массив ролей, а не единcтвенное значение}}&lt;br /&gt;
&lt;br /&gt;
== Возможные проблемы при настройке ==&lt;br /&gt;
&lt;br /&gt;
=== Сообщение 'Cookies not found' ===&lt;br /&gt;
&lt;br /&gt;
Проблема в DNS имена хоста Keycloak. Проблема встречается когда хост Keycloak имеет разные имена или в некоторых случаях обращение к нему происходит по IP адресу.&lt;br /&gt;
&lt;br /&gt;
=== Сообщение 'Invalid parameter: redirect_url' ===&lt;br /&gt;
&lt;br /&gt;
[[File:Image-20240529151256529.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
При перенаправлении пользователя на Keycloak сервер, OAuth2-proxy передал неверное значение в параметре ''redirect_uri''. Необходимо проверить, что в настройках Keycloak и в параметре ''redirect_uri'' OAauth2-proxy находятся одинаковые значения&lt;br /&gt;
&lt;br /&gt;
[[File:Image-20240529152158450.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
=== Сообщение 'CSRF cookie failed validation' ===&lt;br /&gt;
Данная ошибка появляется по следующим причинам:&lt;br /&gt;
* ''csrf'' токен не найден в куках; Можно открыть консоль разработчика и убедится, что в куках для хоста oauth2-proxy есть кука: ''_oauth2_proxy_csrf_XXXXX''&lt;br /&gt;
* ''csrf'' токен истек; Для решения проблемы можно увеличить время действия ''csrf'' токена (см. [[OIDC#Конфигурация OAuth2-proxy|Конфигурация OAuth2-proxy]])&lt;br /&gt;
* был произведен перезапуск oauth2-proxy, а строка адреса в URL осталась от предыдущего запуска; Попробовать начать процедуру входа снова, перейдя на главную страницу OAuth2-proxy&lt;br /&gt;
&lt;br /&gt;
=== Строка переключения языка GUI Svacer и белый экран. ===&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer недоступен.&lt;br /&gt;
&lt;br /&gt;
=== При работе с CLI возникает ошибка: 'Failed to query server. Details: server response error: 403' ===&lt;br /&gt;
&lt;br /&gt;
Не прописано исключение для запроса: /''api/public/server/info''&lt;br /&gt;
&lt;br /&gt;
=== При работе с CLI возникает ошибка: 'Cannot get authentication settings from server StatusCode: 403' ===&lt;br /&gt;
&lt;br /&gt;
Не прописано исключение для запроса: ''/api/auth_settings''&lt;br /&gt;
&lt;br /&gt;
=== При работе с CLI возникает ошибка: 'ERROR: invalid character '&amp;lt;' looking for beginning of value' ===&lt;br /&gt;
&lt;br /&gt;
Не прописано исключение для запроса: ''/api/public/oidc/login''&lt;br /&gt;
&lt;br /&gt;
== Конфигурация в Docker ==&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся примеры конфигурации контейнеров для запуска Svacer в тестовом режиме с целью понимания логики работы oauth2-proxy совместно со Svacer и сервером Keycloak.&lt;br /&gt;
&lt;br /&gt;
=== Образы Docker ===&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
&lt;br /&gt;
Файл Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;FROM ubuntu:22.04&lt;br /&gt;
&lt;br /&gt;
LABEL maintainer=&amp;quot;akuzmin@ispras.ru&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
&lt;br /&gt;
RUN apt update &amp;amp;amp;&amp;amp;amp; apt install -y --no-install-recommends curl \&lt;br /&gt;
    &amp;amp;amp;&amp;amp;amp; rm -rf /var/cache/apt/archives /var/lib/apt/lists/* \&lt;br /&gt;
    &amp;amp;amp;&amp;amp;amp; mkdir -p /svacer/bin &amp;amp;amp;&amp;amp;amp; mkdir -p /svacer/store &lt;br /&gt;
&lt;br /&gt;
COPY svacer/bin/svacer-server /svacer/bin/&lt;br /&gt;
COPY svacer/bin/svacer /svacer/bin/&lt;br /&gt;
&lt;br /&gt;
WORKDIR /svacer/bin&lt;br /&gt;
&lt;br /&gt;
ENV STORE=/svacer/store&lt;br /&gt;
ENV SVACER_PG_URL=postgres://svace:svace@127.0.0.1:5432/svace&lt;br /&gt;
ENV MEMSETTINGS=default&lt;br /&gt;
ENV PATH=/svacer/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
EXPOSE 8080&lt;br /&gt;
&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL --config /config/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OAuth2-proxy ====&lt;br /&gt;
&lt;br /&gt;
Файл Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;FROM ubuntu:22.04&lt;br /&gt;
LABEL maintainer=&amp;quot;chernykov_sv@ispras.ru&amp;quot;&lt;br /&gt;
RUN mkdir /config&lt;br /&gt;
RUN mkdir /logs&lt;br /&gt;
#COPY oauth.cfg oauth.cfg&lt;br /&gt;
WORKDIR /oauth&lt;br /&gt;
COPY oauth2-proxy oauth2-proxy&lt;br /&gt;
COPY start.sh start.sh&lt;br /&gt;
RUN apt update &amp;amp;amp;&amp;amp;amp; apt install curl -y&lt;br /&gt;
ENTRYPOINT [&amp;quot;/bin/bash&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;/oauth/start.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скрипт start.sh (полезен для определения факта запуска Keycloak контейнера):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
exit='no'&lt;br /&gt;
start='no'&lt;br /&gt;
tmt=60&lt;br /&gt;
echo &amp;quot;Using $KEYCLOAK_HOST&amp;quot;&lt;br /&gt;
until [[ $exit == 'yes' ]]; do&lt;br /&gt;
  sleep 5&lt;br /&gt;
  tmt=$(($tmt-5))&lt;br /&gt;
  if [[ $tmt == 0 ]]; then&lt;br /&gt;
    exit='yes'&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  resp=`curl --head -fsS  http://$KEYCLOAK_HOST/health/ready`&lt;br /&gt;
  if [[ $? == 0 ]]; then&lt;br /&gt;
    exit='yes'&lt;br /&gt;
    start='yes'&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
if [[ $start == 'yes' ]]; then&lt;br /&gt;
echo 'Starting oauth...'&lt;br /&gt;
./oauth2-proxy --config /config/oauth.cfg --logging-filename /logs/oauth.log&lt;br /&gt;
else&lt;br /&gt;
 echo &amp;quot;Keycloak is not ready ...Can not start oauth2_proxy&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Docker-compose ===&lt;br /&gt;
Файл docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;version: &amp;quot;3.6&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  oauth_proxy:&lt;br /&gt;
    image: oauth_proxy&lt;br /&gt;
    container_name: oauth_proxy&lt;br /&gt;
    environment:&lt;br /&gt;
      - OAUTH2_PROXY_HTTP_ADDRESS=http://oauth_proxy:8080&lt;br /&gt;
      - OAUTH2_PROXY_UPSTREAMS=http://svacer:8080&lt;br /&gt;
      - OAUTH2_PROXY_REDIRECT_URL=http://oauth_proxy:4180/oauth2/callback&lt;br /&gt;
      - OAUTH2_PROXY_OIDC_ISSUER_URL=http://keycloak:8888/realms/svacer&lt;br /&gt;
      - KEYCLOAK_HOST=keycloak:8888&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./config/proxy:/config&lt;br /&gt;
      - ./logs:/logs&lt;br /&gt;
&lt;br /&gt;
    depends_on:&lt;br /&gt;
      svacer:&lt;br /&gt;
          condition: service_healthy&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;4180:8080&amp;quot;&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
        ipv4_address: 10.10.10.2&lt;br /&gt;
&lt;br /&gt;
  postgresql:&lt;br /&gt;
    image: postgres:12.16&lt;br /&gt;
    container_name: oauth_postgres&lt;br /&gt;
    restart: always&lt;br /&gt;
    shm_size: 1g&lt;br /&gt;
    environment:&lt;br /&gt;
      - POSTGRES_DB=svace&lt;br /&gt;
      - POSTGRES_USER=svace&lt;br /&gt;
      - POSTGRES_PASSWORD=svace&lt;br /&gt;
      - POSTGRES_ROOT_PASSWORD=svace&lt;br /&gt;
    expose:&lt;br /&gt;
      - &amp;quot;5432&amp;quot;&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./postgres_data:/var/lib/postgresql/data&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
         ipv4_address: 10.10.10.3&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: pg_isready -U svace&lt;br /&gt;
      interval: 8s&lt;br /&gt;
      start_period: 16s&lt;br /&gt;
      timeout: 4s&lt;br /&gt;
      retries: 4&lt;br /&gt;
&lt;br /&gt;
  keycloak:&lt;br /&gt;
    image: keycloak:latest&lt;br /&gt;
    container_name: oauth_keycloak&lt;br /&gt;
    environment:&lt;br /&gt;
      - KEYCLOAK_ADMIN=admin&lt;br /&gt;
      - KEYCLOAK_ADMIN_PASSWORD=1234&lt;br /&gt;
      - KEYCLOAK_LOGLEVEL=TRACE&lt;br /&gt;
      - KC_HEALTH_ENABLED=true&lt;br /&gt;
    command: &lt;br /&gt;
      - start-dev&lt;br /&gt;
      - --import-realm&lt;br /&gt;
      - --http-port=8888&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./keycloak_realm:/opt/keycloak/data/import&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8888:8888&amp;quot;&lt;br /&gt;
    expose:&lt;br /&gt;
      - &amp;quot;8888&amp;quot;&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
         ipv4_address: 10.10.10.3&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: pg_isready -U svace&lt;br /&gt;
      interval: 8s&lt;br /&gt;
      start_period: 16s&lt;br /&gt;
      timeout: 4s&lt;br /&gt;
      retries: 4&lt;br /&gt;
&lt;br /&gt;
  svacer:&lt;br /&gt;
    image: oauth_svacer:latest&lt;br /&gt;
    container_name: oauth_svacer&lt;br /&gt;
    restart: always&lt;br /&gt;
    shm_size: 1g&lt;br /&gt;
    depends_on:&lt;br /&gt;
      postgresql:&lt;br /&gt;
        condition: service_healthy&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;3002:3002&amp;quot;&lt;br /&gt;
      - &amp;quot;18080:8080&amp;quot;&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./svacer_data:/data&lt;br /&gt;
      - ./config/svacer/:/config&lt;br /&gt;
    environment:&lt;br /&gt;
      - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
      - SVACER_DEBUG=true&lt;br /&gt;
      - SVACER_OPT='--config /config/oidc3.yaml'&lt;br /&gt;
      - STORE=/data/store&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
         ipv4_address: 10.10.10.5&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: curl --fail http://localhost:8080/api/health || exit 1&lt;br /&gt;
      interval: 8s&lt;br /&gt;
      start_period: 16s&lt;br /&gt;
      timeout: 4s&lt;br /&gt;
      retries: 4&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  svacer_oauth:&lt;br /&gt;
    driver: bridge&lt;br /&gt;
    ipam:&lt;br /&gt;
      config:&lt;br /&gt;
        - subnet: 10.10.10.0/24&lt;br /&gt;
          gateway: 10.10.10.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2938</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2938"/>
		<updated>2025-05-16T13:30:20Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;svacer server token admin delete --id token_id&amp;lt;/code&amp;gt; - удаление токена.  &amp;lt;code&amp;gt;svacer server token list --user user_id_or_login&amp;lt;/code&amp;gt;. Требуется наличие прав по управлению пользователями.&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на создаваемые токены - нельзя с помощью такого токена создавать другие токены. Каждый пользователь может создавать токены также через public api: /api/public/personal_token. См. описание swagger.&lt;br /&gt;
&lt;br /&gt;
Созданные токены можно в дальнейшем использовать в качестве значения переменной окружения SVACER_AUTH_TOKEN&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2937</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2937"/>
		<updated>2025-05-16T13:28:37Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;svacer server token admin delete --id token_id&amp;lt;/code&amp;gt; - удаление токена.  &amp;lt;code&amp;gt;svacer server token list --user user_id_or_login&amp;lt;/code&amp;gt;. Требуется наличие прав по управлению пользователями.&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на создаваемые токены - нельзя с помощью такого токена создавать другие токены. Каждый пользователь может создавать токены также через public api: /api/public/personal_token. См. описание swagger.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2936</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2936"/>
		<updated>2025-05-16T13:28:05Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;svacer server token admin delete --id token_id&amp;lt;/code&amp;gt; - удаление токена.  &amp;lt;code&amp;gt;svacer server token list --user user_id_or_login&amp;lt;/code&amp;gt;. Требуется наличие прав по управлению пользователями.&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на создаваемые токены - нельзя с помощью такого токена создавать другие токены. Каждый пользователь может создавать токены также через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2935</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2935"/>
		<updated>2025-05-16T13:27:23Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;svacer server token admin delete --id token_id&amp;lt;/code&amp;gt; - удаление токена.  &amp;lt;code&amp;gt;svacer server token list --user user_id_or_login&amp;lt;/code&amp;gt;. Требуется наличие прав по управлению пользователями.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2934</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2934"/>
		<updated>2025-05-16T13:27:08Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;svacer server token admin delete --id token_id&amp;lt;/code&amp;gt; - удаление токена.  &amp;lt;code&amp;gt;svacer server token list --user user_id_or_login&amp;lt;/code&amp;gt;Требуется наличие прав по управлению пользователями.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2933</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2933"/>
		<updated>2025-05-16T13:24:55Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;svacer server token admin [list,delete] --id token_id --user user&amp;lt;/code&amp;gt;. Требуется наличие прав по управлению пользователями.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2931</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2931"/>
		<updated>2025-05-16T13:23:24Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Просмотреть список созданных токенов. &amp;lt;code&amp;gt;svacer server token list&amp;lt;/code&amp;gt;&lt;br /&gt;
* Удалить токен &amp;lt;code&amp;gt;svacer server token delete --id token_id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Управлять токенами других пользователей &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;. Требуется наличие прав по управлению пользователями.&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2929</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2929"/>
		<updated>2025-05-16T13:20:41Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены. &amp;lt;code&amp;gt;svacer server token create --name token_name --ttl day_to_live --details more_info&amp;lt;/code&amp;gt; TTL указывается в днях. Параметры name, ttl - обязательны&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2928</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2928"/>
		<updated>2025-05-16T13:19:47Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены svacer server token create --name token_name --ttl day_to_live --details more_info&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2926</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2926"/>
		<updated>2025-05-16T13:18:37Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;aaaa&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2924</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2924"/>
		<updated>2025-05-16T13:18:12Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Создавать токены &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2923</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2923"/>
		<updated>2025-05-16T13:17:50Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;. Команда позволяет:&lt;br /&gt;
&lt;br /&gt;
* Создавать токены &lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2922</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2922"/>
		<updated>2025-05-16T13:16:22Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &amp;lt;code&amp;gt;svacer server token&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2921</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2921"/>
		<updated>2025-05-16T13:16:02Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Аутентификация с использование Personal Token */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Svacer поддерживает работу с Personal Token для аутентификации. Для этого используется команда &lt;br /&gt;
&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2920</id>
		<title>Help:CLI</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:CLI&amp;diff=2920"/>
		<updated>2025-05-16T13:14:30Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CLI features ==&lt;br /&gt;
=== Перенос снимков ===&lt;br /&gt;
Svacer предоставляет возможность по экспорту и импорту снимков посредством интерфейса командной строки и [[Help:UI manual#Работа со снимками|веб-интерфейса]]. Экспорт снимка включает все предупреждения, информацию о снимке, прикрепленные файлы, объект сборки, пользовательские атрибуты, разметку и комментарии. Подавленные предупреждения также включаются в экспортированную информацию и импортируются в статусе подавленных.&lt;br /&gt;
&lt;br /&gt;
Экспорт и импорт снимков из командной строки доступен пользователям с [[Help:UI manual#Описание ролевой модели|соответствующими правами]] для выбранного проекта/ветки.&lt;br /&gt;
&lt;br /&gt;
Экспорт снимков:&lt;br /&gt;
    svacer server export&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --snapshot &amp;lt;snapshot name or id&amp;gt; &lt;br /&gt;
        &amp;lt;output file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Импорт снимков:&lt;br /&gt;
    svacer server import&lt;br /&gt;
        --user &amp;lt;user&amp;gt; &lt;br /&gt;
        --password &amp;lt;pwd&amp;gt; &lt;br /&gt;
        --host &amp;lt;host&amp;gt; &lt;br /&gt;
        --port &amp;lt;port&amp;gt; &lt;br /&gt;
        --grpc &amp;lt;grpc port&amp;gt; &lt;br /&gt;
        --project &amp;lt;project name or id&amp;gt; &lt;br /&gt;
        --branch &amp;lt;branch name or id&amp;gt; &lt;br /&gt;
        --name &amp;lt;new name for snapshot&amp;gt;&lt;br /&gt;
        [--force]&lt;br /&gt;
        &amp;lt;input file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опция '''--force''' создаст проект и ветку, если их не было на сервере.&lt;br /&gt;
&lt;br /&gt;
=== Создание PDF отчета ===&lt;br /&gt;
Для создания PDF отчета по проекту из интерфейса командной строки используется команда  '''pdfgen'''. &lt;br /&gt;
&lt;br /&gt;
Общий вид команды следующий:&lt;br /&gt;
  svacer pdfgen --cmp-mode [none|new|missing|matched|same] --project [name|id] --branch [name|id] --snapshot [name|id] [--target-project [name|id] --target-branch [name|id] --target-snapshot [name|id]] [--file [re_exp] --checker [re_exp] --severity [re_exp] --review [re_exp]] --out-file report_name --tz time_zone --lang report_lang&lt;br /&gt;
&lt;br /&gt;
* '''cmpMode''' — параметры сравнения. Возможные значения: '''none''' — без сравнения, '''new''' — новые, '''missing''' — отсутствующие, '''matched''' — сопоставленные, '''same''' — одинаковые&lt;br /&gt;
* '''project, branch, snapshot''' — параметры, описывающие снимок, отчет для которого требуется создать. В качестве значений могут использоваться как имена, так и идентификаторы соответствующих сущностей. Например: --project zstd  --branch &amp;quot;7683ed6a-b838-4090-9945-10e148f94be3&amp;quot; --snapshot zstd_130&lt;br /&gt;
* '''target-project, target-branch, target-snapshot''' — параметры, описывающие снимок, с которым необходимо провести сравнение (обязательные параметры для режимов cmpMode: new, missing, matched, same).&lt;br /&gt;
* '''file, checker, severity, review''' — параметры, задающие фильтры, применяемые к списку маркеров. Фильтры задают условия включения маркера в отчет. Значения фильтров задаются в формате регулярных выражений. В случае неверного формата, ошибочный фильтр не будет применяться и операция экспорта будет выполнена, как если бы фильтр не был указан. File — фильтр по пути к файлу, где был обнаружен маркер. Checker — фильтр по чекеру, предупреждение от которого было создано. Severity — серьезность сработавшего чекера. Review — статус разметки (confirmed, unclear и т. д.) &lt;br /&gt;
* '''out-file''' — имя создаваемого файла отчета. Если не указано расширение, будет добавлено расширение pdf&lt;br /&gt;
* '''tz''' — временная зона в минутах. Используется при формировании записи  о комментариях, которые оставил пользователь, производивший разметку&lt;br /&gt;
* '''lang''' — язык, который будет использован в создаваемом отчете (en — английский, ru — русский)&lt;br /&gt;
&lt;br /&gt;
Для создания отчета без использования режима сравнения, необходимо указать cmpMode в значение none (это значение используется по умолчанию).&lt;br /&gt;
&lt;br /&gt;
Для предварительного формирования таблицы маркеров с учетом сравнения, использовать значения cmpMode [new, missing, same, matched]. Названия этих режимов аналогичны названиями в GUI. При этом требуется указание как минимум одного параметра из списка: target-project, target-branch, target-snapshot. Если какие-то параметры target* не указаны, они будут установлены в значение исходных (project -&amp;gt; target-project, branch -&amp;gt; target-branch, ...). Сформированные на предварительном этапе маркеры, проходят механизм фильтраций (параметры: severity, file, review, checker), после чего происходит создание отчета.&lt;br /&gt;
&lt;br /&gt;
Для создания отчета можно использовать public API:&lt;br /&gt;
:URL — /api/public/exportPDF&lt;br /&gt;
:Метод — POST&lt;br /&gt;
&lt;br /&gt;
Тело запроса — JSON, имеет следующий вид: &lt;br /&gt;
    {&lt;br /&gt;
    &amp;quot;compare_mode&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
    &amp;quot;context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_131&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
    &amp;quot;target_context&amp;quot;:{&lt;br /&gt;
      &amp;quot;project&amp;quot;: &amp;quot;zstd&amp;quot;,&lt;br /&gt;
      &amp;quot;branch&amp;quot;: &amp;quot;v13&amp;quot;,&lt;br /&gt;
      &amp;quot;snapshot&amp;quot;: &amp;quot;zstd_132&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;,&lt;br /&gt;
     &amp;quot;timezone&amp;quot;: 180,&lt;br /&gt;
     &amp;quot;filters&amp;quot;: {&lt;br /&gt;
       &amp;quot;checker&amp;quot;: &amp;quot;^Z.*$&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;.*example.*&amp;quot;,&lt;br /&gt;
       &amp;quot;severity&amp;quot;: &amp;quot;Cr.*&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: &amp;quot;Conf.*&amp;quot;&lt;br /&gt;
     } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Данный запрос соответствует запросу на создание отчета, который получается в результате сравнения в рамках проекта zstd и ветки v13 двух снимков zstd_131 и zstd_132. При этом будут выбраны только новые маркеры. Среди выбранных останутся только те, что удовлетворяют условиям фильтров, а именно: чекер начинается с буквы Z, файл содержит слово example, серьезность чекера содержит подстроку Cr (что в силу ограниченного количества значений для данного фильтра соответствует значению Critical) в названии, а состояние разметки содержит подстроку Conf (что в силу ограниченного количества значений для данного фильтра соответствует значению Confirmed). Язык отчета — английский, часовой пояс — 180 минут (3 часа).&lt;br /&gt;
&lt;br /&gt;
=== Импорт разметки из исходного кода ===&lt;br /&gt;
Импорт разметки из исходного кода на сервер истории возможен с помощью команды '''svacer markup import''', или с помощью CLI/REST API [[Markup2]].&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --snapshot &amp;lt;snapshot id or name&amp;gt; import --template &amp;lt;name&amp;gt; [--exclude-paths &amp;lt;path1, path2, ..., pathN&amp;gt; --from-build-object]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в который будет произведен импорт разметки&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которую будет произведен импорт разметки&lt;br /&gt;
* snapshot — снимок в выбранных проекте и ветке (по умолчанию последний загруженный), в который будет произведен импорт разметки&lt;br /&gt;
* exclude-paths — исключает файлы, соответствующие регулярным выражениям&lt;br /&gt;
* template — определяет имя шаблона для импорта разметки (флаг обязательный, в отличие от экспорта)&lt;br /&gt;
* from-build-object — при включении этой опции, разметка будет выгружаться из объекта сборки того снимка, который был указан в опциях выше.&lt;br /&gt;
&lt;br /&gt;
После выполнения команды все комментарии оставленные в коде в соответствии с выбранным шаблоном разметки будут разобраны и добавлены на сервер истории в соответствующий проект, ветку и снимок.&lt;br /&gt;
&lt;br /&gt;
Для подавления найденных предупреждений следует использовать следующий формат разметки в исходном коде&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: -&amp;lt;warn class&amp;gt;[|-&amp;lt;warn class&amp;gt;]+ &lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
&lt;br /&gt;
  if (!strncmp(&amp;quot;--filelimit&amp;quot;,argv[i],11)) {&lt;br /&gt;
    j = 11; //svacer_review: -UNUSED_VALUE&lt;br /&gt;
    if (*(argv[i]+11) == '=') {&lt;br /&gt;
&lt;br /&gt;
Комментарий должен быть расположен в конце строки, где ожидается предупреждение от анализатора Svace.&lt;br /&gt;
&lt;br /&gt;
Для импорта разметки при использовании команд '''import --upload''' и '''upload''' следует указывать флаг '''--template &amp;lt;template&amp;gt;'''. В таком случае разметка будет импортирована из объекта сборки сразу после загрузки его на сервер.&lt;br /&gt;
&lt;br /&gt;
==== Шаблон разметки DEFAULT ====&lt;br /&gt;
Сервер позволяет добавить собственные шаблоны разметки, для удобства добавлен неудаляемый шаблон DEFAULT. Список шаблонов можно увидеть в '''Settings &amp;gt; Markup templates''' (при наличии прав доступа).&lt;br /&gt;
&lt;br /&gt;
Шаблон можно использовать как для импорта, так и для экспорта разметки, поэтому можно проверить ожидаемый формат через [[Help:UI manual#Экспорт кода с разметкой|выгрузку кода]] с указанием шаблона.&lt;br /&gt;
&lt;br /&gt;
В шаблоне DEFAULT каждая разметка описывается на отдельной строчке перед маркером, при необходимости можно использовать несколько строчек. Импорт разметки с неправильным статусом или со статусом Undecided не производится, включая комментарии к ней.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
  //svacer_review: FORMAT_STRING.PARAM_EXCESS r:Confirmed|s:Minor|a:Undecided|c:&lt;br /&gt;
  //svacer_review: UNINIT.LOCAL_VAR r:Confirmed|s:Unspecified|a:Fix required|c:will be fixed&lt;br /&gt;
  printf(&amp;quot;v = %d&amp;quot;, fl3(), i);&lt;br /&gt;
&lt;br /&gt;
Разметка нескольких одинаковых предупреждений на одной строчке проблематична, гарантируется только что разметка будет применена к маркеру с таким названием.&lt;br /&gt;
&lt;br /&gt;
=== Изменение инвариантов (--path-prefix) ===&lt;br /&gt;
Если на сервер был загружен снимок, в котором расположение некоторых (или всех) файлов поменялось, а при импорте не был указан флаг '''--path-prefix''', то разметка с прошлого снимка не распространится на новый снимок. Для решения данной проблемы следует использовать команду '''svacer markup update'''.&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
  svacer markup update --user &amp;lt;user&amp;gt; --password &amp;lt;password&amp;gt; --project &amp;lt;project id or name&amp;gt; --branch &amp;lt;branch id or name&amp;gt; --path-prefix &amp;lt;prefix:replacement; prefix:replacement&amp;gt; [&amp;lt;snapshot id or name&amp;gt;1, &amp;lt;snapshot id or name&amp;gt;2, ..., &amp;lt;snapshot id or name&amp;gt;N]&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
* user, password — пользователь и пароль учетной записи на сервере&lt;br /&gt;
* project — проект на сервере, в котором будет обновлена разметка&lt;br /&gt;
* branch — ветка в проекте выбранном выше (по умолчанию master), в которой будет обновлена разметка&lt;br /&gt;
* path-prefix — правило отображения для префиксов путей в формате: &amp;lt;file&amp;gt; или line prefix:replacement;prefix:replacement&lt;br /&gt;
&lt;br /&gt;
В конце команды опционально могут быть указаны имена или идентификаторы снимков, в которых будет обновлена разметка в соответствии с указанными префиксами путей. Если они указаны не будут, изменения будут применены ко всей ветке. После запуска команды на сервер будет отправлен асинхронный запрос на обновление разметки, за дальнейшим прогрессом исполнения можно следить в логе сервера (через UI он доступен пользователям с ролью admin в '''Settings &amp;gt; Server information''').&lt;br /&gt;
&lt;br /&gt;
=== Подавление предупреждений ===&lt;br /&gt;
Для подавление выбранных пользователем предупреждений предоставляется следующий интерфейс командной строки:&lt;br /&gt;
&lt;br /&gt;
Список подавленных предупреждений (печатает JSON)&lt;br /&gt;
  svacer markup [auth/selection] suppress list&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подавить предупреждение&lt;br /&gt;
  svacer markup [auth/selection] suppress add id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress add 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать подавление предупреждения&lt;br /&gt;
  svacer markup [auth/selection] suppress remove id1 id2 id3&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove 29d298cd-752d-4d19-b535-2089a72a96af&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Убрать все подавления&lt;br /&gt;
  svacer markup [auth/selection] suppress remove&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
  svacer markup --user admin --password admin --project tree-command suppress remove&lt;br /&gt;
&lt;br /&gt;
Список предупреждений с ID доступен посредством public REST API. Функциональность предназначена для интеграции со сторонними инструментами и встраивания в CI/CD pipeline.&lt;br /&gt;
На текущий момент информация о подавленных предупреждениях недоступна в веб-интерфейсе.&lt;br /&gt;
&lt;br /&gt;
При экспортировании снимка где есть подавленные предупреждения, сами предупреждения будут так же экспортированы как подавленные.&lt;br /&gt;
&lt;br /&gt;
=== Автомиграция разметки ===&lt;br /&gt;
В Svacer возможно настроить автомиграцию разметки с ветки на ветку (у пользователя должны быть права на администрирование сервера).&lt;br /&gt;
&lt;br /&gt;
  svacer server automigrate [command] [flags]&lt;br /&gt;
&lt;br /&gt;
Существующие command:&lt;br /&gt;
* add — добавляет автомиграцию в соответствии с паттерном&lt;br /&gt;
* delete — удаляет автомиграцию&lt;br /&gt;
* show_config — показывает все заданные миграции (Config Table), их id, время создания и пользователя, который их создал&lt;br /&gt;
* show_automigrate — показывает таблицу всех существующих проектов и веток с которых и на которые происходят автоматические миграции (Automigrate Table)&lt;br /&gt;
* log — выводит список всех совершенных миграций (Done Automigrate Table)&lt;br /&gt;
&lt;br /&gt;
Флаг '''pattern''', применяется для команд &amp;lt;code&amp;gt;&amp;lt;add|delete|show_config|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''add''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:regEx — в [https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP формате как для PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': Паттерн автомиграции в формате: &amp;lt;code&amp;gt;srcProject{id|name}/srcBranch{id|name}=&amp;gt;receiveProject{id|name|regEx}/receiveBranch{id|name|regEx}&amp;lt;/code&amp;gt;&lt;br /&gt;
:Паттерн должен быть точно таким же, как он записан в Config Table&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''': Паттерн автомиграции. Поиск будет происходить в следующем виде: &amp;lt;code&amp;gt;ILIKE &amp;quot;'%&amp;quot;+pattern+&amp;quot;%'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''log''': Флаг в формате &amp;lt;code&amp;gt;srcProjectId/srcBranchId=&amp;gt;receiveProjectId/receiveBranchId&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;srcProjectName/srcBranchName=&amp;gt;receiveProjectName/receiveBranchName&amp;lt;/code&amp;gt; для вывода автомиграций с данным паттерном&lt;br /&gt;
&lt;br /&gt;
Флаг '''id''', применяется для command &amp;lt;code&amp;gt;&amp;lt;delete|show_automigrate&amp;gt;&amp;lt;/code&amp;gt; в формате uuid&lt;br /&gt;
&lt;br /&gt;
* Для '''delete''': id для удаления автомиграции (из Config Table)&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate''': id ветки/проекта или конфигурации для нахождения его в таблице автомиграций (Automigrate Table) и вывода автомиграций, где присутствует данный id&lt;br /&gt;
&lt;br /&gt;
Флаг '''format''' — формат вывода таблицы. Применяется для command &amp;lt;code&amp;gt;&amp;lt;show_config|show_automigrate|log&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Для '''show_config''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:* no-id — вывод без config id&lt;br /&gt;
:Значения можно перечислить через запятую: &amp;lt;code&amp;gt;json,no-id&amp;lt;/code&amp;gt;. По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
* Для '''show_automigrate|log''':&lt;br /&gt;
:* table — вывод в виде таблицы&lt;br /&gt;
:* json — вывод в виде json&lt;br /&gt;
:По умолчанию — table.&lt;br /&gt;
&lt;br /&gt;
Также возможно использовать POST запрос по адресу &amp;lt;code&amp;gt;/api/automigrate&amp;lt;/code&amp;gt;. В теле передается json, с полями &amp;lt;code&amp;gt;action(not null), pattern, id&amp;lt;/code&amp;gt;. Выполняется по тому же принципу, что и в CLI.&lt;br /&gt;
&lt;br /&gt;
Принцип работы сервиса: &lt;br /&gt;
* При запуске сервера запускается сервис automigrate&lt;br /&gt;
* При занесении новой миграции, находит все миграции, подходящие под паттерн, и копирует разметку на них&lt;br /&gt;
* При удалении миграции, удаляет её из таблицы Config и удаляет из таблицы автомиграций&lt;br /&gt;
* '''Может''' копировать разметку с нескольких веток на одну, а также поддерживает цепочки и циклы автомиграций (например 1-&amp;gt;2-&amp;gt;3-&amp;gt;1)&lt;br /&gt;
&lt;br /&gt;
* При любом изменении разметки у существующих веток (добавление/удаление/изменение комментариев, добавление снимка, добавление проекта, добавление ветки, изменение имени ветки/проекта, удаление контейнера, удаление снимка) происходит либо миграция разметки, либо добавление новых миграций в таблицу автомиграций и миграция разметки, либо удаление миграции из таблицы автомиграций (в зависимости от конкретной ситуации). При какой-либо ошибке выдает предупреждение, но даёт выполнить действие.&lt;br /&gt;
&lt;br /&gt;
* Единственный случай, когда сервис не даёт выполнить действие — загрузка результатов Svace через CLI: upload, либо import с флагом --upload. В этом случае сервис выдает ошибку миграции и отменяет загрузку. Такое может произойти, когда имя данной ветки (в качестве to_branch) подходит под несколько паттернов.&lt;br /&gt;
* Копируется последняя примененная разметка&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация из переменных окружения ===&lt;br /&gt;
Пользователь может использовать следующие переменные окружения для выполнения аутентификации при использовании CLI&lt;br /&gt;
 SVACER_AUTH_CREDS=login:password&lt;br /&gt;
 SVACER_AUTH_TOKEN=token&lt;br /&gt;
В качестве токена нужно использовать токен, получаемый через REST endpoint &amp;lt;code&amp;gt;/api/public/login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также пользователь может задать переменную окружения SVACER_APP_KEY или передать в CLI ключ &amp;lt;code&amp;gt;--app-key&amp;lt;/code&amp;gt; для указания ключа подписи выдаваемых сервером Bearer токенов. Это позволит избежать необходимости повторого логина в веб интерфейсе Svacer после его перезапуска. Кроме того, сторонее приложение также сможет выдавать Bearer токены для сервера Svacer, которые сервер будет рассматривать как подлинные.&lt;br /&gt;
&lt;br /&gt;
=== Аутентификация с использование Personal Token ===&lt;br /&gt;
Сейчас наложено единственное ограничение на токены - нельзя с помощью такого токена создавать другие. Но этот вопрос (ограничения), мне кажется надо отдельно обсудить, так как Андрей Кузьмин упоминал, что их использование ограничено.&lt;br /&gt;
Каждый пользователь может создавать токены через public api: /api/public/private_token. Swagger по нему добавлен&lt;br /&gt;
Пользователи могут управлять токенами через cli. Для этого есть команда svacer server token.&lt;br /&gt;
&lt;br /&gt;
=== Вывод списка предупреждений ===&lt;br /&gt;
Пользователь может получить таблицу предупреждений с сервера, используя команду&lt;br /&gt;
&lt;br /&gt;
 svacer marker list --host host --user user --password password --project project_name_or_id --branch branch_name_or_id --snapshot snapshot_name_or_id&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 #     warn                                 file                            line   review  msg                                                 &lt;br /&gt;
 1000  INVARIANT_RESULT                     /.build/subst.c                 7080           Expression 'tl-&amp;gt;word-&amp;gt;flags | (1 &amp;lt;&amp;lt; 21)' is always  &lt;br /&gt;
                                                                                           true , which may be caused by a logical error       &lt;br /&gt;
 1001  DEREF_AFTER_NULL.LOOP                /.build/execute_cmd.c           3327           After having been compared to NULL value at execut  &lt;br /&gt;
                                                                                           e_cmd.c:3325, pointer 'l' is dereferenced at execu  &lt;br /&gt;
                                                                                           te_cmd.c:3327.                                      &lt;br /&gt;
 1002  DEREF_AFTER_NULL.LOOP                /.build/variables.c             2749           After having been compared to NULL value at variab  &lt;br /&gt;
                                                                                           les.c:2656, pointer 'vc' is dereferenced at variab  &lt;br /&gt;
                                                                                           les.c:2749.                                         &lt;br /&gt;
 1003  CHECK_AFTER_PASS_TO_PROC             /.build/redir.c                 1219           Variable 'redirector' was passed to function at re  &lt;br /&gt;
                                                                                           dir.c:1215 by calling function 'fcntl' that can't   &lt;br /&gt;
                                                                                           use negative values is checked for negative value   &lt;br /&gt;
                                                                                           at redir.c:1219.                                &lt;br /&gt;
&lt;br /&gt;
При указании флага &amp;lt;code&amp;gt;--out-format=json&amp;lt;/code&amp;gt; вывод будет произведен в JSON формате:&lt;br /&gt;
&lt;br /&gt;
 [{&amp;quot;id&amp;quot;:&amp;quot;e0ec7389-42a0-403c-9ce2-bfaa3bfa0228&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/subst.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;WORD_DESC * parameter_brace_expand_rhs()&amp;quot;,&amp;quot;line&amp;quot;:7080,&amp;quot;locID&amp;quot;:1000,&amp;quot;lang&amp;quot;:&amp;quot;CXX&amp;quot;,&amp;quot;tool&amp;quot;:&amp;quot;CSA&amp;quot;,&amp;quot;warnClass&amp;quot;:&amp;quot;INVARIANT_RESULT&amp;quot;,&amp;quot;mtid&amp;quot;:&amp;quot;CSA.INVARIANT_RESULT.1&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;Expression 'tl-\u003eword-\u003eflags | (1 \u003c\u003c 21)' is always true , which may be caused by a logical error&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;811ed8f680ae9b540707436615348aed6d32ee93&amp;quot;,&amp;quot;flags&amp;quot;:0,&amp;quot;invariant&amp;quot;:&amp;quot;TBXA/IYVZKVlH6f19tiGsd3stuI&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;184b85bf-a63f-4187-b290-25a5950b3353&amp;quot;,&amp;quot;file&amp;quot;:&amp;quot;/.build/execute_cmd.c&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;select_query&amp;quot;,&amp;quot;line&amp;quot;:3327,&amp;quot;locID&amp;quot;:1001,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Слияние снимков из CLI (экспериментальная опция) ===&lt;br /&gt;
Пользователь может объединить несколько снимков в один используя команду&lt;br /&gt;
 svacer container snapshot merge --host host --user user --password password --branch target_branch --name target_snapshot_name --snapshot val1 --snapshot val2 --snapshot val3 ...&lt;br /&gt;
При указании снимков для слияния и целевой ветки, пользователь может использовать либо UUID объектов либо формат&lt;br /&gt;
 целевая ветка: &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;&lt;br /&gt;
 снимок:        &amp;lt;project name&amp;gt;:::&amp;lt;branch name&amp;gt;:::&amp;lt;snapshot name&amp;gt;&lt;br /&gt;
При слиянии можно использовать снимки из разных проектов и веток. Пользователь должен иметь доступ на чтение ко всем снимкам и на запись для целевой ветки&lt;br /&gt;
&lt;br /&gt;
=== Управление контейнерами ===&lt;br /&gt;
См. [[Help:CLI/management/containers]]&lt;br /&gt;
&lt;br /&gt;
=== Управление пользователями и ролями ===&lt;br /&gt;
См. [[User Management (command line)]]&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое удаление снимков ===&lt;br /&gt;
См. [[Help:CLI/cleanup]]&lt;br /&gt;
&lt;br /&gt;
== Svacer server features ==&lt;br /&gt;
&lt;br /&gt;
=== Запуск с конфиг-файлом ===&lt;br /&gt;
 svacer-server run --config config.yml&lt;br /&gt;
&lt;br /&gt;
'''--config &amp;lt;value&amp;gt;''' — путь к файлу конфигураций в формате YAML (по умолчанию svacer.cfg)&lt;br /&gt;
&lt;br /&gt;
=== Поддержка сквозной аутентификации ===&lt;br /&gt;
Svacer поддерживает сквозную аутентификацию через reverse proxy. Для этого используется опция proxy-mode. При включении этой опции есть возможность проходить аутентификацию (используя HTTP Basic Authentication) на reverse proxy сервере и использовать эти данные для аутентификации на сервере Svacer.&lt;br /&gt;
&lt;br /&gt;
При включенном proxy-mode используется header с прокси '''Authorization Basic ...''', откуда Svacer берет имя пользователя и пароль, проверяет и аутентифицирует пользователя, если аккаунт с таким логином и паролем есть в БД пользователей Svacer.&lt;br /&gt;
&lt;br /&gt;
Пример запуска сервера с поддержкой сквозной аутентификации:&lt;br /&gt;
&lt;br /&gt;
  svacer-server run --proxy-mode&lt;br /&gt;
&lt;br /&gt;
=== Хуки ===&lt;br /&gt;
Для использования хуков при запуске сервера нужно указать опцию '''--hooks &amp;lt;path to JSON file&amp;gt;'''. Эта опция задаёт файл, содержащий описание хуков, которые пользователь может вызывать из web-интерфейса. Каждый хук соответствует процессу или скрипту, который сервер запускает при вызове соответствующей команды из web-интерфейса.&lt;br /&gt;
&lt;br /&gt;
Формат файла описания хуков следующий:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hooks&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;&amp;lt;id&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;lt;label &amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;target&amp;quot;: &amp;quot;&amp;lt;target&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&amp;quot;&amp;lt;param1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;param2&amp;gt;&amp;quot;, ...],&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;&amp;lt;path to executable&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;args&amp;quot;: [&amp;quot;&amp;lt;arg1&amp;gt;&amp;quot;, “&amp;lt;arg2&amp;gt;”, ...]&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
'''Параметры хуков '''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:100px;&amp;quot; | ''id''&lt;br /&gt;
| Идентификатор хука. Должен быть уникальным в файле&lt;br /&gt;
|-&lt;br /&gt;
| ''label''&lt;br /&gt;
| Имя команды, которую пользователь видит в web-интерфейсе&lt;br /&gt;
|-&lt;br /&gt;
| ''target''&lt;br /&gt;
| Место в UI, в которое будет добавлена команда. Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса&lt;br /&gt;
|-&lt;br /&gt;
| ''input''&lt;br /&gt;
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе. &amp;lt;br/&amp;gt;&lt;br /&gt;
Поддерживаемые значения:&lt;br /&gt;
* markerID — UUID идентификатор маркера;&lt;br /&gt;
* branchID — UUID идентификатор ветки;&lt;br /&gt;
* snapshotID — UUID идентификатор снимка;&lt;br /&gt;
* projectID — UUID идентификатор проекта;&lt;br /&gt;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;&lt;br /&gt;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке&lt;br /&gt;
|-&lt;br /&gt;
| ''cmd''&lt;br /&gt;
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска&lt;br /&gt;
|-&lt;br /&gt;
| ''args''&lt;br /&gt;
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка &amp;lt;args&amp;gt; и списка значений, соответствующих полю &amp;lt;input&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Типичный сценарий использования хуков — создание кейсов для выбранного предупреждения в системах отслеживания ошибок, таких как Jira или Gitlab. Примеры скриптов для этого можно найти на странице [[Примеры использования хуков]].&lt;br /&gt;
&lt;br /&gt;
=== Ограничение числа запросов ===&lt;br /&gt;
Чтобы ограничить число запросов на сервер Svacer, перед запуском сервера определите переменную окружения со следующими параметрами&lt;br /&gt;
&lt;br /&gt;
 SVACER_SERVER_THROTTLE_PARAMS=limit,backlogLimit,timeout&lt;br /&gt;
&lt;br /&gt;
* limit — число одновременных запросов            &lt;br /&gt;
* backlogLimit — размер бэклога для запросов, которые нельзя обработать сейчас            &lt;br /&gt;
* timeout — время ожидания запроса в бэклоге (формат 1m12s — duration)&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=2911</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=2911"/>
		<updated>2025-05-16T11:12:17Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 11-0-0 ===&lt;br /&gt;
май 2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для импорта и экспорта следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания мэппинга severity детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлен [[Help:Match#Классический режим генерации инвариантов|режим работы]] сервера где генерация инвариантов для переноса разметки соответствует режиму Svacer &amp;lt;=8.x.x. Режим включается через опции &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; или переменную окружения &amp;lt;code&amp;gt;SVACER_CLASSIC_INV_MODE=true|false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка OIDC&lt;br /&gt;
* Улучшена поддержка LDAP&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов Infisical&lt;br /&gt;
* Добавлена служба нотификаций пользователей через почтовые сообщения и мессенджер telegram&lt;br /&gt;
* Добавлен механизм аутентификации через Personal Token&lt;br /&gt;
* Добавлен механизм упоминания пользователей через специальную конструкцию @login в комментариях к разметке&lt;br /&gt;
* Добавлены дополнительные метрики в разделе Статистика&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=2910</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=2910"/>
		<updated>2025-05-16T11:09:09Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 11-0-0 ===&lt;br /&gt;
май 2025&lt;br /&gt;
&lt;br /&gt;
* Убраны излишние сообщения в логе сервера о login/logout операциях. Они будут выводиться только при запуске сервера с опцией &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Команды CLI &amp;lt;code&amp;gt;svacer sarif *&amp;lt;/code&amp;gt; были убраны, для импорта и экспорта следует использовать &amp;lt;code&amp;gt;svacer sarif2 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* Экспорт SARIF теперь включает все комментарии как отдельные объекты в &amp;lt;code&amp;gt;Properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* При экспорте в SARIF теперь экспортируются поля &amp;lt;code&amp;gt;Labels, Orig function&amp;lt;/code&amp;gt;&lt;br /&gt;
* Импорт SARIF теперь корректным образом учитывает relatedLocations и формирует трассу&lt;br /&gt;
* Импорт SARIF теперь автоматически импортирует исходники, если они включены в сам SARIF файл&lt;br /&gt;
* Добавлена возможность указания мэппинга severity детекторов при импорте из SARIF&lt;br /&gt;
* Добавлен механизм указания правил резолвинга путей при импортировании исходного кода вместе с SARIF файлом&lt;br /&gt;
* Экспорт исходников из снимка будет доступен только при наличии исходников на сервере&lt;br /&gt;
* Добавлен [[Help:Match#Классический режим генерации инвариантов|режим работы]] сервера где генерация инвариантов для переноса разметки соответствует режиму Svacer &amp;lt;=8.x.x. Режим включается через опции &amp;lt;code&amp;gt;--classic-inv-mode&amp;lt;/code&amp;gt; или переменную окружения &amp;lt;code&amp;gt;SVACER_CLASSIC_INV_MODE=true|false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлены флаги &amp;lt;code&amp;gt;--autoclean&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--autoclean-svace&amp;lt;/code&amp;gt; в команду &amp;lt;code&amp;gt;svacer import&amp;lt;/code&amp;gt; для автоматического удаления &amp;lt;code&amp;gt;.svace-dir / .svacer-dir&amp;lt;/code&amp;gt; после успешного импорта и загрузки данных на сервер&lt;br /&gt;
* Улучшена поддержка OIDC&lt;br /&gt;
* Улучшена поддержка LDAP&lt;br /&gt;
* Добавлена интеграция с хранилищем секретов Infisical&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-1 ===&lt;br /&gt;
17.02.2025&lt;br /&gt;
&lt;br /&gt;
* Исправлена ошибка с временной таблицей при обработке планов автомиграции разметки при импорте результатов (ERROR: relation &amp;quot;loaded_review&amp;quot; already exists)&lt;br /&gt;
&lt;br /&gt;
=== Release 10-0-0 ===&lt;br /&gt;
16.01.2025&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 10-0-0]]&lt;br /&gt;
* Сделали [[Help:Installation#rpm|dnf/yum репозиторий]] для RPM-пакетов Svacer&lt;br /&gt;
* Реализована возможность [[Markup2|экспорта, импорта и копирования разметки посредством Public REST API и CLI]]&lt;br /&gt;
* Реализован дополнительный экспериментальный механизм [[Help:UI manual#Настройка интерфейса|генерации PDF на основе HTML]]. Генерация PDF переведена на асинхронный режим с показом нотификации пользователю&lt;br /&gt;
* Добавлена возможность очистки всей разметки и/или комментариев на ветке проекта&lt;br /&gt;
* Улучшения функциональности просмотра маркеров в встроенном IDE Theia&lt;br /&gt;
* Добавлена функциональность по [[Help:UI manual#Глобальный поиск|глобальному поиску]] маркеров, комментариев и снимков по различным атрибутам&lt;br /&gt;
* Добавлена возможность [[Help:UI manual#Просмотр статистики|получения статистики]] по маркерам и активностям пользователей при разметке&lt;br /&gt;
* В API fullmarkers добавлен параметр &amp;lt;code&amp;gt;labels: true/false&amp;lt;/code&amp;gt; для выгрузки меток маркера&lt;br /&gt;
* Реализован Public API для получения/добавления/удаления меток маркеров&lt;br /&gt;
* Настройки LDAP и прочие настройки аутентификации добавлены в единый конфигурационный файл&lt;br /&gt;
* Добавлена возможность удаления кода из снимка при частичном импорте в Svacer&lt;br /&gt;
* Добавлена опция minVersion, maxVersion для TLS при запуске сервера Svacer&lt;br /&gt;
* Добавлена поддержка групп проектов при импорте снимков в CLI&lt;br /&gt;
* При импорте снимков реализована поддержка автоматического определения пути префикса для переноса разметки&lt;br /&gt;
* Исправлен ряд ошибок в импорте и генерации [[Help:Sarif|SARIF]]&lt;br /&gt;
* Исправлены ошибки в копировании разметки между ветками, клонировании проектов и веток&lt;br /&gt;
* Добавлена возможность отключения бэкграунд задач по очистке мусора&lt;br /&gt;
* Добавлено экспериментальное CLI API для просмотра асинхронных задач на генерацию PDF&lt;br /&gt;
* Добавлена возможность визуализации производительности сервера на основе [https://github.com/arl/statsviz statsviz]&lt;br /&gt;
* Добавлена поддержка относительных путей в svres файле&lt;br /&gt;
* Добавлена возможность ожидания завершения операций по очистки мусора при выполнении операций по импорту результатов анализа&lt;br /&gt;
* Добавлена поддержка CWE таксономий при экспорте [[Help:Sarif|SARIF]]&lt;br /&gt;
* Добавлена переменная окружения SVACER_TOKEN_LIFETIME для управления временем жизни токена аутентификации&lt;br /&gt;
* Добавлена переменная окружения SVACER_RESET_ADMIN_PASSWORD для явного указания желаемого пароля при операции по сбросу пароля администратора&lt;br /&gt;
* Добавлен [[Notifications|механизм нотификаций пользователей]] о внутренних событиях Svacer (экспериментальный функционал)&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-2 ===&lt;br /&gt;
22.07.2024&lt;br /&gt;
&lt;br /&gt;
* Еще некоторые исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена проблема с навигацией по Go to Definition&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-1 ===&lt;br /&gt;
15.07.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлены ошибки в клонировании проектов, приводящие к размножению записей в некоторых внутренних таблицах&lt;br /&gt;
* Различные исправления, связанные с миграцией данных&lt;br /&gt;
* Исправлена работа ряда CLI команд с включенным TLS на сервере&lt;br /&gt;
* Исправлен ряд ошибок в генерации PDF&lt;br /&gt;
&lt;br /&gt;
=== Release 9-0-0 ===&lt;br /&gt;
04.06.2024&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI, смотрите [[Release notes 9-0-0]]&lt;br /&gt;
* Svacer разделен на два исполняемых файла: &amp;lt;code&amp;gt;svacer-server&amp;lt;/code&amp;gt; — сервер и &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt; — клиент&lt;br /&gt;
* {{Note}}Object store заменен на другую реализацию. Конвертация данных запускается автоматически при апгрейде и требует примерно 2х-2.2х дискового пространства, после конвертации старый object store будет удален. Время конвертации зависит от объема данных и скорости диска&lt;br /&gt;
* {{Note}}Изменен [[Help:Match|алгоритм сопоставления предупреждений]]. При старте сервера будет произведена регенерация всех инвариантов во всех ветках. Это может занять продолжительное время (зависит от мощности сервера и объемов данных)&lt;br /&gt;
* Добавлена возможность [[Help:Match#Ручное сопоставление предупреждений (экспериментальная возможность)|ручного сопоставления предупреждений]] для переноса разметки&lt;br /&gt;
* Добавлена экспериментальная поддержка [[OIDC|OpenID]] протокола для аутентификации&lt;br /&gt;
* Добавлена экспериментальная возможность [[Help:CLI#Слияние снимков из CLI (экспериментальная опция)|слияния снимков через CLI]]&lt;br /&gt;
* Исправлены баги в [[Help:Sarif|импорте Sarif]], добавлена поддержка импорта с относительными путями к файлам (флаг &amp;lt;code&amp;gt;--base-dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Лог сервера работает в режиме append, прежние данные не затираются&lt;br /&gt;
* Добавлена возможность передачи токена аутентификации в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_TOKEN=token&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность передачи логина и пароля в клиент Svacer через переменную окружения &amp;lt;code&amp;gt;SVACER_AUTH_CREDS=login:password&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен public REST endpoint для импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; на стороне сервера&lt;br /&gt;
* Добавлена возможность импорта &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt; из веб-интерфейса&lt;br /&gt;
* Добавлены [[Metrics|метрики]] для Prometheus, доступны при запуске сервера с переменной окружения &amp;lt;code&amp;gt;SVACER_TRACE_OPTIONS=prom_metrics_on&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;/api/metrics&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена очистка БД от мусора с возможностью настройки периодичности данной операции через переменную окружения &amp;lt;code&amp;gt;SVACER_GC_PERIOD=val&amp;lt;/code&amp;gt; где val — duration в формате &amp;lt;code&amp;gt;hhmmss&amp;lt;/code&amp;gt; или [https://en.wikipedia.org/wiki/Cron Cron]&lt;br /&gt;
* Добавлена возможность клонирования проектов&lt;br /&gt;
* Добавлен импорт &amp;lt;code&amp;gt;*warn, *.err&amp;lt;/code&amp;gt;  файлов из &amp;lt;code&amp;gt;.svace-dir&amp;lt;/code&amp;gt;, которые содержат диагностические сообщения от Svace&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Ограничение числа запросов|ограничения числа запросов]] на сервер с указанием параметров в переменной окружения &amp;lt;code&amp;gt;SVACER_SERVER_THROTTLE_PARAMS&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлен шаблон для импорта разметки из кода на Go: &amp;lt;code&amp;gt;DEFAULT_GO&amp;lt;/code&amp;gt;&lt;br /&gt;
* Добавлена возможность [[Help:CLI#Аутентификация из файла|аутентификации из файла]]&lt;br /&gt;
* Исправлены проблемы безопасности&lt;br /&gt;
* Добавлена возможность просмотра исходного кода снимка с предупреждениями анализатора во внешней IDE собранной на базе [https://theia-ide.org/ Theia IDE]&lt;br /&gt;
* К команде automigrate add в CLI добавлен флаг &amp;lt;code&amp;gt;skip-exist&amp;lt;/code&amp;gt;, чтобы при добавлении паттерна, который уже существует, не выдавало ошибки &lt;br /&gt;
* К команде upload (import с флагом upload) с указанием флага &amp;lt;code&amp;gt;quality-gate&amp;lt;/code&amp;gt; теперь можно добавить флаг &amp;lt;code&amp;gt;quality-gate-verbose&amp;lt;/code&amp;gt;. Если его указать, то также будет выведен результат успешных проверок quality-gate&lt;br /&gt;
* Улучшения в поддержке протокола LDAP&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-1 ===&lt;br /&gt;
22.01.2024&lt;br /&gt;
&lt;br /&gt;
* Исправлена работа в изолированной от сети среде. Загрузка Web UI больше не требует доступа к публичным CDN&lt;br /&gt;
* Добавлена поддержка функций при указании пользовательского фильтра&lt;br /&gt;
* Добавлено API для управления пользовательскими фильтрами. Детали и пример использования можно найти здесь: https://gitlab.ispras.ru/svacer-public/api-go-examples/-/tree/master/api-ui-settings&lt;br /&gt;
* Исправлено отображение Checker Severity при экспорте в SARIF. Теперь Critical -&amp;gt; error; Major, Normal -&amp;gt; warning; Minor -&amp;gt; note; any other -&amp;gt; warning&lt;br /&gt;
&lt;br /&gt;
=== Release 8-0-0 ===&lt;br /&gt;
21.11.2023&lt;br /&gt;
&lt;br /&gt;
* Множество изменений в UI. Смотрите обзор в [[Release notes 8-0-0]]&lt;br /&gt;
* Добавлен новый импорт и экспорт из SARIF в command line с поддержкой исходного кода в SARIF файлах и импортом описания детекторов из SARIF&lt;br /&gt;
* Добавлены группы проектов&lt;br /&gt;
* Переделана модель ролей и доступов. Добавлен CLI для управления ролями и доступами&lt;br /&gt;
* Добавлена возможность настройки автопереноса разметки между ветками, в том числе в разных проектах&lt;br /&gt;
* Импорт/экспорт снимков включает информацию о детекторах&lt;br /&gt;
* Исправлена работа интерфейса с Undefined детекторами (т. е. детекторами, информация о которых отсутствует в Svacer)&lt;br /&gt;
* Добавлено экспериментальное API по управлению детекторами и конфигурациями детекторов&lt;br /&gt;
* Добавлена очистка исходного кода от Svacer-specific комментариев перед экспортом разметки в код&lt;br /&gt;
* Добавлена возможность включения режима обязательного комментария при разметке кода. Комментарий будет сгруппирован с операцией разметки и будет иметь ссылку на нее&lt;br /&gt;
* Утилита миграции со старого svace-сервера больше не поддерживается. При необходимости миграции используйте утилиту из прошлых релизов Svacer&lt;br /&gt;
* Добавлена Swagger документация на API&lt;br /&gt;
* Добавлено хранение истории изменений комментариев&lt;br /&gt;
* Опция &amp;lt;code&amp;gt;--pathPrefix&amp;lt;/code&amp;gt; поддерживает файлы в JSON формате вида: &amp;lt;code&amp;gt;[{ &amp;quot;prefix&amp;quot;: &amp;quot;/some/path&amp;quot;, &amp;quot;replace&amp;quot;: &amp;quot;/test&amp;quot; }, ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* При использовании операции по обновлению &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; на сервере, данные о прежнем &amp;lt;code&amp;gt;pathPrefix&amp;lt;/code&amp;gt; запоминаются в мета-информации о снимке&lt;br /&gt;
* Добавлена возможность переименования снимков в UI&lt;br /&gt;
* Sensitive информация (детали подключения к БД с данными аутентификации) убрана из UI и API&lt;br /&gt;
* ОС в docker-образе Svacer обновлена с Ubuntu 18 до Ubuntu 22&lt;br /&gt;
* Улучшена логика автоопределения портов и протоколов при соединении с сервером из Svacer CLI&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-1 ===&lt;br /&gt;
23.05.2023&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема с фильтрацией предупреждений для C# проектов&lt;br /&gt;
&lt;br /&gt;
=== Release 7-0-0 ===&lt;br /&gt;
16.05.2023&lt;br /&gt;
&lt;br /&gt;
* Убрана зависимость от PostgreSQL из .deb и .rpm пакетов, чтобы проще было ставить Svacer только как клиент&lt;br /&gt;
* Сделан пакет для Windows (.msi) и документация по установке и запуску на Windows&lt;br /&gt;
* Теперь, если при svacer import и svacer sarif не указан путь к проекту, им считается текущая директория&lt;br /&gt;
* Информация о разметке и блокировках теперь обновляется автоматически при изменении в другом браузере (табе) или другим пользователем&lt;br /&gt;
* UI для пользовательских фильтров улучшен и перенесен в правую верхнюю часть экрана&lt;br /&gt;
* UI для выбора проекта, ветки и снимка теперь находится на одном уровне&lt;br /&gt;
* Улучшен UI для режима сравнения снимков&lt;br /&gt;
* Добавлена возможность работать одновременно с несколькими открытыми файлами в режиме Code, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* В левой навигационной панели детекторы теперь по умолчанию группируются по серьезности, это поведение можно изменить в настройках профиля пользователя&lt;br /&gt;
* Профиль текущего пользователя теперь можно смотреть/редактировать только через меню в правом верхнем углу&lt;br /&gt;
* Добавлена возможность копирования в системном логе и журнале&lt;br /&gt;
* Для пользователя теперь запоминается последний контекст (проект/ветка/снимок), с которым он работал, он автоматически открывается при старте новой сессии&lt;br /&gt;
* Групповая разметка теперь делается единой транзакцией, в случае ошибок или отмены все изменения откатываются&lt;br /&gt;
* Добавлено предупреждение при использовании некорректных путей при использовании REST API с префиксом /api&lt;br /&gt;
* Поддержка указания паролей из файла или pipe-а при использование Svacer CLI&lt;br /&gt;
* Добавлена поддержка multi-tab code view для режима просмотра кода объекта сборки&lt;br /&gt;
* Добавлена поддержка сохранения информации об удаленных детекторах при загрузке информации о детекторах из новой версии Svace&lt;br /&gt;
* Исправлен импорт результатов анализа, если сборка проводилась с опцией --disable-dxr&lt;br /&gt;
* Исправлены проблемы при импорте и прикреплении нескольких файлов к снимку&lt;br /&gt;
* Исправлены ошибки с входом в систему пользователей LDAP (специальные символы в пароле, вход по атрибуту mail)&lt;br /&gt;
* Добавлена возможность использования резервных серверов LDAP&lt;br /&gt;
* Добавлена возможность автоматического назначения пользователям LDAP роли Svacer, в зависимости от принадлежности пользователя к LDAP группе&lt;br /&gt;
* Добавлены новые public запросы на получение маркеров/снимков/проектов с учетом заданных параметров фильтрации&lt;br /&gt;
* Добавлена поддержка TLS при работе сервера по протоколам HTTP и gRPC&lt;br /&gt;
* Добавлена возможность загрузки статистики по общему количеству предупреждений и по количеству размеченных предупреждений для проектов и веток через REST API&lt;br /&gt;
* Добавлена вкладка выбора проектов в расширении VSCode&lt;br /&gt;
* Убрана возможность использовать всплывающее окно в VScode для добавления/редактирования/удаления комментариев, установки ревью-статусов, локов и т.д.&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-3 ===&lt;br /&gt;
25.01.2023&lt;br /&gt;
&lt;br /&gt;
* RPM-пакет теперь при сборке упаковывается в gzip вместо zstd для обратной совместимости со старыми дистрибутивами&lt;br /&gt;
* Если short url некорректен, то Svacer теперь будет возвращать корректный http error NotFound&lt;br /&gt;
* Если путь к лог файлу явно не указан, то svacer.log будет создаваться во временной директории. Это решает проблемы при запуске Svacer из директорий с запретом на запись. Путь к лог файлу будет печататься в stdout&lt;br /&gt;
* Лог файлы не будут создаваться, когда используется опция --help&lt;br /&gt;
* Исправлены проблемы при миграции схемы данных, когда в PostgreSQL используется SSL подключение&lt;br /&gt;
* Добавлены описания детекторов из последнего релиза Svace, которые были пропущены в релизе 6-0-2&lt;br /&gt;
* Исправлена работа Svacer за proxy-сервером, где выставляется Header &amp;quot;X-Content-Type-Options nosniff&amp;quot;&lt;br /&gt;
* Добавлены кнопки для скачивания системного лога и журнала из web-интерфейса&lt;br /&gt;
* Поправлен ряд ошибок валидации схемы при экспорте в SARIF&lt;br /&gt;
* Исправлено поведение при наличии нескольких хуков в конфигурационном файле&lt;br /&gt;
* В информацию о маркере для хуков добавлены checker severity и reliability&lt;br /&gt;
* Исправлен случайный порядок URL для маркеров при использовании public API для получения URL-ов&lt;br /&gt;
* На главную страницу добавлена кнопка &amp;quot;Помощь&amp;quot;, которая открывает документацию&lt;br /&gt;
* При использовании команд навигации в режиме &amp;quot;Browse code&amp;quot; текущий файл теперь корректно подсвечивается в дереве файлов&lt;br /&gt;
* В диалоге групповой разметки убран индикатор изменений в виде кружочка, наличие изменений можно определить по активности кнопок &amp;quot;Apply&amp;quot; и &amp;quot;Reset&amp;quot;&lt;br /&gt;
* Кнопка обновления в верхнем меню теперь корректно обновляет информацию на странице Settings/Project&lt;br /&gt;
* Различные небольшие исправления в пользовательском интерфейсе&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-2 ===&lt;br /&gt;
16.12.2022&lt;br /&gt;
&lt;br /&gt;
* Исправлена проблема в UI с сохраненными пользовательскими фильтрами&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-1 === &lt;br /&gt;
13.12.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено описание ряда детекторов, которые есть в последнем релизе Svace 3.3.2 но были пропущены в Svacer&lt;br /&gt;
* Исправлено вылетание в Login Screen при удалении нотификации из панели нотификаций&lt;br /&gt;
* Исправлено появление белого экрана при клике на детектор, информация о котором отсутствует&lt;br /&gt;
* Ряд различных небольших исправлений в UI&lt;br /&gt;
* Промежуточное хранилище будет очищаться по умолчанию при использовании команды import&lt;br /&gt;
&lt;br /&gt;
=== Release 6-0-0 === &lt;br /&gt;
30.11.2022&lt;br /&gt;
&lt;br /&gt;
* Добавлено копирование комментариев при копировании разметки&lt;br /&gt;
* Комментарии добавлены к отчету в формате csv&lt;br /&gt;
* Добавлена возможность вводить пароль с клавиатуры для консольных команд&lt;br /&gt;
* Добавлена возможность импортировать разметку из объекта сборки (из ранее загруженных данных)&lt;br /&gt;
* Добавлена возможность импортировать разметку сразу после загрузки на сервер (опция для команды svacer upload)&lt;br /&gt;
* Добавлена возможность загружать исходный код не из папки .svace-dir&lt;br /&gt;
* Добавлена возможность бэкапа и восстановление объектного хранилища в сервер PostgresSQL&lt;br /&gt;
* Добавлена возможность создания отчета по проекту в формате PDF через интерфейс командной строки и посредством REST API&lt;br /&gt;
* Добавлена возможность подавления предупреждений через inline комментарии в коде&lt;br /&gt;
* Добавлена возможность подавления предупреждений по идентификатору предупреждения через command line и REST API&lt;br /&gt;
* Добавлена возможность ассоциировать организацию с пользователем и реестр организаций&lt;br /&gt;
* Добавлена фильтрация списка комментариев по пользователю в правой панели веб-интерфейса&lt;br /&gt;
* Добавлен поиск пользователей по его атрибутам в панели управления пользователями&lt;br /&gt;
* Добавлена возможность заполнения данных профиля LDAP пользователя данными, полученными от LDAP сервера&lt;br /&gt;
* Добавлена возможность прикреплять файлы к снимкам при импорте результатов (данные файлы составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлена возможность ассоциировать пользовательские атрибуты типа &amp;quot;строка&amp;quot; или массив строк со снимком при импорте данных (данные атрибуты составляют часть экспортируемых данных при экспорте снимков)&lt;br /&gt;
* Добавлены command line операции по получению прикрепленных файлов и пользовательских атрибутов со снимков&lt;br /&gt;
* Добавлена возможность группового добавления комментариев&lt;br /&gt;
* Добавлена возможность указания сетевого интерфейса для работы WEB и GRPC серверов&lt;br /&gt;
* Добавлен вывод краткой статистики по загруженному снимку при команде upload. Поддерживается текстовой и JSON форматы вывода&lt;br /&gt;
* Существенно расширены возможности по интеграции Visual Studio Code с сервером Svacer&lt;br /&gt;
* Добавлен флаг --git в команду import. При наличии такого флага, ищется ближайший git репозиторий содержащий .svace-dir и при наличии такого - используется путь к гит репозиторию для замены путей на префикс .build.&lt;br /&gt;
* Portable PostgreSQL больше не входит в поставку. Вместо него поставляется docker-compose.yml файл для запуска PostgreSQL в докер-контейнере&lt;br /&gt;
* Добавлено больше данных и информации об ошибках в вывод команды svacer import&lt;br /&gt;
* Изменение Public API: добавлена точка входа /api/public/login&lt;br /&gt;
* Операции по импорту и экспорту снимков доступны теперь обычным пользователям (не администраторам) при использовании command line интерфейса&lt;br /&gt;
* Операция по экспорту снимков доступна обычному пользователю из веб-интерфейса (импорт все еще требует роль администратора для веб-интерфейса)&lt;br /&gt;
* Операции по экспорту снимков переведены на асинхронный режим. Нотификация о готовности будет показана пользователю и доступна в панели нотификаций&lt;br /&gt;
* Обновлено описание детекторов в соответствии с релизом Svace 3.3.2&lt;br /&gt;
* Исправлена ошибка обработки корневых сертификатов при подключении к LDAP серверу по протоколу ldaps&lt;br /&gt;
* Исправлено ошибочное создание дубликатов локальных учетных записей LDAP пользователей (case sensitive login)&lt;br /&gt;
* Различные исправления в пользовательском интерфейсе с целью оптимизации производительности&lt;br /&gt;
* Добавлены пропущенные проверки ролей при работе с веб-интерфейсом&lt;br /&gt;
* Svacer больше не создает временные файлы в директории с исполняемым файлом&lt;br /&gt;
* Устаранены задержки при удалении веток и проектов&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=OIDC&amp;diff=2909</id>
		<title>OIDC</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=OIDC&amp;diff=2909"/>
		<updated>2025-05-16T11:01:57Z</updated>

		<summary type="html">&lt;p&gt;Chernykov sv: /* Автоназначение ролей пользователю на основе содержимого Claims токена */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Основные концепции ==&lt;br /&gt;
&lt;br /&gt;
Аутентификация с помощью протокола ''OpenID Connect'' (далее ''OIDC'') реализована с помощью утилиты [https://oauth2-proxy.github.io/oauth2-proxy/ oauth2-proxy]. Общая схема аутентификации представлена на рисунке ниже:&lt;br /&gt;
&lt;br /&gt;
[[File:Image-20240531112418954.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
Пояснения к картинке указаны в таблице. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| 1. Запрос ресурса&lt;br /&gt;
| Если запрос включен в список запросов без аутентификации (см. skip_auth_routes), то он перенаправляется к серверу Svacer (Входа на сервер Svacer при этом не происходит. Будут доступны только те ресурсы, которые не требуют аутентификации). Если запроса нет в списке, то переходим к шагу 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. Проверка необходимости аутентификации OAuth2&lt;br /&gt;
| Утилита oAuth2-proxy, на основе имеющихся в куках данных, определяет необходимость перенаправления пользователя на сервер OAuth2. Если аутентификация необходима, то по URL, который был указан в параметре oidc_issuer_url, прокси запросит точки входа в соответствии с протоколом OIDC. После получения нужной точки входа, пользователь будет перенаправлен на нее (шаг 3), при этом в параметре redirect этого запроса будет указано значение параметра конфигурации прокси redirect_url. Если аутентификация не нужна (уже есть действительный токен от OIDC сервера), то запрос перенаправляется на сервер Svacer с токеном доступа (Access Token) от сервера OAuth2 в заголовке X-Forwarded-Access-Token — шаг 1* на рисунке&lt;br /&gt;
|-&lt;br /&gt;
| 3. Аутентификация пользователя на OAuth2 сервере&lt;br /&gt;
| Если в куках сервера OAuth2 есть данные об активной сессии аутентификации, то пользователь будет перенаправлен обратно на прокси сервер по указанному в параметре запроса URL. При этом, в параметрах URL будет передан Authorization Code для дальнейшего использования клиентом OAuth2 (в терминологии OAuth2 клиентом является oauth2-proxy). Если активной сессии нет, то будет отображена форма для логина и пароля пользователя. После успешного входа, OAuth2 сервер запомнит сессию пользователя, сформирует Authorization Code и перенаправит пользователя обратно на прокси, передав в URL значение Authorization Code&lt;br /&gt;
|-&lt;br /&gt;
| 4. Получение AccessToken&lt;br /&gt;
| Прокси осуществляет получение Access Token от сервера OAuth2, используя полученный Authorization Code и точку входа сервера OAuth2 для получения токенов, которую он получил ранее на шаге 2&lt;br /&gt;
|-&lt;br /&gt;
| 5. Отправка запроса к Svacer&lt;br /&gt;
| Первоначальный запрос (из шага 1), отправляется серверу Svacer. При этом в заголовки этого запроса добавляется Access Token от OAuth сервера, а также другие специфичные для oauth2-proxy заголовки. Состав дополнительной информации, передаваемой в заголовках, определяется конфигурацией oauth2-proxy&lt;br /&gt;
|-&lt;br /&gt;
| 6. Выпуск токена Svacer&lt;br /&gt;
| Svacer определяет наличие заголовка X-Forwarded-Access-Token в запросе. Если конфигурация сервера подразумевает использование OIDC протокола, то полученный токен проверяется и на его основе создается токен Svacer, после чего выполняется вход в систему и создается пользователь Svacer (если еще не создан), соответствующий пользователю, указанному в токене доступа от OAuth2 сервера&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация Svacer для поддержки протокола OIDC ==&lt;br /&gt;
&lt;br /&gt;
Для конфигурации Svacer необходимо использовать секцию ''auth'' стандартного конфигурационного файла Svacer, указываемого через опцию ''--config'' при его запуске. &lt;br /&gt;
&lt;br /&gt;
 svacer-server run --config config.yaml&lt;br /&gt;
&lt;br /&gt;
Пример секции ''auth'' конфигурационного файла представлен ниже&lt;br /&gt;
 oidc:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  debug: true&lt;br /&gt;
  oauth_proxy:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   clock: 1&lt;br /&gt;
   sign_in: &amp;quot;&amp;lt;nowiki&amp;gt;http://keycloak:12800/realms/svacer/protocol/openid-connect/token&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
   sign_out: &amp;quot;&amp;lt;nowiki&amp;gt;http://oauth_proxy:4180/oauth2/sign_out?rd=/oauth2/sign_in&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
   tokens:&lt;br /&gt;
    - claims:&lt;br /&gt;
       subject: preferred_username&lt;br /&gt;
       role: svacer_role&lt;br /&gt;
       sync_roles: svacer_roles&lt;br /&gt;
       first_name: given_name&lt;br /&gt;
       second_name: second_name&lt;br /&gt;
       last_name: family_name&lt;br /&gt;
       email: email&lt;br /&gt;
      sign:&lt;br /&gt;
       - key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvR/zIW/acyWFVSuSD/8iDM3epguHljKZkaB4ITojRwisXNcn6S0ArlI8v69qV1tBFi+RH3Ys4L5Pj+xDFlemlml6wPp5X0tcD2Gax51KHqQcFjViBGVSqJUdts/bkvfiIfZLkurybkhR0ALToWvbNyD7&amp;gt;&lt;br /&gt;
         name: rsa&lt;br /&gt;
В секции используются следующие поля:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Название&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''''enabled'''''&lt;br /&gt;
| Использовать ''OIDC'' провайдер. Значение ''false'' отключает данный функционал&lt;br /&gt;
|-&lt;br /&gt;
| '''''debug'''''&lt;br /&gt;
| Выводить в логи сервера дополнительные отладочные сообщения. Полезно при первичной настройке, в дальнейшем желательно установить в значение ''false''&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.enabled'''''&lt;br /&gt;
| Использовать утилиту ''oauth2-proxy'' в качестве механизма поддержки протокола OIDC. На текущий момент это единственная реализация поддержки ''OIDC'' протокола&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.clock'''''&lt;br /&gt;
| Допускаемая погрешность расхождения времени между сервером аутентификации и клиентом. Указывается значение в минутах&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.sign_in'''''&lt;br /&gt;
| Точка входа сервера OAuth2 для получения токена. Используется в Svacer только для работы CLI команд и сервисной учетной записи. При некорректном значении работа клиента Svacer с сервером Svacer через ''OIDC'' будет невозможна, но при правильной настройке других параметров, в GUI пользователи работать смогут&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.sign_out'''''&lt;br /&gt;
| Ссылка, которая будет использована при выходе пользователя из системы (logout в GUI). Более подробно см. [[OIDC#Выход пользователя из системы|Выход пользователя из системы]]&lt;br /&gt;
|-&lt;br /&gt;
| '''''oauth_proxy.tokens'''''&lt;br /&gt;
| Массив объектов (''token''), описывающих структуру ''JWT'' токена ''OIDC'' сервера и данные, необходимые для проверки выпускаемого им токена&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims'''''&lt;br /&gt;
| Описывает структуру токена. Поля этой сущности определяют свойства создаваемого внутреннего пользователя Svacer и его права&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.subject'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Логин'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.first_name'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Имя'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.second_name'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Отчество'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.last_name'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''Фамилия'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.email'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для заполнения свойства ''E-Mail'' у созданного пользователя Svacer&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.claims.role'''''&lt;br /&gt;
| Название поля из Claims токена, значение которого будет использовано для добавления роли пользователю Svacer. Значение должно быть именем уже существующей роли или значением &amp;quot;admin&amp;quot; для добавления роли администратора. Автоматическое назначение роли происходит только при первом создании пользователя&lt;br /&gt;
|-&lt;br /&gt;
|'''''token.claims.sync_roles'''''&lt;br /&gt;
|Название поля из Claims токена, которое содержит полный список доступных ролей Svacer для механизма автоназнаечния ролей&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.sign'''''&lt;br /&gt;
| Содержит данные, необходимые для проверки подписи ''JWT'' токена&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.sign.key'''''&lt;br /&gt;
| Открытый ключ, используемый OIDC сервером для проверки токена. Формат: BASE64(ASN1.DER)&lt;br /&gt;
|-&lt;br /&gt;
| '''''token.sign.name'''''&lt;br /&gt;
| Имя алгоритма ЭЦП. Поддерживаются: RSA, ECDSA&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация OAuth2-proxy  ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация OAauth2-proxy может выполнятся через параметры CLI, через указание параметров в конфигурационном файле, а также через переменные окружения. Названия параметров, передаваемых в CLI, в конфигурационном файле и через переменные окружения находятся в следующем соответствии друг с другом (на примере параметра ''client_secret''):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Конфигурационный файл&lt;br /&gt;
! CLI&lt;br /&gt;
! Переменная окружения&lt;br /&gt;
|-&lt;br /&gt;
| client_secret&lt;br /&gt;
| --client-secret&lt;br /&gt;
| OAUTH2_PROXY_CLIENT_SECRET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Для нормальной работы желательно наличие DNS имен для хостов (OAuth2-proxy использует Cookies для хранения там информации о сессии аутентификации пользователя а также для хранения csrf токена).'''&lt;br /&gt;
&lt;br /&gt;
Ниже приводится пример конфигурации oauth2-proxy для подключения Svacer сервера к OAuth2 серверу Keycloak&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;standard_logging = true&lt;br /&gt;
standard_logging_format = &amp;quot;[{{.Timestamp}}] [{{.File}}] {{.Message}}&amp;quot;&lt;br /&gt;
auth_logging = true&lt;br /&gt;
auth_logging_format = &amp;quot;{{.Client}} - {{.Username}} [{{.Timestamp}}] [{{.Status}}] {{.Message}}&amp;quot;&lt;br /&gt;
pass_user_headers = true&lt;br /&gt;
pass_host_header = true&lt;br /&gt;
email_domains = [&lt;br /&gt;
 &amp;quot;*&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
client_id = &amp;quot;svacer-auth-proxy&amp;quot;&lt;br /&gt;
client_secret = &amp;quot;q2rNKGofxpw7FzmZDstSIyNNyzkW1BsW&amp;quot;&lt;br /&gt;
pass_access_token = true&lt;br /&gt;
cookie_name = &amp;quot;_oauth2_proxy2&amp;quot;&lt;br /&gt;
cookie_secret = &amp;quot;2-W9DDrnlfBEK75F3zGpszuwTSqwBcUFQm6OQa3dHgU=&amp;quot;&lt;br /&gt;
cookie_expire = &amp;quot;11m&amp;quot;&lt;br /&gt;
cookie_refresh = &amp;quot;10m&amp;quot;&lt;br /&gt;
cookie_secure = false&lt;br /&gt;
provider = &amp;quot;keycloak-oidc&amp;quot;&lt;br /&gt;
show_debug_on_error = true&lt;br /&gt;
cookie_csrf_per_request = true&lt;br /&gt;
cookie_csrf_expire = &amp;quot;36h&amp;quot;&lt;br /&gt;
skip_auth_routes = [&amp;quot;GET=/static/.*&amp;quot;,&amp;quot;/api/public/*&amp;quot;,&amp;quot;GET=/api/auth_settings&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В файле выше указаны не все требуемые параметры для нормальной работы OAuth2-proxy. Ниже приведены наиболее важные параметры конфигурационного файла OAuth2-proxy с пояснениями&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Название&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| client_id&lt;br /&gt;
| Название клиента (в терминах OAuth2), от имени которого пользователь будет аутентифицироваться на сервере OAuth&lt;br /&gt;
|-&lt;br /&gt;
| client_secret&lt;br /&gt;
| Секрет клиента (в терминах OAuth2)&lt;br /&gt;
|-&lt;br /&gt;
| pass_access_token&lt;br /&gt;
| Передавать токен доступа от Oauth2 сервера в Svacer (через заголовки). Данный токен будет использован сервером Svacer для идентификации и аутентификации пользователя, а также для получения первоначальной информации о нем&lt;br /&gt;
|-&lt;br /&gt;
| provider&lt;br /&gt;
| Имя провайдера OAuth2&lt;br /&gt;
|-&lt;br /&gt;
| cookie_csrf_per_request&lt;br /&gt;
| Возможность отправки нескольких запросов одновременно&lt;br /&gt;
|-&lt;br /&gt;
| skip_auth_routes&lt;br /&gt;
| Указывается список запросов, которые не требуют аутентификации. Для корректной работы Svacer необходимо указать значения из примера выше&lt;br /&gt;
|-&lt;br /&gt;
| http_address&lt;br /&gt;
| Имя хоста, на котором будет работать OAuth2-proxy, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]&lt;br /&gt;
|-&lt;br /&gt;
| upstreams&lt;br /&gt;
| Хост, на котором работает Svacer, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]&lt;br /&gt;
|-&lt;br /&gt;
| redirect_url&lt;br /&gt;
| URL на который будет осуществлено перенаправление после успешной аутентификации на OAuth2 сервере, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]&lt;br /&gt;
|-&lt;br /&gt;
| oidc_issuer_url&lt;br /&gt;
| URL сервера OAuth2 для начала аутентификации, см. пример в разделе [[OIDC#Конфигурация в Docker|Конфигурация в Docker]]. С помощью данного URL будет получен список точек входа для поддержки разных потоков аутентификации (в терминах OAuth2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Детали работы OAuth2-proxy с куками и токенами ===&lt;br /&gt;
&lt;br /&gt;
Для корректной настройки OAuth2-proxy полезно понимать детали работы OAath2-proxy. На шаге 2 прокси определяет необходимость выполнения аутентификации пользователя. Прокси проверяет наличие куки ''_oauth2_proxy'' и его срок действия. Срок действия создаваемых кук указывается в поле ''cookie_expire''. Если срок действия куки закончен, то пользователь будут перенаправлен на точку входа прокси: ''/oauth2/sign_in''.&lt;br /&gt;
&lt;br /&gt;
Важным полем конфигурации является поле ''cookie_refresh''. При каждом запросе прокси обновляет свои куки с периодичностью, указанной в ''cookie_refresh''. Вместе с обновлением своих куки прокси проверяет состояние сессии на OAuth2 сервере и получает новый токен доступа. То есть, если в поле ''cookie_refresh'' стоит значение 1 минута, 1 раз в минуту (если пользователь отправляет запросы 1 раз в 10 секунд, то каждый 6 запрос будет обновлять куки прокси) OAuth2-proxy будет обновлять свои куки ''_oauth2_proxy'' и обновлять состоянии сессии аутентификации на сервере OAuth2 с получением токена доступа. Если сессия OAuth2 завершена, пользователь будет перенаправлен на точку входа аутентификации сервера OAuth2. &lt;br /&gt;
&lt;br /&gt;
== Выход пользователя из системы ==&lt;br /&gt;
&lt;br /&gt;
Процедура выхода пользователя из Svacer состоит из двух этапов. На первом этапе производится инвалидация токена Svacer, далее осуществляется переход по ссылке указанной в параметре ''oauth_proxy.sign_out'' с тем, чтобы прокси сервер или/и OAuth2 сервер смогли выполнить инвалидацию сущностей аутентификации, выданных пользователю. Явным признаком корректной работы выхода пользователя из системы является отсутствие данных аутентификации в куках сервера OAuth2 (и/или прокси) после выхода пользователя из системы.&lt;br /&gt;
&lt;br /&gt;
== Работа со Svacer через CLI ==&lt;br /&gt;
&lt;br /&gt;
Для работы в Svacer через CLI необходимо создать Personal Token, в графиеческом интерфейсе и передавать его каким-либо предусмотренным способом (Например, через переменную окружения SVACER_AUTH_TOKEN.&lt;br /&gt;
&lt;br /&gt;
== Автоназначение ролей пользователю на основе содержимого Claims токена ==&lt;br /&gt;
В Svacer реализован механизм автоназначения ролей пользователю, на основе получаемого от провайдера аутентификации (например KeyCloak) токена. Для работы этого механизма необходимо:&lt;br /&gt;
&lt;br /&gt;
# В Svacer создать необходимые роли (доступные для автоназначения)&lt;br /&gt;
# Посредством настройки провайдера аутентифкации добавление в Claims пользователя двух полей, которые содержат список всех возможных для пользвоателя ролей и список ролей, доступных в текущий момент.&lt;br /&gt;
# Указать название полей из пункта 2 в полях конфигурации token.claims.role и token.claims.sync_roles&lt;br /&gt;
&lt;br /&gt;
Механизм автоназначения ролей будет обеспечивать наличие у пользователя ролей, получаемых по следующей формуле:&amp;lt;code&amp;gt;haveSet.Sub(syncSet).Add(tokenSet.Mul(syncSet))&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&lt;br /&gt;
* haveSet - текущее множество ролей пользователя&lt;br /&gt;
* syncSet - роли из списка sync_roles&lt;br /&gt;
* token_set - роли из списка role&lt;br /&gt;
* Sub,Add,Mul - соответствующие операции над множествами&lt;br /&gt;
'''!Внимание!''' С версии 11, в поле Claims, указанном в конфигурации в '''token.Claims.role''', должен находится массив ролей, а не едиснтвенное значение&lt;br /&gt;
&lt;br /&gt;
== Возможные проблемы при настройке ==&lt;br /&gt;
&lt;br /&gt;
=== Сообщение 'Cookies not found' ===&lt;br /&gt;
&lt;br /&gt;
Проблема в DNS имена хоста Keycloak. Проблема встречается когда хост Keycloak имеет разные имена или в некоторых случаях обращение к нему происходит по IP адресу.&lt;br /&gt;
&lt;br /&gt;
=== Сообщение 'Invalid parameter: redirect_url' ===&lt;br /&gt;
&lt;br /&gt;
[[File:Image-20240529151256529.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
При перенаправлении пользователя на Keycloak сервер, OAuth2-proxy передал неверное значение в параметре ''redirect_uri''. Необходимо проверить, что в настройках Keycloak и в параметре ''redirect_uri'' OAauth2-proxy находятся одинаковые значения&lt;br /&gt;
&lt;br /&gt;
[[File:Image-20240529152158450.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
=== Сообщение 'CSRF cookie failed validation' ===&lt;br /&gt;
Данная ошибка появляется по следующим причинам:&lt;br /&gt;
* ''csrf'' токен не найден в куках; Можно открыть консоль разработчика и убедится, что в куках для хоста oauth2-proxy есть кука: ''_oauth2_proxy_csrf_XXXXX''&lt;br /&gt;
* ''csrf'' токен истек; Для решения проблемы можно увеличить время действия ''csrf'' токена (см. [[OIDC#Конфигурация OAuth2-proxy|Конфигурация OAuth2-proxy]])&lt;br /&gt;
* был произведен перезапуск oauth2-proxy, а строка адреса в URL осталась от предыдущего запуска; Попробовать начать процедуру входа снова, перейдя на главную страницу OAuth2-proxy&lt;br /&gt;
&lt;br /&gt;
=== Строка переключения языка GUI Svacer и белый экран. ===&lt;br /&gt;
&lt;br /&gt;
Сервер Svacer недоступен.&lt;br /&gt;
&lt;br /&gt;
=== При работе с CLI возникает ошибка: 'Failed to query server. Details: server response error: 403' ===&lt;br /&gt;
&lt;br /&gt;
Не прописано исключение для запроса: /''api/public/server/info''&lt;br /&gt;
&lt;br /&gt;
=== При работе с CLI возникает ошибка: 'Cannot get authentication settings from server StatusCode: 403' ===&lt;br /&gt;
&lt;br /&gt;
Не прописано исключение для запроса: ''/api/auth_settings''&lt;br /&gt;
&lt;br /&gt;
=== При работе с CLI возникает ошибка: 'ERROR: invalid character '&amp;lt;' looking for beginning of value' ===&lt;br /&gt;
&lt;br /&gt;
Не прописано исключение для запроса: ''/api/public/oidc/login''&lt;br /&gt;
&lt;br /&gt;
== Конфигурация в Docker ==&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся примеры конфигурации контейнеров для запуска Svacer в тестовом режиме с целью понимания логики работы oauth2-proxy совместно со Svacer и сервером Keycloak.&lt;br /&gt;
&lt;br /&gt;
=== Образы Docker ===&lt;br /&gt;
&lt;br /&gt;
==== Svacer ====&lt;br /&gt;
&lt;br /&gt;
Файл Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;FROM ubuntu:22.04&lt;br /&gt;
&lt;br /&gt;
LABEL maintainer=&amp;quot;akuzmin@ispras.ru&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
&lt;br /&gt;
RUN apt update &amp;amp;amp;&amp;amp;amp; apt install -y --no-install-recommends curl \&lt;br /&gt;
    &amp;amp;amp;&amp;amp;amp; rm -rf /var/cache/apt/archives /var/lib/apt/lists/* \&lt;br /&gt;
    &amp;amp;amp;&amp;amp;amp; mkdir -p /svacer/bin &amp;amp;amp;&amp;amp;amp; mkdir -p /svacer/store &lt;br /&gt;
&lt;br /&gt;
COPY svacer/bin/svacer-server /svacer/bin/&lt;br /&gt;
COPY svacer/bin/svacer /svacer/bin/&lt;br /&gt;
&lt;br /&gt;
WORKDIR /svacer/bin&lt;br /&gt;
&lt;br /&gt;
ENV STORE=/svacer/store&lt;br /&gt;
ENV SVACER_PG_URL=postgres://svace:svace@127.0.0.1:5432/svace&lt;br /&gt;
ENV MEMSETTINGS=default&lt;br /&gt;
ENV PATH=/svacer/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
EXPOSE 8080&lt;br /&gt;
&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL --config /config/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OAuth2-proxy ====&lt;br /&gt;
&lt;br /&gt;
Файл Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;FROM ubuntu:22.04&lt;br /&gt;
LABEL maintainer=&amp;quot;chernykov_sv@ispras.ru&amp;quot;&lt;br /&gt;
RUN mkdir /config&lt;br /&gt;
RUN mkdir /logs&lt;br /&gt;
#COPY oauth.cfg oauth.cfg&lt;br /&gt;
WORKDIR /oauth&lt;br /&gt;
COPY oauth2-proxy oauth2-proxy&lt;br /&gt;
COPY start.sh start.sh&lt;br /&gt;
RUN apt update &amp;amp;amp;&amp;amp;amp; apt install curl -y&lt;br /&gt;
ENTRYPOINT [&amp;quot;/bin/bash&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;/oauth/start.sh&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Скрипт start.sh (полезен для определения факта запуска Keycloak контейнера):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
exit='no'&lt;br /&gt;
start='no'&lt;br /&gt;
tmt=60&lt;br /&gt;
echo &amp;quot;Using $KEYCLOAK_HOST&amp;quot;&lt;br /&gt;
until [[ $exit == 'yes' ]]; do&lt;br /&gt;
  sleep 5&lt;br /&gt;
  tmt=$(($tmt-5))&lt;br /&gt;
  if [[ $tmt == 0 ]]; then&lt;br /&gt;
    exit='yes'&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  resp=`curl --head -fsS  http://$KEYCLOAK_HOST/health/ready`&lt;br /&gt;
  if [[ $? == 0 ]]; then&lt;br /&gt;
    exit='yes'&lt;br /&gt;
    start='yes'&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
if [[ $start == 'yes' ]]; then&lt;br /&gt;
echo 'Starting oauth...'&lt;br /&gt;
./oauth2-proxy --config /config/oauth.cfg --logging-filename /logs/oauth.log&lt;br /&gt;
else&lt;br /&gt;
 echo &amp;quot;Keycloak is not ready ...Can not start oauth2_proxy&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Docker-compose ===&lt;br /&gt;
Файл docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;&amp;quot;&amp;gt;version: &amp;quot;3.6&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  oauth_proxy:&lt;br /&gt;
    image: oauth_proxy&lt;br /&gt;
    container_name: oauth_proxy&lt;br /&gt;
    environment:&lt;br /&gt;
      - OAUTH2_PROXY_HTTP_ADDRESS=http://oauth_proxy:8080&lt;br /&gt;
      - OAUTH2_PROXY_UPSTREAMS=http://svacer:8080&lt;br /&gt;
      - OAUTH2_PROXY_REDIRECT_URL=http://oauth_proxy:4180/oauth2/callback&lt;br /&gt;
      - OAUTH2_PROXY_OIDC_ISSUER_URL=http://keycloak:8888/realms/svacer&lt;br /&gt;
      - KEYCLOAK_HOST=keycloak:8888&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./config/proxy:/config&lt;br /&gt;
      - ./logs:/logs&lt;br /&gt;
&lt;br /&gt;
    depends_on:&lt;br /&gt;
      svacer:&lt;br /&gt;
          condition: service_healthy&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;4180:8080&amp;quot;&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
        ipv4_address: 10.10.10.2&lt;br /&gt;
&lt;br /&gt;
  postgresql:&lt;br /&gt;
    image: postgres:12.16&lt;br /&gt;
    container_name: oauth_postgres&lt;br /&gt;
    restart: always&lt;br /&gt;
    shm_size: 1g&lt;br /&gt;
    environment:&lt;br /&gt;
      - POSTGRES_DB=svace&lt;br /&gt;
      - POSTGRES_USER=svace&lt;br /&gt;
      - POSTGRES_PASSWORD=svace&lt;br /&gt;
      - POSTGRES_ROOT_PASSWORD=svace&lt;br /&gt;
    expose:&lt;br /&gt;
      - &amp;quot;5432&amp;quot;&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./postgres_data:/var/lib/postgresql/data&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
         ipv4_address: 10.10.10.3&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: pg_isready -U svace&lt;br /&gt;
      interval: 8s&lt;br /&gt;
      start_period: 16s&lt;br /&gt;
      timeout: 4s&lt;br /&gt;
      retries: 4&lt;br /&gt;
&lt;br /&gt;
  keycloak:&lt;br /&gt;
    image: keycloak:latest&lt;br /&gt;
    container_name: oauth_keycloak&lt;br /&gt;
    environment:&lt;br /&gt;
      - KEYCLOAK_ADMIN=admin&lt;br /&gt;
      - KEYCLOAK_ADMIN_PASSWORD=1234&lt;br /&gt;
      - KEYCLOAK_LOGLEVEL=TRACE&lt;br /&gt;
      - KC_HEALTH_ENABLED=true&lt;br /&gt;
    command: &lt;br /&gt;
      - start-dev&lt;br /&gt;
      - --import-realm&lt;br /&gt;
      - --http-port=8888&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./keycloak_realm:/opt/keycloak/data/import&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8888:8888&amp;quot;&lt;br /&gt;
    expose:&lt;br /&gt;
      - &amp;quot;8888&amp;quot;&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
         ipv4_address: 10.10.10.3&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: pg_isready -U svace&lt;br /&gt;
      interval: 8s&lt;br /&gt;
      start_period: 16s&lt;br /&gt;
      timeout: 4s&lt;br /&gt;
      retries: 4&lt;br /&gt;
&lt;br /&gt;
  svacer:&lt;br /&gt;
    image: oauth_svacer:latest&lt;br /&gt;
    container_name: oauth_svacer&lt;br /&gt;
    restart: always&lt;br /&gt;
    shm_size: 1g&lt;br /&gt;
    depends_on:&lt;br /&gt;
      postgresql:&lt;br /&gt;
        condition: service_healthy&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;3002:3002&amp;quot;&lt;br /&gt;
      - &amp;quot;18080:8080&amp;quot;&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./svacer_data:/data&lt;br /&gt;
      - ./config/svacer/:/config&lt;br /&gt;
    environment:&lt;br /&gt;
      - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace&lt;br /&gt;
      - SVACER_DEBUG=true&lt;br /&gt;
      - SVACER_OPT='--config /config/oidc3.yaml'&lt;br /&gt;
      - STORE=/data/store&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer_oauth:&lt;br /&gt;
         ipv4_address: 10.10.10.5&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: curl --fail http://localhost:8080/api/health || exit 1&lt;br /&gt;
      interval: 8s&lt;br /&gt;
      start_period: 16s&lt;br /&gt;
      timeout: 4s&lt;br /&gt;
      retries: 4&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  svacer_oauth:&lt;br /&gt;
    driver: bridge&lt;br /&gt;
    ipam:&lt;br /&gt;
      config:&lt;br /&gt;
        - subnet: 10.10.10.0/24&lt;br /&gt;
          gateway: 10.10.10.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chernykov sv</name></author>
	</entry>
</feed>