<?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=M.vinogradov</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=M.vinogradov"/>
	<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Special:Contributions/M.vinogradov"/>
	<updated>2026-07-09T07:29:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3573</id>
		<title>Help:13-alpha deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3573"/>
		<updated>2026-05-26T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: mcp link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с [[Help:13-alpha MCP|MCP-сервером]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; || Запуск Svacer со всеми доступными профилями&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile ai&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Данный профиль не требует дополнительной конфигурации для запуска&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url, по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например, значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM model service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
# LLM model service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token for the operation of AI-assistant components &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password for the operation of AI-assistant components&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI-assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI-assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM model service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM model service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to the LLM model service&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером, подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости можно настроить логин и пароль пользователя, от имени которого MCP-сервер будет выполнять запросы к Svacer. По умолчанию &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# SVACER_LOGIN=admin&lt;br /&gt;
# SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
# MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
# DNS rebinding protection for FastMCP&lt;br /&gt;
# MCP_ENABLE_DNS_REBINDING_PROTECTION=false&lt;br /&gt;
# MCP_ALLOWED_HOSTS=svacer-mcp:*&lt;br /&gt;
# MCP_ALLOWED_ORIGINS=http://svacer-mcp:*&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Удаление демонстрационной версии == &lt;br /&gt;
&lt;br /&gt;
В процессе запуска демонстрационной версии в docker будут созданы контейнеры, тома, сеть с префиксом &amp;lt;code&amp;gt;svacer-13&amp;lt;/code&amp;gt;. Чтобы из удалить, выполните последовательно следующие шаги:&lt;br /&gt;
# Остановите и удалите все docker-контейнеры Svacer;&lt;br /&gt;
# Удалите тома с данными Svacer;&lt;br /&gt;
# Удалите docker-образы демонстрационной версии Svacer;&lt;br /&gt;
&lt;br /&gt;
=== Остановка и удаление docker-контейнеров Svacer ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После остановки и удаления docker-контейнеров с компонентами Svacer, данные продолжат храниться в docker-томах. Поэтому при повторном запуске демонстрационной версии они будут доступны.&lt;br /&gt;
&lt;br /&gt;
=== Удаление томов с данными БД, объектного и файлового хранилищ ===&lt;br /&gt;
&lt;br /&gt;
После выполнения следующей команды все данные накопленные за время работы демонстрационной версии Svacer будут удалены. При повторном запуске будет развёрнута чистая версия системы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker volume rm svacer-13-ai-postgres svacer-13-object-store svacer-13-postgres svacer-13-snapshot-sources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удаление томов также можно выполнить одновременно с остановкой и удалением docker-контейнеров Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Удаление docker-образов ===&lt;br /&gt;
&lt;br /&gt;
После удаления docker-образов компонентов демонстрационной версии Svacer, при повторном запуске они снова будут загружены из репозитория https://hub.docker.com.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker image rm ispras/svacer:13-alpha ispras/svacerai:13-alpha ispras/svacer-mcp:13-alpha ispras/validation-server:13-alpha&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удаление томов также можно выполнить одновременно с остановкой и удалением docker-контейнеров Svacer и томов с данными&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down -v --rmi all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3569</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3569"/>
		<updated>2026-05-26T10:07:41Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Удалена плашка со ссылкой на деморелиз&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
&lt;br /&gt;
Svacer MCP может быть подключён к любому серверу Svacer версии 12 и выше. В данном разделе описывается установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/svacerai/mcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd mcp&lt;br /&gt;
 &lt;br /&gt;
 python3 -m venv .venv&lt;br /&gt;
 .venv/bin/pip install -e .&lt;br /&gt;
 &lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 .venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&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;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;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;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3568</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3568"/>
		<updated>2026-05-26T08:49:46Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Поддержка MCP включена в [[Help:13-alpha introduction|демонстрационный релиз]], который может быть развёрнут с помощью docker compose [[Help:13-alpha deploy|согласно инструкции]]}}&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
Установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/svacerai/mcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd mcp&lt;br /&gt;
 &lt;br /&gt;
 python3 -m venv .venv&lt;br /&gt;
 .venv/bin/pip install -e .&lt;br /&gt;
 &lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 .venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&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;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;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;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3567</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3567"/>
		<updated>2026-05-26T08:49:14Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Добавлена ссылка на демонстрационный релиз и инструкцию запуска с помощью docker compose&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Поддержка MCP включена в [[Help:13-alpha introduction|тестовый релиз]], который может быть развёрнут с помощью docker compose [[Help:13-alpha deploy|согласно инструкции]]}}&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
Установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/svacerai/mcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd mcp&lt;br /&gt;
 &lt;br /&gt;
 python3 -m venv .venv&lt;br /&gt;
 .venv/bin/pip install -e .&lt;br /&gt;
 &lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 .venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&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;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&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;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;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;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3566</id>
		<title>Help:13-alpha deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3566"/>
		<updated>2026-05-26T08:45:01Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Добавлены однострочники для удаления docker-артефактов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с MCP-сервером &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; || Запуск Svacer со всеми доступными профилями&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile ai&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Данный профиль не требует дополнительной конфигурации для запуска&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url, по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например, значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM model service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
# LLM model service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token for the operation of AI-assistant components &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password for the operation of AI-assistant components&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI-assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI-assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM model service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM model service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to the LLM model service&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером, подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости можно настроить логин и пароль пользователя, от имени которого MCP-сервер будет выполнять запросы к Svacer. По умолчанию &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# SVACER_LOGIN=admin&lt;br /&gt;
# SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
# MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
# DNS rebinding protection for FastMCP&lt;br /&gt;
# MCP_ENABLE_DNS_REBINDING_PROTECTION=false&lt;br /&gt;
# MCP_ALLOWED_HOSTS=svacer-mcp:*&lt;br /&gt;
# MCP_ALLOWED_ORIGINS=http://svacer-mcp:*&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Удаление демонстрационной версии == &lt;br /&gt;
&lt;br /&gt;
В процессе запуска демонстрационной версии в docker будут созданы контейнеры, тома, сеть с префиксом &amp;lt;code&amp;gt;svacer-13&amp;lt;/code&amp;gt;. Чтобы из удалить, выполните последовательно следующие шаги:&lt;br /&gt;
# Остановите и удалите все docker-контейнеры Svacer;&lt;br /&gt;
# Удалите тома с данными Svacer;&lt;br /&gt;
# Удалите docker-образы демонстрационной версии Svacer;&lt;br /&gt;
&lt;br /&gt;
=== Остановка и удаление docker-контейнеров Svacer ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После остановки и удаления docker-контейнеров с компонентами Svacer, данные продолжат храниться в docker-томах. Поэтому при повторном запуске демонстрационной версии они будут доступны.&lt;br /&gt;
&lt;br /&gt;
=== Удаление томов с данными БД, объектного и файлового хранилищ ===&lt;br /&gt;
&lt;br /&gt;
После выполнения следующей команды все данные накопленные за время работы демонстрационной версии Svacer будут удалены. При повторном запуске будет развёрнута чистая версия системы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker volume rm svacer-13-ai-postgres svacer-13-object-store svacer-13-postgres svacer-13-snapshot-sources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удаление томов также можно выполнить одновременно с остановкой и удалением docker-контейнеров Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Удаление docker-образов ===&lt;br /&gt;
&lt;br /&gt;
После удаления docker-образов компонентов демонстрационной версии Svacer, при повторном запуске они снова будут загружены из репозитория https://hub.docker.com.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker image rm ispras/svacer:13-alpha ispras/svacerai:13-alpha ispras/svacer-mcp:13-alpha ispras/validation-server:13-alpha&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удаление томов также можно выполнить одновременно с остановкой и удалением docker-контейнеров Svacer и томов с данными&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down -v --rmi all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3565</id>
		<title>Help:13-alpha deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3565"/>
		<updated>2026-05-26T08:27:50Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Добавлена инструкция для удаления демонстрационной версии&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с MCP-сервером &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; || Запуск Svacer со всеми доступными профилями&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile ai&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Данный профиль не требует дополнительной конфигурации для запуска&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url, по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например, значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM model service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
# LLM model service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token for the operation of AI-assistant components &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password for the operation of AI-assistant components&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI-assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI-assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM model service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM model service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to the LLM model service&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером, подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости можно настроить логин и пароль пользователя, от имени которого MCP-сервер будет выполнять запросы к Svacer. По умолчанию &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# SVACER_LOGIN=admin&lt;br /&gt;
# SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
# MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
# DNS rebinding protection for FastMCP&lt;br /&gt;
# MCP_ENABLE_DNS_REBINDING_PROTECTION=false&lt;br /&gt;
# MCP_ALLOWED_HOSTS=svacer-mcp:*&lt;br /&gt;
# MCP_ALLOWED_ORIGINS=http://svacer-mcp:*&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Удаление демонстрационной версии == &lt;br /&gt;
&lt;br /&gt;
В процессе запуска демонстрационной версии в docker будут созданы контейнеры, тома, сеть с префиксом &amp;lt;code&amp;gt;svacer-13&amp;lt;/code&amp;gt;. Чтобы из удалить, выполните последовательно следующие шаги:&lt;br /&gt;
# Остановите и удалите все docker-контейнеры Svacer;&lt;br /&gt;
# Удалите тома с данными Svacer;&lt;br /&gt;
# Удалите docker-образы демонстрационной версии Svacer;&lt;br /&gt;
&lt;br /&gt;
=== Остановка и удаление docker-контейнеров Svacer ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker compose -f docker-compose-with-ai-llm-mcp.yml --profile &amp;quot;*&amp;quot; down&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После остановки и удаления docker-контейнеров с компонентами Svacer, данные продолжат храниться в docker-томах. Поэтому при повторном запуске демонстрационной версии они будут доступны.&lt;br /&gt;
&lt;br /&gt;
=== Удаление томов с данными БД, объектного и файлового хранилищ ===&lt;br /&gt;
&lt;br /&gt;
После выполнения следующей команды все данные накопленные за время работы демонстрационной версии Svacer будут удалены. При повторном запуске будет развёрнута чистая версия системы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker volume rm svacer-13-ai-postgres svacer-13-object-store svacer-13-postgres svacer-13-snapshot-sources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Удаление docker-образов ===&lt;br /&gt;
&lt;br /&gt;
После удаления docker-образов компонентов демонстрационной версии Svacer, при повторном запуске они снова будут загружены из репозитория https://hub.docker.com.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker image rm ispras/svacer:13-alpha ispras/svacerai:13-alpha ispras/svacer-mcp:13-alpha ispras/validation-server:13-alpha&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3564</id>
		<title>Help:13-alpha deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3564"/>
		<updated>2026-05-25T10:11:03Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Дополнительные уточнения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с MCP-сервером &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; || Запуск Svacer со всеми доступными профилями&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile ai&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Данный профиль не требует дополнительной конфигурации для запуска&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url, по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например, значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM model service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
# LLM model service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token for the operation of AI-assistant components &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password for the operation of AI-assistant components&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI-assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI-assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM model service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM model service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to the LLM model service&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером, подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости можно настроить логин и пароль пользователя, от имени которого MCP-сервер будет выполнять запросы к Svacer. По умолчанию &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# SVACER_LOGIN=admin&lt;br /&gt;
# SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
# MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
# DNS rebinding protection for FastMCP&lt;br /&gt;
# MCP_ENABLE_DNS_REBINDING_PROTECTION=false&lt;br /&gt;
# MCP_ALLOWED_HOSTS=svacer-mcp:*&lt;br /&gt;
# MCP_ALLOWED_ORIGINS=http://svacer-mcp:*&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3561</id>
		<title>Help:13-alpha deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3561"/>
		<updated>2026-05-25T07:45:08Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: удалена лишняя строка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с MCP-сервером &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == &amp;lt;code&amp;gt;--profile no-ai&amp;lt;/code&amp;gt; == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Данный профиль не требует дополнительной конфигурации для запуска --&amp;gt;&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url, по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию: &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например, значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM hosting service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
 # LLM hosting service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token, which will be used to perform LLM service registration requests in the AI assistant. &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM hosting service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM hosting service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to process warning with LLM&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером, подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* при необходимости можно настроить логин и пароль пользователя, от имени которого MCP-сервер будет выполнять запросы к Svacer. По умолчанию: &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
SVACER_LOGIN=admin&lt;br /&gt;
SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
MCP_ALLOWED_HOSTS=172.17.0.1:*&lt;br /&gt;
MCP_ALLOWED_ORIGINS=http://172.17.0.1:*&lt;br /&gt;
&lt;br /&gt;
# Svacer server (container) URL&lt;br /&gt;
# SVACER_URL=http://svacer:8080&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3557</id>
		<title>Help:13-alpha deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_deploy&amp;diff=3557"/>
		<updated>2026-05-25T06:48:39Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha_introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с MCP-сервером &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == &amp;lt;code&amp;gt;--profile no-ai&amp;lt;/code&amp;gt; == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Данный профиль не требует дополнительной конфигурации для запуска --&amp;gt;&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию: &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например: значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
В процессе обработки набора маркеров с помощью LLM ИИ-ассистент ожидает, что за минуту будет обрабатываться хотя бы один маркер. Если в течение минуты не появятся новы&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM hosting service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
 # LLM hosting service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token, which will be used to perform LLM service registration requests in the AI assistant. &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM hosting service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM hosting service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to process warning with LLM&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;.&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* При необходимости можно настроить логин и пароль пользователя, от имени которого mcp-сервер будет выполнять запросы к Svacer. По умолчанию: &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
SVACER_LOGIN=admin&lt;br /&gt;
SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
MCP_ALLOWED_HOSTS=172.17.0.1:*&lt;br /&gt;
MCP_ALLOWED_ORIGINS=http://172.17.0.1:*&lt;br /&gt;
&lt;br /&gt;
# Svacer server (container) URL&lt;br /&gt;
# SVACER_URL=http://svacer:8080&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_installation&amp;diff=3556</id>
		<title>Help:13-alpha installation</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_installation&amp;diff=3556"/>
		<updated>2026-05-25T06:47:52Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Демонстрационная сборка ==&lt;br /&gt;
&lt;br /&gt;
Установка демонстрационной версии Svacer с поддержкой [[Help:13-alpha_introduction|описанных функций]] доступна только в докере с использованием docker compose&lt;br /&gt;
&lt;br /&gt;
== docker compose ==&lt;br /&gt;
&lt;br /&gt;
Для установки демонстрационной версии подготовлен специальный файл [https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml docker-compose-with-ai-llm-mcp.yml]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai-llm-mcp.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с использованием данного compose-файла доступны профили:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Профиль !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Без профиля || Запуск Svacer без поддержки ИИ-ассистента и MCP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ai&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента со встроенной моделью&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; || Запуск Svacer с поддержкой ИИ-ассистента и возможностью подключения к нему внешних LLM для разметки предупреждений&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || Запуск Svacer с MCP-сервером &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для запуска с использованием одного или нескольких профилей используется команда&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учитывать, что&lt;br /&gt;
&lt;br /&gt;
* при запуске Svacer без профилей или только с профилем &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; функциональность разметки предупреждений с помощью ИИ будет возвращать ошибку;&lt;br /&gt;
&amp;lt;!-- * Профиль &amp;lt;code&amp;gt;no-ai&amp;lt;/code&amp;gt; не может быть использован одновременно с другими профилями; --&amp;gt;&lt;br /&gt;
* запуск с профилями &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; требует настройки переменных окружения (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Для удобства настройки переменных окружения может использоваться env-файл [https://svacer.ispras.ru/extra/llm-mcp.env llm-mcp.env], который после установки необходимых значений может быть передан команде запуска&lt;br /&gt;
&lt;br /&gt;
 docker compose -f docker-compose-with-ai-llm-mcp.yml --env-file ./llm-mcp.env ... --profile llm --profile mcp ... up -d&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == &amp;lt;code&amp;gt;--profile no-ai&amp;lt;/code&amp;gt; == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Данный профиль не требует дополнительной конфигурации для запуска --&amp;gt;&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile llm&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Запуск Svacer с данным профилем даёт возможность подключить к ИИ-ассистенту внешний сервис моделей, поддерживающий OpenAI API. После успешного подключения ИИ-ассистент сможет использовать LLM для разметки и комментирования предупреждений. В списке разметки с помощью ИИ появятся модели доступные пользователю, чей ключ был передан при запуске.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_URL&amp;lt;/code&amp;gt; значение url по которому контейнер &amp;lt;code&amp;gt;svacer-validation-server&amp;lt;/code&amp;gt; сможет подключиться к сервису моделей, совместимому с OpenAI API;&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;LLM_TOKEN&amp;lt;/code&amp;gt; значение ключа авторизации в сервис моделей;&lt;br /&gt;
* при необходимости установить значения переменных &amp;lt;code&amp;gt;REG_TOKEN&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;REG_LOGIN&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;REG_PASSWORD&amp;lt;/code&amp;gt; содержащих, соответственно, токен авторизации или логин и пароль администратора. Эти данные нужны для запуска компонентов поддержки LLM в ИИ-ассистенте. По умолчанию будут использоваться логин и пароль &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при желании изменить отображаемое название сервиса в интерфейсе выбора моделей, можно установить значение переменной &amp;lt;code&amp;gt;REG_NAME&amp;lt;/code&amp;gt;. По умолчанию: &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt;;&lt;br /&gt;
* при необходимости ограничения списка доступных моделей, в переменную &amp;lt;code&amp;gt;MODEL_WHITELIST&amp;lt;/code&amp;gt; нужно передать список названий моделей разделённых запятыми;&lt;br /&gt;
* если производительность сервиса моделей позволяет параллельно обрабатывать несколько предупреждений, то можно установить значение переменной &amp;lt;code&amp;gt;MAX_PARALLEL_REQUESTS&amp;lt;/code&amp;gt; в значение больше единицы;&lt;br /&gt;
* если производительность модели не позволяет обрабатывать одно предупреждение в минуту, то результаты обработки не будут получены. Чтобы увеличить время ожидания новых результатов модели, можно установить значение переменной &amp;lt;code&amp;gt;MODEL_VALIDATION_MAXATTEMPTS&amp;lt;/code&amp;gt; в значение кратное 12 (двенадцати). Например: значение 60 == 5 минут.&lt;br /&gt;
&lt;br /&gt;
В процессе обработки набора маркеров с помощью LLM ИИ-ассистент ожидает, что за минуту будет обрабатываться хотя бы один маркер. Если в течение минуты не появятся новы&lt;br /&gt;
&lt;br /&gt;
Значения данных переменных могут быть сохранены в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; файл и переданы при запуске с помощью аргумента &amp;lt;code&amp;gt;docker compose --env-file ./.env ... up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL of the OpenAI API-compatible LLM hosting service&lt;br /&gt;
LLM_URL=&lt;br /&gt;
&lt;br /&gt;
 # LLM hosting service authorization token&lt;br /&gt;
LLM_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin authorization token, which will be used to perform LLM service registration requests in the AI assistant. &lt;br /&gt;
# Or with REG_LOGIN and REG_PASSWORD, if token is not set&lt;br /&gt;
# REG_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
# REG_LOGIN=admin&lt;br /&gt;
# REG_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# ID of the service in the AI assistant&lt;br /&gt;
# REG_ID=llm&lt;br /&gt;
&lt;br /&gt;
# The name of the service displayed in the AI assistant&lt;br /&gt;
# REG_NAME=llm&lt;br /&gt;
&lt;br /&gt;
# Service description&lt;br /&gt;
# REG_DESCRIPTION=&amp;quot;LLM hosting service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Comma-separated list of available models. If not specified, all models available to the LLM hosting service user will be available.&lt;br /&gt;
# MODEL_WHITELIST=&lt;br /&gt;
&lt;br /&gt;
# Maximum number of simultaneous requests to process warning with LLM&lt;br /&gt;
# MAX_PARALLEL_REQUESTS=1&lt;br /&gt;
&lt;br /&gt;
# Maximum number of 5s attempts to get single warning result from LLM&lt;br /&gt;
# MODEL_VALIDATION_MAXATTEMPTS=12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;--profile mcp&amp;lt;/code&amp;gt; ==&lt;br /&gt;
При запуске с данным профилем стартует контейнер с MCP-сервером подключённый к текущему экземпляру Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer с профилем &amp;lt;code&amp;gt;llm&amp;lt;/code&amp;gt; необходимо:&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; номер сетевого порта на котором будет доступен MCP-сервер. По умолчанию будет назначен порт &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;.&lt;br /&gt;
* установить в переменную окружения &amp;lt;code&amp;gt;SVACER_MPC_TOKEN&amp;lt;/code&amp;gt; строку с токеном авторизации, который необходимо будет указать в клиенте MCP-сервера;&lt;br /&gt;
* при необходимости доступа к MCP-серверу по адресу отличному от &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;) или при использовании DNS необходимо:&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;MCP_ALLOWED_HOSTS&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;172.17.0.1:*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;some.domain:*&amp;lt;/code&amp;gt;&lt;br /&gt;
** указать необходимый адрес/dns-имя в переменной &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;MCP_ALLOWED_ORIGINS&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; в виде &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://172.17.0.1:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://some.domain:*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* При необходимости можно настроить логин и пароль пользователя, от имени которого mcp-сервер будет выполнять запросы к Svacer. По умолчанию: &amp;lt;code&amp;gt;admin:admin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После запуска mcp-сервер будет доступен по адресу &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:{MCP_PORT}/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание других переменных доступных для конфигурации запуска ИИ-ассистента с поддержкой внешнего сервиса моделей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bearer token for /mcp clients in HTTP mode. Generate: openssl rand -hex 32&lt;br /&gt;
SVACER_MCP_TOKEN=&lt;br /&gt;
&lt;br /&gt;
# Svacer admin login and password&lt;br /&gt;
SVACER_LOGIN=admin&lt;br /&gt;
SVACER_PASSWORD=admin&lt;br /&gt;
&lt;br /&gt;
# External port that will be mapped by docker to the internal port 8000&lt;br /&gt;
MCP_PORT=8002&lt;br /&gt;
&lt;br /&gt;
MCP_ALLOWED_HOSTS=172.17.0.1:*&lt;br /&gt;
MCP_ALLOWED_ORIGINS=http://172.17.0.1:*&lt;br /&gt;
&lt;br /&gt;
# Svacer server (container) URL&lt;br /&gt;
# SVACER_URL=http://svacer:8080&lt;br /&gt;
&lt;br /&gt;
# HTTP timeout for requests to Svacer, seconds&lt;br /&gt;
# SVACER_TIMEOUT=30&lt;br /&gt;
&lt;br /&gt;
# Public URL of this MCP server (used for WWW-Authenticate, RFC 9728).&lt;br /&gt;
# Defaults to http://localhost:&amp;lt;SVACER_HTTP_PORT&amp;gt;. Set when running behind a reverse proxy.&lt;br /&gt;
# SVACER_MCP_RESOURCE_URL=https://mcp.example.com&lt;br /&gt;
&lt;br /&gt;
# Subset of tools to register (comma-separated). Unset = all 8 tools.&lt;br /&gt;
# Available: get_projects, get_snapshots, get_warnings, get_markers,&lt;br /&gt;
#            get_project_stats, get_project_groups, get_advanced_file_preview, get_diff&lt;br /&gt;
# SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3424</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3424"/>
		<updated>2025-12-01T08:59:49Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Remove description of old (separate) AI-assistant version. Add deployment manual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|type=warn|text=&#039;&#039;&#039;Disclaimer&#039;&#039;&#039;&lt;br /&gt;
* Это экспериментальная Proof of Concept версия, предоставляемая для ознакомления по принципу &amp;quot;как есть&amp;quot;. &lt;br /&gt;
* Данная функциональность не связана с [https://svace.pages.ispras.ru/svace-website/2025/02/21/ai-assistant.html AI-ассистентом из анализатора Svace]. Функционал AI-ассистента из анализатора Svace будет интегрирован в Svacer в будущих версиях сервера.}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
== Активация и запуск ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его работы необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения&lt;br /&gt;
# При необходимости: развернуть PostgreSQL-сервер для хранения базы данных ИИ-ассистента&lt;br /&gt;
# Запустить сервис ИИ-ассистента&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-ассистенту&lt;br /&gt;
&lt;br /&gt;
=== docker compose ===&lt;br /&gt;
Самый простой способ деплоя — развернуть всё в докер-контейнерах, воспользовавшиcь подготовленным нами [https://svacer.ispras.ru/extra/docker-compose-with-ai.yml docker-compose] файлом:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -LO https://svacer.ispras.ru/extra/docker-compose-with-ai.yml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 docker compose -f docker-compose-with-ai.yml up -d&lt;br /&gt;
&lt;br /&gt;
=== deb/rpm ===&lt;br /&gt;
Если Svacer установлен из deb/rpm пакета:&lt;br /&gt;
&lt;br /&gt;
1. Запустите docker-контейнер с моделью машинного обучения&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -d --name svacerai-model -p 8000:8000 ispras/svacerai-model:latest&lt;br /&gt;
&lt;br /&gt;
2. В PostgreSQL создайте отдельную БД для ИИ-сервера, запустив psql-консоль и выполнив команды:&lt;br /&gt;
&lt;br /&gt;
 sudo su -l postgres&lt;br /&gt;
 psql&lt;br /&gt;
 postgres=# create database svacerai;&lt;br /&gt;
 postgres=# grant all privileges on database svacerai to svace;&lt;br /&gt;
&lt;br /&gt;
(предполагается, что пользователь &amp;lt;code&amp;gt;svace&amp;lt;/code&amp;gt; уже [[Help:Installation#deb/rpm|был создан]] для сервера Svacer)&lt;br /&gt;
&lt;br /&gt;
3. В конфиг-файле ИИ-сервера &amp;lt;code&amp;gt;/etc/default/svacerai&amp;lt;/code&amp;gt; укажите аргументы запуска&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# URL подключения к БД из второго шага&lt;br /&gt;
SVACERAI_PG_URL=&amp;quot;postgres://svace:svace@127.0.0.1:5432/svacerai?sslmode=disable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# адрес и порт модели из первого шага&lt;br /&gt;
SVACERAI_MODEL_URL=&amp;quot;server-status:http://localhost:8000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# интерфейс и порт, на котором будет запущен ИИ-сервер&lt;br /&gt;
SVACERAI_HOST=&amp;quot;0.0.0.0:7001&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# URL сервера Svacer, который будет подключен к ИИ-серверу&lt;br /&gt;
SVACER_HOST=&amp;quot;http://localhost:8080&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Запустите systemd-сервис ИИ-сервера&lt;br /&gt;
&lt;br /&gt;
 systemctl start svacerai&lt;br /&gt;
&lt;br /&gt;
5. В конфиг-файле сервера Svacer &amp;lt;code&amp;gt;/etc/default/svacer&amp;lt;/code&amp;gt; включите фичу ИИ-ассистента, добавив флаг &amp;lt;code&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; и укажите URL ИИ-сервера&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SVACER_ARGS=&amp;quot;--pg ... --store ... --xsvacer.features aiAssistant&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# соответствует переменной SVACERAI_HOST из шага 3&lt;br /&gt;
XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://localhost:7001/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Перезапустите сервер Svacer&lt;br /&gt;
&lt;br /&gt;
 systemctl restart svacer&lt;br /&gt;
&lt;br /&gt;
== Дополнительная конфигурация ==&lt;br /&gt;
=== Подключение к серверу ИИ-ассистента ===&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Изменить этот адрес можно одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистента}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистента}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Запуск docker-контейнера с моделью машинного обучения ====&lt;br /&gt;
При запуске докер-контейнера с ИИ-моделью, можно создать и примонтировать вольюмы для постоянного хранения базы данных и кэша:&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run --rm -d --name svacerai-model -p 8000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache ispras/svacerai-model:latest&lt;br /&gt;
&lt;br /&gt;
* Вольюм &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кэш сервиса взаимодействия с моделью машинного обучения&lt;br /&gt;
* Вольюм &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ PostgreSQL&lt;br /&gt;
&lt;br /&gt;
=== Флаги команды запуска ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Глобальные флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по умолчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|style=&amp;quot;width: 80px&amp;quot;|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;{ip адрес}:{порт}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|https://en.wikipedia.org/wiki/URL#Syntax&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Список адресов сервисов с моделями машинного обучения. &amp;lt;code&amp;gt;host-id&amp;lt;/code&amp;gt; — идентификатор сервиса моделей в [[#Конфигурация по умолчанию|конфигурации]]&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{host id}:{url сервиса моделей}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При использовании [[#Конфигурация по умолчанию|конфигурации по умолчанию]], &amp;lt;code&amp;gt;{host id}&amp;lt;/code&amp;gt; должен быть равен &amp;lt;code&amp;gt;server-status&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacerai-server run --pg postgres://svace:svace@127.0.0.1:5432/svacer_ai --host localhost:8095 --svacer-host http://localhost:8094 --ai-host server-status:http://localhost:7000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;localhost:8081&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8080/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;[AI]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса моделей}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Параметры подключения сервиса модели машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса с моделями машинного обучения&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:7000&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений, отправляемых для анализа моделью за раз&lt;br /&gt;
|&amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;[id, warnClass, code]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Описание модели xgb.joblib ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Модель обучена на базе 50000+ размеченных предупреждений.&lt;br /&gt;
&lt;br /&gt;
Для предсказания статуса разметки нами используются:&lt;br /&gt;
# языковая модель codebert-base для получения эмбеддингов кода;&lt;br /&gt;
# метод градиентного бустинга (xgboost) для решения задачи классификации.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3398</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Changelog&amp;diff=3398"/>
		<updated>2025-11-27T14:14:01Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: changelog 12-0-0 add AI assistant and new Webide deployment description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Release 12-0-0 ===&lt;br /&gt;
* API методы на fullmarkers позволяют указать фильтр с полем фильтрации по 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;  для контроля таймаута на ожидание возможности начала операции импорта результатов (формат 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;
* [&#039;&#039;&#039;Экспериментально&#039;&#039;&#039;] Можно указать формат лог файла в 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;
* Добавлена возможность создания сложных пользовательских фильтров по условиям выраженным предикатом [[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: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;
* [&#039;&#039;&#039;Экспериментально&#039;&#039;&#039;]  Добавлена возможность [[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;
* Форма разметки с помощью [[Help:XSvacer:AIAssistant:Deploy|ИИ-ассистента]] реализована в основном интерфейсе 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#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>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=3305</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=3305"/>
		<updated>2025-11-14T14:38:32Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: start IDE from Svacer in docker container&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE основана на управлении docker-контейнерами с IDE. Поэтому при запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|управления docker-контейнерами]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Запуск функциональности при использовании docker compose ===&lt;br /&gt;
&lt;br /&gt;
В случае запуска Svacer [[Help:Installation#docker_compose|с помощью docker compose]], функциональность Webide будет активирована по умолчанию. При этом в docker-контейнер содержащий Svacer по умолчанию будет проброшен (примонтирован) unix-сокет файл &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/var/run/docker.sock&amp;lt;/code&amp;gt;, доступ к которому будет использоваться для управления контейнерами c IDE. При запуске контейнеры с IDE будут подключаться к docker-сети &amp;lt;code&amp;gt;svacer&amp;lt;/code&amp;gt;, которая будет создана при вызове &amp;lt;code&amp;gt;docker compose up&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск функциональности в Svacer с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров Svacer, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option) на том же хосте, что и Svacer;&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать архив с docker-образом для соответствующей версии Svacer: [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz 11+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz 10+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar 9+]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение.&lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sarif/filenametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt;&lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Завершающий слеш обязателен!&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации&lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка&lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=При использовании версии Svacer 9.0.0 установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9.0.1]].&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка.&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)&lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|{{Note|text=В версии 10.0.0 заменён на [[Help:XSvacer:Webide#Параметры_экспорта_sarif-файла_с_разметкой_предупреждений|sarif]]}}&lt;br /&gt;
Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры экспорта sarif-файла с разметкой предупреждений ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки экспорта sarif-файлов с разметкой предупреждений, выполненной в Svacer.&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;
|-&lt;br /&gt;
|sarif&lt;br /&gt;
|map&lt;br /&gt;
|Настройки экспорта sarif-файла&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|sarif/filenametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия sarif-файла. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;warnings.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|sarif/commenttemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|{{Note|text=Удалён в версии 11.0.0}}&lt;br /&gt;
Шаблон для формирования элемента списка комментариев предупреждения при экспорте в sarif-файл. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|Comment]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default&lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|Svacer 11+: 1.46.0.sarif.clang.11.0.0.1&lt;br /&gt;
Svacer 10+: 1.46.0.sarif.clang.10.0.0&lt;br /&gt;
&lt;br /&gt;
Svacer 9+: 1.46.0.sarif.clang&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|Svacer 11+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz&lt;br /&gt;
Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
Svacer 9+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре Config https://github.com/moby/moby/blob/v28.5.1/api/types/container/config.go#L44&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре HostConfig https://github.com/moby/moby/blob/v28.5.1/api/types/container/hostconfig.go#L429&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings/&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
:- hostport: 0&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре NetworkingConfig https://github.com/moby/moby/blob/v28.5.1/api/types/network/network.go#L140&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerhostconfigmounts/&lt;br /&gt;
|map&lt;br /&gt;
|{{Note|text=Добавлен в версии 12.0.0}}&lt;br /&gt;
Именованные настройки точек монтирования контейнера. Соответствуют структуре [[Help:XSvacer:Webide#Структуры_применяемые_в_конфигурации_функциональности|MountMap]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/containernetworkingconfigendpoints/&lt;br /&gt;
|map&lt;br /&gt;
|{{Note|text=Добавлен в версии 12.0.0}}&lt;br /&gt;
Именованные настройки подключённых сетевых интерфейсов контейнера контейнера. Соответствуют структуре [[Help:XSvacer:Webide#Структуры_применяемые_в_конфигурации_функциональности|EndpointsMap]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
     IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
     StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Comment {&lt;br /&gt;
     ID               string&lt;br /&gt;
     Text             string&lt;br /&gt;
     Ref              string&lt;br /&gt;
     CreatedBy        string&lt;br /&gt;
     CreatedByID      string&lt;br /&gt;
     CreateTs         time.Time&lt;br /&gt;
     UpdateTs         *time.Time&lt;br /&gt;
     UpdatedBy        string&lt;br /&gt;
     UpdatedByID      string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Структуры применяемые в конфигурации функциональности ====&lt;br /&gt;
&lt;br /&gt;
 type Mount struct {&lt;br /&gt;
 	Disabled bool&lt;br /&gt;
 	mount.Mount https://github.com/moby/moby/blob/v28.5.1/api/types/mount/mount.go#L27&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 type MountMap map[string]Mount&lt;br /&gt;
 &lt;br /&gt;
 type EndpointSettings struct {&lt;br /&gt;
 	Name     string&lt;br /&gt;
 	Disabled bool&lt;br /&gt;
 	*network.EndpointSettings https://github.com/moby/moby/blob/v28.5.1/api/types/network/endpoint.go#L10&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 type EndpointsMap map[string]*EndpointSettings&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sarif:&lt;br /&gt;
          filenametemplate: &amp;quot;warnings.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang.11.0.0.1&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          containerhostconfigmounts:&lt;br /&gt;
            &amp;quot;projectrootbind&amp;quot;: &lt;br /&gt;
              disabled: false&lt;br /&gt;
              mount:&lt;br /&gt;
                type: bind&lt;br /&gt;
                target: &amp;quot;/home/project&amp;quot;&lt;br /&gt;
                readonly: true&lt;br /&gt;
            &amp;quot;projectrootvolume&amp;quot;: &lt;br /&gt;
              disabled: true&lt;br /&gt;
              mount:&lt;br /&gt;
                type: volume&lt;br /&gt;
                source: svacer-snapshot-sources&lt;br /&gt;
                target: &amp;quot;/home/project&amp;quot;&lt;br /&gt;
                readonly: true&lt;br /&gt;
          containernetworkingconfigendpoints:&lt;br /&gt;
            &amp;quot;svacer&amp;quot;:&lt;br /&gt;
              name: svacer&lt;br /&gt;
              disabled: true&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  # - hostport: 0 # not required since version 12.0.0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр&lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение&lt;br /&gt;
 &lt;br /&gt;
 Svacer 11+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz&lt;br /&gt;
 Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
 Svacer 9+:  https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.&lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.4/file/MS-SarifVSCode.sarif-viewer-3.4.4.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа:&lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang... -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0.sarif.clang... | gzip &amp;gt; /path/to/tar/theia-blueprint.1.46.0.sarif.clang....tar.gz&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant:Deploy&amp;diff=3023</id>
		<title>Help:XSvacer:AIAssistant:Deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant:Deploy&amp;diff=3023"/>
		<updated>2025-06-23T11:46:25Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: --ai-host description improvement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Активация и запуск функциональности ==&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его запуска необходимо:&lt;br /&gt;
&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-ассистенту;&lt;br /&gt;
# Развернуть и запустить сервис ИИ-ассистента;&lt;br /&gt;
&lt;br /&gt;
=== Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer&amp;lt;/code&amp;gt; при запуске Svacer ===&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
==== Настройка доступа к ИИ-ассистенту в Svacer ====&lt;br /&gt;
&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменить адрес, по которому Svacer будет подключаться к ИИ-ассистенту, можно одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистента}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистента}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка значения флага &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
В связи с тем, что ИИ-ассистент использует REST API Svacer, необходимо добавить url ИИ-ассистента в список публичных url Svacer. Это можно сделать, добавив при запуске Svacer флаг:&lt;br /&gt;
&lt;br /&gt;
 --public-url {url ИИ-ассистента}&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;--xsvacer.features aiAssistant --public-url https://svacer-ai-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Данная настройка связана с функциональностью генерации коротких ссылок}}&lt;br /&gt;
&lt;br /&gt;
=== Развёртывание и запуск ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
При развёртывании ИИ-ассистента необходимо выполнить следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения;&lt;br /&gt;
# При необходимости: развернуть postresql-сервер для хранения базы данных ИИ-ассистента;&lt;br /&gt;
# Запустить сервис ИИ-ассистента.&lt;br /&gt;
&lt;br /&gt;
==== Запуск docker-контейнера с моделью машинного обучения ====&lt;br /&gt;
&lt;br /&gt;
Docker-образ контейнера с моделью можно скачать по ссылке: https://svacer.ispras.ru/docker/images/svacer-ai-model-host.1.0.0.tar.gz (3.3GB)&lt;br /&gt;
&lt;br /&gt;
Далее docker-образ необходимо загрузить на docker-хост с помощью команды&lt;br /&gt;
&lt;br /&gt;
 docker image load -i /path/to/svacer-ai-model-host.1.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого docker-контейнер может быть запущен следующей командой&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run -d --name svacer-ai-model-host -p 7000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache svacer-ai-model-host:1.0.0&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кэш сервиса взаимодействия с моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ postgres&#039;а.&lt;br /&gt;
&lt;br /&gt;
Порт &amp;lt;code&amp;gt;7000&amp;lt;/code&amp;gt; будет использоваться по умолчанию, если не были изменены [[#Параметры подключения сервиса модели машинного обучения|параметры подключения сервиса машинного обучения]]&lt;br /&gt;
&lt;br /&gt;
==== Запуск ИИ-ассистента ====&lt;br /&gt;
&lt;br /&gt;
Исполняемый файл ИИ-ассистента можно скачать по ссылке: https://svacer.ispras.ru/releases/svacer-ai/svacer-ai-1-0-0-linux.tar.gz (53MB)&lt;br /&gt;
&lt;br /&gt;
После этого ИИ-ассистент может быть запущен командой &amp;lt;code&amp;gt;svacerai-server run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Флаги команды запуска ИИ-ассистента =====&lt;br /&gt;
&lt;br /&gt;
Глобальные флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по умолчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|style=&amp;quot;width: 80px&amp;quot;|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;{ip адрес}:{порт}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|https://en.wikipedia.org/wiki/URL#Syntax&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Список адресов сервисов с моделями машинного обучения. &amp;lt;code&amp;gt;host-id&amp;lt;/code&amp;gt; - идентификатор сервиса моделей в [[#Конфигурация по умолчанию|конфигурации]]&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{host id}:{url сервиса моделей}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При использовании [[#Конфигурация по умолчанию|конфигурации по умолчанию]], &amp;lt;code&amp;gt;{host id}&amp;lt;/code&amp;gt; должен быть равен &amp;lt;code&amp;gt;server-status&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacerai-server run --pg postgres://svace:svace@127.0.0.1:5432/svacer_ai --host localhost:8095 --svacer-host http://localhost:8094 --ai-host server-status:http://localhost:7000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;localhost:8081&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8080/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;[AI]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса моделей}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры подключения сервиса модели машинного обучения ====&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса с моделями машинного обучения&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:7000&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений, отправляемых для анализа моделью за раз&lt;br /&gt;
|&amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;[id, warnClass, code]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer&amp;diff=3011</id>
		<title>Help:XSvacer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer&amp;diff=3011"/>
		<updated>2025-06-04T12:42:24Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Add AI assistant link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= XSvacer — расширение функциональности Svacer =&lt;br /&gt;
{{Note|text=На данный момент расширенные функции находятся на стадии внедрения. В последующих релизах возможно изменение форматов конфигурации и API взаимодействия с указанными функциями}}&lt;br /&gt;
&lt;br /&gt;
Начиная с релиза [[Changelog#Release_9-0-0|9.0.0]] в Svacer появились расширенные функции, которые могут быть активированы по требованию. По умолчанию данные функции неактивны.&lt;br /&gt;
&lt;br /&gt;
Доступные функции:&lt;br /&gt;
* [[Help:XSvacer:Webide|Webide]] — среда разработки на базе [https://theia-ide.org/ Theia IDE], с помощью которой можно просматривать исходный код снимка, предупреждения анализатора и разметку.&lt;br /&gt;
* [[Help:XSvacer:AIAssistant|AIAssistant]] — ИИ-ассистент, позволяющий использовать модель машинного обучения для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
== Активация функций ==&lt;br /&gt;
&lt;br /&gt;
Активировать функции можно, указав флаг &amp;lt;code&amp;gt;--xsvacer.features feature_name&amp;lt;/code&amp;gt; при запуске Svacer. Флаг можно указать несколько раз, чтобы активировать несколько функций.&lt;br /&gt;
&lt;br /&gt;
Также список активных функций можно настроить в конфигурационном yaml-файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; в разделе &amp;lt;code&amp;gt;xsvacer.features&amp;lt;/code&amp;gt;.&lt;br /&gt;
Значением данного ключа является список строк с названиями активируемых функций:&lt;br /&gt;
 ...&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   features:&lt;br /&gt;
     - webide&lt;br /&gt;
     - aiAssistant&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
При установке флага &amp;lt;code&amp;gt;--xsvacer.features&amp;lt;/code&amp;gt; список функций, указанный в конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;, будет проигнорирован.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3010</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=3010"/>
		<updated>2025-06-04T05:48:16Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: AI-model short description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
{{Note|text=[[Help:XSvacer:AIAssistant:Deploy|Инструкция по активации и запуску функциональности]] ИИ-ассистента}}&lt;br /&gt;
&lt;br /&gt;
== Описание интерфейса ИИ-ассистента==&lt;br /&gt;
=== Разметка одного маркера ===&lt;br /&gt;
Чтобы разметить один маркер с помощью ИИ-ассистента:&lt;br /&gt;
:1. Нажмите кнопку [[File:Icon AI.png|25px]] [[Help:UI manual#Функции правой панели|на правой панели]] или в виджете маркера на [[Help:UI manual#Вкладка с исходным кодом|вкладке с исходным кодом]].&lt;br /&gt;
:[[File:221 Правая панель. Переход к ИИ-разметке.png|thumb|none|x200px|Правая панель. Переход к ИИ-разметке]]&lt;br /&gt;
:[[File:222 Виджет элемента трассы. Переход к ИИ-разметке.png|thumb|none|x150px|Виджет маркера на вкладке с исходным кодом. Переход к ИИ-разметке]]&lt;br /&gt;
:2. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированный статус и уровень доверия прогнозу отобразятся в этом же окне. &lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то в окне отобразится сообщение об этом и дальнейшая разметка станет недоступна.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Нажмите кнопку &#039;&#039;&#039;Применить&#039;&#039;&#039;.&lt;br /&gt;
:&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  223 Окно ИИ-разметки.png|Окно ИИ-разметки&lt;br /&gt;
  224 Окно ИИ-разметки. Статус совпадает.png|Окно ИИ-разметки. Прогнозный статус совпадает с существующим&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
:Статус, установленный с помощью ИИ-ассистента, отобразится в верхней части правой панели и в виджете маркера на вкладке с исходным кодом с отметкой [[File:Icon AI 2.png|15px]]. Также этой иконкой будет отмечен статус в комментарии, добавленном при разметке, который дополнительно содержит информацию о проведенной разметке: время, имя модели машинного обучения, уровень доверия прогнозу.&lt;br /&gt;
:Дополнительная информация также отображается при наведении курсора на иконку [[File:Icon AI 2.png|15px]].&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;250px&amp;quot; style=&amp;quot;float:left; clear:right; margin-right:1em; margin-left:1em&amp;quot;&amp;gt;&lt;br /&gt;
  225 Правая панель. Результат ИИ-разметки.png|Правая панель. Результат ИИ-разметки&lt;br /&gt;
  227 Правая панель. Комментарий об ИИ-разметке.png|Правая панель. Комментарий об ИИ-разметке&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;br clear=all /&amp;gt;&lt;br /&gt;
[[File:226 Виджет элемента трассы. Результат ИИ-разметки.png|thumb|none|x150px|Виджет элемента трассы. Результат ИИ-разметки]]&lt;br /&gt;
&lt;br /&gt;
=== Групповая разметка маркеров ===&lt;br /&gt;
Чтобы разметить несколько маркеров с помощью ИИ-ассистента одновременно:&lt;br /&gt;
:1. Если планируется разметить большое количество маркеров, то для ускорения составления прогноза запустите предварительный рассчет (опционально) – на вкладке [[Help:UI manual#Вкладка «Информация о снимке»|&#039;&#039;&#039;Информация о снимке&#039;&#039;&#039;]] [[Help:UI manual#Функции центральной панели|центральной панели]] нажмите кнопку &#039;&#039;&#039;Проанализировать с AI&#039;&#039;&#039;.&lt;br /&gt;
:Расчет прогнозируемого статуса для каждого маркера запустится в фоновом режиме. В это время на месте кнопки будет отображаться анимированная иконка ожидания.&lt;br /&gt;
:[[File:228 Информация о снимке. Предварительный расчет.png|thumb|none|x200px|Информация о снимке. Кнопка перехода к предварительному расчету статусов маркеров]]&lt;br /&gt;
:2. Выберите маркеры для разметки – установите флажки в строках [[Help:UI manual#Таблица маркеров|таблицы]].&lt;br /&gt;
:3. Нажмите кнопку [[File:Icon AI.png|25px]] (доступна, если выбраны маркеры в таблице).&lt;br /&gt;
:4. В открывшемся окне разметки:&lt;br /&gt;
::а) Выберите модель AI, с помощью которой ИИ-ассистент рассчитает статус разметки.&lt;br /&gt;
::Спрогнозированные статусы и уровни доверия прогнозу отобразятся в этом же окне в таблице маркеров. При этом размеченные ранее маркеры окрашены в цвет, соответствующий выставленному статусу. &lt;br /&gt;
::В таблице доступна сортировка значений в столбцах &#039;&#039;&#039;Детектор&#039;&#039;&#039;, &#039;&#039;&#039;Файл&#039;&#039;&#039;, &#039;&#039;&#039;Строка&#039;&#039;&#039; и &#039;&#039;&#039;Уровень доверия&#039;&#039;&#039;, а в столбце &#039;&#039;&#039;Статус разметки&#039;&#039;&#039; доступна фильтрация по значению прогнозируемого статуса.&lt;br /&gt;
::б) Введите комментарий.&lt;br /&gt;
::в) Выберите маркеры, которые требуется разметить, – установите флажки в столбце &#039;&#039;&#039;Статус разметки&#039;&#039;&#039;.&lt;br /&gt;
::Если маркер уже размечен и его статус совпадает с прогнозным, то он недоступен для установки флажка.&lt;br /&gt;
::г) Нажмите кнопку &#039;&#039;&#039;Применить&#039;&#039;&#039;.&lt;br /&gt;
:[[File:229 Окно групповой ИИ-разметки.png|thumb|none|x300px|Окно групповой ИИ-разметки]]&lt;br /&gt;
:Прогресс разметки отображается в соответствующем окне. Запущенный процесс можно полностью отменить нажатием кнопки &#039;&#039;&#039;Отмена&#039;&#039;&#039;.&lt;br /&gt;
:[[File:56 Окно прогресса разметки.png|thumb|none|x100px|Окно прогресса разметки]]&lt;br /&gt;
=== Фильтрация маркеров по режиму разметки ===&lt;br /&gt;
По умолчанию в [[Help:UI manual#Таблица маркеров|таблице маркеров]] отображаются все маркеры: как размеченные вручную, так и размеченные с помощью ИИ-ассистента.&lt;br /&gt;
Чтобы отобразить маркеры только с одним режимом разметки, воспользуйтесь [[Help:UI manual#Настройка и использование пользовательских фильтров|пользовательскими фильтрами]]:&lt;br /&gt;
* для отображения только маркеров, размеченных вручную, выберите фильтр &#039;&#039;&#039;Режим разметки&#039;&#039;&#039; – &#039;&#039;&#039;Вручную&#039;&#039;&#039;;&lt;br /&gt;
* для отображения только маркеров, размеченных с помощью ИИ-ассистента, выберите фильтр &#039;&#039;&#039;Режим разметки&#039;&#039;&#039; – &#039;&#039;&#039;С помощью ИИ&#039;&#039;&#039;.&lt;br /&gt;
[[File:230 Пользовательские фильтры. Режимы разметки.png|thumb|none|x400px|Пользовательские фильтры. Режимы разметки]]&lt;br /&gt;
&lt;br /&gt;
== Описание модели xgb.joblib ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Модель обучена на базе 50000+ размеченных предупреждений.&lt;br /&gt;
&lt;br /&gt;
Для предсказания статуса разметки нами используются:&lt;br /&gt;
# языковая модель codebert-base для получения эмбеддингов кода;&lt;br /&gt;
# метод градиентного бустинга (xgboost) для решения задачи классификации.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2989</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2989"/>
		<updated>2025-05-30T07:30:31Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Separate deployment manual from common description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
{{Note|text=[[Help:XSvacer:AIAssistant:Deploy|Инструкция по активации и запуску функциональности]] ИИ-ассистента}}&lt;br /&gt;
&lt;br /&gt;
== Описание интерфейса ИИ-ассистента==&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant:Deploy&amp;diff=2988</id>
		<title>Help:XSvacer:AIAssistant:Deploy</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant:Deploy&amp;diff=2988"/>
		<updated>2025-05-30T07:27:08Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Separate deployment manual from common description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Активация и запуск функциональности ==&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его запуска необходимо:&lt;br /&gt;
&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-ассистенту;&lt;br /&gt;
# Развернуть и запустить сервис ИИ-ассистента;&lt;br /&gt;
&lt;br /&gt;
=== Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer&amp;lt;/code&amp;gt; при запуске Svacer ===&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
==== Настройка доступа к ИИ-ассистенту в Svacer ====&lt;br /&gt;
&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменить адрес, по которому Svacer будет подключаться к ИИ-ассистенту, можно одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистента}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистента}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка значения флага &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
В связи с тем, что ИИ-ассистент использует REST API Svacer, необходимо добавить url ИИ-ассистента в список публичных url Svacer. Это можно сделать, добавив при запуске Svacer флаг:&lt;br /&gt;
&lt;br /&gt;
 --public-url {url ИИ-ассистента}&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;--xsvacer.features aiAssistant --public-url https://svacer-ai-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Данная настройка связана с функциональностью генерации коротких ссылок}}&lt;br /&gt;
&lt;br /&gt;
=== Развёртывание и запуск ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
При развёртывании ИИ-ассистента необходимо выполнить следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения;&lt;br /&gt;
# При необходимости: развернуть postresql-сервер для хранения базы данных ИИ-ассистента;&lt;br /&gt;
# Запустить сервис ИИ-ассистента.&lt;br /&gt;
&lt;br /&gt;
==== Запуск docker-контейнера с моделью машинного обучения ====&lt;br /&gt;
&lt;br /&gt;
Docker-образ контейнера с моделью можно скачать по ссылке: https://svacer.ispras.ru/docker/images/svacer-ai-model-host.1.0.0.tar.gz (3.3GB)&lt;br /&gt;
&lt;br /&gt;
Далее docker-образ необходимо загрузить на docker-хост с помощью команды&lt;br /&gt;
&lt;br /&gt;
 docker image load -i /path/to/svacer-ai-model-host.1.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого docker-контейнер может быть запущен следующей командой&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run -d --name svacer-ai-model-host -p 7000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache svacer-ai-model-host:1.0.0&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кэш сервиса взаимодействия с моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ postgres&#039;а.&lt;br /&gt;
&lt;br /&gt;
Порт &amp;lt;code&amp;gt;7000&amp;lt;/code&amp;gt; будет использоваться по умолчанию, если не были изменены [[#Параметры подключения сервиса модели машинного обучения|параметры подключения сервиса машинного обучения]]&lt;br /&gt;
&lt;br /&gt;
==== Запуск ИИ-ассистента ====&lt;br /&gt;
&lt;br /&gt;
Исполняемый файл ИИ-ассистента можно скачать по ссылке: https://svacer.ispras.ru/releases/svacer-ai/svacer-ai-1-0-0-linux.tar.gz (53MB)&lt;br /&gt;
&lt;br /&gt;
После этого ИИ-ассистент может быть запущен командой &amp;lt;code&amp;gt;svacerai-server run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Флаги команды запуска ИИ-ассистента =====&lt;br /&gt;
&lt;br /&gt;
Глобальные флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по умолчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|style=&amp;quot;width: 80px&amp;quot;|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;{ip адрес}:{порт}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|https://en.wikipedia.org/wiki/URL#Syntax&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Url сервиса с моделями машинного обучения&lt;br /&gt;
|https://en.wikipedia.org/wiki/URL#Syntax&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svacerai-server run --pg postgres://svace:svace@127.0.0.1:5432/svacer_ai --host localhost:8095 --svacer-host http://localhost:8094&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;localhost:8081&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8080/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;[AI]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры подключения сервиса модели машинного обучения ====&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса с моделями машинного обучения&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:7000&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений, отправляемых для анализа моделью за раз&lt;br /&gt;
|&amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;[id, warnClass, code]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2984</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2984"/>
		<updated>2025-05-27T09:49:14Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: --public-url description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
== Поддержка ИИ-ассистента для разметки предупреждений ==&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
== Активация и запуск функциональности ==&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его запуска необходимо:&lt;br /&gt;
&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-ассистенту;&lt;br /&gt;
# Развернуть и запустить сервис ИИ-ассистента;&lt;br /&gt;
&lt;br /&gt;
=== Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer&amp;lt;/code&amp;gt; при запуске Svacer ===&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
==== Настройка доступа к ИИ-ассистенту в Svacer ====&lt;br /&gt;
&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменить адрес, по которому Svacer будет подключаться к ИИ-ассистенту, можно одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистента}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистента}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Настройка значения флага &amp;lt;code&amp;gt;--public-url&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
В связи с тем, что ИИ-ассистент использует REST API Svacer, необходимо добавить url ИИ-ассистента в список публичных url Svacer. Это можно сделать, добавив при запуске Svacer флаг &amp;lt;code&amp;gt;--public-url {url ИИ-ассистента}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Данная настройка связана с функциональностью генерации коротких ссылок}}&lt;br /&gt;
&lt;br /&gt;
=== Развёртывание и запуск ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
При развёртывании ИИ-ассистента необходимо выполнить следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения;&lt;br /&gt;
# При необходимости: развернуть postresql-сервер для хранения базы данных ИИ-ассистента;&lt;br /&gt;
# Запустить сервис ИИ-ассистента.&lt;br /&gt;
&lt;br /&gt;
==== Запуск docker-контейнера с моделью машинного обучения ====&lt;br /&gt;
&lt;br /&gt;
Docker-образ контейнера с моделью можно скачать по ссылке: https://svacer.ispras.ru/docker/images/svacer-ai-model-host.1.0.0.tar.gz (3.3GB)&lt;br /&gt;
&lt;br /&gt;
Далее docker-образ необходимо загрузить на docker-хост с помощью команды&lt;br /&gt;
&lt;br /&gt;
 docker image load -i /path/to/svacer-ai-model-host.1.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого docker-контейнер может быть запущен следующей командой&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run -d --name svacer-ai-model-host -p 7000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache svacer-ai-model-host:1.0.0&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кэш сервиса взаимодействия с моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ postgres&#039;а.&lt;br /&gt;
&lt;br /&gt;
Порт &amp;lt;code&amp;gt;7000&amp;lt;/code&amp;gt; будет использоваться по умолчанию, если не были изменены [[#Параметры подключения сервиса модели машинного обучения|параметры подключения сервиса машинного обучения]]&lt;br /&gt;
&lt;br /&gt;
==== Запуск ИИ-ассистента ====&lt;br /&gt;
&lt;br /&gt;
Исполняемый файл ИИ-ассистента можно скачать по ссылке: https://svacer.ispras.ru/releases/svacer-ai/svacer-ai-1-0-0-linux.tar.gz (53MB)&lt;br /&gt;
&lt;br /&gt;
После этого ИИ-ассистент может быть запущен командой &amp;lt;code&amp;gt;svacerai-server run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Флаги команды запуска ИИ-ассистента =====&lt;br /&gt;
&lt;br /&gt;
Глобальные флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по умолчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|style=&amp;quot;width: 80px&amp;quot;|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;{ip адрес}:{порт}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|https://en.wikipedia.org/wiki/URL#Syntax&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Url сервиса с моделями машинного обучения&lt;br /&gt;
|https://en.wikipedia.org/wiki/URL#Syntax&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт, на которых будет запущен ИИ-ассистент&lt;br /&gt;
|&amp;lt;code&amp;gt;localhost:8081&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса Svacer, к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|http://localhost:8080/&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|&amp;lt;code&amp;gt;[AI]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры подключения сервиса модели машинного обучения ====&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Url сервиса с моделями машинного обучения&lt;br /&gt;
|&amp;lt;code&amp;gt;http://localhost:7000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений, отправляемых для анализа моделью за раз&lt;br /&gt;
|&amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;lt;code&amp;gt;[id, warnClass, code]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2973</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2973"/>
		<updated>2025-05-26T09:02:28Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: port 7000 description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка ИИ-ассистента для разметки предупреждений =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
= Активация и запуск функциональности =&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его запуска необходимо:&lt;br /&gt;
&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-асстистенту;&lt;br /&gt;
# Развернуть и запустить сервис ИИ-ассистента;&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer&amp;lt;/code&amp;gt; при запуске Svacer ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Настройка доступа к ИИ-ассистенту в Svacer ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменить адрес по которому Svacer будет подключаться к ИИ-ассистенту можно сделать одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистена}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистена}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Развёртывание и запуск ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
При развёртывании ИИ-ассистента необходимо выполнить следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения;&lt;br /&gt;
# При необходимости: развернуть postresql-сервер для хранения базы данных ИИ-ассистента;&lt;br /&gt;
# Запустить сервис ИИ-ассистента.&lt;br /&gt;
&lt;br /&gt;
=== Запуск docker-контейнера с моделью машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Docker-образ контейнера с моделью можно скачать по ссылке - https://svacer.ispras.ru/docker/images/svacer-ai-model-host.1.0.0.tar.gz (3.3GB)&lt;br /&gt;
&lt;br /&gt;
Далее docker-образ необходимо загрузить на docker-хост с помощью команды&lt;br /&gt;
&lt;br /&gt;
 docker image load -i /path/to/svacer-ai-model-host.1.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого docker-контейнер может быть запущен следующей командой&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run -d --name svacer-ai-model-host -p 7000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache svacer-ai-model-host:1.0.0&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кеш сервиса взаимодействия с моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ postgres&#039;а.&lt;br /&gt;
&lt;br /&gt;
Порт &amp;lt;code&amp;gt;7000&amp;lt;/code&amp;gt; будет использоваться по умолчанию, если не были изменены [[#Параметры подключения сервиса модели машинного обучения|параметры подключения сервиса машинного обучения]]&lt;br /&gt;
&lt;br /&gt;
=== Запуск ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Исполняемый файл ИИ-ассистента можно скачать по ссылке - https://svacer.ispras.ru/releases/svacer-ai/svacer-ai-1-0-0-linux.tar.gz (53MB)&lt;br /&gt;
&lt;br /&gt;
После этого ИИ-ассистент может быть запущен командой &amp;lt;code&amp;gt;svacerai-server run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Флаги команды запуска ИИ-ассистента ====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Глобальные&amp;quot; флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по молчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт на которых будет запущен ИИ-ассистент&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса Svacer к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Адреса сервиса с моделями машинного обучения&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт на которых будет запущен ИИ-ассистент&lt;br /&gt;
|localhost:8081&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса Svacer к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|http://localhost:8080/&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|[AI]&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Параметры подключения сервиса модели машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса с моделями машинного обучения&lt;br /&gt;
|http://localhost:7000&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений отправляемых для анализа моделью за раз&lt;br /&gt;
|512&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|[id, warnClass, code]&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация по умолчанию ==&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2971</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2971"/>
		<updated>2025-05-26T08:29:20Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: svacer-ai-1.0.0-linux.tar.gz link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка ИИ-ассистента для разметки предупреждений =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
= Активация и запуск функциональности =&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его запуска необходимо:&lt;br /&gt;
&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-асстистенту;&lt;br /&gt;
# Развернуть и запустить сервис ИИ-ассистента;&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer&amp;lt;/code&amp;gt; при запуске Svacer ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Настройка доступа к ИИ-ассистенту в Svacer ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменить адрес по которому Svacer будет подключаться к ИИ-ассистенту можно сделать одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистена}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистена}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Развёртывание и запуск ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
При развёртывании ИИ-ассистента необходимо выполнить следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения;&lt;br /&gt;
# При необходимости: развернуть postresql-сервер для хранения базы данных ИИ-ассистента;&lt;br /&gt;
# Запустить сервис ИИ-ассистента.&lt;br /&gt;
&lt;br /&gt;
=== Запуск docker-контейнера с моделью машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Docker-образ контейнера с моделью можно скачать по ссылке - https://svacer.ispras.ru/docker/images/svacer-ai-model-host.1.0.0.tar.gz (3.3GB)&lt;br /&gt;
&lt;br /&gt;
Далее docker-образ необходимо загрузить на docker-хост с помощью команды&lt;br /&gt;
&lt;br /&gt;
 docker image load -i /path/to/svacer-ai-model-host.1.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого docker-контейнер может быть запущен следующей командой&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run -d --name svacer-ai-model-host -p 7000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache svacer-ai-model-host:1.0.0&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кеш сервиса взаимодействия с моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ postgres&#039;а.&lt;br /&gt;
&lt;br /&gt;
=== Запуск ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Исполняемый файл ИИ-ассистента можно скачать по ссылке - https://svacer.ispras.ru/releases/svacer-ai/svacer-ai-1-0-0-linux.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого ИИ-ассистент может быть запущен командой &amp;lt;code&amp;gt;svacerai-server run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Флаги команды запуска ИИ-ассистента ====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Глобальные&amp;quot; флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по молчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт на которых будет запущен ИИ-ассистент&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса Svacer к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Адреса сервиса с моделями машинного обучения&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт на которых будет запущен ИИ-ассистент&lt;br /&gt;
|localhost:8081&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса Svacer к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|http://localhost:8080/&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|[AI]&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Параметры подключения сервиса модели машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса с моделями машинного обучения&lt;br /&gt;
|http://localhost:7000&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений отправляемых для анализа моделью за раз&lt;br /&gt;
|512&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|[id, warnClass, code]&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация по умолчанию ==&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2968</id>
		<title>Help:XSvacer:AIAssistant</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:AIAssistant&amp;diff=2968"/>
		<updated>2025-05-25T20:43:29Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка ИИ-ассистента для разметки предупреждений =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность позволяет использовать модель машинного обучения (ИИ) для помощи при разметке предупреждений.&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент предназначен для разметки предупреждений статусами &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;Confirmed&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;False Positive&amp;lt;/code&amp;gt;, которые были предсказаны моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Все данные предупреждений хранятся в Svacer и получаются ИИ-ассистентом с помощью REST API.&lt;br /&gt;
&lt;br /&gt;
= Активация и запуск функциональности =&lt;br /&gt;
&lt;br /&gt;
ИИ-ассистент реализован в виде отдельного сервиса, взаимодействующего со Svacer по REST API. Для его запуска необходимо:&lt;br /&gt;
&lt;br /&gt;
# Активировать функциональность при запуске Svacer и настроить доступ к ИИ-асстистенту;&lt;br /&gt;
# Развернуть и запустить сервис ИИ-ассистента;&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer&amp;lt;/code&amp;gt; при запуске Svacer ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features aiAssistant&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Настройка доступа к ИИ-ассистенту в Svacer ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию Svacer будет пытаться подключиться к ИИ-ассистенту по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8081/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменить адрес по которому Svacer будет подключаться к ИИ-ассистенту можно сделать одним из способов:&lt;br /&gt;
&lt;br /&gt;
# При запуске Svacer установить переменную окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;XSVACER_AIASSISTANT_ASSISTANTHOSTURL=http://{адрес ИИ-ассистена}:{порт}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# В конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; добавить раздел&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
xsvacer:&lt;br /&gt;
  ...&lt;br /&gt;
  aiAssistant:&lt;br /&gt;
    assistantHostUrl: http://{адрес ИИ-ассистена}:{порт}/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Развёртывание и запуск ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
При развёртывании ИИ-ассистента необходимо выполнить следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Запустить docker-контейнер с моделью машинного обучения;&lt;br /&gt;
# При необходимости: развернуть postresql-сервер для хранения базы данных ИИ-ассистента;&lt;br /&gt;
# Запустить сервис ИИ-ассистента.&lt;br /&gt;
&lt;br /&gt;
=== Запуск docker-контейнера с моделью машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Docker-образ контейнера с моделью можно скачать по ссылке - https://svacer.ispras.ru/docker/images/svacer-ai-model-host.1.0.0.tar.gz (3.3GB)&lt;br /&gt;
&lt;br /&gt;
Далее docker-образ необходимо загрузить на docker-хост с помощью команды&lt;br /&gt;
&lt;br /&gt;
 docker image load -i /path/to/svacer-ai-model-host.1.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
После этого docker-контейнер может быть запущен следующей командой&lt;br /&gt;
&lt;br /&gt;
 docker volume create svacer-ai-cache&lt;br /&gt;
 docker volume create svacer-ai-pgdata&lt;br /&gt;
 docker run -d --name svacer-ai-model-host -p 7000:8000 -v svacer-ai-pgdata:/var/lib/postgresql/data -v svacer-ai-cache:/root/.cache svacer-ai-model-host:1.0.0&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;cache&amp;lt;/code&amp;gt; будет содержать кеш сервиса взаимодействия с моделью машинного обучения.&lt;br /&gt;
&lt;br /&gt;
Том &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;pgdata&amp;lt;/code&amp;gt; будет содержать файлы с данными встроенного в docker-образ postgres&#039;а.&lt;br /&gt;
&lt;br /&gt;
=== Запуск ИИ-ассистента ===&lt;br /&gt;
&lt;br /&gt;
Исполняемый файл ИИ-ассистента можно скачать по ссылке - TODO&lt;br /&gt;
&lt;br /&gt;
После этого ИИ-ассистент может быть запущен командой &amp;lt;code&amp;gt;svacerai-server run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Флаги команды запуска ИИ-ассистента ====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Глобальные&amp;quot; флаги &amp;lt;code&amp;gt;svacerai-server help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server - Svace AI server&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server [global options] command [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 COMMANDS:&lt;br /&gt;
    run&lt;br /&gt;
    help, h  Shows a list of commands or help for one command&lt;br /&gt;
 &lt;br /&gt;
 GLOBAL OPTIONS:&lt;br /&gt;
    --debug            (default: false) [$SVACER_AI_DEBUG]&lt;br /&gt;
    --log-level value  Defines log level. Available: info, warn, error [$SVACER_AI_LOG_LEVEL]&lt;br /&gt;
    --log value        Defines path to log file. By default file /tmp/svacer-ai-*.log will be created.&lt;br /&gt;
    --config value     Define path to file with config in YAML format (by default svacer-ai.cfg).&lt;br /&gt;
    --help, -h         show help&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;
|debug&lt;br /&gt;
|bool&lt;br /&gt;
|Отладочный режим логирования&lt;br /&gt;
|-&lt;br /&gt;
|log-level&lt;br /&gt;
|string&lt;br /&gt;
|Уровень логирования&lt;br /&gt;
|-&lt;br /&gt;
|log&lt;br /&gt;
|string&lt;br /&gt;
|Путь к файлу с логами&lt;br /&gt;
|-&lt;br /&gt;
|config&lt;br /&gt;
|string&lt;br /&gt;
|Путь к [[#Конфигурация по молчанию|конфигурационному файлу]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Флаги запуска ИИ-ассистента &amp;lt;code&amp;gt;svacerai-server run help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 NAME:&lt;br /&gt;
    svacerai-server run&lt;br /&gt;
 &lt;br /&gt;
 USAGE:&lt;br /&gt;
    svacerai-server run [command options] [arguments...]&lt;br /&gt;
 &lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    --pg value                           Defines PostgreSQL connection URL&lt;br /&gt;
    --host value                         Defines host name for the server&lt;br /&gt;
    --svacer-host value                  Defines remote Svacer host&lt;br /&gt;
    --ai-host value [ --ai-host value ]  Specify the address of the service with AI models in the format &amp;lt;nowiki&amp;gt;{host id}:{http://{host address}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
    --help, -h                           show help&lt;br /&gt;
&lt;br /&gt;
{{Note|text=С помощью флагов запуска можно переопределять наиболее часто меняющиеся [[#Конфигурация по умолчанию|параметры конфигурации]] без необходимости создания файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;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;
|pg&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|-&lt;br /&gt;
|host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт на которых будет запущен ИИ-ассистент&lt;br /&gt;
|-&lt;br /&gt;
|svacer-host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса Svacer к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|-&lt;br /&gt;
|ai-host&lt;br /&gt;
|[]string&lt;br /&gt;
|Адреса сервиса с моделями машинного обучения&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ИИ-ассистента ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками ИИ-ассистента осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; в рабочей директории сервиса.j&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;
|-&lt;br /&gt;
|db/url&lt;br /&gt;
|string&lt;br /&gt;
|Строка подключения к базе данных ИИ-ассистента&lt;br /&gt;
|postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&lt;br /&gt;
|-&lt;br /&gt;
|http/host&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сетевого интерфейса и порт на которых будет запущен ИИ-ассистент&lt;br /&gt;
|localhost:8081&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerHostUrl&lt;br /&gt;
&lt;br /&gt;
ai/svacerHostUrl&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса Svacer к API которого будет обращаться ИИ-ассистент&lt;br /&gt;
|http://localhost:8080/&lt;br /&gt;
|-&lt;br /&gt;
|http/svacerClientTlsCfg?&lt;br /&gt;
&lt;br /&gt;
ai/svacerClientTlsCfg&lt;br /&gt;
|[https://pkg.go.dev/crypto/tls#Config *tls.Config]&lt;br /&gt;
|Настройки безопасного подключения к Svacer&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
svacerClientTlsCfg:&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewCommentTemplate&lt;br /&gt;
|string&lt;br /&gt;
|Шаблон для формирования комментария к разметке выполненной с помощью ИИ-ассистента. В шаблон передаётся структура &amp;lt;code&amp;gt;processing.MarkerResult&amp;lt;/code&amp;gt;&lt;br /&gt;
|См. [[#Конфигурация по умолчанию|конфигурацию по умолчанию]]&lt;br /&gt;
|-&lt;br /&gt;
|ai/svacerReviewTags&lt;br /&gt;
|[]string&lt;br /&gt;
|Список названий меток, которые будут установлены маркерам, размеченным с помощью ИИ-ассистента&lt;br /&gt;
|[AI]&lt;br /&gt;
|-&lt;br /&gt;
|hosts&lt;br /&gt;
|map[string]object&lt;br /&gt;
|Список параметров подключения к сервисам с моделями машинного обучения, которые будет использовать ИИ-ассистент&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{id сервиса}:&lt;br /&gt;
  {параметры подключения}&lt;br /&gt;
  (см. описание ниже)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Параметры подключения сервиса модели машинного обучения ===&lt;br /&gt;
&lt;br /&gt;
Параметры подключения сервисов модели задаются в виде map&#039;ы, ключами которой являются идентификаторы сервисов. В значении содержатся следующие параметры:&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;
|-&lt;br /&gt;
|url&lt;br /&gt;
|string&lt;br /&gt;
|Адрес сервиса с моделями машинного обучения&lt;br /&gt;
|http://localhost:7000&lt;br /&gt;
|-&lt;br /&gt;
|settings/requestBatchSize&lt;br /&gt;
|int&lt;br /&gt;
|Количество предупреждений отправляемых для анализа моделью за раз&lt;br /&gt;
|512&lt;br /&gt;
|-&lt;br /&gt;
|settings/httpMultipartParameterName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartFileName&lt;br /&gt;
&lt;br /&gt;
settings/httpMultipartContentType&lt;br /&gt;
|string&lt;br /&gt;
|Параметра multipart-запроса вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|resources/modelList&lt;br /&gt;
&lt;br /&gt;
resources/modelInference&lt;br /&gt;
&lt;br /&gt;
resources/logs&lt;br /&gt;
|string&lt;br /&gt;
|Сопоставление названий ресурсов сервиса моделей&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvSeparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|&amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/additionalLineNumber&lt;br /&gt;
|int&lt;br /&gt;
|Количество строк исходного кода, которые добавляются до и после строки предупреждения при отправке в сервис моделей&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|defaults/dataCollector/csvColumns&lt;br /&gt;
|[]string&lt;br /&gt;
|Названия столбцов csv-файла, который отправляется в сервис моделей&lt;br /&gt;
|[id, warnClass, code]&lt;br /&gt;
|-&lt;br /&gt;
|defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
&lt;br /&gt;
defaults/interpretation/defaultValue&lt;br /&gt;
|string&lt;br /&gt;
|Названия статусов, которые присваиваются результату вызова модели&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Конфигурация по умолчанию ==&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию при запуске ИИ-ассистента, если отсутствует конфигурационный файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=Если файл &amp;lt;code&amp;gt;svacer-ai.cfg&amp;lt;/code&amp;gt; существует, в нём должны содержаться все указанные параметры конфигурации.&#039;&#039;&#039;}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
varSvacerHostUrl: &amp;amp;svacerHostUrl &amp;quot;http://localhost:8080/&amp;quot;&lt;br /&gt;
varSvacerClientTlsCfg: &amp;amp;svacerClientTlsCfg&lt;br /&gt;
  insecureSkipVerify: true&lt;br /&gt;
db:&lt;br /&gt;
  url: &amp;quot;postgres://postgres:postgres@localhost:5432/svacer_ai?sslmode=disable&amp;quot;&lt;br /&gt;
http:&lt;br /&gt;
  host: &amp;quot;localhost:8081&amp;quot;&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
ai:&lt;br /&gt;
  svacerHostUrl: *svacerHostUrl&lt;br /&gt;
  svacerClientTlsCfg: *svacerClientTlsCfg&lt;br /&gt;
  svacerReviewCommentTemplate: |+&lt;br /&gt;
    `Timestamp: {{now.UTC.Format &amp;quot;2006-01-02T15:04:05Z&amp;quot;}}`&lt;br /&gt;
&lt;br /&gt;
    `AI model: {{.Pipeline.Name}}`&lt;br /&gt;
&lt;br /&gt;
    `Confidence level: {{ printf &amp;quot;%.2f&amp;quot; (index .Interpretation 0).Confidence }}`&lt;br /&gt;
&lt;br /&gt;
  svacerReviewTags:&lt;br /&gt;
    - AI&lt;br /&gt;
  hosts:&lt;br /&gt;
    server-status:&lt;br /&gt;
      url: &amp;quot;http://localhost:7000&amp;quot;&lt;br /&gt;
      settings:&lt;br /&gt;
        requestBatchSize: 512&lt;br /&gt;
        httpMultipartParameterName: &amp;quot;file&amp;quot;&lt;br /&gt;
        httpMultipartFileName: &amp;quot;file.csv&amp;quot;&lt;br /&gt;
        httpMultipartContentType: &amp;quot;application/vnd.ms-excel&amp;quot;&lt;br /&gt;
      resources:&lt;br /&gt;
        modelList: &amp;quot;/models_info&amp;quot;&lt;br /&gt;
        modelInference: &amp;quot;/use_model_for_file&amp;quot;&lt;br /&gt;
        logs: &amp;quot;/log_file&amp;quot;&lt;br /&gt;
      defaults:&lt;br /&gt;
        dataCollector:&lt;br /&gt;
          csvSeparator: &amp;quot;,&amp;quot;&lt;br /&gt;
          additionalLinesNumber: 0&lt;br /&gt;
          csvColumns:&lt;br /&gt;
            - &amp;quot;id&amp;quot;&lt;br /&gt;
            - &amp;quot;warnClass&amp;quot;&lt;br /&gt;
            - &amp;quot;code&amp;quot;&lt;br /&gt;
        interpretation: &lt;br /&gt;
          defaultValue: &amp;quot;Undecided&amp;quot;&lt;br /&gt;
          leftClassValue: &amp;quot;False Positive&amp;quot;&lt;br /&gt;
          rightClassValue: &amp;quot;Confirmed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2960</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2960"/>
		<updated>2025-05-20T07:53:16Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Релиз 11. Удалена настройка шаблона комментария sarif/commenttemplate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать архив с docker-образом для соответствующей версии Svacer: [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz 11+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz 10+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar 9+]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение.&lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sarif/filenametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt;&lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Завершающий слеш обязателен!&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации&lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка&lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=При использовании версии Svacer 9.0.0 установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9.0.1]].&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка.&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)&lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|{{Note|text=В версии 10.0.0 заменён на [[Help:XSvacer:Webide#Параметры_экспорта_sarif-файла_с_разметкой_предупреждений|sarif]]}}&lt;br /&gt;
Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры экспорта sarif-файла с разметкой предупреждений ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки экспорта sarif-файлов с разметкой предупреждений, выполненной в Svacer.&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;
|-&lt;br /&gt;
|sarif&lt;br /&gt;
|map&lt;br /&gt;
|Настройки экспорта sarif-файла&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|sarif/filenametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия sarif-файла. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;warnings.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|sarif/commenttemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|{{Note|text=Удалён в версии 11.0.0}}&lt;br /&gt;
Шаблон для формирования элемента списка комментариев предупреждения при экспорте в sarif-файл. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|Comment]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default&lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|Svacer 11+: 1.46.0.sarif.clang.11.0.0.1&lt;br /&gt;
Svacer 10+: 1.46.0.sarif.clang.10.0.0&lt;br /&gt;
&lt;br /&gt;
Svacer 9+: 1.46.0.sarif.clang&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|Svacer 11+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz&lt;br /&gt;
Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
Svacer 9+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
:- hostport: 0&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
&lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
     IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
     StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
&lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Comment {&lt;br /&gt;
     ID               string&lt;br /&gt;
     Text             string&lt;br /&gt;
     Ref              string&lt;br /&gt;
     CreatedBy        string&lt;br /&gt;
     CreatedByID      string&lt;br /&gt;
     CreateTs         time.Time&lt;br /&gt;
     UpdateTs         *time.Time&lt;br /&gt;
     UpdatedBy        string&lt;br /&gt;
     UpdatedByID      string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sarif:&lt;br /&gt;
            filenametemplate: &amp;quot;warnings.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang.11.0.0.1&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр&lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение&lt;br /&gt;
 &lt;br /&gt;
 Svacer 11+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz&lt;br /&gt;
 Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
 Svacer 9+:  https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.&lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.4/file/MS-SarifVSCode.sarif-viewer-3.4.4.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа:&lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang... -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0.sarif.clang... | gzip &amp;gt; /path/to/tar/theia-blueprint.1.46.0.sarif.clang....tar.gz&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2561</id>
		<title>Help:XSvacer:Webide:SvacerAsDockerContainer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2561"/>
		<updated>2025-03-12T09:41:32Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка функциональности [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide webide] когда Svacer развёрнут в docker-контейнере =&lt;br /&gt;
&lt;br /&gt;
На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, &amp;quot;рядом&amp;quot; с docker&#039;ом.&lt;br /&gt;
&lt;br /&gt;
Для поддержки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; когда Svacer развёрнут в docker-контейнере необходимо решить следующие задачи:&lt;br /&gt;
&lt;br /&gt;
# Предоставить docker-контейнеру Svacer доступ к управлению контейнерами IDE;&lt;br /&gt;
# Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; в docker-контейнере Svacer;&lt;br /&gt;
# Организация сетевого доступа между контейнером Svacer и контейнерами IDE;&lt;br /&gt;
# Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE;&lt;br /&gt;
&lt;br /&gt;
Детали каждой задачи и варианты решения приведены ниже.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Приведённые решения основаны на развёртывании Svacer с помощью файла [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
== Предоставление контейнеру Svacer доступа к управлению контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE основана на том, что Svacer управляет контейнерами IDE с помощью API docker&#039;а. Поэтому необходимо предоставить доступ к API docker&#039;а из docker-контейнера Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Один из способов подключения к API docker&#039;а является использование socket-файла &amp;lt;code&amp;gt;/var/run/docker.sock&amp;lt;/code&amp;gt;. Чтобы Svacer получил доступ к этому файлу, его необходимо примонтировать к docker-контейнеру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Изменение настроек Svacer - &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Дальнейшие шаги связаны с изменением настроек Svacer. В случае, когда Svacer развёрнут в docker-контейнере, это можно сделать следующим образом:&lt;br /&gt;
# Создать конфигурационный файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Перенести настройки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Примонтировать файл к рабочей директории docker-контейнера Svacer;&lt;br /&gt;
# Перезапустить контейнер Svacer;&lt;br /&gt;
&lt;br /&gt;
Чтобы примонтировать &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; к контейнеру Svacer нужно в файл &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; добавить строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /path/to/svacer.cfg:/svacer/bin/svacer.cfg:ro&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Перенос настроек функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Скопировать секцию с [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E настройками по умолчанию] в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Варианты активации функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt;:&lt;br /&gt;
# указать флаг &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer;&lt;br /&gt;
# в конфигурационном файле (&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;) добавить значение &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в список &amp;lt;code&amp;gt;/xsvacer/features&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Второй вариант активации функциональности является более предпочтительным. В &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; необходимо добавить следующую настройку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  features:&lt;br /&gt;
    - webide # активация функциональности webide&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Альтернативное решение с использованием флага &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
В [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] используется docker-образ Svacer, собранный на основе [[Dockerfile]]. В данном файле содержится инструкция запуска Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности IDE необходимо переопределить аргументы инструкции &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;CMD&amp;lt;/code&amp;gt; в файле &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    command: /bin/sh -c &#039;/svacer/bin/svacer-server --memsettings=$${MEMSETTINGS} run --store $$STORE --pg $${SVACER_PG_URL} --xsvacer.features webide&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Организация сетевого доступа между контейнером Svacer и контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
В текущей реализации при запуске docker-контейнер IDE публикует внутренний порт web-приложения Theia IDE на случайный порт всех сетевых интерфейсов (0.0.0.0) docker-хоста. Svacer хранит информацию на каком порте хоста развёрнуты соответствующие инстансы IDE и проксирует запросы к ним.&lt;br /&gt;
&lt;br /&gt;
Необходимо организовать доступ контейнера Svacer к портам docker-хоста, на которых опубликованы контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Чтобы предоставить доступ контейнера Svacer к контейнеру IDE нужно:&lt;br /&gt;
# Определить ip-адрес интерфейса docker-хоста &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Изменить настройку публикации портов контейнеров IDE на значение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Определение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На docker-хосте выполнить команду &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
...&lt;br /&gt;
6: docker0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default&lt;br /&gt;
    link/ether 82:70:b5:24:50:e4 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае искомый ip-адрес - &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Изменение настроек публикации портов контейнеров IDE &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Настройки публикации порта контейнера IDE заданы в [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0_Theia_IDE конфигурации запуска IDE]. Настройки по умолчанию должны быть предварительно [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;amp;action=submit#.D0.9F.D0.B5.D1.80.D0.B5.D0.BD.D0.BE.D1.81_.D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BA_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_webide_.D0.B2_svacer.cfg перенесены в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
В файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; нужно добавить параметр &amp;lt;code&amp;gt;hostip&amp;lt;/code&amp;gt; со значением ip-адреса интерфейса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        docker:&lt;br /&gt;
          ...&lt;br /&gt;
          container:&lt;br /&gt;
            ...&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              ...&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # новый параметр&lt;br /&gt;
            ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE ==&lt;br /&gt;
&lt;br /&gt;
При запуске IDE для просмотра снимка, Svacer экспортирует исходный код снимка в папку на docker-хосте. Далее эта папка монтируется к контейнеру IDE, к пути &amp;lt;code&amp;gt;/home/project&amp;lt;/code&amp;gt;, который использует Theia IDE в качестве папки проекта.&lt;br /&gt;
&lt;br /&gt;
При развёртывании Svacer в docker-контейнере необходимо настроить экспорт исходников в папку, которая может быть примонтирована к контейнеру IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Путь к корневой папке, в которую будут экспортироваться исходники снимков, задаётся в конфигурационном параметре [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.B8_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0 &amp;lt;code&amp;gt;sourcesroot&amp;lt;/code&amp;gt;]. Так как этот же параметр используется для настройки пути к корневой папке на docker-хосте, которая будет примонтирована к контейнеру IDE, то пути к папке с исходным кодом снимков должны совпадать в контейнере Svacer и на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Пример конфигурации &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        sourcesroot: /data/snapshot-sources&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources # привязка с разрешением на запись&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примеры файлов с описанными изменениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены версии конфигурационных файлов, с изменениями которые были описаны выше. Изменённые строки содежат комментарии.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{Note|type=info|text=Ниже приведён файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; содержащий только секцию &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt;. Если файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; создан и содержит другие настройки, то приведённые ниже настройки должны быть перенесены в существующий файл}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  features:&lt;br /&gt;
    - webide # активация функциональности webide&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: /data/snapshot-sources # путь к базовой папке с исходным кодом снимков&lt;br /&gt;
        sarif:&lt;br /&gt;
          filenametemplate: &amp;quot;warnings.sarif&amp;quot;&lt;br /&gt;
          commenttemplate: &amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang.10.0.0&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT={{hostname}}&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # ip-адрес интерфейса хоста docker0&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;&amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{Note|type=info|text=Изменены внесены в файл [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  postgresql:&lt;br /&gt;
    image: postgres:17.0-bullseye&lt;br /&gt;
    container_name: svacer-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;
    volumes:&lt;br /&gt;
      - svacer-postgres:/var/lib/postgresql/data&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer:&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: ispras/svacer:10-0-0&lt;br /&gt;
    container_name: 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;8080:8080&amp;quot;&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;
    volumes:&lt;br /&gt;
      - svacer-object-store:/data/store&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro # доступ к API docker&#039;а из контейнера Svacer&lt;br /&gt;
      - ./svacer.cfg:/svacer/bin/svacer.cfg:ro # привязка конфигурационного файла svacer.cfg&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources # writable привязка коневой папки с исходниками снимков. Пути до и после &amp;quot;:&amp;quot; должны совпадать.&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer:&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;
volumes:&lt;br /&gt;
  svacer-postgres:&lt;br /&gt;
  svacer-object-store:&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  svacer:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схемы компонентов ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены концептуальные схемы компонентов, на базе которых основана функциональность запуска IDE. Данные схемы могут быть использованы для поиска других решений приведённых выше задач.&lt;br /&gt;
&lt;br /&gt;
=== Стандартный запуск Svacer в виде сервиса ===&lt;br /&gt;
&lt;br /&gt;
[[File:Comp-svacer-webide-default-hosting.png]]&lt;br /&gt;
&lt;br /&gt;
=== Запуск Svacer внутри docker-контейнера ===&lt;br /&gt;
&lt;br /&gt;
[[File:Comp-svacer-in-container-webide-hosting.png]]&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-in-container-webide-hosting.png&amp;diff=2560</id>
		<title>File:Comp-svacer-in-container-webide-hosting.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-in-container-webide-hosting.png&amp;diff=2560"/>
		<updated>2025-03-11T11:12:39Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: M.vinogradov uploaded a new version of File:Comp-svacer-in-container-webide-hosting.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Диаграмма развёртывания компонентов функциональности запуска IDE если Svacer запущен в docker-контейнере&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2559</id>
		<title>Help:XSvacer:Webide:SvacerAsDockerContainer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2559"/>
		<updated>2025-03-11T11:10:08Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка функциональности [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide webide] когда Svacer развёрнут в docker-контейнере =&lt;br /&gt;
&lt;br /&gt;
На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, &amp;quot;рядом&amp;quot; с docker&#039;ом.&lt;br /&gt;
&lt;br /&gt;
Для поддержки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; когда Svacer развёрнут в docker-контейнере необходимо решить следующие задачи:&lt;br /&gt;
&lt;br /&gt;
# Предоставить docker-контейнеру Svacer доступ к управлению контейнерами IDE;&lt;br /&gt;
# Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; в docker-контейнере Svacer;&lt;br /&gt;
# Организация сетевого доступа между контейнером Svacer и контейнерами IDE;&lt;br /&gt;
# Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE;&lt;br /&gt;
&lt;br /&gt;
Детали каждой задачи и варианты решения приведены ниже.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Приведённые решения основаны на развёртывании Svacer с помощью файла [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
== Предоставление контейнеру Svacer доступа к управлению контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE основана на том, что Svacer управляет контейнерами IDE с помощью API docker&#039;а. Поэтому необходимо предоставить доступ к API docker&#039;а из docker-контейнера Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Один из способов подключения к API docker&#039;а является использование socket-файла &amp;lt;code&amp;gt;/var/run/docker.sock&amp;lt;/code&amp;gt;. Чтобы Svacer получил доступ к этому файлу, его необходимо примонтировать к docker-контейнеру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Изменение настроек Svacer - &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Дальнейшие шаги связаны с изменением настроек Svacer. В случае, когда Svacer развёрнут в docker-контейнере, это можно сделать следующим образом:&lt;br /&gt;
# Создать конфигурационный файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Перенести настройки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Примонтировать файл к рабочей директории docker-контейнера Svacer;&lt;br /&gt;
# Перезапустить контейнер Svacer;&lt;br /&gt;
&lt;br /&gt;
Чтобы примонтировать &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; к контейнеру Svacer нужно в файл &amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt; добавить строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /path/to/svacer.cfg:/svacer/bin/svacer.cfg:ro&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Перенос настроек функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Скопировать секцию с [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E настройками по умолчанию] в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Варианты активации функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt;:&lt;br /&gt;
# указать флаг &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer;&lt;br /&gt;
# в конфигурационном файле (&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;) добавить значение &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в список &amp;lt;code&amp;gt;/xsvacer/features&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Второй вариант активации функциональности является более предпочтительным. В &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; необходимо добавить следующую настройку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  features:&lt;br /&gt;
    - webide # активация функциональности webide&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Альтернативное решение с использованием флага &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
В [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] используется docker-образ Svacer, собранный на основе [[Dockerfile]]. В данном файле содержится инструкция запуска Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности IDE необходимо переопределить аргументы инструкции &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;CMD&amp;lt;/code&amp;gt; в файле &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    command: /bin/sh -c &#039;/svacer/bin/svacer-server --memsettings=$${MEMSETTINGS} run --store $$STORE --pg $${SVACER_PG_URL} --xsvacer.features webide&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Организация сетевого доступа между контейнером Svacer и контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
В текущей реализации при запуске docker-контейнер IDE публикует внутренний порт web-приложения Theia IDE на случайный порт всех сетевых интерфейсов (0.0.0.0) docker-хоста. Svacer хранит информацию на каком порте хоста развёрнуты соответствующие инстансы IDE и проксирует запросы к ним.&lt;br /&gt;
&lt;br /&gt;
Необходимо организовать доступ контейнера Svacer к портам docker-хоста, на которых опубликованы контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Чтобы предоставить доступ контейнера Svacer к контейнеру IDE нужно:&lt;br /&gt;
# Определить ip-адрес интерфейса docker-хоста &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Изменить настройку публикации портов контейнеров IDE на значение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Определение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На docker-хосте выполнить команду &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
...&lt;br /&gt;
6: docker0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default&lt;br /&gt;
    link/ether 82:70:b5:24:50:e4 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае искомый ip-адрес - &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Изменение настроек публикации портов контейнеров IDE &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Настройки публикации порта контейнера IDE заданы в [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0_Theia_IDE конфигурации запуска IDE]. Настройки по умолчанию должны быть предварительно [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;amp;action=submit#.D0.9F.D0.B5.D1.80.D0.B5.D0.BD.D0.BE.D1.81_.D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BA_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_webide_.D0.B2_svacer.cfg перенесены в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
В файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; нужно добавить параметр &amp;lt;code&amp;gt;hostip&amp;lt;/code&amp;gt; со значением ip-адреса интерфейса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        docker:&lt;br /&gt;
          ...&lt;br /&gt;
          container:&lt;br /&gt;
            ...&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              ...&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # новый параметр&lt;br /&gt;
            ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE ==&lt;br /&gt;
&lt;br /&gt;
При запуске IDE для просмотра снимка, Svacer экспортирует исходный код снимка в папку на docker-хосте. Далее эта папка монтируется к контейнеру IDE, к пути &amp;lt;code&amp;gt;/home/project&amp;lt;/code&amp;gt;, который использует Theia IDE в качестве папки проекта.&lt;br /&gt;
&lt;br /&gt;
При развёртывании Svacer в docker-контейнере необходимо настроить экспорт исходников в папку, которая может быть примонтирована к контейнеру IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Путь к корневой папке, в которую будут экспортироваться исходники снимков, задаётся в конфигурационном параметре [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.B8_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0 &amp;lt;code&amp;gt;sourcesroot&amp;lt;/code&amp;gt;]. Так как этот же параметр используется для настройки пути к корневой папке на docker-хосте, которая будет примонтирована к контейнеру IDE, то пути к папке с исходным кодом снимков должны совпадать в контейнере Svacer и на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Пример конфигурации &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        sourcesroot: /data/snapshot-sources&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources # привязка с разрешением на запись&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примеры файлов с описанными изменениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены версии конфигурационных файлов, с изменениями которые были описаны выше. Изменённые строки содежат комментарии.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{Note|type=info|text=Ниже приведён файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; содержащий только секцию &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt;. Если файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; создан и содержит другие настройки, то приведённые ниже настройки должны быть перенесены в существующий файл}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  features:&lt;br /&gt;
    - webide # активация функциональности webide&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: /data/snapshot-sources # путь к базовой папке с исходным кодом снимков&lt;br /&gt;
        sarif:&lt;br /&gt;
          filenametemplate: &amp;quot;warnings.sarif&amp;quot;&lt;br /&gt;
          commenttemplate: &amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang.10.0.0&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT={{hostname}}&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # ip-адрес интерфейса хоста docker0&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;&amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{Note|type=info|text=Изменены внесены в файл [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  postgresql:&lt;br /&gt;
    image: postgres:17.0-bullseye&lt;br /&gt;
    container_name: svacer-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;
    volumes:&lt;br /&gt;
      - svacer-postgres:/var/lib/postgresql/data&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer:&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: ispras/svacer:10-0-0&lt;br /&gt;
    container_name: 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;8080:8080&amp;quot;&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;
    volumes:&lt;br /&gt;
      - svacer-object-store:/data/store&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro # доступ к API docker&#039;а из контейнера Svacer&lt;br /&gt;
      - ./svacer.cfg:/svacer/bin/svacer.cfg:ro # привязка конфигурационного файла svacer.cfg&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources # writable привязка коневой папки с исходниками снимков. Пути до и после &amp;quot;:&amp;quot; должны совпадать.&lt;br /&gt;
    networks:&lt;br /&gt;
      svacer:&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;
volumes:&lt;br /&gt;
  svacer-postgres:&lt;br /&gt;
  svacer-object-store:&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  svacer:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схемы компонентов ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены концептуальные схемы компонентов, на базе которых основана функциональность запуска IDE. Данные схемы могут быть использованы для поиска других решений приведённых выше задач.&lt;br /&gt;
&lt;br /&gt;
=== Стандартный запуск Svacer в виде сервиса ===&lt;br /&gt;
&lt;br /&gt;
[[File:Comp-svacer-webide-default-hosting.png]]&lt;br /&gt;
&lt;br /&gt;
=== Запуск Svacer внутри docker-контейнера ===&lt;br /&gt;
&lt;br /&gt;
[[File:Comp-svacer-in-container-webide-hosting.png]]&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2558</id>
		<title>Help:XSvacer:Webide:SvacerAsDockerContainer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2558"/>
		<updated>2025-03-11T08:24:08Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка функциональности [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide webide] когда Svacer развёрнут в docker-контейнере =&lt;br /&gt;
&lt;br /&gt;
На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, &amp;quot;рядом&amp;quot; с docker&#039;ом.&lt;br /&gt;
&lt;br /&gt;
Для поддержки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; когда Svacer развёрнут в docker-контейнере необходимо решить следующие задачи:&lt;br /&gt;
&lt;br /&gt;
# Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; в docker-контейнере Svacer;&lt;br /&gt;
# Предоставить docker-контейнеру Svacer доступ к управлению контейнерами IDE;&lt;br /&gt;
# Организация сетевого доступа между контейнером Svacer и контейнерами IDE;&lt;br /&gt;
# Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE;&lt;br /&gt;
&lt;br /&gt;
Детали каждой задачи и варианты решения приведены ниже.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Приведённые решения основаны на развёртывании Svacer с помощью файла [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; необходимо при запуске Svacer указать флаг &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
В [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] используется docker-образ Svacer, собранный на основе [[Dockerfile]]. В данном файле содержится инструкция запуска Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности IDE необходимо переопределить аргументы инструкции &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;CMD&amp;lt;/code&amp;gt; в файле &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    command: /bin/sh -c &#039;/svacer/bin/svacer-server --memsettings=$${MEMSETTINGS} run --store $$STORE --pg $${SVACER_PG_URL} --xsvacer.features webide&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Предоставление контейнеру Svacer доступа к управлению контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE основана на том, что Svacer управляет контейнерами IDE с помощью API docker&#039;а. Поэтому необходимо предоставить доступ к API docker&#039;а из docker-контейнера Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Один из способов подключения к API docker&#039;а является использование socket-файла &amp;lt;code&amp;gt;/var/run/docker.sock&amp;lt;/code&amp;gt;. Чтобы Svacer получил доступ к этому файлу, его необходимо примонтировать к docker-контейнеру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Изменение настроек Svacer - &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Дальнейшие шаги связаны с изменением настроек Svacer. В случае, когда Svacer развёрнут в docker-контейнере, это можно сделать следующим образом:&lt;br /&gt;
# Создать конфигурационный файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Примонтировать файл к рабочей директории docker-контейнера Svacer;&lt;br /&gt;
# Перезапустить контейнер Svacer;&lt;br /&gt;
&lt;br /&gt;
Чтобы примонтировать &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; к контейнеру Svacer нужно в файл &amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt; добавить строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /path/to/svacer.cfg:/svacer/bin/svacer.cfg:ro&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Перенос настроек функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Скопировать секцию с [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E настройками по умолчанию] в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Организация сетевого доступа между контейнером Svacer и контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
В текущей реализации при запуске docker-контейнер IDE публикует внутренний порт web-приложения Theia IDE на случайный порт всех сетевых интерфейсов (0.0.0.0) docker-хоста. Svacer хранит информацию на каком порте хоста развёрнуты соответствующие инстансы IDE и проксирует запросы к ним.&lt;br /&gt;
&lt;br /&gt;
Необходимо организовать доступ контейнера Svacer к портам docker-хоста, на которых опубликованы контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Чтобы предоставить доступ контейнера Svacer к контейнеру IDE нужно:&lt;br /&gt;
# Определить ip-адрес интерфейса docker-хоста &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Изменить настройку публикации портов контейнеров IDE на значение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Определение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На docker-хосте выполнить команду &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
...&lt;br /&gt;
6: docker0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default&lt;br /&gt;
    link/ether 82:70:b5:24:50:e4 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае искомый ip-адрес - &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Изменение настроек публикации портов контейнеров IDE &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Настройки публикации порта контейнера IDE заданы в [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0_Theia_IDE конфигурации запуска IDE]. Настройки по умолчанию должны быть предварительно [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;amp;action=submit#.D0.9F.D0.B5.D1.80.D0.B5.D0.BD.D0.BE.D1.81_.D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BA_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_webide_.D0.B2_svacer.cfg перенесены в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
В файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; нужно добавить параметр &amp;lt;code&amp;gt;hostip&amp;lt;/code&amp;gt; со значением ip-адреса интерфейса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        docker:&lt;br /&gt;
          ...&lt;br /&gt;
          container:&lt;br /&gt;
            ...&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              ...&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # новый параметр&lt;br /&gt;
            ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE ==&lt;br /&gt;
&lt;br /&gt;
При запуске IDE для просмотра снимка, Svacer экспортирует исходный код снимка в папку на docker-хосте. Далее эта папка монтируется к контейнеру IDE, к пути &amp;lt;code&amp;gt;/home/project&amp;lt;/code&amp;gt;, который использует Theia IDE в качестве папки проекта.&lt;br /&gt;
&lt;br /&gt;
При развёртывании Svacer в docker-контейнере необходимо настроить экспорт исходников в папку, которая может быть примонтирована к контейнеру IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Путь к корневой папке, в которую будут экспортироваться исходники снимков, задаётся в конфигурационном параметре [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.B8_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0 &amp;lt;code&amp;gt;sourcesroot&amp;lt;/code&amp;gt;]. Так как этот же параметр используется для настройки пути к корневой папке на docker-хосте, которая будет примонтирована к контейнеру IDE, то пути к папке с исходным кодом снимков должны совпадать в контейнере Svacer и на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Пример конфигурации &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        sourcesroot: /data/snapshot-sources&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схемы компонентов ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены концептуальные схемы компонентов, на базе которых основана функциональность запуска IDE. Данные схемы могут быть использованы для поиска других решений приведённых выше задач.&lt;br /&gt;
&lt;br /&gt;
=== Стандартный запуск Svacer в виде сервиса ===&lt;br /&gt;
&lt;br /&gt;
[[File:Comp-svacer-webide-default-hosting.png]]&lt;br /&gt;
&lt;br /&gt;
=== Запуск Svacer внутри docker-контейнера ===&lt;br /&gt;
&lt;br /&gt;
[[File:Comp-svacer-in-container-webide-hosting.png]]&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-in-container-webide-hosting.png&amp;diff=2557</id>
		<title>File:Comp-svacer-in-container-webide-hosting.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-in-container-webide-hosting.png&amp;diff=2557"/>
		<updated>2025-03-11T08:22:06Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: M.vinogradov uploaded a new version of File:Comp-svacer-in-container-webide-hosting.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Диаграмма развёртывания компонентов функциональности запуска IDE если Svacer запущен в docker-контейнере&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-webide-default-hosting.png&amp;diff=2556</id>
		<title>File:Comp-svacer-webide-default-hosting.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-webide-default-hosting.png&amp;diff=2556"/>
		<updated>2025-03-11T08:21:46Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: M.vinogradov uploaded a new version of File:Comp-svacer-webide-default-hosting.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Диаграмма стандартного развёртывания компонентов функциональности запуска IDE&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-in-container-webide-hosting.png&amp;diff=2555</id>
		<title>File:Comp-svacer-in-container-webide-hosting.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-in-container-webide-hosting.png&amp;diff=2555"/>
		<updated>2025-03-11T08:15:30Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Диаграмма развёртывания компонентов функциональности запуска IDE если Svacer запущен в docker-контейнере&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-webide-default-hosting.png&amp;diff=2554</id>
		<title>File:Comp-svacer-webide-default-hosting.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Comp-svacer-webide-default-hosting.png&amp;diff=2554"/>
		<updated>2025-03-11T08:10:50Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Диаграмма стандартного развёртывания компонентов функциональности запуска IDE&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2553</id>
		<title>Help:XSvacer:Webide:SvacerAsDockerContainer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2553"/>
		<updated>2025-03-11T07:16:53Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка функциональности [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide webide] когда Svacer развёрнут в docker-контейнере =&lt;br /&gt;
&lt;br /&gt;
На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, &amp;quot;рядом&amp;quot; с docker&#039;ом.&lt;br /&gt;
&lt;br /&gt;
Для поддержки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; когда Svacer развёрнут в docker-контейнере необходимо решить следующие задачи:&lt;br /&gt;
&lt;br /&gt;
# Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; в docker-контейнере Svacer;&lt;br /&gt;
# Предоставить docker-контейнеру Svacer доступ к управлению контейнерами IDE;&lt;br /&gt;
# Организация сетевого доступа между контейнером Svacer и контейнерами IDE;&lt;br /&gt;
# Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE;&lt;br /&gt;
&lt;br /&gt;
Детали каждой задачи и варианты решения приведены ниже.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Приведённые решения основаны на развёртывании Svacer с помощью файла [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; необходимо при запуске Svacer указать флаг &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
В [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] используется docker-образ Svacer, собранный на основе [[Dockerfile]]. В данном файле содержится инструкция запуска Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности IDE необходимо переопределить аргументы инструкции &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;CMD&amp;lt;/code&amp;gt; в файле &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    command: /bin/sh -c &#039;/svacer/bin/svacer-server --memsettings=$${MEMSETTINGS} run --store $$STORE --pg $${SVACER_PG_URL} --xsvacer.features webide&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Предоставление контейнеру Svacer доступа к управлению контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE основана на том, что Svacer управляет контейнерами IDE с помощью API docker&#039;а. Поэтому необходимо предоставить доступ к API docker&#039;а из docker-контейнера Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Один из способов подключения к API docker&#039;а является использование socket-файла &amp;lt;code&amp;gt;/var/run/docker.sock&amp;lt;/code&amp;gt;. Чтобы Svacer получил доступ к этому файлу, его необходимо примонтировать к docker-контейнеру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Изменение настроек Svacer - &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Дальнейшие шаги связаны с изменением настроек Svacer. В случае, когда Svacer развёрнут в docker-контейнере, это можно сделать следующим образом:&lt;br /&gt;
# Создать конфигурационный файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Примонтировать файл к рабочей директории docker-контейнера Svacer;&lt;br /&gt;
# Перезапустить контейнер Svacer;&lt;br /&gt;
&lt;br /&gt;
Чтобы примонтировать &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; к контейнеру Svacer нужно в файл &amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt; добавить строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /path/to/svacer.cfg:/svacer/bin/svacer.cfg:ro&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Перенос настроек функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Скопировать секцию с [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E настройками по умолчанию] в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Организация сетевого доступа между контейнером Svacer и контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
В текущей реализации при запуске docker-контейнер IDE публикует внутренний порт web-приложения Theia IDE на случайный порт всех сетевых интерфейсов (0.0.0.0) docker-хоста. Svacer хранит информацию на каком порте хоста развёрнуты соответствующие инстансы IDE и проксирует запросы к ним.&lt;br /&gt;
&lt;br /&gt;
Необходимо организовать доступ контейнера Svacer к портам docker-хоста, на которых опубликованы контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Чтобы предоставить доступ контейнера Svacer к контейнеру IDE нужно:&lt;br /&gt;
# Определить ip-адрес интерфейса docker-хоста &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Изменить настройку публикации портов контейнеров IDE на значение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Определение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На docker-хосте выполнить команду &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
...&lt;br /&gt;
6: docker0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default&lt;br /&gt;
    link/ether 82:70:b5:24:50:e4 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае искомый ip-адрес - &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Изменение настроек публикации портов контейнеров IDE &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Настройки публикации порта контейнера IDE заданы в [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0_Theia_IDE конфигурации запуска IDE]. Настройки по умолчанию должны быть предварительно [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;amp;action=submit#.D0.9F.D0.B5.D1.80.D0.B5.D0.BD.D0.BE.D1.81_.D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BA_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_webide_.D0.B2_svacer.cfg перенесены в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
В файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; нужно добавить параметр &amp;lt;code&amp;gt;hostip&amp;lt;/code&amp;gt; со значением ip-адреса интерфейса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        docker:&lt;br /&gt;
          ...&lt;br /&gt;
          container:&lt;br /&gt;
            ...&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              ...&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # новый параметр&lt;br /&gt;
            ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE ==&lt;br /&gt;
&lt;br /&gt;
При запуске IDE для просмотра снимка, Svacer экспортирует исходный код снимка в папку на docker-хосте. Далее эта папка монтируется к контейнеру IDE, к пути &amp;lt;code&amp;gt;/home/project&amp;lt;/code&amp;gt;, который использует Theia IDE в качестве папки проекта.&lt;br /&gt;
&lt;br /&gt;
При развёртывании Svacer в docker-контейнере необходимо настроить экспорт исходников в папку, которая может быть примонтирована к контейнеру IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Путь к корневой папке, в которую будут экспортироваться исходники снимков, задаётся в конфигурационном параметре [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.B8_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0 &amp;lt;code&amp;gt;sourcesroot&amp;lt;/code&amp;gt;]. Так как этот же параметр используется для настройки пути к корневой папке на docker-хосте, которая будет примонтирована к контейнеру IDE, то пути к папке с исходным кодом снимков должны совпадать в контейнере Svacer и на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Пример конфигурации &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        sourcesroot: /data/snapshot-sources&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2552</id>
		<title>Help:XSvacer:Webide:SvacerAsDockerContainer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;diff=2552"/>
		<updated>2025-03-10T08:06:35Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Created page with &amp;quot;= Поддержка функциональности [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide webide] когда Svacer развёрнут в docker-контейнере =  На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, &amp;quot;рядом&amp;quot; с docker&amp;#039;ом.  Для поддержки ф...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка функциональности [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide webide] когда Svacer развёрнут в docker-контейнере =&lt;br /&gt;
&lt;br /&gt;
На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, &amp;quot;рядом&amp;quot; с docker&#039;ом.&lt;br /&gt;
&lt;br /&gt;
Для поддержки функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; когда Svacer развёрнут в docker-контейнере необходимо решить следующие задачи:&lt;br /&gt;
&lt;br /&gt;
# Активация функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; в docker-контейнере Svacer;&lt;br /&gt;
# Предоставить docker-контейнеру Svacer доступ к управлению контейнерами IDE;&lt;br /&gt;
# Организация сетевого доступа между контейнером Svacer и контейнерами IDE;&lt;br /&gt;
# Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE;&lt;br /&gt;
&lt;br /&gt;
Детали каждой задачи и варианты решения приведены ниже.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Приведённые решения основаны на развёртывании Svacer с помощью файла [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml]}}&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; необходимо при запуске Svacer указать флаг &amp;lt;code&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
В [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] используется docker-образ Svacer, собранный на основе [[Dockerfile]]. В данном файле содержится инструкция запуска Svacer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для активации функциональности IDE необходимо переопределить аргументы инструкции &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;CMD&amp;lt;/code&amp;gt; в файле &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    command: /bin/sh -c &#039;/svacer/bin/svacer-server --memsettings=$${MEMSETTINGS} run --store $$STORE --pg $${SVACER_PG_URL} --xsvacer.features webide&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=info|text=Проверить актуальные значения аргументов инструкции &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; docker-образа можно с помощью команды &amp;lt;code&amp;gt;docker image inspect {имя образа}&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Предоставление контейнеру Svacer доступа к управлению контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE основана на том, что Svacer управляет контейнерами IDE с помощью API docker-хоста. Поэтому необходимо предоставить доступ к API docker-хоста из docker-контейнера Svacer.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Один из способов подключения к API docker-хоста является использование socket-файла &amp;lt;code&amp;gt;/var/run/docker.sock&amp;lt;/code&amp;gt;. Чтобы Svacer получил доступ к этому файлу, его необходимо примонтировать к docker-контейнеру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /var/run/docker.sock:/var/run/docker.sock:ro&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Изменение настроек Svacer - &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Дальнейшие шаги связаны с изменением настроек Svacer. В случае, когда Svacer развёрнут в docker-контейнере, это можно сделать следующим образом:&lt;br /&gt;
# Создать конфигурационный файл &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Примонтировать файл к рабочей директории docker-контейнера Svacer;&lt;br /&gt;
# Перезапустить контейнер Svacer;&lt;br /&gt;
&lt;br /&gt;
Чтобы примонтировать &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; к контейнеру Svacer нужно в файл &amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt; добавить строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /path/to/svacer.cfg:/svacer/bin/svacer.cfg:ro&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Перенос настроек функциональности &amp;lt;code&amp;gt;webide&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Скопировать секцию с [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E настройками по умолчанию] в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Организация сетевого доступа между контейнером Svacer и контейнерами IDE ==&lt;br /&gt;
&lt;br /&gt;
В текущей реализации при запуске docker-контейнер IDE публикует внутренний порт web-приложения Theia IDE на случайный порт всех сетевых интерфейсов (0.0.0.0) docker-хоста. Svacer хранит информацию на каком порте хоста развёрнуты соответствующие инстансы IDE и проксирует запросы к ним.&lt;br /&gt;
&lt;br /&gt;
Необходимо организовать доступ контейнера Svacer к портам docker-хоста, на которых опубликованы контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Чтобы предоставить доступ контейнера Svacer к контейнеру IDE нужно:&lt;br /&gt;
# Определить ip-адрес интерфейса docker-хоста &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Изменить настройку публикации портов контейнеров IDE на значение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Определение ip-адреса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На docker-хосте выполнить команду &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
$ ip a&lt;br /&gt;
...&lt;br /&gt;
6: docker0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default&lt;br /&gt;
    link/ether 82:70:b5:24:50:e4 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае искомый ip-адрес - &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Изменение настроек публикации портов контейнеров IDE &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Настройки публикации порта контейнера IDE заданы в [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.9A.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0_Theia_IDE конфигурации запуска IDE]. Настройки по умолчанию должны быть предварительно [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide:SvacerAsDockerContainer&amp;amp;action=submit#.D0.9F.D0.B5.D1.80.D0.B5.D0.BD.D0.BE.D1.81_.D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BA_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_webide_.D0.B2_svacer.cfg перенесены в &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
В файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; нужно добавить параметр &amp;lt;code&amp;gt;hostip&amp;lt;/code&amp;gt; со значением ip-адреса интерфейса &amp;lt;code&amp;gt;docker0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        docker:&lt;br /&gt;
          ...&lt;br /&gt;
          container:&lt;br /&gt;
            ...&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              ...&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
                    hostip: 172.17.0.1 # новый параметр&lt;br /&gt;
            ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE ==&lt;br /&gt;
&lt;br /&gt;
При запуске IDE для просмотра снимка, Svacer экспортирует исходный код снимка в папку на docker-хосте. Далее эта папка монтируется к контейнеру IDE, к пути &amp;lt;code&amp;gt;/home/project&amp;lt;/code&amp;gt;, который использует Theia IDE в качестве папки проекта.&lt;br /&gt;
&lt;br /&gt;
При развёртывании Svacer в docker-контейнере необходимо настроить экспорт исходников в папку, которая может быть примонтирована к контейнеру IDE.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
&lt;br /&gt;
Путь к корневой папке, в которую будут экспортироваться исходники снимков, задаётся в конфигурационном параметре [https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.B8_.D0.B7.D0.B0.D0.BF.D1.83.D1.81.D0.BA.D0.B0 &amp;lt;code&amp;gt;sourcesroot&amp;lt;/code&amp;gt;]. Так как этот же параметр используется для настройки пути к корневой папке на docker-хосте, которая будет примонтирована к контейнеру IDE, то пути к папке с исходным кодом снимков должны совпадать в контейнере Svacer и на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Пример конфигурации &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        ...&lt;br /&gt;
        sourcesroot: /data/snapshot-sources&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font: 1em Courier New, monospace;&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  ...&lt;br /&gt;
  svacer:&lt;br /&gt;
    ...&lt;br /&gt;
    volumes:&lt;br /&gt;
      ...&lt;br /&gt;
      - /data/snapshot-sources:/data/snapshot-sources&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2467</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2467"/>
		<updated>2025-01-15T08:29:13Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать архив с docker-образом для соответствующей версии Svacer: [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz 10+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar 9+]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение.&lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sarif/filenametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt;&lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Завершающий слеш обязателен!&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации&lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка&lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=При использовании версии Svacer 9.0.0 установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9.0.1]].&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка.&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)&lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|{{Note|text=В версии 10.0.0 заменён на [[Help:XSvacer:Webide#Параметры_экспорта_sarif-файла_с_разметкой_предупреждений|sarif]]}}&lt;br /&gt;
Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры экспорта sarif-файла с разметкой предупреждений ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки экспорта sarif-файлов с разметкой предупреждений, выполненной в Svacer&#039;е.&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;
|-&lt;br /&gt;
|sarif&lt;br /&gt;
|map&lt;br /&gt;
|Настройки экспорта sarif-файла&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|sarif/filenametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия sarif-файла. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;warnings.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|sarif/commenttemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования элемента списка комментариев предупреждения при экспорте в sarif-файл. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|Comment]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default&lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|Svacer 10+: 1.46.0.sarif.clang.10.0.0&lt;br /&gt;
Svacer 9+: 1.46.0.sarif.clang&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file&lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
Svacer 9+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
:- hostport: 0&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
&lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
     IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
     StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
&lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Comment {&lt;br /&gt;
     ID               string&lt;br /&gt;
     Text             string&lt;br /&gt;
     Ref              string&lt;br /&gt;
     CreatedBy        string&lt;br /&gt;
     CreatedByID      string&lt;br /&gt;
     CreateTs         time.Time&lt;br /&gt;
     UpdateTs         *time.Time&lt;br /&gt;
     UpdatedBy        string&lt;br /&gt;
     UpdatedByID      string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sarif:&lt;br /&gt;
            filenametemplate: &amp;quot;warnings.sarif&amp;quot;&lt;br /&gt;
            commenttemplate: &amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang.10.0.0&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр&lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение&lt;br /&gt;
&lt;br /&gt;
 Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz&lt;br /&gt;
 Svacer 9+:  https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.&lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.4/file/MS-SarifVSCode.sarif-viewer-3.4.4.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа:&lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang... -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0.sarif.clang... | gzip &amp;gt; /path/to/tar/theia-blueprint.1.46.0.sarif.clang....tar.gz&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2463</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2463"/>
		<updated>2025-01-14T07:51:11Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar архив с docker-образом]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение. &lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sarif/filenametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt; &lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Завершающий слеш обязателен!&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка &lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения &lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=При использовании версии Svacer 9.0.0 установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9.0.1]].&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|{{Note|text=В версии 10.0.0 заменён на [[Help:XSvacer:Webide#Параметры_экспорта_sarif-файла_с_разметкой_предупреждений|sarif]]}}&lt;br /&gt;
Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры экспорта sarif-файла с разметкой предупреждений ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки экспорта sarif-файлов с разметкой предупреждений, выполненной в Svacer&#039;е.&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;
|-&lt;br /&gt;
|sarif&lt;br /&gt;
|map&lt;br /&gt;
|Настройки экспорта sarif-файла&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|sarif/filenametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия sarif-файла. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;warnings.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|sarif/commenttemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования элемента списка комментариев предупреждения при экспорте в sarif-файл. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|Comment]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
:- hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
&lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
     IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
     StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
     Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Comment {&lt;br /&gt;
     ID               string&lt;br /&gt;
     Text             string&lt;br /&gt;
     Ref              string&lt;br /&gt;
     CreatedBy        string&lt;br /&gt;
     CreatedByID      string&lt;br /&gt;
     CreateTs         time.Time&lt;br /&gt;
     UpdateTs         *time.Time&lt;br /&gt;
     UpdatedBy        string&lt;br /&gt;
     UpdatedByID      string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sarif:&lt;br /&gt;
            filenametemplate: &amp;quot;warnings.sarif&amp;quot;&lt;br /&gt;
            commenttemplate: &amp;quot;{{if trim .Text}}`[{{.CreateTs.Local.Format \&amp;quot;02.01.2006 15:04\&amp;quot;}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение &lt;br /&gt;
&lt;br /&gt;
 https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго. &lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API/management/containers&amp;diff=2090</id>
		<title>Help:Public API/management/containers</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API/management/containers&amp;diff=2090"/>
		<updated>2024-10-16T10:05:41Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: /* = Примеры запросов управления составом групп */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Управление контейнерами (проектами, ветками, группами проектов) =&lt;br /&gt;
&lt;br /&gt;
В данном разделе содержится описание REST API управления контейнерами и их содержимым.&lt;br /&gt;
&lt;br /&gt;
Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресурс&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/public/admin/server/containers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для операций управления составом групп проектов существует http-ресурс &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/public/admin/server/project-groups&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для операции переименования снимков существует http-ресурс&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT /api/public/snapshots/{snapshot_id}/update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=Для использования ресурсов необходимо использовать http-запросы с токеном пользователя имеющего соответствующие права}}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;POST /api/public/admin/server/containers&amp;lt;/code&amp;gt; - управление набором проектов, веток, групп проектов ==&lt;br /&gt;
&lt;br /&gt;
Формат запроса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;parent&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;review_with_comment&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Containers&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;parent&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;review_with_comment&amp;quot;: true,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Назначение полей запроса и установка значений полей ответа зависит от типа операции и определяется значением поля запроса &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Поддерживаемыe значения поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!Значение&lt;br /&gt;
!Тип операции&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Получение списка контейнеров&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;&lt;br /&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;
|&amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
|Удаление контейнера&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение списка контейнеров: &amp;quot;action&amp;quot;: &amp;quot;list&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Если не пустое: идентификатор контейнера, для которого будут загружены &amp;quot;связанные&amp;quot; контейнеры:&lt;br /&gt;
:- если передан id группы проектов - вернётся список проектов входящих в данную группу&lt;br /&gt;
:- если передан id проекта - вернётся список групп проектов, в который входит проект + список его веток&lt;br /&gt;
:- если передан id ветки - вернётся список снимков данной ветки&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если не пустое: отфильтровывает список контейнеров по типу&lt;br /&gt;
&lt;br /&gt;
Если пустое:&lt;br /&gt;
:- если поле &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; пустое - возвращается объединённый список проектов и групп проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Если не пустое:&lt;br /&gt;
:- если поле &amp;lt;code&amp;gt;id&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;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Примеры запросов с &amp;lt;code&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;20706313-6986-4c9d-9a4e-5e4908a11499&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupB&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;iptables&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;d53b0b92-d0fb-429a-8f86-c8fe6ee50c0c&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;proftpd&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;project-group&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;20706313-6986-4c9d-9a4e-5e4908a11499&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupB&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bas&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;ef9210db-180b-4351-8a2f-7e8ceaa42ec6&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;branch&amp;quot;,&amp;quot;parent&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Создание контейнера: &amp;quot;action&amp;quot;: &amp;quot;add&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип нового контейнера. Обязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название нового контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор проекта, в котором будет создана новая ветка&lt;br /&gt;
Если тип нового контейнера НЕ &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;: не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Значение настройки проекта &amp;quot;Обязательный комментарий при разметке&amp;quot;&lt;br /&gt;
Если тип нового контейнера НЕ &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;: не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Изменение контейнера: &amp;quot;action&amp;quot;: &amp;quot;update&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&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;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Идентификатор изменяемого контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип изменяемого контейнера. Используется для поиска контейнера вместе с id. Изменить тип контейнера нельзя. Необязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Новое название контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется. Изменить проект в котором создана ветка нельзя&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Новое значение настройки проекта &amp;quot;Обязательный комментарий при разметке&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Удаление контейнера: &amp;quot;action&amp;quot;: &amp;quot;remove&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Идентификатор удаляемого контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип удаляемого контейнера. Используется для поиска контейнера вместе с id. Необязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;POST /api/public/admin/server/project-groups&amp;lt;/code&amp;gt; - управление составом групп проектов ==&lt;br /&gt;
&lt;br /&gt;
Формат запроса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_name_or_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_name&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Назначение полей запроса и ответа зависит от типа операции и определяется значением поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Поддерживаемыe значения поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!Значение&lt;br /&gt;
!Тип операции&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;&lt;br /&gt;
|Получение экземпляра группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;add-project-to-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|Добавление проекта в группу проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;remove-project-from-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|Исключение проекта из группы проектов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение экземпляра группы проектов: &amp;quot;action&amp;quot;: &amp;quot;get&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор запрашиваемой группы проектов. {{Note|text= Поддержка названия добавлена ПОСЛЕ версии 9.0.2}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Добавление проекта в группу проектов: &amp;quot;action&amp;quot;: &amp;quot;add-project-to-group&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;add-project-to-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор изменяемой группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор добавляемого проекта&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Исключение проекта из группы проектов: &amp;quot;action&amp;quot;: &amp;quot;remove-project-from-group&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;remove-project-from-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор изменяемой группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор исключаемого проекта&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Примеры запросов управления составом групп ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;get&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;get&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;get&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;get&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;add-project-to-group&amp;quot;, &amp;quot;project_name_or_id&amp;quot;: &amp;quot;iptables&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;add-project-to-group&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;project_id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;project_name&amp;quot;:&amp;quot;iptables&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;remove-project-from-group&amp;quot;, &amp;quot;project_name_or_id&amp;quot;: &amp;quot;iptables&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;remove-project-from-group&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;project_id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;project_name&amp;quot;:&amp;quot;iptables&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API/management/containers&amp;diff=2089</id>
		<title>Help:Public API/management/containers</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API/management/containers&amp;diff=2089"/>
		<updated>2024-10-16T09:28:03Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Управление контейнерами (проектами, ветками, группами проектов) =&lt;br /&gt;
&lt;br /&gt;
В данном разделе содержится описание REST API управления контейнерами и их содержимым.&lt;br /&gt;
&lt;br /&gt;
Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресурс&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/public/admin/server/containers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для операций управления составом групп проектов существует http-ресурс &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/public/admin/server/project-groups&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для операции переименования снимков существует http-ресурс&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PUT /api/public/snapshots/{snapshot_id}/update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=Для использования ресурсов необходимо использовать http-запросы с токеном пользователя имеющего соответствующие права}}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;POST /api/public/admin/server/containers&amp;lt;/code&amp;gt; - управление набором проектов, веток, групп проектов ==&lt;br /&gt;
&lt;br /&gt;
Формат запроса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;parent&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;review_with_comment&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Containers&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;parent&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;review_with_comment&amp;quot;: true,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Назначение полей запроса и установка значений полей ответа зависит от типа операции и определяется значением поля запроса &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Поддерживаемыe значения поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!Значение&lt;br /&gt;
!Тип операции&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Получение списка контейнеров&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;&lt;br /&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;
|&amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
|Удаление контейнера&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение списка контейнеров: &amp;quot;action&amp;quot;: &amp;quot;list&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Если не пустое: идентификатор контейнера, для которого будут загружены &amp;quot;связанные&amp;quot; контейнеры:&lt;br /&gt;
:- если передан id группы проектов - вернётся список проектов входящих в данную группу&lt;br /&gt;
:- если передан id проекта - вернётся список групп проектов, в который входит проект + список его веток&lt;br /&gt;
:- если передан id ветки - вернётся список снимков данной ветки&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если не пустое: отфильтровывает список контейнеров по типу&lt;br /&gt;
&lt;br /&gt;
Если пустое:&lt;br /&gt;
:- если поле &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; пустое - возвращается объединённый список проектов и групп проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Если не пустое:&lt;br /&gt;
:- если поле &amp;lt;code&amp;gt;id&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;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Примеры запросов с &amp;lt;code&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;20706313-6986-4c9d-9a4e-5e4908a11499&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupB&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;iptables&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;d53b0b92-d0fb-429a-8f86-c8fe6ee50c0c&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;proftpd&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;project-group&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;20706313-6986-4c9d-9a4e-5e4908a11499&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupB&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bas&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;ef9210db-180b-4351-8a2f-7e8ceaa42ec6&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;branch&amp;quot;,&amp;quot;parent&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Создание контейнера: &amp;quot;action&amp;quot;: &amp;quot;add&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип нового контейнера. Обязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название нового контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор проекта, в котором будет создана новая ветка&lt;br /&gt;
Если тип нового контейнера НЕ &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;: не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Значение настройки проекта &amp;quot;Обязательный комментарий при разметке&amp;quot;&lt;br /&gt;
Если тип нового контейнера НЕ &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;: не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Изменение контейнера: &amp;quot;action&amp;quot;: &amp;quot;update&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&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;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Идентификатор изменяемого контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип изменяемого контейнера. Используется для поиска контейнера вместе с id. Изменить тип контейнера нельзя. Необязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Новое название контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется. Изменить проект в котором создана ветка нельзя&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Новое значение настройки проекта &amp;quot;Обязательный комментарий при разметке&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Удаление контейнера: &amp;quot;action&amp;quot;: &amp;quot;remove&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Идентификатор удаляемого контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип удаляемого контейнера. Используется для поиска контейнера вместе с id. Необязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;POST /api/public/admin/server/project-groups&amp;lt;/code&amp;gt; - управление составом групп проектов ==&lt;br /&gt;
&lt;br /&gt;
Формат запроса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_name_or_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_name&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Назначение полей запроса и ответа зависит от типа операции и определяется значением поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Поддерживаемыe значения поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!Значение&lt;br /&gt;
!Тип операции&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;&lt;br /&gt;
|Получение экземпляра группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;add-project-to-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|Добавление проекта в группу проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;remove-project-from-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|Исключение проекта из группы проектов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение экземпляра группы проектов: &amp;quot;action&amp;quot;: &amp;quot;get&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор запрашиваемой группы проектов. {{Note|text= Поддержка названия добавлена ПОСЛЕ версии 9.0.2}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Добавление проекта в группу проектов: &amp;quot;action&amp;quot;: &amp;quot;add-project-to-group&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;add-project-to-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор изменяемой группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор добавляемого проекта&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Исключение проекта из группы проектов: &amp;quot;action&amp;quot;: &amp;quot;remove-project-from-group&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;remove-project-from-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор изменяемой группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор исключаемого проекта&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Примеры запросов управления составом групп ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;get&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;get&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;get&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;get&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;add-project-to-group&amp;quot;, &amp;quot;project_name_or_id&amp;quot;: &amp;quot;iptables&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;add-project-to-group&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;project_id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;project_name&amp;quot;:&amp;quot;iptables&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;remove-project-from-group&amp;quot;, &amp;quot;project_name_or_id&amp;quot;: &amp;quot;iptables&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;remove-project-from-group&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;project_id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;project_name&amp;quot;:&amp;quot;iptables&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API/management/containers&amp;diff=2088</id>
		<title>Help:Public API/management/containers</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:Public_API/management/containers&amp;diff=2088"/>
		<updated>2024-10-16T09:17:21Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Created page with &amp;quot;= Управление контейнерами (проектами, ветками, группами проектов) =  В данном разделе содержится описание REST API управления контейнерами и их содержимым.  Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресу...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Управление контейнерами (проектами, ветками, группами проектов) =&lt;br /&gt;
&lt;br /&gt;
В данном разделе содержится описание REST API управления контейнерами и их содержимым.&lt;br /&gt;
&lt;br /&gt;
Для выполнения операций получения списка контейнеров, их создания, изменения и удаления существует http-ресурс&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/public/admin/server/containers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для операций управления составом групп проектов существует http-ресурс &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/public/admin/server/project-groups&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|type=warn|text=Для использования ресурсов необходимо использовать http-запросы с токеном пользователя имеющего соответствующие права}}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;POST /api/public/admin/server/containers&amp;lt;/code&amp;gt; - управление набором проектов, веток, групп проектов ==&lt;br /&gt;
&lt;br /&gt;
Формат запроса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;parent&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;review_with_comment&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Containers&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;parent&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
      &amp;quot;review_with_comment&amp;quot;: true,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Назначение полей запроса и установка значений полей ответа зависит от типа операции и определяется значением поля запроса &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Поддерживаемыe значения поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!Значение&lt;br /&gt;
!Тип операции&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Получение списка контейнеров&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;&lt;br /&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;
|&amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
|Удаление контейнера&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение списка контейнеров: &amp;quot;action&amp;quot;: &amp;quot;list&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Если не пустое: идентификатор контейнера, для которого будут загружены &amp;quot;связанные&amp;quot; контейнеры:&lt;br /&gt;
:- если передан id группы проектов - вернётся список проектов входящих в данную группу&lt;br /&gt;
:- если передан id проекта - вернётся список групп проектов, в который входит проект + список его веток&lt;br /&gt;
:- если передан id ветки - вернётся список снимков данной ветки&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если не пустое: отфильтровывает список контейнеров по типу&lt;br /&gt;
&lt;br /&gt;
Если пустое:&lt;br /&gt;
:- если поле &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; пустое - возвращается объединённый список проектов и групп проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Если не пустое:&lt;br /&gt;
:- если поле &amp;lt;code&amp;gt;id&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;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Примеры запросов с &amp;lt;code&amp;gt;&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;20706313-6986-4c9d-9a4e-5e4908a11499&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupB&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;iptables&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;d53b0b92-d0fb-429a-8f86-c8fe6ee50c0c&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;proftpd&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;project-group&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;20706313-6986-4c9d-9a4e-5e4908a11499&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupB&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bas&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;list&amp;quot;, &amp;quot;id&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/containers&lt;br /&gt;
{&amp;quot;Containers&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;project-group&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;ef9210db-180b-4351-8a2f-7e8ceaa42ec6&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;master&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;branch&amp;quot;,&amp;quot;parent&amp;quot;:&amp;quot;a7e22042-96e5-4659-b21a-0615d434bed7&amp;quot;}]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Создание контейнера: &amp;quot;action&amp;quot;: &amp;quot;add&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип нового контейнера. Обязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название нового контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор проекта, в котором будет создана новая ветка&lt;br /&gt;
Если тип нового контейнера НЕ &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;: не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Значение настройки проекта &amp;quot;Обязательный комментарий при разметке&amp;quot;&lt;br /&gt;
Если тип нового контейнера НЕ &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;: не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Изменение контейнера: &amp;quot;action&amp;quot;: &amp;quot;update&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&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;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Идентификатор изменяемого контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип изменяемого контейнера. Используется для поиска контейнера вместе с id. Изменить тип контейнера нельзя. Необязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Новое название контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется. Изменить проект в котором создана ветка нельзя&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Новое значение настройки проекта &amp;quot;Обязательный комментарий при разметке&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Удаление контейнера: &amp;quot;action&amp;quot;: &amp;quot;remove&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Идентификатор удаляемого контейнера. Обязательное&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип удаляемого контейнера. Используется для поиска контейнера вместе с id. Необязательное. Допустимые значения: &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;branch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;project-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;review_with_comment&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;POST /api/public/admin/server/project-groups&amp;lt;/code&amp;gt; - управление составом групп проектов ==&lt;br /&gt;
&lt;br /&gt;
Формат запроса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_name_or_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формат ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_group_name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;project_name&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Назначение полей запроса и ответа зависит от типа операции и определяется значением поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Поддерживаемыe значения поля &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!Значение&lt;br /&gt;
!Тип операции&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;&lt;br /&gt;
|Получение экземпляра группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;add-project-to-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|Добавление проекта в группу проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;remove-project-from-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|Исключение проекта из группы проектов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Получение экземпляра группы проектов: &amp;quot;action&amp;quot;: &amp;quot;get&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор запрашиваемой группы проектов. {{Note|text= Поддержка названия добавлена ПОСЛЕ версии 9.0.2}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Не используется&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Добавление проекта в группу проектов: &amp;quot;action&amp;quot;: &amp;quot;add-project-to-group&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;add-project-to-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор изменяемой группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор добавляемого проекта&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Исключение проекта из группы проектов: &amp;quot;action&amp;quot;: &amp;quot;remove-project-from-group&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | Назначение полей запроса&lt;br /&gt;
|-&lt;br /&gt;
!Поле&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;remove-project-from-group&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_group_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор изменяемой группы проектов&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;project_name_or_id&amp;lt;/code&amp;gt;&lt;br /&gt;
|Название или идентификатор исключаемого проекта&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Примеры запросов управления составом групп ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;get&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;get&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;get&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;get&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;add-project-to-group&amp;quot;, &amp;quot;project_name_or_id&amp;quot;: &amp;quot;iptables&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;add-project-to-group&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;project_id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;project_name&amp;quot;:&amp;quot;iptables&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl --data &#039;{&amp;quot;action&amp;quot;: &amp;quot;remove-project-from-group&amp;quot;, &amp;quot;project_name_or_id&amp;quot;: &amp;quot;iptables&amp;quot;, &amp;quot;project_group_name_or_id&amp;quot;: &amp;quot;projectGroupA&amp;quot;}&#039; -X POST http://localhost:8080/api/public/admin/server/project-groups&lt;br /&gt;
{&amp;quot;action&amp;quot;:&amp;quot;remove-project-from-group&amp;quot;,&amp;quot;project_group_id&amp;quot;:&amp;quot;0f7da122-9c86-4384-b7bc-356bfb3b7f28&amp;quot;,&amp;quot;project_group_name&amp;quot;:&amp;quot;projectGroupA&amp;quot;,&amp;quot;project_id&amp;quot;:&amp;quot;a8e0352c-0408-417c-8fd0-4fbe03f38980&amp;quot;,&amp;quot;project_name&amp;quot;:&amp;quot;iptables&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2055</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2055"/>
		<updated>2024-07-15T11:53:47Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar архив с docker-образом]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение. &lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sariffiletemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt; &lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Завершающий слеш обязателен!&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка &lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения &lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=При использовании версии Svacer 9.0.0 установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9.0.1]].&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
:- hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
 	IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
 	StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sariffiletemplate: &amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение &lt;br /&gt;
&lt;br /&gt;
 https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго. &lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2054</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2054"/>
		<updated>2024-07-15T11:52:57Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|text=Данная функциональность входит в набор расширений XSvacer}}&lt;br /&gt;
&lt;br /&gt;
= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar архив с docker-образом]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение. &lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sariffiletemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
{{Note|type=reminder|text=Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt; &lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note}} Завершающий слеш обязателен!&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка &lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения &lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
{{Note|type=error|text=При использовании версии Svacer 9-0-0 установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9-0-1]].&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
:- hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
 	IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
 	StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sariffiletemplate: &amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
{{Note|text=При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение &lt;br /&gt;
&lt;br /&gt;
 https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго. &lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2024</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=2024"/>
		<updated>2024-06-19T09:13:17Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: support#3391 docker image url changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка среды разработки Theia IDE =&lt;br /&gt;
&lt;br /&gt;
 Данная функциональность входит в набор расширений XSvacer&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске Svacer.&lt;br /&gt;
&lt;br /&gt;
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;&lt;br /&gt;
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; — https://docs.docker.com/engine/install/linux-postinstall&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot;&lt;br /&gt;
# Перезапустить Svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar архив с docker-образом]&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Внимание!&#039;&#039;&#039; IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение. &lt;br /&gt;
&lt;br /&gt;
Например, в Firefox:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification ru.png]]&lt;br /&gt;
&lt;br /&gt;
В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
&lt;br /&gt;
[[File:Firefox popup notification expanded ru.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла svacer.cfg&lt;br /&gt;
# Внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске Svacer указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE&lt;br /&gt;
# У пользователя Svacer имеются разрешения &amp;quot;Просмотр маркеров&amp;quot; и &amp;quot;Экспорт разметки&amp;quot; на проект, в котором находится снимок, для которого нужно запустить IDE&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;quot;Открыть в IDE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sariffiletemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;. Если docker-образ отсутствует, он будет загружен на хост&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; — процесс запуска IDE продолжается&lt;br /&gt;
##** в статусе &amp;lt;code&amp;gt;created&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;paused&amp;lt;/code&amp;gt; — контейнер будет запущен&lt;br /&gt;
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается&lt;br /&gt;
#* Если ответ не получен — вернётся ошибка &amp;lt;code&amp;gt;ide not ready&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
Причиной возникновения ошибки &amp;quot;ide not ready&amp;quot; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени.&lt;br /&gt;
&lt;br /&gt;
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:&lt;br /&gt;
# Сетевую доступность docker-хоста&lt;br /&gt;
# Настройки фаервола на docker-хосте&lt;br /&gt;
# Настройки биндинга docker-контейнера c IDE&lt;br /&gt;
::&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt; &lt;br /&gt;
::Контейнер должен быть подключён к доступному сетевому интерфейсу&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и слушает порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для запуска IDE в окне браузера нужно указать адрес&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Завершающий слеш обязателен!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода&lt;br /&gt;
 DELETE /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;. В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию установлен параметр конфигурации &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&lt;br /&gt;
&lt;br /&gt;
Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить это поведение, настройка &lt;br /&gt;
 xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&lt;br /&gt;
&lt;br /&gt;
должна быть установлена в &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения &lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Сейчас установка &amp;lt;code&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска Svacer. Не используйте данную настройку до исправления.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершения Svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; — название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; — порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; — действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Доступные действия:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; — обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; — идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; — идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для default-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью — &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;, иначе функциональность WebIDE не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации default)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со Svacer&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;theia-1-46-{{.StartArgs.SnapshotID}}&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список меток docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
- &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост&lt;br /&gt;
* repository — будет вызван docker pull образа &amp;lt;code&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* file — будет вызван docker load с URL &amp;lt;code&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|URL откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
URL может содержать:&lt;br /&gt;
* путь к локальному файлу: схема &amp;lt;code&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
* http/https-адрес: схема &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
:- hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
 	IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
 	StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sariffiletemplate: &amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию используется docker-хост с идентификатором &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения&lt;br /&gt;
&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске Svacer:&lt;br /&gt;
&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &lt;br /&gt;
&lt;br /&gt;
 xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&lt;br /&gt;
&lt;br /&gt;
Содержит значение &lt;br /&gt;
&lt;br /&gt;
 https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
&lt;br /&gt;
По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго. &lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Скачать файл архива&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений Theia. Результат выполнения &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
 docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
 docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Svacer&amp;diff=1976</id>
		<title>Svacer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Svacer&amp;diff=1976"/>
		<updated>2024-06-10T12:43:46Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: Добавлена ссылка на документацию XSvacer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Svacer — сервер для хранения и обработки результатов статического анализа. Поддерживает импорт результатов анализа из [https://svace.ispras.ru Svace] напрямую и из прочих анализаторов через формат [[Help:Sarif|SARIF]].&lt;br /&gt;
&lt;br /&gt;
=== Техническая документация ===&lt;br /&gt;
Version 9.0.0&lt;br /&gt;
# [[Help:Introduction|Введение]]&lt;br /&gt;
# [[Help:Installation|Установка и обновление]]&lt;br /&gt;
# [[Help:Import from Svace|Импорт из Svace]]&lt;br /&gt;
# [[Help:Backup|Резервное копирование]]&lt;br /&gt;
# [[Help:UI manual|Использование веб-интерфейса]]&lt;br /&gt;
# [[Help:Public API|Public REST API]]&lt;br /&gt;
# [[Help:CLI|CLI]]&lt;br /&gt;
# [[LDAP configuration|LDAP]]&lt;br /&gt;
# [[OIDC|OpenID Connect]]&lt;br /&gt;
# [[Help:Sarif|SARIF]]&lt;br /&gt;
# [[Help:Statistics|Статистика]]&lt;br /&gt;
# [[Help:Match|Механизмы сопоставления предупреждений и переноса разметки]]&lt;br /&gt;
# [[Help:XSvacer|XSvacer - расширение функциональности svacer]]&lt;br /&gt;
&lt;br /&gt;
=== Релизы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! version !! zip !! linux !! windows !! deb/rpm !! doc&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.0&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-9-0-0.zip svacer-9-0-0.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer svacer]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-server svacer-server]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer.exe svacer.exe]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-server.exe svacer-server.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-9-0-0/svacer_9.0-0_amd64.deb svacer_9.0-0_amd64.deb]&amp;lt;br /&amp;gt;[https://svacer.ispras.ru/releases/svacer-9-0-0/svacer-9.0-0.x86_64.rpm svacer-9.0-0.x86_64.rpm]&lt;br /&gt;
| [[Changelog#Release 9-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 9-0-0|Release notes]]&amp;lt;br /&amp;gt;[[Help:Installation#9-0-0|Upgrade notes]]&lt;br /&gt;
|-&lt;br /&gt;
| 8.0.1 &lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8-0-1.zip svacer-8-0-1.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer svacer]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer.exe svacer.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer_8.0-1_amd64.deb svacer_8.0-1_amd64.deb]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8.0-1.x86_64.rpm svacer-8.0-1.x86_64.rpm]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-1/svacer-8.0.1.msi svacer-8.0.1.msi]&lt;br /&gt;
| [[Changelog#Release 8-0-1|Changelog]]&lt;br /&gt;
|-&lt;br /&gt;
| 8.0.0 &lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8-0-0.zip svacer-8-0-0.zip]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer svacer]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer.exe svacer.exe]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer_8.0-0_amd64.deb svacer_8.0-0_amd64.deb]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8.0-0.x86_64.rpm svacer-8.0-0.x86_64.rpm]&amp;lt;br /&amp;gt; [https://svacer.ispras.ru/releases/svacer-8-0-0/svacer-8.0.0.msi svacer-8.0.0.msi]&lt;br /&gt;
| [[Changelog#Release 8-0-0|Changelog]]&amp;lt;br /&amp;gt;[[Release notes 8-0-0|Release notes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Также доступны в виде docker-образа на [https://hub.docker.com/r/ispras/svacer docker hub] и как пакеты в [[Help:Installation#.deb|apt-репозитории]].&lt;br /&gt;
&lt;br /&gt;
===== Предыдущие релизы =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| [[Changelog#Release 7-0-1|7.0.1]]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer_release-7-0-1.zip zip]([https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer_release-7-0-1.zip.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer_7.0-1_amd64.deb deb]([https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer_7.0-1_amd64.deb.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer-7.0-1.x86_64.rpm rpm]([https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer-7.0-1.x86_64.rpm.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer-7.0.1.msi msi]([https://svacer.ispras.ru/releases/svacer-release-7-0-1/svacer-7.0.1.msi.md5 md5])&lt;br /&gt;
|-&lt;br /&gt;
| [[Changelog#Release 7-0-0|7.0.0]]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer_release-7-0-0.zip zip]([https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer_release-7-0-0.zip.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer_7.0-0_amd64.deb deb]([https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer_7.0-0_amd64.deb.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer-7.0-0.x86_64.rpm rpm]([https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer-7.0-0.x86_64.rpm.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer-7.0.0.msi msi]([https://svacer.ispras.ru/releases/svacer-release-7-0-0/svacer-7.0.0.msi.md5 md5])&lt;br /&gt;
|-&lt;br /&gt;
| [[Changelog#Release 6-0-3|6.0.3]]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-release-6-0-3/svacer_release-6-0-3.zip zip]([https://svacer.ispras.ru/releases/svacer-release-6-0-3/svacer_release-6-0-3.zip.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-3/svacer_6.0-3_amd64.deb deb]([https://svacer.ispras.ru/releases/svacer-release-6-0-3/svacer_6.0-3_amd64.deb.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-3/svacer-6.0-3.x86_64.rpm rpm]([https://svacer.ispras.ru/releases/svacer-release-6-0-3/svacer-6.0-3.x86_64.rpm.md5 md5])&lt;br /&gt;
|-&lt;br /&gt;
| [[Changelog#Release 6-0-2|6.0.2]]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-release-6-0-2/svacer_release-6-0-2.zip zip]([https://svacer.ispras.ru/releases/svacer-release-6-0-2/svacer_release-6-0-2.zip.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-2/svacer_6.0-2_amd64.deb deb]([https://svacer.ispras.ru/releases/svacer-release-6-0-2/svacer_6.0-2_amd64.deb.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-2/svacer-6.0-2.x86_64.rpm rpm]([https://svacer.ispras.ru/releases/svacer-release-6-0-2/svacer-6.0-2.x86_64.rpm.md5 md5])&lt;br /&gt;
|-&lt;br /&gt;
| [[Changelog#Release 6-0-1|6.0.1]]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-release-6-0-1/svacer_release-6-0-1.zip zip]([https://svacer.ispras.ru/releases/svacer-release-6-0-1/svacer_release-6-0-1.zip.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-1/svacer_6.0-1_amd64.deb deb]([https://svacer.ispras.ru/releases/svacer-release-6-0-1/svacer_6.0-1_amd64.deb.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-1/svacer-6.0-1.x86_64.rpm rpm]([https://svacer.ispras.ru/releases/svacer-release-6-0-1/svacer-6.0-1.x86_64.rpm.md5 md5])&lt;br /&gt;
|-&lt;br /&gt;
| [[Changelog#Release 6-0-0|6.0.0]]&lt;br /&gt;
| [https://svacer.ispras.ru/releases/svacer-release-6-0-0/svacer_release-6-0-0.zip zip]([https://svacer.ispras.ru/releases/svacer-release-6-0-0/svacer_release-6-0-0.zip.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-0/svacer_6.0-0_amd64.deb deb]([https://svacer.ispras.ru/releases/svacer-release-6-0-0/svacer_6.0-0_amd64.deb.md5 md5]); [https://svacer.ispras.ru/releases/svacer-release-6-0-0/svacer-6.0-0.x86_64.rpm rpm]([https://svacer.ispras.ru/releases/svacer-release-6-0-0/svacer-6.0-0.x86_64.rpm.md5 md5])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Более старые релизы — в [https://nextcloud.ispras.ru/index.php/s/x4r4cMJAMr5RZtd?path=%2F nextcloud]&lt;br /&gt;
&lt;br /&gt;
=== FAQ ===&lt;br /&gt;
* [https://gitlab.ispras.ru/svace/svace-support/-/wikis/home Документация на статический анализатор Svace]&lt;br /&gt;
* [[Help:Introduction#Системные требования|Системные требования]]&lt;br /&gt;
* [[Примеры использования хуков#Создание кейсов в системах отслеживания ошибок|Создание из Svacer кейсов в Gitlab, Jira, Redmine]]&lt;br /&gt;
* Public REST API &lt;br /&gt;
:* [[Help:Public API#Примеры использования public REST API|Примеры использования]]&lt;br /&gt;
:* [https://gitlab.ispras.ru/svacer-public Репозитории с примерами на Python и Go]  &lt;br /&gt;
:* [https://svacer-demo.ispras.ru/api/public/swagger/ Спецификация OpenAPI]&lt;br /&gt;
* [https://t.me/+6pvgZ0oveNVhOTc6 Группа технической поддержки в Telegram]&lt;br /&gt;
&lt;br /&gt;
=== Демо ===&lt;br /&gt;
Попробуйте Svacer в действии на демо-сервере: https://svacer-demo.ispras.ru&lt;br /&gt;
* admin / svacer_admin_31415 — логин / пароль администратора&lt;br /&gt;
* user / user — логин / пароль пользователя&lt;br /&gt;
&lt;br /&gt;
Можете делать там что угодно, каждую ночь сервер восстанавливается до изначального состояния.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=1975</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=1975"/>
		<updated>2024-06-10T10:32:59Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка среды разработки Theia IDE =&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; данная функциональность входит в набор расширений XSvacer.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске svacer&#039;а.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; при запуске функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; также будет запущена функциональность &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;[[Help:XSvacer:Docker|docker]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов;&lt;br /&gt;
* в пользовательском интерфейсе на вкладке &amp;quot;Информация о снимке&amp;quot; появляется кнопка &amp;quot;Открыть в IDE&amp;quot;;&lt;br /&gt;
* устанавливается подключение к хосту docker&#039;а, на котором будут запускаться контейнеры с экземплярами IDE.&lt;br /&gt;
&lt;br /&gt;
=== Быстрый запуск функциональности с настройками по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:&lt;br /&gt;
# Настройка доступа к docker-хосту:&lt;br /&gt;
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; - https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option);&lt;br /&gt;
## Проверить, что у пользователя под которым будет запускаться svacer есть доступ к unix-сокету docker-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt; - https://docs.docker.com/engine/install/linux-postinstall/;&lt;br /&gt;
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Просмотр маркеров&amp;quot;&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Экспорт разметки&amp;quot;&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Перезапустить svacer с флагом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &#039;&#039;Опционально.&#039;&#039; Для ускорения первого запуска IDE:&lt;br /&gt;
## Скачать архив с docker-образом: https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar;&lt;br /&gt;
## Загрузить docker-образ из архива на docker-хост: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
После этого у пользователей с указанными правами должна появиться кнопка &amp;quot;Открыть в IDE&amp;quot; на панели с информацией о снимке.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; IDE с исходным подом снимков будут запускаться в новых вкладках браузера.&lt;br /&gt;
 При этом зачастую все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение. Например, в firefox:&lt;br /&gt;
 [[File:Firefox popup notification ru.png|x25px]]&lt;br /&gt;
 В таком случае нужно дать разрешение на открытие вкладки с IDE:&lt;br /&gt;
 [[File:Firefox popup notification expanded ru.png|x106px]]&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек подключения к docker-хосту:&lt;br /&gt;
# скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При необходимости изменения настроек запуска IDE:&lt;br /&gt;
# скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел &amp;lt;code&amp;gt;xsvacer&amp;lt;/code&amp;gt; конфигурационного файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;;&lt;br /&gt;
# внести требуемые изменения в конфигурацию раздела &amp;lt;code&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске svacer&#039;а указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В конфигурации функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;[[Help:XSvacer:Webide#Конфигурация|xsvacer/webide/theia]]&amp;lt;/code&amp;gt; есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE;&lt;br /&gt;
# У пользователя svacer имеются разрешения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Просмотр маркеров&amp;quot;&amp;lt;/code&amp;gt; и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Экспорт разметки&amp;quot;&amp;lt;/code&amp;gt; на проект, в котором находится снимок, для которого нужно запустить IDE.&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Открыть в IDE&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Open in IDE&amp;quot;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается;&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет &#039;&#039;перезапущена&#039;&#039;;&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sariffiletemplate&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;:&lt;br /&gt;
##* Если docker-образ отсутствует - он будет загружен на хост;&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен;&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;running&amp;lt;/code&amp;gt; - процесс запуска IDE продолжается;&lt;br /&gt;
##** в статусе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;created&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;paused&amp;lt;/code&amp;gt; - контейнер будет запущен;&lt;br /&gt;
##** в других статусах - вернётся соответствующая ошибка и процесс запуска IDE прервётся;&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен - процесс запуска завершается;&lt;br /&gt;
#* Если ответ не получен - вернётся ошибка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Причиной возникновения ошибки &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;.&lt;br /&gt;
 В случае возникновения ошибки &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt; рекомендуется попробовать повторно запустить IDE через короткий промежуток времени.&lt;br /&gt;
 Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется:&lt;br /&gt;
 1. проверить сетевую доступность docker-хоста;&lt;br /&gt;
 2. проверить настройки биндинга docker-контейнера c IDE - &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt;. Контейнер должен быть подключён к доступному сетевому интерфейсу;&lt;br /&gt;
 3. проверить настройки фаервола на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с &amp;quot;префиксом&amp;quot; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и &amp;quot;слушает&amp;quot; порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; для запуска IDE в окне браузера нужно указать адрес &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Завершающий слеш обязателен!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;DELETE /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; По умолчанию установлен параметр конфигурации &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&amp;lt;/code&amp;gt;. Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
 Чтобы изменить это поведение, настройка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&amp;lt;/code&amp;gt; должна быть установлена в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;false&amp;lt;/code&amp;gt; &#039;&#039;&#039;на момент запуска docker-контейнера IDE&#039;&#039;&#039;. Это можно сделать, например, установив значение переменной окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &#039;&#039;&#039;!!!Сейчас установка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска svacer!!! Не используйте данную настройку до исправления.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание!&#039;&#039;&#039; При корректной остановке (например &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;SIGTERM&amp;lt;/code&amp;gt;) svacer автоматически остановит все запущенные docker-контейнеры IDE&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершениея svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах.&lt;br /&gt;
&lt;br /&gt;
При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке svacer&#039;а все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE снимками:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; - название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; - порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
Доступные действия:&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; - обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; - действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью - &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому помимо настройки функциональности в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; необходимо также настроить доступ к docker-хосту в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt; ([[Help:XSvacer:Docker]]). В противном случае функциональность webide не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; в случае отсутствия файла &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]]&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со svacer&#039;ом&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker&#039;а. Нужен при использовании удалённого docker-хоста, т.к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker&#039;а. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только &amp;quot;стандартный&amp;quot; менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker&#039;а, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;             &lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список &amp;quot;меток&amp;quot; docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 - &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост.&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;repository&amp;lt;/code&amp;gt; - будет вызван &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker pull&amp;lt;/code&amp;gt; образа &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;file&amp;lt;/code&amp;gt; - будет вызван &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker load&amp;lt;/code&amp;gt; с url&#039;ом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|Url откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Url может содержать:&lt;br /&gt;
- путь к локальному файлу: схема &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
- http/https-адрес: схема &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
 - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
 &amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
   - hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
 	IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
 	StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sariffiletemplate: &amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; По умолчанию используется docker-хост с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается svacer должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске svacer&#039;а:&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в &amp;quot;корневые папки&amp;quot;, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;;&lt;br /&gt;
# При использовании rootless-хоста docker&#039;а будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста]].&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&amp;lt;/code&amp;gt; содержит значение &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;. По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т.к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.&lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker&#039;а вручную. Для этого необходимо:&lt;br /&gt;
# Скачать файл архива;&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [[https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0|1.46.0]]&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений theia (результат выполнения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;git diff&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers|требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;localhost&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы svacer должен открываться по https или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Firefox_popup_notification_ru.png&amp;diff=1974</id>
		<title>File:Firefox popup notification ru.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Firefox_popup_notification_ru.png&amp;diff=1974"/>
		<updated>2024-06-10T10:07:21Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: M.vinogradov uploaded a new version of File:Firefox popup notification ru.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Нотификация firefox если сайт пытается открыть новую вкладку&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Firefox_popup_notification_expanded_ru.png&amp;diff=1973</id>
		<title>File:Firefox popup notification expanded ru.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Firefox_popup_notification_expanded_ru.png&amp;diff=1973"/>
		<updated>2024-06-10T10:01:49Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Развёрнутая нотификация firefox если сайт пытается открыть новую вкладку&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=File:Firefox_popup_notification_ru.png&amp;diff=1972</id>
		<title>File:Firefox popup notification ru.png</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=File:Firefox_popup_notification_ru.png&amp;diff=1972"/>
		<updated>2024-06-10T10:00:02Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Нотификация firefox если сайт пытается открыть новую вкладку&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Docker&amp;diff=1971</id>
		<title>Help:XSvacer:Docker</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Docker&amp;diff=1971"/>
		<updated>2024-06-07T11:59:35Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Управление docker-контейнерами =&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; данная функциональность входит в набор расширений XSvacer.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность предназначена для управления docker-контейнерами, содержащими компоненты XSvacer.&lt;br /&gt;
&lt;br /&gt;
Управление docker-контейнерами осуществляется с помощью взаимодействия с docker-хостом с использованием [https://docs.docker.com/engine/api/latest/ REST API].&lt;br /&gt;
&lt;br /&gt;
Возможны два сценария использования docker&#039;а:&lt;br /&gt;
# Подключение к существующему (&amp;quot;внешнему&amp;quot;) docker-хосту;&lt;br /&gt;
# Запуск управляемого svacer&#039;ом [https://docs.docker.com/go/rootless/ rootless-хоста].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code&amp;gt;--xsvacer.features docker&amp;lt;/code&amp;gt; при запуске svacer&#039;а.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; на базе данной функциональности осуществляется запуск компонентов других расширений XSvacer. В таком случае её необязательно запускать явно: она будет запущена, если будет запущена зависимая функциональность.&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью - &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление настроек подключаемых хостов docker&#039;а &amp;lt;code&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;, на которые в дальнейшем будут ссылаться зависимые функциональности. Каждое поле в &amp;lt;code&amp;gt;xsvacer/docker/hosts/...&amp;lt;/code&amp;gt; является идентификатором подключения и содержит его конфигурацию.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   docker:&lt;br /&gt;
     hosts:&lt;br /&gt;
       dockerhost1:&lt;br /&gt;
         type: ...&lt;br /&gt;
         host: ...&lt;br /&gt;
         disabled: false&lt;br /&gt;
         ...&lt;br /&gt;
       dockerhost2:&lt;br /&gt;
         ...&lt;br /&gt;
   &lt;br /&gt;
   dependentFeature1:&lt;br /&gt;
     ...&lt;br /&gt;
     docker:&lt;br /&gt;
       hostid: dockerhost1&lt;br /&gt;
     ...&lt;br /&gt;
   dependentFeature2:&lt;br /&gt;
     ...&lt;br /&gt;
     docker:&lt;br /&gt;
       hostid: dockerhost2&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; в случае отсутствия файла &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt; будет использоваться конфигурация по умолчанию (см. ниже)&lt;br /&gt;
&lt;br /&gt;
=== Общие параметры docker-хостов ===&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;type&amp;lt;/code&amp;gt;&lt;br /&gt;
|enum: &amp;lt;code&amp;gt;external&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;managed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remote&amp;lt;/code&amp;gt;&lt;br /&gt;
|Тип подключаемого docker-хоста:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;external&amp;lt;/code&amp;gt; - &amp;quot;внешний&amp;quot; docker-хост&lt;br /&gt;
* &amp;lt;code&amp;gt;managed&amp;lt;/code&amp;gt; - &amp;quot;управляемый&amp;quot; rootless-хост&lt;br /&gt;
* &amp;lt;code&amp;gt;remote&amp;lt;/code&amp;gt; - аналогичен &amp;lt;code&amp;gt;external&amp;lt;/code&amp;gt;, но &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; должен быть задан&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;hostd&amp;lt;/code&amp;gt;&lt;br /&gt;
|url&lt;br /&gt;
|Url docker-хоста&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация хоста неактивна&lt;br /&gt;
Неактивная конфигурация не может использоваться в других функциональностях&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Использование существующего (&amp;quot;внешнего&amp;quot;) docker-хоста ===&lt;br /&gt;
Данный способ взаимодействия предполагает подключение к существующему хосту docker&#039;а.&lt;br /&gt;
&lt;br /&gt;
Доступные варианты подключения:&lt;br /&gt;
# К локальному хосту через unix-сокет;&lt;br /&gt;
# К удалённому хосту по ssh;&lt;br /&gt;
# К удалённому хосту по http;&lt;br /&gt;
# К к удалённому хосту по https.&lt;br /&gt;
&lt;br /&gt;
Для использования &amp;quot;внешнего&amp;quot; хоста docker&#039;а в конфигурационном файле нужно указать &amp;lt;code&amp;gt;type: external&amp;lt;/code&amp;gt;, а также задать адрес хоста, соответствующий типу подключения:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     default:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;unix:///path/to/docker.sock&amp;quot;&lt;br /&gt;
     remote1:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;&amp;lt;nowiki&amp;gt;ssh://docker-user@docker-host&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     remote2:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;&amp;lt;nowiki&amp;gt;http://docker-host-ip-address:2375&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
     remote3:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;&amp;lt;nowiki&amp;gt;https://docker-host-ip-address:2376&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
       clienttls: ...&lt;br /&gt;
Если параметр &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; не задан, то по умолчанию будет использоваться unix-сокет.&lt;br /&gt;
&lt;br /&gt;
==== Подключение к локальному хосту через unix-сокет ====&lt;br /&gt;
При обычном запуске процесса &amp;lt;code&amp;gt;dockerd&amp;lt;/code&amp;gt; взаимодействие с хостом осуществляется с помощью unix-сокета &amp;lt;code&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Доступ к сокету может получить пользователь с правами &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; или обычный пользователь, входящий в группу &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; (https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option).&lt;br /&gt;
&lt;br /&gt;
Пользователь, под которым запускается svacer, должен иметь права доступа к указанному unix-сокету docker&#039;а (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При отсутствии прав доступа к unix-сокету использование данной функциональности будет приводить к ошибке.&lt;br /&gt;
 В таком случае можно воспользоваться rootless-хостом (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Если для взаимодействия с хостом docker&#039;а используется дефолтный unix-сокет &amp;lt;code&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;, то в конфигурации поле &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; можно не указывать:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     default:&lt;br /&gt;
       type: external&lt;br /&gt;
&lt;br /&gt;
==== Подключение к удалённому хосту по ssh ====&lt;br /&gt;
&lt;br /&gt;
Чтобы подключиться к удалённому хосту docker&#039;а по ssh, необходимо в поле &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; указать схему &amp;lt;code&amp;gt;ssh://&amp;lt;/code&amp;gt;, реквизиты пользователя и название/адрес docker-хоста:&lt;br /&gt;
&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     default:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;&amp;lt;nowiki&amp;gt;ssh://docker-user@docker-host&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Указанный пользователь должен иметь возможность подключения по ssh к указанному хосту, а также иметь права доступа к unix-сокету docker&#039;а на удалённом хосте (https://docs.docker.com/engine/security/protect-access/#use-ssh-to-protect-the-docker-daemon-socket)&lt;br /&gt;
&lt;br /&gt;
==== Подключение к удалённому хосту по http ====&lt;br /&gt;
&lt;br /&gt;
Чтобы подключиться к удалённому хосту docker&#039;а по http, необходимо в поле &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; указать схему &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; и адрес docker-хоста:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     default:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;&amp;lt;nowiki&amp;gt;http://docker-host-ip-address:port&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Данный тип подключения является *небезопасным*, т.к. при использовании API docker&#039;а не производится шифрование сетевого трафика и аутентификация клиента при доступе к docker&#039;у. Чтобы создать безопасное сетевое соединение необходимо использовать подключение по https (tls) (см. ниже)&lt;br /&gt;
&lt;br /&gt;
==== Подключение к удалённому хосту по https (tls) ====&lt;br /&gt;
&lt;br /&gt;
Docker-хост может предоставлять доступ по https (https://docs.docker.com/engine/security/protect-access/#use-tls-https-to-protect-the-docker-daemon-socket).&lt;br /&gt;
&lt;br /&gt;
В таком случае для доступа к API необходимо иметь сертификат удостоверяющего центра, клиентский ключ и сертификат.&lt;br /&gt;
&lt;br /&gt;
В конфигурационном файле пути к ключам указываются в поле &amp;lt;code&amp;gt;xsvacer/docker/{docker-host-id}/clienttls&amp;lt;/code&amp;gt;:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     default:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;&amp;lt;nowiki&amp;gt;https://docker-host-ip-address:2376&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
       clienttls:&lt;br /&gt;
         ca:   &amp;quot;/path/to/ca.pem&amp;quot;&lt;br /&gt;
         cert: &amp;quot;/path/to/cert.pem&amp;quot;&lt;br /&gt;
         key:  &amp;quot;/path/to/key.pem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Специфичные настройки для подключения к https хосту =====&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;
|clienttls/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки TLS                                   &lt;br /&gt;
|-&lt;br /&gt;
|clienttls/ca&lt;br /&gt;
|url&lt;br /&gt;
|Путь к файлу сертификата удостоверяющего центра &lt;br /&gt;
|-&lt;br /&gt;
|clienttls/cert&lt;br /&gt;
|url&lt;br /&gt;
|Путь к клиентскому сертификату                  &lt;br /&gt;
|-&lt;br /&gt;
|clienttls/key&lt;br /&gt;
|url&lt;br /&gt;
|Путь к клиентскому ключу                         &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Памятка при использовании подключения к удалённым хостам ====&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; если используется подключения к удалённому хосту docker&#039;а, в настройке биндингов контейнеров необходимо указывать ip-адрес доступного сетевого интерфейса хоста, т.к. при привязке контейнера к 0.0.0.0 на машине хоста контейнеры будут недоступны снаружи.&lt;br /&gt;
&lt;br /&gt;
=== Запуск &amp;quot;управляемого&amp;quot; rootless-хоста ===&lt;br /&gt;
&lt;br /&gt;
В случае отсутствия доступного docker-хоста, либо если не хочется его загромождать контейнерами svacer&#039;а, предусмотрена возможность запуска &amp;quot;управляемого&amp;quot; rootless-хоста, не требующего настройки дополнительных прав для пользователя, под которым запускается svacer (https://docs.docker.com/engine/security/rootless/).&lt;br /&gt;
&lt;br /&gt;
Управление (запуск и остановка) rootless-хостом будет осуществлять svacer.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Доступно только для linux&#039;а.&lt;br /&gt;
&lt;br /&gt;
Для использования данного rootless-хоста в конфигурационном файле для хоста нужно указать &amp;lt;code&amp;gt;type: managed&amp;lt;/code&amp;gt;.&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     local:&lt;br /&gt;
       type: managed&lt;br /&gt;
       ...&lt;br /&gt;
&lt;br /&gt;
==== Специфичные настройки для rootless-хоста ====&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;
|managed/&lt;br /&gt;
|map&lt;br /&gt;
|параметры запуска rootless-хоста                                             &lt;br /&gt;
|-&lt;br /&gt;
|managed/executable&lt;br /&gt;
|string&lt;br /&gt;
|исполняемый файл. Должен быть доступен в $PATH или содержать абсолютный путь &lt;br /&gt;
&#039;&#039;формат&#039;&#039;: имя исполняемого фала, доступного через переменную &amp;lt;code&amp;gt;$PATH&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;или&#039;&#039;: абсолютный путь до исполняемого файла&lt;br /&gt;
|-&lt;br /&gt;
|managed/env&lt;br /&gt;
|[]string&lt;br /&gt;
|список переменных окружения для процесса rootless-хоста                      &lt;br /&gt;
формат: &amp;lt;code&amp;gt;&amp;quot;НАЗВАНИЕ_ПЕРЕМЕННОЙ=значение переменной&amp;quot;&amp;lt;/code&amp;gt;                          &lt;br /&gt;
|-&lt;br /&gt;
|managed/args&lt;br /&gt;
|[]string&lt;br /&gt;
|список аргументов запуска rootless-хоста                                     &lt;br /&gt;
&#039;&#039;формат&#039;&#039;: &amp;lt;code&amp;gt;&amp;quot;--название-аргумента=значение-аргумента&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;или&#039;&#039;: &amp;lt;code&amp;gt;&amp;quot;--название-аргумента&amp;quot;, &amp;quot;значение-аргумента&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;или&#039;&#039;: &amp;lt;code&amp;gt;&amp;quot;--название-флага&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|managed/loglevel&lt;br /&gt;
|string&lt;br /&gt;
|уровень логирования, на котором будут записываться stdout и stderr процесса rootless-хоста                                      &lt;br /&gt;
|-&lt;br /&gt;
|managed/logprefix&lt;br /&gt;
|string&lt;br /&gt;
|префикс в логе, которым будут помечаться записи из stdout и stderr процесса rootless-хоста                                      &lt;br /&gt;
|-&lt;br /&gt;
|managed/healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|параметры проверки доступности rootless-хоста                                &lt;br /&gt;
|-&lt;br /&gt;
|managed/healthcheck/interval&lt;br /&gt;
|golang duration string&lt;br /&gt;
|интервал проверки                                                            &lt;br /&gt;
|-&lt;br /&gt;
|managed/healthcheck/retries&lt;br /&gt;
|int&lt;br /&gt;
|количество попыток проверки до ошибки доступности                            &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В значениях &amp;lt;code&amp;gt;managed/env&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;managed/args&amp;lt;/code&amp;gt; можно использовать имена переменных окружения в формате &amp;lt;code&amp;gt;${НАЗВАНИЕ_ПЕРЕМЕННОЙ}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Рекомендуемая конфигурация rootless-хоста ====&lt;br /&gt;
&lt;br /&gt;
При запуске &amp;lt;code&amp;gt;dockerd-rootless.sh&amp;lt;/code&amp;gt; без параметров папки с артефактами docker&#039;а создаются во вложенных папках внутри &amp;lt;code&amp;gt;/run/user/$UID/&amp;lt;/code&amp;gt;.&lt;br /&gt;
Для лучшей локализации артефактов svacer&#039;а рекомендуется использовать следующие настройки для rootless-хоста:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     local:&lt;br /&gt;
       type: managed&lt;br /&gt;
       host: &amp;quot;unix://${USER_CACHE_DIR}/svacer-docker-host/svacer-docker.sock&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       managed:&lt;br /&gt;
         executable: &amp;quot;dockerd-rootless.sh&amp;quot;&lt;br /&gt;
         env:&lt;br /&gt;
           - &amp;quot;DOCKERD_ROOTLESS_ROOTLESSKIT_STATE_DIR=${USER_CACHE_DIR}/svacer-docker-host/state-dir/&amp;quot;&lt;br /&gt;
         args:&lt;br /&gt;
           - &amp;quot;--data-root=${USER_CACHE_DIR}/svacer-docker-host/data-root/&amp;quot;&lt;br /&gt;
           - &amp;quot;--exec-root=${USER_CACHE_DIR}/svacer-docker-host/exec-root/&amp;quot;&lt;br /&gt;
           - &amp;quot;--pidfile=${USER_CACHE_DIR}/svacer-docker-host/svacer-docker.pid&amp;quot;&lt;br /&gt;
         logLevel: info&lt;br /&gt;
         logPrefix: &amp;quot;DOCKER HOST: &amp;quot;&lt;br /&gt;
         healthCheck:&lt;br /&gt;
           interval: 1s&lt;br /&gt;
           retries: 10&lt;br /&gt;
&lt;br /&gt;
Здесь вместо &amp;lt;code&amp;gt;${USER_CACHE_DIR}&amp;lt;/code&amp;gt; будет подставлен путь &amp;lt;code&amp;gt;$HOME/.cache&amp;lt;/code&amp;gt; на unix-подобных системах или &amp;lt;code&amp;gt;%LocalAppData%&amp;lt;/code&amp;gt; на windows.&lt;br /&gt;
&lt;br /&gt;
При таких настройках все артефакты хоста docker&#039;а будут храниться внутри папки &amp;lt;code&amp;gt;${USER_CACHE_DIR}/svacer-docker-host&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Использование &amp;quot;неуправляемого&amp;quot; rootless-хоста ===&lt;br /&gt;
&lt;br /&gt;
В случае необходимости управления rootless-хостом без участия svacer&#039;а, его можно запустить отдельно. Например, командой:&lt;br /&gt;
 DOCKERD_ROOTLESS_ROOTLESSKIT_STATE_DIR=/home/$USER/.cache/svacer-docker-host/state-dir/ dockerd-rootless.sh --host unix:///home/$USER/.cache/svacer-docker-host/svacer-docker.sock --data-root=/home/$USER/.cache/svacer-docker-host/data-root/ --exec-root=/home/$USER/.cache/svacer-docker-host/exec-root/ --pidfile=/home/$USER/.cache/svacer-docker-host/svacer-docker.pid&lt;br /&gt;
&lt;br /&gt;
В таком случае подключиться к данному хосту можно как к &amp;quot;внешнему&amp;quot; (&amp;lt;code&amp;gt;type: external&amp;lt;/code&amp;gt;), указав адрес unix-сокета. Например:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     unmanaged:&lt;br /&gt;
       type: external&lt;br /&gt;
       host: &amp;quot;unix:///home/${USER}/.cache/svacer-docker-host/svacer-docker.sock&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная конфигурация применяется по умолчанию, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
 docker:&lt;br /&gt;
   hosts:&lt;br /&gt;
     default:&lt;br /&gt;
       type: external&lt;br /&gt;
     local:&lt;br /&gt;
       type: managed&lt;br /&gt;
       host: &amp;quot;unix://${USER_CACHE_DIR}/svacer-docker-host/svacer-docker.sock&amp;quot;&lt;br /&gt;
       disabled: true&lt;br /&gt;
 &lt;br /&gt;
       managed:&lt;br /&gt;
         executable: &amp;quot;dockerd-rootless.sh&amp;quot;&lt;br /&gt;
         env:&lt;br /&gt;
           - &amp;quot;DOCKERD_ROOTLESS_ROOTLESSKIT_STATE_DIR=${USER_CACHE_DIR}/svacer-docker-host/state-dir/&amp;quot;&lt;br /&gt;
         args:&lt;br /&gt;
           - &amp;quot;--data-root=${USER_CACHE_DIR}/svacer-docker-host/data-root/&amp;quot;&lt;br /&gt;
           - &amp;quot;--exec-root=${USER_CACHE_DIR}/svacer-docker-host/exec-root/&amp;quot;&lt;br /&gt;
           - &amp;quot;--pidfile=${USER_CACHE_DIR}/svacer-docker-host/svacer-docker.pid&amp;quot;&lt;br /&gt;
         logLevel: info&lt;br /&gt;
         logPrefix: &amp;quot;DOCKER HOST: &amp;quot;&lt;br /&gt;
         healthCheck:&lt;br /&gt;
           interval: 1s&lt;br /&gt;
           retries: 10&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При наличии раздела &amp;lt;code&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt; в конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения &amp;lt;code&amp;gt;XSVACER_DOCKER_HOSTS_{id хоста}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; можно указать такие значения переменных окружения при запуске svacer&#039;а:&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== rootless-хост продолжает работать при некорректной остановке svacer&#039;а ===&lt;br /&gt;
&lt;br /&gt;
При некорректном завершении работы svacer&#039;а (например, при получении сигнала &amp;lt;code&amp;gt;SIGKILL&amp;lt;/code&amp;gt;) процесс rootless-хоста останется запущенным в системе.&lt;br /&gt;
&lt;br /&gt;
При этом svacer потеряет возможность управления (запуска/остановки) этого процесса.&lt;br /&gt;
&lt;br /&gt;
При последующем запуске svacer попробует повторно запустить rootless-хост и получит сообщение типа &amp;lt;code&amp;gt;[rootlesskit:parent] error: failed to lock /path/to/svacer-docker-host/state-dir/lock, another RootlessKit is running with the same state directory?&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом, если настройки не менялись, зависимые функциональности смогут получить доступ к &amp;quot;неконтролируемому&amp;quot; rootless-хосту, т.к. адрес unix-сокета хоста известен.&lt;br /&gt;
&lt;br /&gt;
Процесс &amp;quot;неконтролируемого&amp;quot; rootless-хоста при необходимости может быть остановлен вручную. Например с помощью отправки сигнала &amp;lt;code&amp;gt;SIGTERM&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=1970</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=1970"/>
		<updated>2024-06-07T11:58:57Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка среды разработки Theia IDE =&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; данная функциональность входит в набор расширений XSvacer.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске svacer&#039;а.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; при запуске функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; также будет запущена функциональность &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;[[Help:XSvacer:Docker|docker]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов;&lt;br /&gt;
* в пользовательском интерфейсе появляется кнопка &amp;quot;Открыть в IDE&amp;quot;;&lt;br /&gt;
* устанавливается подключение к хосту docker&#039;а, на котором будут запускаться контейнеры с экземплярами IDE.&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске svacer&#039;а указан флаг &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В конфигурации функциональности &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; ([[Help:XSvacer:Webide#Конфигурация]]) есть хотя бы одна активная (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE;&lt;br /&gt;
# У пользователя svacer имеются разрешения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Просмотр маркеров&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Read markers&amp;quot;&amp;lt;/code&amp;gt;) и &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Экспорт разметки&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Export markup&amp;quot;&amp;lt;/code&amp;gt;) на проект, в котором находится снимок, для которого нужно запустить IDE.&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Открыть в IDE&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Open in IDE&amp;quot;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается;&lt;br /&gt;
#** Если IDE недоступна: продолжается процесс запуска. IDE будет &#039;&#039;перезапущена&#039;&#039;;&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sariffiletemplate&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;:&lt;br /&gt;
##* Если docker-образ отсутствует - он будет загружен на хост;&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен;&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;running&amp;lt;/code&amp;gt; - процесс запуска IDE продолжается;&lt;br /&gt;
##** в статусе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;created&amp;lt;/code&amp;gt;,&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;paused&amp;lt;/code&amp;gt; - контейнер будет запущен;&lt;br /&gt;
##** в других статусах - вернётся соответствующая ошибка и процесс запуска IDE прервётся;&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен - процесс запуска завершается;&lt;br /&gt;
#* Если ответ не получен - вернётся ошибка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Причиной возникновения ошибки &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;.&lt;br /&gt;
 В случае возникновения ошибки &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt; рекомендуется попробовать повторно запустить IDE через короткий промежуток времени.&lt;br /&gt;
 Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется:&lt;br /&gt;
 1. проверить сетевую доступность docker-хоста;&lt;br /&gt;
 2. проверить настройки биндинга docker-контейнера c IDE - &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt;. Контейнер должен быть подключён к доступному сетевому интерфейсу;&lt;br /&gt;
 3. проверить настройки фаервола на docker-хосте.&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с &amp;quot;префиксом&amp;quot; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Все запросы, направленные к ресурсам &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt;, будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и &amp;quot;слушает&amp;quot; порт &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; для запуска IDE в окне браузера нужно указать адрес &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Завершающий слеш обязателен!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;DELETE /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; По умолчанию установлен параметр конфигурации &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&amp;lt;/code&amp;gt;. Это означает, что после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
 Чтобы изменить это поведение, настройка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&amp;lt;/code&amp;gt; должна быть установлена в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;false&amp;lt;/code&amp;gt; &#039;&#039;&#039;на момент запуска docker-контейнера IDE&#039;&#039;&#039;. Это можно сделать, например, установив значение переменной окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &#039;&#039;&#039;!!!Сейчас установка &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска svacer!!! Не используйте данную настройку до исправления.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание!&#039;&#039;&#039; При корректной остановке (например &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;SIGTERM&amp;lt;/code&amp;gt;) svacer автоматически остановит все запущенные docker-контейнеры IDE&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершениея svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах.&lt;br /&gt;
&lt;br /&gt;
При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке svacer&#039;а все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE снимками:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; - название IDE&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; - порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
Доступные действия:&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; - обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; - действие&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;-конфигурации Theia IDE: &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью - &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому помимо настройки функциональности в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; необходимо также настроить доступ к docker-хосту в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt; ([[Help:XSvacer:Docker]]). В противном случае функциональность webide не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; в случае отсутствия файла &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]]&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на машине со svacer&#039;ом&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке, содержащей исходные коды снимков на хосте docker&#039;а. Нужен при использовании удалённого docker-хоста, т.к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker&#039;а. По умолчанию &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только &amp;quot;стандартный&amp;quot; менеджер (&amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker&#039;а, описанного в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;             &lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список &amp;quot;меток&amp;quot; docker-контейнера. Дополняет список меток в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 - &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост.&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;repository&amp;lt;/code&amp;gt; - будет вызван &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker pull&amp;lt;/code&amp;gt; образа &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;file&amp;lt;/code&amp;gt; - будет вызван &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker load&amp;lt;/code&amp;gt; с url&#039;ом &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|Url откуда будет загружен docker-образ если &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Url может содержать:&lt;br /&gt;
- путь к локальному файлу: схема &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
- http/https-адрес: схема &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
 - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
 &amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
   - hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
 	IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
 	StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  docker:&lt;br /&gt;
    hosts:&lt;br /&gt;
      default: # конфигурация docker-хоста&lt;br /&gt;
        type: external&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sariffiletemplate: &amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; По умолчанию используется docker-хост с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается svacer должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При наличии раздела &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост можно указать такие значения переменных окружения при запуске svacer&#039;а:&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в &amp;quot;корневые папки&amp;quot;, заданные в параметре &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;;&lt;br /&gt;
#*: метки, перечисленные в &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;;&lt;br /&gt;
#*: метки с названиями &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;;&lt;br /&gt;
# При использовании rootless-хоста docker&#039;а будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста]].&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&amp;lt;/code&amp;gt; содержит значение &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;. По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т.к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.&lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker&#039;а вручную. Для этого необходимо:&lt;br /&gt;
# Скачать файл архива;&lt;br /&gt;
# Выполнить команду &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [[https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0|1.46.0]]&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений theia (результат выполнения &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;git diff&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers|требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;localhost&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы svacer должен открываться по https или быть доступен по адресу &amp;lt;code style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer&amp;diff=1969</id>
		<title>Help:XSvacer</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer&amp;diff=1969"/>
		<updated>2024-06-07T11:58:18Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= XSvacer - расширение функциональности svacer =&lt;br /&gt;
&lt;br /&gt;
Начиная с релиза [[Changelog#Release_9-0-0|9.0.0]] в svacer&#039;е появились &amp;quot;расширенные функции&amp;quot;, которые могут быть активированы по требованию.&lt;br /&gt;
&lt;br /&gt;
Доступные функции:&lt;br /&gt;
* [[Help:XSvacer:Webide|webide]] - Среда разработки на базе [https://theia-ide.org/ Theia IDE], с помощью которой можно просматривать исходный код снимка, предупреждения анализатора и разметку.&lt;br /&gt;
* [[Help:XSvacer:Docker|docker]] - Вспомогательная функциональность для запуска других компонентов в docker-контейнерах.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; по умолчанию данные функции неактивны. &lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; функциональность docker будет активирована автоматически, при запуске зависящих от неё функций.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На данный момент расширенные функции находятся на стадии внедрения. В последующих релизах возможно изменение форматов конфигурации и API взаимодействия с указанными функциями.&lt;br /&gt;
&lt;br /&gt;
== Активация функций ==&lt;br /&gt;
&lt;br /&gt;
Активировать функции можно, указав флаг &amp;lt;code&amp;gt;--xsvacer.features feature_name&amp;lt;/code&amp;gt; при запуске svacer&#039;а. Флаг можно указать несколько раз, чтобы активировать несколько функций.&lt;br /&gt;
&lt;br /&gt;
Также список активных функций можно настроить в конфигурационном yaml-файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; в разделе &amp;lt;code&amp;gt;xsvacer.features&amp;lt;/code&amp;gt;.&lt;br /&gt;
Значением данного ключа является список строк с названиями активируемых функций:&lt;br /&gt;
 ...&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   features:&lt;br /&gt;
     - webide&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При установке флага &amp;lt;code&amp;gt;--xsvacer.features&amp;lt;/code&amp;gt; список функций, указанный в конфигурационном файле &amp;lt;code&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;, будет проигнорирован.&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=1968</id>
		<title>Help:XSvacer:Webide</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:XSvacer:Webide&amp;diff=1968"/>
		<updated>2024-06-07T09:01:50Z</updated>

		<summary type="html">&lt;p&gt;M.vinogradov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Поддержка среды разработки Theia IDE =&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; данная функциональность входит в набор расширений XSvacer.&lt;br /&gt;
&lt;br /&gt;
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.&lt;br /&gt;
&lt;br /&gt;
По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].&lt;br /&gt;
&lt;br /&gt;
== Активация функциональности ==&lt;br /&gt;
Для активации функциональности необходимо указать флаг &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt; при запуске svacer&#039;а.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; при запуске функциональности &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;webide&amp;lt;/code&amp;gt; также будет запущена функциональность &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;[[Help:XSvacer:Docker|docker]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Активации функциональности:&lt;br /&gt;
* становится доступным REST API управления IDE для просмотра снимков проектов;&lt;br /&gt;
* в пользовательском интерфейсе появляется кнопка &amp;quot;Открыть в IDE&amp;quot;;&lt;br /&gt;
* устанавливается подключение к хосту docker&#039;а, на котором будут запускаться контейнеры с экземплярами IDE.&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:&lt;br /&gt;
# Функциональность активна: при запуске svacer&#039;а указан флаг &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;--xsvacer.features webide&amp;lt;/code&amp;gt;;&lt;br /&gt;
# В конфигурации функциональности &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt; ([[Help:XSvacer:Webide#Конфигурация]]) есть хотя бы одна активная (&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;disabled: false&amp;lt;/code&amp;gt;) конфигурация IDE;&lt;br /&gt;
# У пользователя svacer имеются разрешения &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Просмотр маркеров&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Read markers&amp;quot;&amp;lt;/code&amp;gt;) и &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Экспорт разметки&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Export markup&amp;quot;&amp;lt;/code&amp;gt;) на проект, в котором находится снимок, для которого нужно запустить IDE.&lt;br /&gt;
&lt;br /&gt;
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Открыть в IDE&amp;quot;&amp;lt;/code&amp;gt; (&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;Open in IDE&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Запуск IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;POST /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Последовательность действий, выполняемых при запуске IDE:&lt;br /&gt;
&lt;br /&gt;
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:&lt;br /&gt;
#* Если запущена: производится проверка доступна ли IDE: отвечает на запросы;&lt;br /&gt;
#** Если IDE доступна: действие не требуется. Процесс запуска завершается;&lt;br /&gt;
#** Если IDE не доступна: продолжается процесс запуска. IDE будет &#039;&#039;перезапущена&#039;&#039;;&lt;br /&gt;
# Создаётся &amp;quot;корневая папка снимка&amp;quot;, предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Исходный код снимка скачивается в &amp;quot;корневую папку снимка&amp;quot;;&lt;br /&gt;
# Производится экспорт маркеров и разметки в виде sarif-файла в &amp;quot;корневую папку снимка&amp;quot;. Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/sariffiletemplate&amp;lt;/code&amp;gt;;&lt;br /&gt;
# Производится настройка и запуск docker-контейнера, в соответствии с настройками &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker&amp;lt;/code&amp;gt;:&lt;br /&gt;
## Проверяется наличие на docker-хосте образа IDE, указанного в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/image&amp;lt;/code&amp;gt;:&lt;br /&gt;
##* Если docker-образ отсутствует - он будет загружен на хост;&lt;br /&gt;
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:&lt;br /&gt;
##* Если docker-контейнер не существует, то он будет создан и запущен;&lt;br /&gt;
##* Если docker-контейнер существует и находится:&lt;br /&gt;
##** в статусе &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;running&amp;lt;/code&amp;gt; - процесс запуска IDE продолжается;&lt;br /&gt;
##** в статусе &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;created&amp;lt;/code&amp;gt;,&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;exited&amp;lt;/code&amp;gt; или &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;paused&amp;lt;/code&amp;gt; - контейнер будет запущен;&lt;br /&gt;
##** в других статусах - вернётся соответствующая ошибка и процесс запуска IDE прервётся;&lt;br /&gt;
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере, в соответствии с настройками &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Если за отведённое время ответ от IDE получен - процесс запуска завершается.&lt;br /&gt;
#* Если ответ не получен - вернётся ошибка &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При возникновении ошибки на одном из этапов запуска IDE, артефакты созданные на предыдущих этапах останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Причиной возникновения ошибки &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt; может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим, процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck&amp;lt;/code&amp;gt;.&lt;br /&gt;
 В случае возникновения ошибки &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide not ready&amp;lt;/code&amp;gt; рекомендуется попытаться повторно запустить IDE через короткий промежуток времени.&lt;br /&gt;
 Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера, при подключении к удалённому docker-хосту. В таком случае рекомендуется:&lt;br /&gt;
 1. проверить сетевую доступность docker-хоста;&lt;br /&gt;
 2. проверить настройки биндинга docker-контейнера c IDE - &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings&amp;lt;/code&amp;gt;. Контейнер должен быть подключён к доступному сетевому интерфейсу.&lt;br /&gt;
 3. проверить настройки фаервола на docker-хосте;&lt;br /&gt;
&lt;br /&gt;
=== Использование IDE: проксирование запросов ===&lt;br /&gt;
&lt;br /&gt;
После успешного запуска docker-контейнера IDE станут доступны ресурсы с &amp;quot;префиксом&amp;quot; &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все запросы направленные к ресурсам &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&amp;lt;/code&amp;gt; будут проксироваться в соответствующий контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
Например, если docker-контейнер c IDE &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt; для снимка &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xxx&amp;lt;/code&amp;gt; запущен и &amp;quot;слушает&amp;quot; порт &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;35353&amp;lt;/code&amp;gt; на хосте &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker-host&amp;lt;/code&amp;gt;, то будет происходить проксирование:&lt;br /&gt;
: &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET http://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rArr; &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;GET ws://docker-host:35353/socket.io/?...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; для запуска IDE в окне браузера нужно указать адрес &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Завершающий слеш обязателен!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск IDE ===&lt;br /&gt;
&lt;br /&gt;
В процессе работы svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.&lt;br /&gt;
&lt;br /&gt;
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.&lt;br /&gt;
&lt;br /&gt;
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].&lt;br /&gt;
&lt;br /&gt;
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.&lt;br /&gt;
&lt;br /&gt;
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку, до устранения причин неработоспособности.&lt;br /&gt;
&lt;br /&gt;
=== Остановка IDE ===&lt;br /&gt;
&lt;br /&gt;
Запуск производится путём вызова http-метода &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;DELETE /api/snapshots/{snapshot_id}/ide&amp;lt;/code&amp;gt; с телом запроса &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{&amp;quot;ideId&amp;quot;: &amp;quot;идентификатор IDE&amp;quot;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В ходе обработки запроса останавливается docker-контейнер IDE.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; По умолчанию установлен параметр конфигурации &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true&amp;lt;/code&amp;gt;. Это означает, что при после остановки docker-контейнер будет автоматически удалён.&lt;br /&gt;
 Чтобы изменить это поведение, настройка &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove&amp;lt;/code&amp;gt; должна быть установлена в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;false&amp;lt;/code&amp;gt; &#039;&#039;&#039;на момент запуска docker-контейнера IDE&#039;&#039;&#039;. Это можно сделать, например, установив значение переменной окружения &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &#039;&#039;&#039;!!!Сейчас установка &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;autoremove: false&amp;lt;/code&amp;gt; вызывает ошибку запуска svacer!!! Не используйте данную настройку до исправления&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание!&#039;&#039;&#039; При корректной остановке (например &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;SIGTERM&amp;lt;/code&amp;gt;) svacer автоматически остановит все запущенные docker-контейнеры IDE&lt;br /&gt;
&lt;br /&gt;
=== Подключение к IDE после некорректного завершениея svacer ===&lt;br /&gt;
&lt;br /&gt;
При запуске svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах.&lt;br /&gt;
&lt;br /&gt;
При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке svacer&#039;а, все docker-контейнеры IDE будут остановлены.&lt;br /&gt;
&lt;br /&gt;
== REST API для работы с IDE ==&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
После активации функциональности становятся доступны http-ресурсы для управления IDE снимками:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
|+ style=white-space:nowrap | REST API управления IDE&lt;br /&gt;
|-&lt;br /&gt;
!Ресурс&lt;br /&gt;
!Описание                                                &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Получение списка доступных для запуска IDE.&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;order&amp;quot;: 0&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;name&amp;lt;/code&amp;gt; - название IDE&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;order&amp;lt;/code&amp;gt; - порядковый номер IDE в списке&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запрос описания экземпляра IDE, запущенного для снимка. &lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ide_id&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: {&lt;br /&gt;
    &amp;quot;ide_id&amp;quot;: {&lt;br /&gt;
      &amp;quot;ide_type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
      &amp;quot;config_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;properties&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;start_args&amp;quot;: {&lt;br /&gt;
    &amp;quot;snapshot_id&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
    &amp;quot;user_id&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Запуск IDE для просмотра исходных кодов снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Команда управления экземпляром IDE снимка&lt;br /&gt;
Доступные действия:&lt;br /&gt;
* &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;update_markup&amp;lt;/code&amp;gt; - обновление предупреждений и разметки (sarif-файла)&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;action&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;action&amp;lt;/code&amp;gt; - действие&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Остановка экземпляра IDE снимка&lt;br /&gt;
&#039;&#039;&#039;Параметры:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;snapshot_id&amp;lt;/code&amp;gt; - идентификатор снимка&lt;br /&gt;
&#039;&#039;&#039;Запрос:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;ideId&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;ideId&amp;lt;/code&amp;gt; - идентификатор IDE&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039; пустой&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|Прокси для запросов экземпляра IDE снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Формат идентификатора IDE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{тип ide}__{идентификатор конфигурации}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например для &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;-конфигурации Theia IDE: &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;theia__default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурация ==&lt;br /&gt;
&lt;br /&gt;
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел конфигурации для управления функциональностью - &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Раздел содержит перечисление настроек доступных конфигураций для запуска экземпляров Theia IDE &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia&amp;lt;/code&amp;gt;. При наличии нескольких активных конфигураций запуска Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.&lt;br /&gt;
&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       config1:&lt;br /&gt;
         ...&lt;br /&gt;
       config2:&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому помимо настройки функциональности в разделе &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; необходимо также настроить доступ к docker-хосту в разделе &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker&amp;lt;/code&amp;gt; ([[Help:XSvacer:Docker]]). В противном случае функциональность webide не сможет работать корректно.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Примечание:&#039;&#039;&#039; в случае отсутствия файла &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt; или отсутствии раздела &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;, будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]]&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация запуска Theia IDE ===&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!&lt;br /&gt;
&lt;br /&gt;
Конфигурации запуска Theia IDE добавляются в виде полей в разделе &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;. Название поля является идентификатором конфигурации запуска. Например идентификатор по номеру используемой версии IDE:&lt;br /&gt;
 xsvacer:&lt;br /&gt;
   webide:&lt;br /&gt;
     theia:&lt;br /&gt;
       1-46-0:&lt;br /&gt;
         name: Theia blueprint web IDE (v1.46.0)&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;
|-&lt;br /&gt;
|disabled&lt;br /&gt;
|bool&lt;br /&gt;
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE&lt;br /&gt;
|true (переопределяется в конфигурации &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;)         &lt;br /&gt;
|-&lt;br /&gt;
|order&lt;br /&gt;
|int&lt;br /&gt;
|Порядковый номер в списке выбора конфигурации запуска&lt;br /&gt;
|0                                                        &lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|string&lt;br /&gt;
|Название конфигурации&lt;br /&gt;
|Theia blueprint web IDE (v1.46.0)                        &lt;br /&gt;
|-&lt;br /&gt;
|sourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке содержащей исходные коды снимков на машине со svacer&#039;ом&lt;br /&gt;
|${USER_CACHE_DIR}/svacer-snapshot-sources                &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostsourcesroot&lt;br /&gt;
|string&lt;br /&gt;
|Путь к папке содержащей исходные коды снимков на хосте docker&#039;а. Нужен при использовании удалённого docker-хоста, т.к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|dockerhostpathseparator&lt;br /&gt;
|string&lt;br /&gt;
|Разделитель пути на хосте docker&#039;а. По умолчанию &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;quot;/&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|                                                         &lt;br /&gt;
|-&lt;br /&gt;
|sariffiletemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]&lt;br /&gt;
|&amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры менеджера запуска IDE ====&lt;br /&gt;
&lt;br /&gt;
Конфигурация менеджера запуска IDE. На данный момент доступен только &amp;quot;стандартный&amp;quot; менеджер (&amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;type: default&amp;lt;/code&amp;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;
|-&lt;br /&gt;
|manager&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация менеджера запуска IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|manager/type&lt;br /&gt;
|enum: default&lt;br /&gt;
|Тип менеджера запуска IDE&lt;br /&gt;
|default                              &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры запуска docker-контейнеров с IDE ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для настройки запуска docker-контейнеров с IDE&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;
|-&lt;br /&gt;
|docker/&lt;br /&gt;
|map&lt;br /&gt;
|Настройки создания docker-контейнера с IDE&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/hostid&lt;br /&gt;
|string&lt;br /&gt;
|Идентификатор хоста docker&#039;а, описанного в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/docker/hosts&amp;lt;/code&amp;gt;. Запуск docker-контейнера с IDE будет выполнен на этом хосте&lt;br /&gt;
|default                                            &lt;br /&gt;
|-&lt;br /&gt;
|docker/containernametemplate&lt;br /&gt;
|golang template string&lt;br /&gt;
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]&lt;br /&gt;
|&amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;             &lt;br /&gt;
|-&lt;br /&gt;
|docker/containerconfiglabels&lt;br /&gt;
|[]map&lt;br /&gt;
|Список &amp;quot;меток&amp;quot; docker-контейнера. Дополняет список меток в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 - &amp;quot;com.docker.compose.project&amp;quot;: svacer             &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры docker-образа из которого будет запущен контейнер&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/name&lt;br /&gt;
|string&lt;br /&gt;
|Название образа&lt;br /&gt;
|theia-blueprint                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/tag&lt;br /&gt;
|string&lt;br /&gt;
|Тег образа&lt;br /&gt;
|1.46.0.sarif.clang                                 &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcetype&lt;br /&gt;
|enum: repository/file&lt;br /&gt;
|Тип источника для загрузки образа в docker-хост.&lt;br /&gt;
* &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;repository&amp;lt;/code&amp;gt; - будет вызван &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker pull&amp;lt;/code&amp;gt; образа &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;{image/name}:{image/tag}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;file&amp;lt;/code&amp;gt; - будет вызван &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker load&amp;lt;/code&amp;gt; с url&#039;ом &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcefileurl&amp;lt;/code&amp;gt;&lt;br /&gt;
|file                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/image/sourcefileurl&lt;br /&gt;
|url&lt;br /&gt;
|Url откуда будет загружен docker-образ если &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;image/sourcetype == &amp;quot;file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Url может содержать:&lt;br /&gt;
- путь к локальному файлу: схема &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;file://&amp;lt;/code&amp;gt;&lt;br /&gt;
- http/https-адрес: схема &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;http://&amp;lt;/code&amp;gt; или &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
|https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/&lt;br /&gt;
|map&lt;br /&gt;
|Свойства docker-контейнера&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config&lt;br /&gt;
|map&lt;br /&gt;
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/config/env&lt;br /&gt;
|[]string&lt;br /&gt;
|Список переменных среды, которые будут установлены в контейнере&lt;br /&gt;
|&lt;br /&gt;
 - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;     &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379&lt;br /&gt;
|                                                   &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/autoremove&lt;br /&gt;
|bool&lt;br /&gt;
|&lt;br /&gt;
|true                                               &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/hostconfig/portbindings&lt;br /&gt;
|map&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
 &amp;quot;3000/tcp&amp;quot;:                                        &lt;br /&gt;
   - hostport: 0                                    &lt;br /&gt;
|-&lt;br /&gt;
|docker/container/networkconfig/&lt;br /&gt;
|map&lt;br /&gt;
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104&lt;br /&gt;
|                                                   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Параметры проверки доступности healthcheck ====&lt;br /&gt;
&lt;br /&gt;
Данные параметры используются для проверки доступности IDE после запуска docker-контейнера&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;
|-&lt;br /&gt;
|healthcheck&lt;br /&gt;
|map&lt;br /&gt;
|Параметры проверки доступности IDE&lt;br /&gt;
|                                     &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyretries&lt;br /&gt;
|int&lt;br /&gt;
|Количества попыток проверки до ошибки доступности&lt;br /&gt;
|10                                   &lt;br /&gt;
|-&lt;br /&gt;
|healthcheck/starttoreadyperiod&lt;br /&gt;
|golang duration string&lt;br /&gt;
|Интервал проверки&lt;br /&gt;
|200ms                                &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Структуры передаваемые в поля с golang-шаблонами строк ====&lt;br /&gt;
&lt;br /&gt;
 sarifFileContext {&lt;br /&gt;
     Time    time.Time&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 TheiaDockerContainerStartContext {&lt;br /&gt;
 	IdeID: {&lt;br /&gt;
         IdeType  string&lt;br /&gt;
         ConfigID string&lt;br /&gt;
     },&lt;br /&gt;
 	StartArgs: {&lt;br /&gt;
         SnapshotID string&lt;br /&gt;
         UserID     string&lt;br /&gt;
         User       string&lt;br /&gt;
     },&lt;br /&gt;
 	Context: {&lt;br /&gt;
         ProjectID  *string&lt;br /&gt;
         BranchID   *string&lt;br /&gt;
         SnapshotID *string&lt;br /&gt;
         MarkerID   *string&lt;br /&gt;
 &lt;br /&gt;
         ProjectName  *string&lt;br /&gt;
         BranchName   *string&lt;br /&gt;
         SnapshotName *string&lt;br /&gt;
         MarkerName   *string&lt;br /&gt;
         CreatedBy    null.String&lt;br /&gt;
         CreatedByID  null.String&lt;br /&gt;
         CreateTs     null.Time&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация по умолчанию используемая в svacer ===&lt;br /&gt;
&lt;br /&gt;
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
xsvacer:&lt;br /&gt;
  docker:&lt;br /&gt;
    hosts:&lt;br /&gt;
      default: # конфигурация docker-хоста&lt;br /&gt;
        type: external&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  webide:&lt;br /&gt;
    theia:&lt;br /&gt;
      1-46-0: &amp;amp;1-46-0&lt;br /&gt;
        disabled: true&lt;br /&gt;
        order: 0&lt;br /&gt;
        name: Theia blueprint web IDE (v1.46.0)&lt;br /&gt;
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources&lt;br /&gt;
        sariffiletemplate: &amp;quot;&amp;lt;nowiki&amp;gt;{{.Context.ProjectName}}.{{.Context.BranchName}}&amp;lt;/nowiki&amp;gt;.sarif&amp;quot;&lt;br /&gt;
        manager:&lt;br /&gt;
          type: default&lt;br /&gt;
        docker:&lt;br /&gt;
          hostid: default # идентификатор используемого docker-хоста&lt;br /&gt;
          containernametemplate: &amp;quot;theia-1-46-&amp;lt;nowiki&amp;gt;{{.StartArgs.SnapshotID}}&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
          image:&lt;br /&gt;
            name: theia-blueprint&lt;br /&gt;
            tag: 1.46.0.sarif.clang&lt;br /&gt;
            sourcetype: file&lt;br /&gt;
            sourcefileurl: https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar&lt;br /&gt;
          containerconfiglabels:&lt;br /&gt;
            - &amp;quot;com.docker.compose.project&amp;quot;: svacer&lt;br /&gt;
          container:&lt;br /&gt;
            config:&lt;br /&gt;
              env:&lt;br /&gt;
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=&amp;lt;nowiki&amp;gt;{{hostname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
            hostconfig:&lt;br /&gt;
              autoremove: true&lt;br /&gt;
              portbindings:&lt;br /&gt;
                &amp;quot;3000/tcp&amp;quot;:&lt;br /&gt;
                  - hostport: 0&lt;br /&gt;
            networkconfig:&lt;br /&gt;
        healthcheck:&lt;br /&gt;
          starttoreadyretries: 10&lt;br /&gt;
          starttoreadyperiod: 200ms&lt;br /&gt;
      default:&lt;br /&gt;
        &amp;lt;&amp;lt;: *1-46-0&lt;br /&gt;
        order: 0&lt;br /&gt;
        disabled: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; По умолчанию используется docker-хост с идентификатором &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt;. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;unix:///var/run/docker.sock&amp;lt;/code&amp;gt;. Соответственно пользователь, под которым запускается svacer должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Внимание!&#039;&#039;&#039; При наличии раздела &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide&amp;lt;/code&amp;gt; в конфигурационном файле &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.cfg&amp;lt;/code&amp;gt;, будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.&lt;br /&gt;
&lt;br /&gt;
=== Изменение конфигурационных параметров с помощью переменных окружения ===&lt;br /&gt;
&lt;br /&gt;
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, для активации rootless-хоста &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/hosts/local&amp;lt;/code&amp;gt; и переключения запуска IDE с идентификатором &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;default&amp;lt;/code&amp;gt; на этот хост, можно указать такие значения переменных окружения при запуске svacer&#039;а:&lt;br /&gt;
 XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false&lt;br /&gt;
 XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local&lt;br /&gt;
&lt;br /&gt;
== Очистка системы: удаление артефактов функциональности ==&lt;br /&gt;
&lt;br /&gt;
В процессе использования функциональности IDE создаются следующие артефакты:&lt;br /&gt;
# Исходные файлы снимков скачиваются в &amp;quot;корневые папки&amp;quot; заданные в параметре &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/sourcesroot&amp;lt;/code&amp;gt;&lt;br /&gt;
# Артефакты docker:&lt;br /&gt;
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов, указанных в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/hostid&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-образов будут соответствовать параметрам в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/image&amp;lt;/code&amp;gt;&lt;br /&gt;
#* названия docker-контейнеров будут соответствовать параметру &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate&amp;lt;/code&amp;gt;&lt;br /&gt;
#* наборы меток doker-контейнеров будут содержать:&lt;br /&gt;
#*: метки перечисленные в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки перечисленные в &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels&amp;lt;/code&amp;gt;&lt;br /&gt;
#*: метки с названиями &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.id&amp;lt;/code&amp;gt;, &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.service.type&amp;lt;/code&amp;gt;, &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;svacer.theia.start_args&amp;lt;/code&amp;gt;&lt;br /&gt;
# При использовании rootless-хоста docker&#039;а будут созданы папки, согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста]]&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
=== Предварительная загрузка docker-образа с IDE ===&lt;br /&gt;
&lt;br /&gt;
По умолчанию параметр &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl&amp;lt;/code&amp;gt; содержит значение &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;. По этому адресу находится архив с docker-образом для Theia IDE.&lt;br /&gt;
&lt;br /&gt;
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т.к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.&lt;br /&gt;
&lt;br /&gt;
Для ускорения первого запуска IDE, докер образ можно загрузить на хост docker&#039;а вручную. Для этого необходимо:&lt;br /&gt;
# Скачать файл архива;&lt;br /&gt;
# Выполнить команду &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;docker image load -i /path/to/tar/theia-blueprint.1.46.0.sarif.clang.tar&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Информация о docker-образе Theia IDE ==&lt;br /&gt;
&lt;br /&gt;
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [[https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0|1.46.0]]&lt;br /&gt;
&lt;br /&gt;
При этом была изменена компоновка расширений theia (результат выполнения &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;git diff&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/browser.Dockerfile b/browser.Dockerfile&lt;br /&gt;
index efe591e..a4ebb6a 100644&lt;br /&gt;
--- a/browser.Dockerfile&lt;br /&gt;
+++ b/browser.Dockerfile&lt;br /&gt;
@@ -42,7 +42,7 @@ RUN chmod g+rw /home &amp;amp;&amp;amp; \&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget apt-transport-https &amp;amp;&amp;amp; \&lt;br /&gt;
     wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc &amp;amp;&amp;amp; \&lt;br /&gt;
     echo &amp;quot;deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= &#039;/^VERSION_CODENAME/{print$2}&#039; /etc/os-release) main&amp;quot; | tee /etc/apt/sources.list.d/adoptium.list &amp;amp;&amp;amp; \&lt;br /&gt;
-    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven &amp;amp;&amp;amp; \&lt;br /&gt;
+    apt-get update &amp;amp;&amp;amp; apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get purge -y wget &amp;amp;&amp;amp; \&lt;br /&gt;
     apt-get clean&lt;br /&gt;
&lt;br /&gt;
diff --git a/package.json b/package.json&lt;br /&gt;
index 9044595..9d0dcc8 100644&lt;br /&gt;
--- a/package.json&lt;br /&gt;
+++ b/package.json&lt;br /&gt;
@@ -54,10 +54,8 @@&lt;br /&gt;
   &amp;quot;theiaPluginsDir&amp;quot;: &amp;quot;plugins&amp;quot;,&lt;br /&gt;
   &amp;quot;theiaPlugins&amp;quot;: {&lt;br /&gt;
     &amp;quot;eclipse-theia.builtin-extension-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;ms-vscode.js-debug-companion&amp;quot;: &amp;quot;https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-pack&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix&amp;quot;,&lt;br /&gt;
-    &amp;quot;vscjava.vscode-java-dependency&amp;quot;: &amp;quot;https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix&amp;quot;&lt;br /&gt;
+    &amp;quot;llvm-vs-code-extensions.vscode-clangd&amp;quot;: &amp;quot;https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix&amp;quot;,&lt;br /&gt;
+    &amp;quot;ms-sarifvscode.sarif-viewer&amp;quot;: &amp;quot;https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.2/file/MS-SarifVSCode.sarif-viewer-3.4.2.vsix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;theiaPluginsExcludeIds&amp;quot;: [&lt;br /&gt;
     &amp;quot;ms-vscode.js-debug-companion&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда построения docker-образа: &lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
docker build -t theia-blueprint:1.46.0.sarif.clang -f browser.Dockerfile .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда экспорта docker-образа:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
docker image save theia-blueprint:1.46.0 &amp;gt; /path/to/tar/theia-blueprint.1.46.0.docker.command.tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
&lt;br /&gt;
Список известных проблем и их решение&lt;br /&gt;
&lt;br /&gt;
=== При открытии sarif-файла в IDE открывается пустая панель &amp;quot;SARIF Results&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Для просмотра sarif-файла содержащего предупреждения анализатора и разметку используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина, со списком предупреждений анализатора.&lt;br /&gt;
&lt;br /&gt;
В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности  применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers|требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;localhost&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поэтому для решения данной проблемы svacer должен открываться по https, либо быть доступен по адресу &amp;lt;code  style=&amp;quot;white-space: pre;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>M.vinogradov</name></author>
	</entry>
</feed>