Help:Installation: Difference between revisions

From Svacer Wiki
No edit summary
m (review webhooks part)
 
(139 intermediate revisions by 7 users not shown)
Line 1: Line 1:
[[Category:Help]]
== Установка и запуск ==
[[:Category:Help]]
Для использования только клиента Svacer достаточно [[Svacer#Релизы|скачать исполняемый файл]] '''svacer''', или установить [[Help:Installation#Svacer|deb/rpm пакет]].
__TOC__


Сервер Svacer можно запустить в [[Help:Installation#docker compose|докере]] или из [[Help:Installation#deb/rpm|deb/rpm пакета]].


== Введение ==
=== docker compose ===
[[Help:Introduction|Здесь]]
Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь [https://svacer.ispras.ru/extra/docker-compose.yml docker-compose.yml] файлом:


<nowiki>curl -LO https://svacer.ispras.ru/extra/docker-compose.yml</nowiki>
docker compose up -d


== Установка ==
После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.
Для работы сервера необходим PostgreSQL. Его можно установить как пакет, либо запустить в докере — docker-compose файл для этого находится в '''./extra/docker-compose-postgres.yml'''.
Svacer сервер состоит из единственного бинарного файла '''svacer'''. Он предоставляет как backend-часть, так и веб-сервер, который передаёт статику. По умолчанию запускается на порту 8080.
После запуска по умолчанию создается учётная запись пользователя '''admin''' c паролем '''admin'''. Изменить пароль можно в веб-интерфейсе.
Сервер имеет широкие возможности настройки параметров запуска. Узнать о них подробнее можно, прочитав '''svacer --help'''.


Для сборки своего докер-образа Svacer можете использовать [[Dockerfile]] в качестве референса.


=== Установка и запуск из deb/rpm пакета ===
Для указания других параметров сервера можете [[Help:Installation#Дополнительные параметры при запуске в docker-контейнере|переопределить команду запуска]] в docker-compose файле.
Процесс установки из .deb и .rpm пакетов несколько различается и будет описан ниже в отдельных главах. Процесс настройки и запуска не различается и будет описан в одной общей главе.


=== deb/rpm ===
==== PostgreSQL ====
{{Note|type=info|text=Disclaimer
* Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.
* Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.}}


==== .deb ====
Для работы сервера Svacer установите PostgreSQL, следуя [https://www.postgresql.org/download/linux документации postgres]. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.
Скачайте .deb пакет релиза и выполните следующую команду


    sudo apt install ./svacer_<version>_amd64.deb
Пример для Ubuntu 22:


При этом, если в репозиториях есть PostgreSQL нужной версии, он будет установлен автоматически. Если нет, то установка завершится с ошибкой о зависимости от PostgreSQL. В этом случае вам надо будет установить PostgreSQL версии не ниже 10-й (см. [https://www.postgresql.org/download/linux/ документацию]), после чего повторить установку Svacer.
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install -y postgresql-17


Пример для Rocky Linux 9.4:


==== .rpm ====
<nowiki>sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm</nowiki>
Установите PostgeSQL версии не ниже 10-й для вашей ОС следуя [https://www.postgresql.org/download/linux/redhat/ документации]. Дополнительно установите пакет postgresql-contrib из тех же репозиториев.
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql17-server postgresql17-contrib
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
sudo systemctl enable postgresql-17
sudo systemctl start postgresql-17


==== Браузер для PDF-отчетов ====
Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя [https://www.google.com/chrome/?platform=linux инструкции с сайта google].


Пример для Centos 7<br>
{{Note|type=info|text=Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia}}


    sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию <code>--pdf-generator=native</code> при запуске сервера Svacer.
    sudo yum install -y postgresql14-server postgresql14-contrib
    sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
    sudo systemctl enable postgresql-14
    sudo systemctl start postgresql-14


Для версий PostgreSQL ниже 13-й требуется явно разрешить подключение к локальному хосту базы с логином/паролем. Для этого проверьте следующие строчки в конце файла '''/var/lib/pgsql/<version>/data/pg_hba.conf'''
При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться <code>chromium-browser</code> или <code>chromium</code>. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.


    # IPv4 local connections:
==== Svacer ====
    host    all    all    127.0.0.1/32    ident<br>
На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.
    # IPv6 local connections:
    host    all    all    ::1/128        ident


В случае если в последнем столбце указано значение '''ident''', поменяйте его на '''md5''' и перезапустите PostgreSQL.
<nowiki>echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list</nowiki>
<nowiki>curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg</nowiki>
sudo apt update
sudo apt install -y svacer


    sudo systemctl restart postgresql-12
На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него


Скачайте .rpm пакет релиза Svacer и выполните следующую команду
<nowiki>curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo</nowiki>
sudo dnf install -y svacer


    sudo yum install ./svacer-<version>.x86_64.rpm
Для создания БД PostgreSQL запустите '''psql''' от учетной записи пользователя '''postgres'''


sudo su -l postgres
psql


==== Настройка и запуск ====
И выполните следующие запросы:
Процесс настройки и запуска одинаковый для Svacer установленного из .deb и .rpm пакетов.
create database svace;
create user svace with encrypted password 'svace';
grant all privileges on database svace to svace;
alter user svace superuser;


В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.


В процессе установки создаются следующие файлы и директории
При использовании других значений нужно поменять параметры подключения к БД в файле '''/etc/default/svacer'''
* /etc/default/svacer — конфигурационный файл
* /var/log/svacer — директория для логов
* /var/lib/svacer — директория для object store


SVACER_ARGS="--pg postgres://<user>:<password>@127.0.0.1:5432/<database>"


После установки Svacer требуется создать пользователя и БД PostgreSQL. Для этого перейдите в пользователя postgres, запустите psql и выполните соответствующие запросы, после чего выйдите из консоли PostgreSQL и из пользователя postgres.
В этой же строке можно указать прочие аргументы для запуска сервера Svacer.


    sudo su -l postgres
На Astra Linux необходимо в файле '''/etc/parsec/mswitch.conf''' установить параметр <code>zero_if_notfound: yes</code>, иначе при запуске Svacer будет ошибка подключения к БД вида
    psql
    postgres=# create database svace;
    postgres=# create user svace with encrypted password 'svace';
    postgres=# grant all privileges on database svace to svace;
    postgres=# alter user svace superuser;


В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace, а также этому пользователю выдаются права суперюзера (это необходимо для создания расширений в PostgreSQL). При использовании этих значений дальнейшая конфигурация не требуется и можно переходить к запуску.
error obtaining MAC configuration for user "svace" (SQLSTATE 57P03)


При использовании других имен пользователя, БД или пароля потребуется дополнительная конфигурация перед запуском Svacer: в файле '''/etc/default/svacer''' нужно поменять параметры подключения к БД в строке
После создания БД и конфигурации сервера Svacer запустить его можно следующими командами


    SVACER_ARGS="--pg postgres://<user>:<password>@127.0.0.1:5432/<database>"
sudo systemctl enable svacer
sudo systemctl start svacer


В этой же строке можно указывать прочие аргументы для запуска сервера Svacer.
После чего проверить успешность запуска командой
 
systemctl status svacer
 
После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.
 
=== Установка и запуск на Windows ===
PostgreSQL нужен только для сервера Svacer, для клиента не требуется.
* Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows
* Установите PostgreSQL, выбрав, как минимум, компоненты "PostgreSQL Server" и "Command Line Tools"
* Задайте и запомните пароль на шаге выбора пароля для суперпользователя
* Остальные параметры при установке можно оставить по умолчанию
* После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя "postgres" и авторизуйтесь с паролем, заданным во время установки
  cd c:\Program Files\PostgreSQL\15\bin
  psql -U postgres
* Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer
  create database svace;
  create user svace with encrypted password 'svace';
  grant all privileges on database svace to svace;
  alter user svace superuser;
* Выйдите из консоли PostgreSQL
* Запустите '''svacer-server.exe''' из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно
  svacer-server.exe run
* Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно
  svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database
* После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin
 
== Обновление ==
{{Note|type=reminder|text='''Перед обновлением настоятельно рекомендуется [[Help:Backup|делать резервные копии]]'''}}
 
Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера.
 
Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.
 
{{Note|type=warn|text=После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.}}
 
=== Upgrade notes ===
==== 12-x-x ====
Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.
 
==== 11-x-x ====
Нет специфических рекомендаций по обновлению.
 
==== 10-x-x ====
Нет специфических рекомендаций по обновлению.
 
==== 9-0-0 ====
{{Note|type=reminder|text=При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций}}
 
Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.
 
'''1.'''
 
В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.
 
Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:


svacer-server kvconvert --from <path> --to <path>


После создания БД и настройки конфигурации Svacer запустить его можно следующими командами
Расположение object store в файловой системе описано в [[Help:Backup#Бэкап object store вручную|разделе про бэкапы]].


    sudo systemctl enable svacer
'''2.'''
    sudo systemctl start svacer


После чего проверить успешность запуска командой
Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.
 
delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));


    systemctl status svacer
Если вы уже выполняли этот запрос при [[Help:Installation#8-0-0|обновлении на 8-0-0]], то второй раз запускать не обязательно.


В случае успешного запуска сервер будет доступен по адресу http://localhost:8080
'''3.'''


После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду <code>VACUUM FULL</code> в PostgreSQL для очистки и оптимизации базы данных.


При установке из .deb или .rpm пакета Svacer ставится в директорию, прописанную в $PATH, поэтому при запуске Svacer для импорта и загрузки результатов полный путь к исполняемому файлу '''svacer''' указывать не требуется, он будет доступен просто по имени.
psql -h <postgres_host> -U <username> <svacer_database_name> -c 'VACUUM FULL;'


Например:


=== Запуск в docker ===
psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'
Установите docker и docker-compose. Поскольку образы PostgreSQL и Svacer размещены на докер-хабе, для их скачивания при запуске необходимо наличие интернета.


==== 8-0-0 ====
Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка
Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated
Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:
delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));


Используйте для запуска docker-compose файл, находящийся в дистрибутиве Svacer: '''./extra/docker-compose.yml'''. Перейдите в директорию, где находится этот файл и выполните команду
== Расширенная конфигурация ==


    docker-compose up -d
=== Настройки аутентификации в Svacer ===
В Svacer возможны четыре способа аутентификации пользователей


При этом будет запущено два контейнера: PostgreSQL и Svacer. После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080
# Встроенный
# С помощью LDAP сервера
# Через утилиту oauth_proxy (по протоколу OIDC)
# Посредством Personal Access Token (PAT)


Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки [[LDAP]], [[Help:CLI#Personal_Access_Token|PAT]] или [[OIDC]] аутентификации см. соответствующие разделы документации.


В процессе запуска в текущей директории будут созданы две директории
==== Настройка внутреннего механизма аутентификации Svacer ====


* postgres_data — для хранения БД PostgreSQL
===== Настройка парольной политики внутреннего механизма аутентификации Svacer =====
* svacer_data — для object store сервера Svacer
Настройки параметров встроенного механизма аутентификации возможны посредством секции '''auth.svacer''' конфигурационного файла Svacer. Ниже приведен пример настроек:
<pre class="">auth:
  svacer:
    password:
      min_length: 10
      complexity:
        - &quot;[a-z]&quot;
        - &quot;[A-Z]&quot;
        - &quot;[0-9]&quot;
        - &quot;[!#]&quot;</pre>
Параметр '''min_length''' задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.


Параметр '''complexity''' содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.


Эти директории будут примонтированы в соответствующие контейнеры как volumes, это необходимо для сохранения данных БД и сервера после остановки или перезапуска контейнеров.
Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).


===== Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer) =====
В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр '''auth.svacer.default'''. Если данный параметр установлен в значение '''true''', то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.


Важное уточнение: в докере запускается только сервер Svacer. Для импорта и загрузки результатов на сервер будет нужен исполняемый файл svacer.
Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра '''auth.svacer.enabled'''.


Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)<pre class="plaintext">auth:
  svacer:
    enabled: true
    default: false</pre>


Остановить сервер Svacer можно, выполнив следующую команду
==== Настройка защиты от перебора паролей пользователей ====
Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:


     docker-compose down
<pre class="plaintext">security:
  login:
     max_attempts: 5
    lock_time: 2m</pre>


Также можно запустить в докер-контейнере только PostgreSQL для последующего запуска Svacer вручную. Используйте файл '''./extra/docker-compose-postgres.yml'''
Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.


    docker-compose -f docker-compose-postgres.yml up -d
В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.


Чтобы остановить, соответственно
Блокировка не влияет на работу уже зарегистрированных пользователей.


    docker-compose -f docker-compose-postgres.yml down
Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):


<pre class="">svacer user-provider unlock --user admin --password admin --login locked_user</pre>


=== Установка и запуск вручную ===
=== Настройка TLS ===
Для установки Svacer скачайте и распакуйте архив дистрибутива (файл с названием вида '''svacer_release-<version>.zip''').
Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.


==== Reverse proxy ====
Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.


При использовании PostgreSQL, предварительно настроенного на каком-либо хосте, необходимо использовать соответствующие параметры запуска. Допустим, PostgreSQL работает на локальном хосте, в нем создана БД '''svacer_db''', доступная от пользователя '''svacer_user''' с паролем '''svacer123'''. В этом случае запустите Svacer со следующими параметрами
===== Nginx =====
Создайте конфигурационный файл с подобным содержанием в '''/etc/nginx/sites-enabled/'''  
<pre>
server {
    listen 443 ssl;
    listen [::]:443 ssl;


     ./bin/svacer server --pg postgres://svacer_user:svacer123@127.0.0.1:5432/svacer_db
     server_name svacer.ispras.ru;


Если вы запустили PostgreSQL в докер-контейнере, используя файл '''./extra/docker-compose-postgres.yml''', то при запуске Svacer параметр '''--pg''' для подключения к БД можно не указывать, поскольку был создан пользователь и база, прописанные в Svacer как параметры по умолчанию.
    # for large data transfers and continuous connections
    client_max_body_size        0;
    proxy_connect_timeout      600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;


    # path to ssl-certificate and key
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;


После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080
    location / {
По умолчанию web сервер запускается на интерфейсе '''0.0.0.0:<port>'''. Для указания отличного  сетевого интерфейса пользователь может использовать опцию '''--listen <network interface>'''.
        include proxy_params;
По умолчанию grpc сервер запускается на интерфейсе '''0.0.0.0:<port>'''. Для указания отличного сетевого интерфейса пользователь может использовать опцию '''--listen-grpc <network interface>'''.


        # to make WebSockets work
        proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";


=== Hooks ===
        # svacer HTTP URL
Для получения данных Hooks при запуске сервера нужно указать опцию '''--hooks <path to JSON file>'''. Эта опция задаёт файл, содержащий информацию о расширении сервера посредством хуков, которые пользователь может вызывать из web-интерфейса.
         proxy_pass http://127.0.0.1:8080;
Каждый хук соответствует некоторому процессу или скрипту, который сервер запускает в ответ на вызов соответствующей команды из web-интерфейса.
Формат файла Hooks следующий:
    {
      "hooks": [
         {
          "id": "<id>",
          "label": "<label >",
          "target": "<target>",
          "input": ["<param1>", "<param2>",…],
          "cmd": "<path to executable>",
          "args": ["<arg1>", “<arg2>”, …]
        },
        ...
      ]
     }
     }
}
# proxy gRPC port if required
server {
    listen 13002 http2;
    underscores_in_headers on;
    location / {
        grpc_pass grpc://127.0.0.1:3002;
    }
}
</pre>
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.
  systemctl restart nginx
Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. [https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ эту инструкцию].
===== Apache =====
Включите нужные модули в Apache
  sudo a2enmod ssl proxy proxy_http rewrite
Создайте конфигурационный файл с подобным содержанием в '''/etc/apache2/sites-enabled/'''
<pre>
<VirtualHost *:443>
    SSLEngine On
    ProxyPreserveHost On
    ProxyTimeout 600
   
    # path to ssl-certificate and key
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key
   
    # svacer HTTP URL
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    # to make WebSockets work
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]
    ServerName svacer.ispras.ru
    ServerAdmin svacer@ispras.ru
</VirtualHost>
</pre>
В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.
  systemctl restart apache2
==== Нативно ====
Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC.
По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.
TLS for REST and gRPC DISABLED
Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.
svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key
При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC.
Работа сервера по проктолу TLS сопровождается следующей записью в логе:
Using TLS for REST and gRPC protocols
Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре '''--host''', либо добавить опцию '''--ssl'''.
<pre>
svacer upload --host https://example.com
svacer upload --ssl --host example.com
</pre>
Также в клиенте можно определить параметр '''--ssl-ca-certs'''. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:
Using weak TLS configuration, because no CA certificate found
Если сертификаты были загружены, в логе будет строчка:
added 1 ca certs from /home/user/svacer/svacer.crt
Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: '''server:config'''. В данной области есть 3 команды: '''show''', '''reload''', '''update'''. ID в этом случае нужно всегда указывать в значение '''ssl.cert'''.
* '''show''' — отображает текущий используемый сертификат
:<pre>svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show</pre>
* '''reload''' — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом
:<pre>svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload</pre>
* '''update''' — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете '''cat''' для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.
:<pre>svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem</pre>
:Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.
В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры <code>minVersion</code> и <code>maxVersion</code> в разделе security.tls.
<pre>
security:
  tls:
    minVersion: tls11
    maxVersion: tls12
</pre>
=== Интеграция с хранилищем секретов Infisical ===
В Svacer реализована поддержка получения секретов из хранилища секретов [https://infisical.com/ Infisical]. Подробную информацию об интеграции см. в статье [[Infisical|Интеграция с хранилищем секретов Infisical]].
=== Механизм интеграции с внешними системами посредством Webhook-ов ===
==== Общий принцип работы ====
Механизм webhook-ов настраивается в конфигурационном файле в секции '''webhook'''. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. [[Help:Installation#Модель_поддерживаемых_событий|Модель поддерживаемых событий]]) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре '''workers_count'''). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.
Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр '''ca_certs''' конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр '''timeout''') и количество попыток отправки (по умолчанию — одна попытка, параметр '''retry_count''').
В настройках можно указать фильтр на отправляемые события (параметр '''filter'''). Фильтр указывается посредством задания выражения. В выражениях используется [https://github.com/expr-lang/expr синтаксис go-expr]. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.
Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр '''journal_length'''). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.
Для настройки аутентификации работника можно использовать параметр '''headers''', который представляет собой список значений вида '''key:value'''. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.
==== Конфигурация ====
Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.
webhook:
  enabled: true
  journal_length: 86400
  targets:
  - url: "<nowiki>https://test-host.local:8080/webhook</nowiki>"
    workers_count: 1
    enabled: true   
    filter: "Type == EventReviewMarker and Payload.Status != 'Undecided'"
    ca_certs: "/etc/ssl/certs/ca.crt"
    retry_count: 3
    timeout: 1000
    headers:
        - "password:12345"
        - "Authorization: Bearer eyJh .... "
==== CLI ====
Для взаимодействия с механизмом webhook реализованы две cli команды:
svacer server webhook journal
svacer server webhook stat
Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля '''sendError''' и '''skip''').
Пример вывода для первой команды (с флагом '''--humanize'''; если флага нет, то вывод будет в формате json):
==================== #1 ======================
Time: 2025-07-01 12:25:52.25343534 +0300 MSK
Created by: admin
Error:
Success: true
SvacerKind: UpdateMarkerReview
EventType: EventReviewMarker
TargetURL: <nowiki>https://swarm-mgr.home:8080/webhook</nowiki>
ProcessTime: 6 ms
==================== #2 ======================
Time: 2025-07-01 12:25:54.202850322 +0300 MSK
Created by: admin
Error:
Success: true
SvacerKind: UpdateMarkerReview
EventType: EventReviewMarker
TargetURL: <nowiki>https://swarm-mgr.home:8080/webhook</nowiki>
ProcessTime: 3 ms
Пример вывода команды статистики:
{
"enabled": true,
"targets": [
  {
  "enabled": true,
  "url": "<nowiki>https://swarm-mgr.home:8080/webhook</nowiki>",
  "filtered": 0,
  "sendSuccess": 3,
  "sentError": 0,
  "submitted": 3,
  "skip": 0
  }
]
}
==== Модель поддерживаемых событий ====
syntax = "proto3";
import "google/protobuf/any.proto";
option go_package="svacer/proto/webhook";
package webhook;
enum EventType {
    EventNone = 0;
    EventTest = 1;
    EventReviewMarker = 2;
    EventPurgeReview = 3;
    EventGroupReview = 4;
    EventImportSnapshot = 5;
    EventCopySnapshot = 6;
    EventNewComment = 7;
    EventUpdateComment = 8;
    EventNewContainer = 9;
    EventDeleteContainer = 10;
    EventUpdateContainer  =11;
    EventImportMarkup = 12;
    EventDeleteSnapshot = 13;
    UpdateSnapshot = 14;
  }
message MarkerDetails {
    string id = 1;
    string file = 2;
    string line = 3;
    string lang = 4;
}
message Event {
    uint64 timestamp = 1;
    EventType type = 2;
    string created_by = 3;
    google.protobuf.Any payload = 4;
}
message PayloadMarkerReview {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
    repeated MarkerDetails markers = 7;
    string comment = 8;
    string severity = 9;
    string action = 10;
    string status = 11;
    bool group_review = 12;
    string created_by_id = 13;
    string created_by_login = 14;
}
message PayloadPurgeReview {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string created_by_id = 5;
    string created_by_login = 6;
}
message PayloadImportSnapshot {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
}
message PayloadMarkerComment {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
    MarkerDetails marker = 7;
    string comment = 8;
    string created_by_id = 9;
    string created_by_login = 10;
}
message PayloadCopySnapshot {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
    string created_by_id = 7;
    string created_by_login = 8;
}
message Container {   
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    Container source = 5;
}
message PayloadNewContainer {
    repeated Container containers = 1;
}
message PayloadDeleteContainer {
    repeated Container projects = 1;
    repeated Container branches = 2;   
}
message PayloadUpdateContainer {
    Container container = 1;
}
message CopyResult {
    uint64 total = 1;
uint64 applied_reviews = 2;
uint64 applied_comments = 3;
uint64 skipped_reviews = 4;
uint64 duplicate_reviews = 5;
uint64 duplicate_comments = 6;
}
message PayloadImportMarkup {
    Container source=1;
    Container target=2;
    CopyResult copy_result =3;
}
message Snapshot {   
    string snapshot_id = 1;
    string snapshot_name = 2;
    Container container = 3;
}
message PayloadDeleteSnapshots {
      repeated Snapshot snapshots = 1;
}
message PayloadUpdateSnapshot {
    string snapshot_id = 1;
    string snapshot_name = 2;
    Container container  = 3;
}
=== Выбор сетевых интерфейсов и портов сервера ===
* По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 ('''0.0.0.0:8080'''). Для указания конкретного сетевого интерфейса можно использовать опцию '''--listen <network interface>''', для указания другого порта: '''--port <port_number>.
* Аналогично для grpc-сервера: по умолчанию — '''0.0.0.0:3002''', для выбора конкретного интерфейса: '''--listen-grpc <network_interface>''', для указания другого порта: '''--grpc <port_number>'''.
svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004
При попытке запуска на порту < 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой
ERROR: port 443 is privileged, please check current user permissions or set another rest api port
В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server
=== Увеличение лимита открытых файлов ===
Актуально только для Linux.
Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов.
В POSIX таких лимита два:
* soft nofiles — текущее максимальное значение
* hard nofiles — общесистемное максимальное значение
В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:
  $ ulimit -Sn
  1024
  $ ulimit -Hn
  1048576
Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.
  Open files limit (soft and hard): 1048576
Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:
* Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии
  ulimit -Sn 16384
* Либо один раз увеличить на уровне системы — в файл '''/etc/security/limits.conf''' добавить
  * soft nofile 16384
* Если запускаете Svacer как сервис systemd, добавьте параметр '''LimitNOFILE''' в секцию '''[Service]''' файла описания сервиса.
:В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен
  [Service]
  LimitNOFILE=16384
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer
  sudo systemctl daemon-reload
  sudo systemctl restart svacer.service
=== Установка пути к директории для кэша ===
Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd
  [Service]
  Environment="SVACER_CACHE_DIR=/path/to/some/dir"
После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer
  sudo systemctl daemon-reload
  sudo systemctl restart svacer.service
=== Дополнительные параметры при запуске в docker-контейнере ===
При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг [[Help:CLI#Хуки|хуков]].
Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:
command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json
Конфигурационный файл с описанием хуков примонтируйте как volume:
volumes:
  - ./hooks.json:/svacer/hooks.json
Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью <code>$$</code> и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных
environment:
  - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace
  - STORE=/data/store
  - HOOKS_FILE=/svacer/hooks.json
volumes:
  - ./hooks.json:/svacer/hooks.json
command: sh -c "/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE"
Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш [[Dockerfile]] как референс.
== Обновление детекторов ==
После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:
  svacer checkers --upload </path/to/svace>
{{Note}} Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.
== Генерация PDF на основе HTML ==
В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения
SVACER_PDF_GEN_LIMITS=<pdf tool limit>:<chrome limit>
Первое значение <code><pdf tool limit></code> определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение <code><chrome limit></code> определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.
== Полнотекстовый поиск ==
Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в <code>$HOME/.cache/svacer</code>, для указания иной директории можно использовать переменную окружения <code>SVACER_SEARCH_INDEX_DIR</code>


В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду


'''Параметры Hooks'''
svacer search --host <nowiki>http://some_host:port</nowiki> --user <login> --password <pwd> --drop-cache
{| class="wikitable"
! style="width:100px;" | Параметр || Описание
|-
| ''id''
| Идентификатор хука.<br>Должен быть уникальным в файле
|-
| ''label''
| Имя команды, которую пользователь видит в web-интерфейсе
|-
| ''target''
| Место в UI, в которое будет добавлена команда.<br>
Сейчас поддерживается только одно значение — default. Оно соответствует вкладке Details на правой панели пользовательского интерфейса
|-
| ''input''
| Параметры, которые можно передать в запускаемый процесс, исходя из контекста вызова команды в web-интерфейсе.<br>
Поддерживаемые значения:
* markerID — UUID идентификатор маркера;
* branchID — UUID идентификатор ветки;
* snapshotID — UUID идентификатор снимка;
* projectID — UUID идентификатор проекта;
* url — URL маркера в web-интерфейсе, на котором была вызвана команда;
* marker — будет заменен на полное имя временного файла, содержащего сериализованное в JSON представление маркера, который включает в себя его трассу и информацию о разметке
|-
| ''cmd''
| Полный путь к процессу, который будет запущен. Не должен включать аргументы запуска
|-
| ''args''
| Аргументы, передаваемые в запускаемый процесс. Полный список аргументов запускаемого процесса состоит из списка <args> и списка значений, соответствующих полю <input>
|}


Используемая при этом учетная запись должна быть с правами на <code>Server administration</code>


[[#Top|В начало]]
== Указание public-url ==
В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в [[Notifications|уведомлениях]]. Используйте параметр <code>--public-url</code> при запуске сервера
<nowiki>svacer-server run --public-url http://svacer.intra.net:8080</nowiki>

Latest revision as of 16:43, 21 November 2025

Установка и запуск

Для использования только клиента Svacer достаточно скачать исполняемый файл svacer, или установить deb/rpm пакет.

Сервер Svacer можно запустить в докере или из deb/rpm пакета.

docker compose

Рекомендуемый и самый простой способ деплоя — развернуть сервер Svacer в докер-контейнерах, воспользовавшиcь docker-compose.yml файлом:

curl -LO https://svacer.ispras.ru/extra/docker-compose.yml
docker compose up -d

После запуска контейнеров веб-интерфейс Svacer будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.

Для сборки своего докер-образа Svacer можете использовать Dockerfile в качестве референса.

Для указания других параметров сервера можете переопределить команду запуска в docker-compose файле.

deb/rpm

PostgreSQL

Disclaimer
  • Рекомендуемая версия PostgreSQL — 15 и выше. С более старыми версиями корректная работа Svacer не гарантируется.
  • Svacer требует эксклюзивного доступа к базе. Использование одной и той же базы для нескольких экземпляров Svacer может приводить к порче данных.

Для работы сервера Svacer установите PostgreSQL, следуя документации postgres. Для RedHat-based OS нужно дополнительно установить пакет postgresql-contrib соответствующей версии.

Пример для Ubuntu 22:

sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install -y postgresql-17

Пример для Rocky Linux 9.4:

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql17-server postgresql17-contrib
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
sudo systemctl enable postgresql-17
sudo systemctl start postgresql-17

Браузер для PDF-отчетов

Для создания PDF-отчетов с использованием нового HTML-генератора установите браузер Google Chrome на машину, где запускается сервер Svacer. Рекомендуется устанавливать из официального репозитория, следуя инструкции с сайта google.

Рекомендуемые системные требования при генерации PDF-отчетов для больших проектов с использованием HTML-генератора: Intel Core i9, 64 GB RAM, SSD, видеокарта Nvidia

При запуске Svacer проверит доступность браузера для генерации PDF. Если он не установлен или генерация не работает, будет использован нативный генератор: менее продвинутый, но для него не нужен браузер. Можно явно включить использование нативного генератора, передав опцию --pdf-generator=native при запуске сервера Svacer.

При невозможности установить Google Chrome, например если нет пакета для вашего дистрибутива Linux, можно установить Chromium. Его пакет в репозиториях, в зависимости от вышей ОС, может называться chromium-browser или chromium. В некоторых случаях генерация с Chromium может не работать. Например, если Svacer установлен из deb-пакета, а Сhromium из snap (на Ubuntu он устанавливается именно так даже при использовании apt) и сервер Svacer запускается от отдельного системного пользователя, от которого Chromium не может запуститься. В этом случае установите Google Chrome, с ним генерация работает.

Svacer

На Debian-based OS добавьте apt-репозиторий и установите Svacer из него.

echo 'deb [signed-by=/usr/share/keyrings/ispras.gpg] https://repo.ispras.ru/apt /' | sudo tee /etc/apt/sources.list.d/ispras.list
curl -fsSL https://repo.ispras.ru/apt/key.asc | sudo gpg --dearmor -o /usr/share/keyrings/ispras.gpg
sudo apt update
sudo apt install -y svacer

На RedHat-based OS добавьте dnf-репозиторий и установите Svacer из него

curl -fsSL https://repo.ispras.ru/rpm/ispras.repo | sudo tee /etc/yum.repos.d/ispras.repo
sudo dnf install -y svacer

Для создания БД PostgreSQL запустите psql от учетной записи пользователя postgres

sudo su -l postgres
psql

И выполните следующие запросы:

create database svace;
create user svace with encrypted password 'svace';
grant all privileges on database svace to svace;
alter user svace superuser;

В данном примере создается БД svace и права на нее выдаются пользователю svace с паролем svace. Также этому пользователю выдаются права суперюзера, что необходимо для создания расширений в PostgreSQL. При использовании этих значений по умолчанию дальнейшая конфигурация не требуется и можно переходить к запуску.

При использовании других значений нужно поменять параметры подключения к БД в файле /etc/default/svacer

SVACER_ARGS="--pg postgres://<user>:<password>@127.0.0.1:5432/<database>"

В этой же строке можно указать прочие аргументы для запуска сервера Svacer.

На Astra Linux необходимо в файле /etc/parsec/mswitch.conf установить параметр zero_if_notfound: yes, иначе при запуске Svacer будет ошибка подключения к БД вида

error obtaining MAC configuration for user "svace" (SQLSTATE 57P03)

После создания БД и конфигурации сервера Svacer запустить его можно следующими командами

sudo systemctl enable svacer
sudo systemctl start svacer

После чего проверить успешность запуска командой

systemctl status svacer

После запуска сервер будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin.

Установка и запуск на Windows

PostgreSQL нужен только для сервера Svacer, для клиента не требуется.

  • Скачайте установщик PostgreSQL для Windows: https://www.postgresql.org/download/windows
  • Установите PostgreSQL, выбрав, как минимум, компоненты "PostgreSQL Server" и "Command Line Tools"
  • Задайте и запомните пароль на шаге выбора пароля для суперпользователя
  • Остальные параметры при установке можно оставить по умолчанию
  • После установки PostgreSQL откройте консоль, перейдите в директорию, куда установили PostgreSQL, запустите его клиент с указанием пользователя "postgres" и авторизуйтесь с паролем, заданным во время установки
 cd c:\Program Files\PostgreSQL\15\bin
 psql -U postgres
  • Запустится консоль управления PostgreSQL. Выполните в ней следующие команды, чтобы создать БД и пользователя для Svacer
 create database svace;
 create user svace with encrypted password 'svace';
 grant all privileges on database svace to svace;
 alter user svace superuser;
  • Выйдите из консоли PostgreSQL
  • Запустите svacer-server.exe из консоли с указанием параметров подключения к БД. Если при создании пользователя и БД PostgreSQL вы использовали для них имя по умолчанию 'svace', как в примере выше, то указывать данные для подключения к БД при запуске сервера не обязательно
 svacer-server.exe run
  • Если создавали пользователя или БД с другими именами, то при запуске сервера надо указать их явно
 svacer-server.exe run --pg postgres://svacer_user:svacer_password@127.0.0.1:5432/svacer_database
  • После запуска сервера его веб-интерфейс будет доступен по адресу http://localhost:8080, логин / пароль — admin / admin

Обновление

Перед обновлением настоятельно рекомендуется делать резервные копии

Миграции схем БД PostgreSQL и object store происходят автоматически при обновлении на новую версию Svacer. Поэтому для обновления Svacer достаточно остановить сервер старой версии, запустить сервер новой версии, указав ему те же параметры БД и object store, и подождать, пока не пройдет обновление, после чего Svacer запустится как обычно. При больших объемах данных в БД это может занять существенное время, до нескольких часов. Прогресс можно отслеживать по логам сервера.

Версии не имеют обратной совместимости, то есть после обновления на следующую версию, откатиться на предыдущую можно будет, только восстановив БД из бэкапа.

После запуска Svacer при обновлении обязательно дождитесь пока миграция БД завершится. Если прервать процесс во время миграции, принудительно остановив Svacer, база данных может оказаться в неконсистентном состоянии и придется восстанавливать данные из бэкапа.

Upgrade notes

12-x-x

Рекомендуем обновить PostgreSQL до версии 15 или выше. С более старыми версиями корректная работа Svacer не гарантируется.

11-x-x

Нет специфических рекомендаций по обновлению.

10-x-x

Нет специфических рекомендаций по обновлению.

9-0-0

При обновлении на эту версию рекомендуем не меньше 8GB RAM для корректности миграций

Базово, никаких обязательных ручных действий с базой данных или object store при обновлении на 9-0-0 не требуется. Описанные ниже шаги могут помочь увеличить производительность сервера Svacer или решить возможные проблемы.

1.

В версии 9-0-0 поменялся формат object store, поэтому при обновлении с предыдущих версий Svacer на 9-0-0 или выше будет запущена конвертация object store в новый формат. Конвертация сначала записывает новые данные, а потом, если все прошло успешно, удаляет старые. Из-за этого для конвертации нужно примерно в два раза больше свободного дискового пространства, чем занимает текущий object store. При больших размерах object store и медленном диске конвертация может занять много времени.

Конвертация запустится автоматически при обновлении на 9-0-0, но можно запустить вручную отдельно:

svacer-server kvconvert --from <path> --to <path>

Расположение object store в файловой системе описано в разделе про бэкапы.

2.

Перед установкой новой версии рекомендуется выполнить следующий запрос в БД для удаления дубликатов описаний чекеров.

delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));

Если вы уже выполняли этот запрос при обновлении на 8-0-0, то второй раз запускать не обязательно.

3.

После обновления на версию 9-0-0 и завершения всех миграций БД (когда станет доступен веб-интерфейс) рекомендуем выполнить команду VACUUM FULL в PostgreSQL для очистки и оптимизации базы данных.

psql -h <postgres_host> -U <username> <svacer_database_name> -c 'VACUUM FULL;'

Например:

psql -h localhost -U svacer svacer_db -c 'VACUUM FULL;'

8-0-0

Если при обновлении на версию 8-0-0 и выше возникает подобная ошибка

Key (config_id, checker_id, languages, tools)=(4cd178ce-a2b2-4692-a45a-f84b145c807b, FB.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT, {JAVA}, {SpotBugs}) is duplicated

Это значит, что в БД есть дубликаты чекеров. Выполните следующий SQL-запрос в PostgreSQL-базе Svacer, чтобы удалить их:

delete from checkers where id not in (select max(id) from checkers group by (config_id, checker_id, languages, tools));

Расширенная конфигурация

Настройки аутентификации в Svacer

В Svacer возможны четыре способа аутентификации пользователей

  1. Встроенный
  2. С помощью LDAP сервера
  3. Через утилиту oauth_proxy (по протоколу OIDC)
  4. Посредством Personal Access Token (PAT)

Ниже рассматривается настройка аутентификации посредством внутреннего механизма аутентификации. Для настройки LDAP, PAT или OIDC аутентификации см. соответствующие разделы документации.

Настройка внутреннего механизма аутентификации Svacer

Настройка парольной политики внутреннего механизма аутентификации Svacer

Настройки параметров встроенного механизма аутентификации возможны посредством секции auth.svacer конфигурационного файла Svacer. Ниже приведен пример настроек:

auth:
  svacer:
    password:
       min_length: 10
       complexity:
        - "[a-z]"
        - "[A-Z]"
        - "[0-9]"
        - "[!#]"

Параметр min_length задает минимальную возможную длину пароля в системе. Данный критерий используется при смене пароля пользователя и не влияет на текущие пароли пользователей.

Параметр complexity содержит набор регулярных выражений, задающих требования к паролю с точки зрения наличия в нем определенных символов. При задании такого списка выражений Svacer будет проверять задаваемый пользователем новый пароль на предмет удовлетворения всем этим требованиям. Каждое выражение в списке — полноценное выражение, поддерживаемое языком golang.

Указанные выше настройки применяются только к внутренним учетным записям пользователей Svacer. По умолчанию данные настройки отключены (нет требований на минимальную длину и сложность пароля).

Задание вкладки по умолчанию на странице входа в GUI Svacer (а также отключение внутренного механизма аутентификации Svacer)

В случае интеграции Svacer с LDAP, можно указать Svacer какую вкладку — Svacer или LDAP — использовать по умолчанию. Для этого используется параметр auth.svacer.default. Если данный параметр установлен в значение true, то вкладкой по умолчанию будет вкладка Svacer, иначе — вкладка LDAP.

Также возможно полностью отключить механизм внутренней аутентификации Svacer с помощью параметра auth.svacer.enabled.

Ниже приведен пример конфигурационного файла Svacer для задания вкладки LDAP по умолчанию (в случае наличие интеграции с LDAP сервером)

auth:
  svacer:
    enabled: true
    default: false

Настройка защиты от перебора паролей пользователей

Для случаев аутентификации с помощью LDAP сервера и с помощью встроенного механизма аутентификации реализован механизм блокировки учетных записей пользователей в том случае, если количество неудачных попыток входа превышает заданное в настройках число. По умолчанию защита отключена. Ниже приведен пример секции конфигурационного файла Svacer, задающего правила блокировки:

security:
  login:
    max_attempts: 5
    lock_time: 2m

Время, на которое происходит блокировка учетной записи пользователя, указывается в формате golang/time: 1s,1m,60m и т. д.

В случае активации защиты данный механизм также защищает аутентификацию посредством вызовов соответствующих точек входа public API.

Блокировка не влияет на работу уже зарегистрированных пользователей.

Для принудительной разблокировки пользователей можно использовать команды cli (требуются права управления сервером):

svacer user-provider unlock --user admin --password admin --login locked_user

Настройка TLS

Svacer может быть сконфигурирован для поддержки TLS несколькими способами. Первый способ — использовать reverse proxy с поддержкой HTTPS и проксированием в Svacer по HTTP, второй — запуск Svacer с нативной поддержкой TLS.

Reverse proxy

Данный способ позволяет обеспечить безопасную передачу данных только по протоколу HTTPS, данные по протоколу gRPC передаются в незащищенном виде.

Nginx

Создайте конфигурационный файл с подобным содержанием в /etc/nginx/sites-enabled/

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name svacer.ispras.ru;

    # for large data transfers and continuous connections
    client_max_body_size        0;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;

    # path to ssl-certificate and key
    ssl_certificate /etc/ssl/certs/svacer.ispras.ru.crt;
    ssl_certificate_key /etc/ssl/private/svacer.ispras.ru.key;

    location / {
        include proxy_params;

        # to make WebSockets work
        proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";

        # svacer HTTP URL
        proxy_pass http://127.0.0.1:8080;
    }
}

# proxy gRPC port if required
server {
    listen 13002 http2;
    underscores_in_headers on;

    location / {
        grpc_pass grpc://127.0.0.1:3002;
    }
}

В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Nginx.

 systemctl restart nginx

Если ваш сервер виден из интернета и его внешний IP-адрес привязан к доменному имени, можете использовать Let's Encrypt и Certbot для получения валидного SSL-сертификата. См. эту инструкцию.

Apache

Включите нужные модули в Apache

 sudo a2enmod ssl proxy proxy_http rewrite

Создайте конфигурационный файл с подобным содержанием в /etc/apache2/sites-enabled/

<VirtualHost *:443>
    SSLEngine On
    ProxyPreserveHost On
    ProxyTimeout 600
    
    # path to ssl-certificate and key
    SSLCertificateFile /etc/ssl/certs/svacer.ispras.ru.crt
    SSLCertificateKeyFile /etc/ssl/private/svacer.ispras.ru.key
    
    # svacer HTTP URL
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    # to make WebSockets work
    ProxyPass /api/ws/ ws://127.0.0.1:8080/api/ws/
    ProxyPassReverse /api/ws/ ws://127.0.0.1:8080/api/ws/
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    RewriteRule /api/ws/(.*) ws://127.0.0.1:8080%{REQUEST_URI} [P]

    ServerName svacer.ispras.ru
    ServerAdmin svacer@ispras.ru
</VirtualHost>

В этом конфигурационном файле укажите нужное имя сервера, пути к сертификату (можно использовать fullchain-сертификат) и ключу, а также адрес сервера Svacer, куда проксировать. После этого перезапустите Apache.

 systemctl restart apache2

Нативно

Этот способ позволяет обеспечить безопасную передачу данных как по протоколу HTTPS, так и по протоколу gRPC. Если сервер запускается с поддержкой TLS, то эта опция относится как к протоколу HTTPS, так и к протоколу gRPC. По умолчанию сервер запускается без поддержки TLS, при этом в логах отображается информация об этом.

TLS for REST and gRPC DISABLED

Для запуска сервера с поддержкой TLS необходимо указать сертификат сервера и соответствующий закрытый ключ.

svacer-server run --ssl-cert svacer.crt --ssl-key svacer.key

При этом ключ должен быть в незашифрованном виде. Права доступа к файлу должны быть 0600. В файле сертификата можно указывать цепочку сертификатов. В этом случае сервер, при подключении клиента, будет возвращать всю цепочку. Первым сертификатом в цепочке всегда должен идти сертификат сервера Svacer. Формат файла — PEM. TLS соединение активируется и для протокола REST и для протокола gRPC.

Работа сервера по проктолу TLS сопровождается следующей записью в логе:

Using TLS for REST and gRPC protocols

Работа с таким сервером через CLI происходит как обычно. Для указания необходимости подключаться по TLS можно явно указать протокол в параметре --host, либо добавить опцию --ssl.

 svacer upload --host https://example.com
 svacer upload --ssl --host example.com

Также в клиенте можно определить параметр --ssl-ca-certs. Он позволяет задать доверенные сертификаты корневых центров. Указывается шаблон файлов (с *) или конкретный файл. Путь к директории должен быть абсолютным. В случае отсутствия этого параметра используется TLS, но сертификат сервера не проверяется. Этому случаю соответствует запись в логе клиента:

Using weak TLS configuration, because no CA certificate found

Если сертификаты были загружены, в логе будет строчка:

added 1 ca certs from /home/user/svacer/svacer.crt

Для администрирования сервера в плане используемого сертификата (например, замена при истечении срока действия) добавлена область в CLI svacer admin: server:config. В данной области есть 3 команды: show, reload, update. ID в этом случае нужно всегда указывать в значение ssl.cert.

  • show — отображает текущий используемый сертификат
svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action show
  • reload — заставляет сервер перечитать использованные при старте сервера файлы с сертификатом и ключом
svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action reload
  • update — позволяет переслать на сервер новый сертификат (и ключ, если надо) и записать их в указанные при старте сервера файлы. При использовании этой команды нужно сформировать файл с новым сертификатом и, при необходимости, ключом, в формате PEM (используете cat для объединения сертификата и ключа в один файл) и указать этот файл в параметре value. Если в файле не будет указан закрытый ключ, то сервером будет использован текущий (тот, что был указан при запуске). Данная команда также изменит файлы сертификата и ключа (если он указан), указанные при старте сервера, на новые значения.
svacer admin --ssl --host example.com --user admin --password admin --scope server:config --id ssl.cert --action update --value svacer.pem
Некоторое время после обновления сертификата сервер может использовать старые сертификаты (для уже установленных соединений). Для новых соединений будет использован обновленный сертификат.

В конфигурационном файле Svacer можно указать минимальную и максимальные версии TLS, поддерживаемые сервером. Для этого необходимо в конфигурационном файле указать параметры minVersion и maxVersion в разделе security.tls.

security:
  tls:
    minVersion: tls11
    maxVersion: tls12

Интеграция с хранилищем секретов Infisical

В Svacer реализована поддержка получения секретов из хранилища секретов Infisical. Подробную информацию об интеграции см. в статье Интеграция с хранилищем секретов Infisical.

Механизм интеграции с внешними системами посредством Webhook-ов

Общий принцип работы

Механизм webhook-ов настраивается в конфигурационном файле в секции webhook. Механизм срабатывает при получении по внутренней шине одного из поддерживаемых событий Svacer. Каждое из внутренних событий преобразуется в событие вызова webhook-а (см. Модель поддерживаемых событий) и отправляется на обработку в каждую из настроенных целей, которыми являются http-обработчики. Отправкой занимаются работники (их количество настраивается в конфигурационном файле в параметре workers_count). У каждой цели есть общая очередь, размер которой составляет 500 событий. Если очередь переполняется, будет выдаваться соответствующее сообщение в лог-файле Svacer.

Работники поддерживают протокол https (в том числе самоподписанные сертификаты). Для указания корневого сертификата можно использовать параметр ca_certs конфигурационного файла. Работникам можно указать таймаут соединения с webhook-сервером (в мс, по умолчанию 1000мс, параметр timeout) и количество попыток отправки (по умолчанию — одна попытка, параметр retry_count).

В настройках можно указать фильтр на отправляемые события (параметр filter). Фильтр указывается посредством задания выражения. В выражениях используется синтаксис go-expr. Фильтр возможно указать в количестве одной штуки на одну цель. Если фильтр после вычисления дает значение true, событие будет отправлено в цель.

Также реализован журнал событий отправки webhook-ов, размер которого может быть указан в конфигурационном файле (параметр journal_length). По умолчанию он равен 86400 записей — по 1 записи на каждую секунду суток. Журнал может быть использован для отладки механизма отправки событий в цель. Содержимое журнала хранится в памяти. При достижении журналом максимального размера, самые старые записи заменяются новыми.

Для настройки аутентификации работника можно использовать параметр headers, который представляет собой список значений вида key:value. Данные пары будут добавлены в заголовки каждого http-запроса, выполняемого работником.

Конфигурация

Возможный пример конфигурационного файла, в котором указана отправка на сервер test-host.local событий, связанных с разметкой маркера.

webhook:
 enabled: true
 journal_length: 86400
 targets:
  - url: "https://test-host.local:8080/webhook"
    workers_count: 1
    enabled: true     
    filter: "Type == EventReviewMarker and Payload.Status != 'Undecided'"
    ca_certs: "/etc/ssl/certs/ca.crt"
    retry_count: 3
    timeout: 1000
    headers:
       - "password:12345"
       - "Authorization: Bearer eyJh .... "

CLI

Для взаимодействия с механизмом webhook реализованы две cli команды:

svacer server webhook journal
svacer server webhook stat

Первая команда позволяет посмотреть записи журнала отправки событий. Вторая команда позволяет вывести статистику по работе службы (особенно интересными могут быть поля sendError и skip).

Пример вывода для первой команды (с флагом --humanize; если флага нет, то вывод будет в формате json):

==================== #1 ======================
Time: 2025-07-01 12:25:52.25343534 +0300 MSK
Created by: admin
Error: 
Success: true
SvacerKind: UpdateMarkerReview
EventType: EventReviewMarker
TargetURL: https://swarm-mgr.home:8080/webhook
ProcessTime: 6 ms
==================== #2 ======================
Time: 2025-07-01 12:25:54.202850322 +0300 MSK
Created by: admin
Error: 
Success: true
SvacerKind: UpdateMarkerReview
EventType: EventReviewMarker
TargetURL: https://swarm-mgr.home:8080/webhook
ProcessTime: 3 ms

Пример вывода команды статистики:

{
"enabled": true,
"targets": [
 {
  "enabled": true,
  "url": "https://swarm-mgr.home:8080/webhook",
  "filtered": 0,
  "sendSuccess": 3,
  "sentError": 0,
  "submitted": 3,
  "skip": 0
 }
]
}

Модель поддерживаемых событий

syntax = "proto3";
import "google/protobuf/any.proto";
option go_package="svacer/proto/webhook";
package webhook;

enum EventType {
    EventNone = 0;
    EventTest = 1;
    EventReviewMarker = 2;
    EventPurgeReview = 3;
    EventGroupReview = 4;
    EventImportSnapshot = 5;
    EventCopySnapshot = 6;
    EventNewComment = 7;
    EventUpdateComment = 8;
    EventNewContainer = 9;
    EventDeleteContainer = 10;
    EventUpdateContainer  =11;
    EventImportMarkup = 12;
    EventDeleteSnapshot = 13;
    UpdateSnapshot = 14;
 }

message MarkerDetails {
    string id = 1;
    string file = 2;
    string line = 3;
    string lang = 4;
}

message Event {
    uint64 timestamp = 1;
    EventType type = 2;
    string created_by = 3;
    google.protobuf.Any payload = 4;
}

message PayloadMarkerReview {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
    repeated MarkerDetails markers = 7;
    string comment = 8;
    string severity = 9;
    string action = 10;
    string status = 11;
    bool group_review = 12;
    string created_by_id = 13;
    string created_by_login = 14;
}

message PayloadPurgeReview {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string created_by_id = 5;
    string created_by_login = 6;
}

message PayloadImportSnapshot {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
}

message PayloadMarkerComment {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
    MarkerDetails marker = 7;
    string comment = 8;
    string created_by_id = 9;
    string created_by_login = 10;
}

message PayloadCopySnapshot {
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    string snapshot_id = 5;
    string snapshot_name = 6;
    string created_by_id = 7;
    string created_by_login = 8;
}

message Container {    
    string project_id = 1;
    string project_name = 2;
    string branch_id = 3;
    string branch_name = 4;
    Container source = 5;
}

message PayloadNewContainer {
    repeated Container containers = 1;
}

message PayloadDeleteContainer {
    repeated Container projects = 1;
    repeated Container branches = 2;    
}

message PayloadUpdateContainer {
    Container container = 1;
}

message CopyResult {
   uint64 total = 1;
	uint64 applied_reviews = 2;
	uint64 applied_comments = 3;
	uint64 skipped_reviews = 4;
	uint64 duplicate_reviews = 5;
	uint64 duplicate_comments = 6;
}

message PayloadImportMarkup {
    Container source=1;
    Container target=2;
    CopyResult copy_result =3;
}

message Snapshot {    
    string snapshot_id = 1;
    string snapshot_name = 2;
    Container container = 3;
}

message PayloadDeleteSnapshots {
     repeated Snapshot snapshots = 1;
}

message PayloadUpdateSnapshot {
    string snapshot_id = 1;
    string snapshot_name = 2;
    Container container  = 3;
}

Выбор сетевых интерфейсов и портов сервера

  • По умолчанию web-сервер запускается на всех сетевых интерфейсах, на порту 8080 (0.0.0.0:8080). Для указания конкретного сетевого интерфейса можно использовать опцию --listen <network interface>, для указания другого порта: --port <port_number>.
  • Аналогично для grpc-сервера: по умолчанию — 0.0.0.0:3002, для выбора конкретного интерфейса: --listen-grpc <network_interface>, для указания другого порта: --grpc <port_number>.
svacer-server run --listen 127.0.0.1 --port 9090 --listen-grpc 127.0.0.1 --grpc 3004

При попытке запуска на порту < 1024 от непривилегированного пользователя (например, от пользователя svacer при установке из deb/rpm пакета), сервер Svacer не запустится с ошибкой

ERROR: port 443 is privileged, please check current user permissions or set another rest api port

В таком случае надо выдать capabilities на открытие привилегированных портов файлу сервера Svacer. Это нужно будет делать при каждом обновлении версии сервера

sudo setcap 'cap_net_bind_service=+ep' /usr/bin/svacer-server

Увеличение лимита открытых файлов

Актуально только для Linux.

Если проекты большие, или их много, в object store создается большое количество файлов. Для нормальной работы сервера Svacer при этом рекомендуется увеличивать системный лимит количества одновременно открытых файлов.

В POSIX таких лимита два:

  • soft nofiles — текущее максимальное значение
  • hard nofiles — общесистемное максимальное значение

В большинстве систем hard значение достаточно большое, а soft обычно маленькое, что и приводит к проблемам. Пример на Debian 11:

 $ ulimit -Sn
 1024
 $ ulimit -Hn
 1048576

Начиная с версии 6-0-0 Svacer пытается автоматически увеличить soft limit до значения hard limit при запуске, а начиная с версии 8-0-0 — проверяет, что увеличить удалось и выводит сообщение с текущим лимитом. Если видите в логах подобную запись — у soft и hard одно, достаточно большое значение — значит все в порядке.

 Open files limit (soft and hard): 1048576

Для более ранних версий, или если на вашем дистрибутиве Linux это не работает автоматически, можете увеличить лимит вручную одним из следующих способов:

  • Перед запуском Svacer выполнить из консоли команду, увеличив лимит для текущей сессии
 ulimit -Sn 16384
  • Либо один раз увеличить на уровне системы — в файл /etc/security/limits.conf добавить
 * soft nofile 16384
  • Если запускаете Svacer как сервис systemd, добавьте параметр LimitNOFILE в секцию [Service] файла описания сервиса.
В файле из deb/rpm пакета релиза Svacer этот параметр уже добавлен
 [Service]
 LimitNOFILE=16384

После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer

 sudo systemctl daemon-reload
 sudo systemctl restart svacer.service

Установка пути к директории для кэша

Если запускаете Svacer под пользователем без домашней директории, рекомендуется установить путь к директории для кэша через переменную окружения SVACER_CACHE_DIR в файле описания сервиса systemd

 [Service]
 Environment="SVACER_CACHE_DIR=/path/to/some/dir"

После чего выполните следующие команды, чтобы прочитать обновленный конфиг и перезапустить с ним Svacer

 sudo systemctl daemon-reload
 sudo systemctl restart svacer.service

Дополнительные параметры при запуске в docker-контейнере

При запуске в докер-контейнере можно указать дополнительные параметры, к примеру добавить конфиг хуков.

Для этого переопределите команду запуска сервера Svacer в docker-compose файле и допишите туда нужные параметры:

command: /svacer/bin/svacer-server run --store /data/store --pg postgres://svace:svace@postgresql:5432/svace --hooks /svacer/hooks.json

Конфигурационный файл с описанием хуков примонтируйте как volume:

volumes:
  - ./hooks.json:/svacer/hooks.json

Можете использовать переменные из секции environment docker-compose файла, тогда в строке запуска их надо экранировать с помощью $$ и запускать сервер Svacer как shell-команду, чтобы в контейнере подставились значения переменных

environment:
  - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace
  - STORE=/data/store
  - HOOKS_FILE=/svacer/hooks.json
volumes:
  - ./hooks.json:/svacer/hooks.json
command: sh -c "/svacer/bin/svacer-server run --store $$STORE --pg $$SVACER_PG_URL --hooks $$HOOKS_FILE"

Для более комплексных сценариев можете собрать свой образ с сервером Svacer, использовав наш Dockerfile как референс.

Обновление детекторов

После установки новой версии Svace требуется обновить описания детекторов в Svacer. Для этого необходимо выполнить команду:

 svacer checkers --upload </path/to/svace>

Note  Обновление описаний детекторов это серьезная операция, которая должна выполняться после предварительного тестирования. Поэтому перед выполнением команды рекомендуется сделать резервную копию базы данных Svacer.

Генерация PDF на основе HTML

В релиз 10.х.х включена генерация PDF на основе рендеринга HTML с последующим запуском headless chrome/chromium для генерации PDF. Этот подход позволяет упростить формирование шаблонов для генерации PDF, но требует существенно больше вычислительных ресурсов. Для тюнинга числа параллельных процессов при генерации используется переменная окружения

SVACER_PDF_GEN_LIMITS=<pdf tool limit>:<chrome limit>

Первое значение <pdf tool limit> определяет число одновременных процессов pdfmerge для сборки отдельных секций в единый PDF документ; второе значение <chrome limit> определяет одновременное число процессов chrome/chromium для генерации PDF из HTML. Не рекомендуется ставить значения, сильно превышающие число ядер в сервере.

Полнотекстовый поиск

Для поддержки полнотекстового поиска Svacer строит индекс. По умолчанию директория для индекса создается в $HOME/.cache/svacer, для указания иной директории можно использовать переменную окружения SVACER_SEARCH_INDEX_DIR

В ряде случаев (падение и рестарт сервера, ошибки и т. п.) кэш может быть в некорректном состоянии. Для переиндексации данных администратор может использовать CLI команду

svacer search --host http://some_host:port --user <login> --password <pwd> --drop-cache

Используемая при этом учетная запись должна быть с правами на Server administration

Указание public-url

В некоторых случаях необходимо явно указывать серверу Svacer его URL-адрес. Например, это нужно для корректной генерации коротких ссылок на предупреждения и ссылок в уведомлениях. Используйте параметр --public-url при запуске сервера

svacer-server run --public-url http://svacer.intra.net:8080