Известные кейсы (Svacer)
1. Запуск и конфигурация сервера
Проблема | Решение |
Сервер не запускается, в логе pebble: not found, Cannot get lines info for ... pebble: not found
|
Проверить --store. Если object store повреждён — восстановить _pebble_ из бэкапа. Можно скопировать _pebble_ в отдельную директорию и указать её в --store.
Попробовать запустить с --classic-inv-mode. Без бэкапа исходники в object store, скорее всего, утеряны, но разметка в PostgreSQL остаётся.
|
on-disk corruption: ... crc32c checksum mismatch
|
Восстановить object store из бэкапа. Настроить регулярный rsync object store.
|
no space left on device, сервер падает, не запускается
|
Освободить место. Остановить сервер. Восстановиться из бэкапа до инцидента. Настроить мониторинг. Временно: --classic-inv-mode, SVACER_NO_INVARIANT_MIGRATION=true.
|
Ссылки в ответах API и в UI без домена
|
Запускать сервер с --public-url https://<домен>. |
restart: always в docker-compose даёт циклические рестарты
|
Убрать restart: always или заменить на on-failure.
|
После перезагрузки пропали проекты
| Проверить, что volume’ы не чистились. Проверить параметры запуска (путь к object store, строка БД). Собрать лог сервера. |
2. Object store и PostgreSQL
Проблема | Решение |
Что хранится в object store, а что в БД
|
Object store — исходный код и данные для навигации. PostgreSQL — разметка, комментарии, предупреждения. При потере object store код не отображается, но разметка может сохраниться.
|
Раздулась comment_history, БД растёт, импорт и клонирование идут медленно
|
Проверить размер: select count(*) from comment_history;. Очистить: truncate comment_history; (удалится только история редактирования, сами комментарии и разметка останутся). Обновить Svacer. |
Битые ссылки в marker_occurrences
|
Проверить: select mo.snapshot_id, invariant, ss.name, ss.import_time, br.name, pr.name, gr.status, cmnt.comment from marker_occurrences mo left join snapshots ss on ss.id = mo.snapshot_id left join containers br on br.id = ss.container left join containers pr on br.parent = pr.id left join group_review gr on gr.group_ref = mo.invariant and gr.container = br.id and gr.is_active = true left join comments cmnt on cmnt.ref = mo.id left join markers mrk on mo.marker_id = mrk.id where mrk.id is null;. Удалить битые: DELETE FROM marker_occurrences WHERE NOT EXISTS (SELECT 1 FROM markers WHERE markers.id = marker_occurrences.marker_id);. Аналогично для marker_occurrences_filtered и marker_occurrences_suppressed. Перед этим — бэкап.
|
Невалидное состояние БД, отсутствуют таблицы
|
Руками таблицы не создавать. Поднять пустую БД, запустить на ней Svacer — он сам создаст схему при старте. Отдельных скриптов миграции нет.
|
PostgreSQL: invalid page, zeroing out page
|
Восстанавливаться из дампа. Проверить диск. Крайняя мера — включить zero_damaged_pages = on в postgresql.conf, перезапустить PostgreSQL, затем удалить битые ссылки (см. выше).
|
Нужно освободить место в object store
|
Удалить старые проекты/снимки: svacer server cleanup list / svacer server cleanup add --keep-time <N>h (при --keep-time 0h правило обрабатывается как дефолтное и сохраняет 30 дней — используйте 1h и проверяйте результат через svacer server cleanup list). Компактифицировать без удаления:
svacer-server run --compact-object-store
. Удалить старый object store от версий < 9-0-0 (файлы вне _pebble_, давно не менялись). Перед всем — бэкап.
|
Нужно почистить БД
| VACUUM FULL (тяжёлая операция, блокирует таблицы). Очистить search_history, search_results (TRUNCATE ... CASCADE). Очистить comment_history (см. выше). |
3. Импорт снимков и результатов
Проблема | Решение |
svacer import --upload падает по timeout или EOF
|
Увеличить таймауты: SVACER_TIMEOUT_IMPORT_RESULTS_PREPARE=30h, |
XML syntax error ... illegal character code U+0001
|
Удалить недопустимые символы из svres. Обновить Svace/Svacer.
|
failed to relate invariants
|
Обновиться до 12.0.0.
|
Ошибка при импорте снапшота из файла
|
Проверить целостность .snap через zstd. Импортировать на чистом экземпляре. Собрать лог.
|
Импорт SARIF даёт 502
|
Использовать svacer sarif2 import --upload. Проверить multipart/form-data. Проверить прокси. Обновить Svacer.
|
Нужно вырезать пути из SARIF
| Фильтровать JSON через jq перед импортом. |
4. Разметка, инварианты, миграция
Проблема | Решение |
После обновления 11-2-0 → 12-0-1 не перенеслась разметка
|
1. Проверить, что снапшоты в одном бранче. |
Часть разметки не переносится между снапшотами
|
Использовать --path-prefix при импорте, чтобы отрезать меняющийся префикс пути. Для правки путей в готовом .snap — утилита pfixer. Попробовать --classic-inv-mode. Диагностика: quickdiff, marker match-journal. Перенос: markup2 export/import, экспорт/импорт snap.
|
Комментарии не переносятся
|
Проверить инварианты. Использовать markup2 export/import с --overwrite force. Попробовать экспорт/импорт snap.
|
Что делает SVACER_NO_INVARIANT_MIGRATION=true
|
Отключает массовую миграцию инвариантов при старте. Новые снимки всё равно считаются. Логику сопоставления не меняет.
|
Как понять, какие маркеры новые/пропали
| svacer quickdiff --project <p> --branch <b> --snapshot_id_v1 <id1> --snapshot_id_v2 <id2> --format raw. В выводе: matched_markers — дефект есть в обоих снимках (инвариант совпал); same_markers — дефект есть, но отличается Marker_id или trace_id; missing_markers — был в старом, нет в новом (вероятно, исправлен); new_markers — появился в новом. Если маркер в matched или same — дефект всё ещё присутствует в коде. |
5. Производительность и ресурсы
Проблема | Решение |
Сервер недоступен, высокий CPU/RAM, падает по OOM
|
Уменьшить MaxConns до 20. Проверить, не дёргается ли постоянно full-text search или API (сбор статистики, автоматика). Для диагностики запустить с SVACER_TRACE_OPTIONS=http_trace_on — в лог добавятся записи о входящих запросах. Обновить Svacer.
|
Долгий импорт, клонирование идёт часами
|
Проверить comment_history — её раздувание замедляет клонирование. См. раздел 2. Проверить таймауты (раздел 3). Обновить Svacer.
|
В логе context deadline exceeded, ошибки лидерства
|
Проверить БД, таймауты, нагрузку на хост. Обновить Svacer.
|
Долгий пересчёт инвариантов
| Отключить SVACER_NO_INVARIANT_MIGRATION=true, если пересчёт при старте не нужен. Использовать --classic-inv-mode при необходимости. |
6. API и CLI
Проблема | Решение |
Нужно пересчитать инварианты по бранчу, а публичного API нет
|
Использовать CLI: svacer admin --scope "container:invariants" --action update --id <branch_id> --user <u> --password <pass> --host <h> --port <port>. Временно можно внутренний /api/containers/<BRANCH_ID>/invariants.
|
Ошибка при передаче custom_filter в публичный API
|
Обновиться до 12-0-1.
|
В ответе API нет поля со ссылкой (домена нет)
|
См. раздел 1 — запускать сервер с --public-url. В следующих релизах поле должно возвращаться.
|
Нужно получить id последнего снимка
|
svacer reports --host <h> --port <port> --grpc <g> --project <prj> --action last-snapshot → в JSON поле result.id. Либо REST: /api/public/projects/{project_id}/branch/{branch_id}/snapshots/last.
|
В Swagger нет нужного метода (например, для review, comments, clone branch, глобальных фильтров)
| Внутреннее API не публикуется. Публичные аналоги — /api/public/.... Если метода нет — создать feature request на вынос. |
7. Права, LDAP, безопасность
Проблема | Решение |
Не хватает прав на очистку разметки
|
Выдать серверные доступы Server administration, а также проектные Import markup, Review markers. Если пользователь — автор проекта, достаточно Create projects и Server administration.
|
Анонимный импорт через встроенного пользователя importer
|
Удалить роль у пользователя importer (в UI через форму редактирования), сменить пароль на случайный. В будущих релизах — отключение системных пользователей.
|
Импорт от имени LDAP-пользователя не работает
|
Указать --ldap_server со значением, которое задано в конфиге (не адрес, а имя). Проверить роли и доступы LDAP-пользователя. Использовать актуальные параметры CLI.
|
Ошибка при синхронизации отключённого или отсутствующего в AD пользователя
|
Исправлено в 12-0-1. Обновиться.
|
8. UI, уведомления, отчёты
Проблема | Решение |
Unexpected Application Error! Cannot read properties of null (reading 'forEach') при работе в UI
|
Сбросить настройки пользователя: под админом → Управление пользователями → в столбце действий «сбросить настройки». Если не помогло — очистить user_settings и custom_filters. Обновиться до актуальной версии.
|
Не отображаются комментарии к уязвимостям после копирования/импорта разметки
|
Использовать svacer markup2 export/import. Проверить инварианты (раздел 4). В 12-0-1 были исправления в этой области.
|
В PDF-отчёте указана неверная версия Svace
|
Включить генерацию PDF на основе HTML, установить браузер на сервере. В 12-й версии при этом механизме версия выводится корректно. Native PDF берёт версию Svace из конфигурации детекторов — исправление в следующем релизе.
|
Нет оповещений о появлении нового проекта / ветки / снимка
| Настроить почтовый сервер для Svacer. Затем в UI — подписки на нужные события (в частности, чек-бокс «Снимки»). Возможны уведомления через Telegram-бота. |
9. Бэкап и восстановление
Проблема | Решение | |
Как делать бэкап Svacer
|
PostgreSQL: pg_dump. Object store: rsync в отдельную директорию. Есть скрытая команда svacer server backup --host <h> --port <port> --grpc <g> --user <u> --password <pass> export --checkpoint <path> — создаёт копию object store с использованием hard link. Проверять бэкап через zstd.
| |
Бэкап object store оказался битым
|
Проверить zstd -v -d <файл> -o /dev/null. Восстановить из другого бэкапа. Разбираться с причиной повреждения (диск, передача файла, обрыв записи).
| |
Восстановление из бэкапа object store
|
| |
Нужно убедиться, что бэкапы валидны
| Автоматической проверки в продукте пока нет. Проверять вручную через zstd -d и тестовое восстановление на отдельном экземпляре. |
10. Быстрые команды
Задача | Команда |
Пересчёт инвариантов по бранчу
|
svacer admin --scope "container:invariants" --action update --id <branch_id> --user <u> --password <pass> --host <h> --port <port>
|
Импорт с обрезкой префикса пути
|
svacer import --path-prefix ...
|
Правка путей в готовом снапшоте
|
pfixer --source <in.snap> --output <out.snap> --map "<from>:<to>"
|
Бэкап object store
|
rsync -a /data/store/ /backup/store/
|
Копия object store через сервер
|
svacer server backup --host <h> --port <port> --grpc <g> --user <u> --password <pass> export --checkpoint <path>
|
Проверка бэкапа object store
|
zstd -v -d <файл> -o /dev/null
|
Очистка истории комментариев
|
psql -U svace -d svace -c 'truncate comment_history;'
|
Компактификация object store
|
svacer-server run --compact-object-store ...
|
Указание публичного URL
|
svacer-server run --public-url https://...
|
Быстрое сравнение снимков
|
svacer quickdiff --project <p> --branch <b> --snapshot_id_v1 <id1> --snapshot_id_v2 <id2> --format raw
|
Получить последний снимок
|
svacer reports --host <h> --port <port> --grpc <g> --project <prj> --action last-snapshot
|
Список правил очистки
|
svacer server cleanup list
|
Добавить правило очистки
|
svacer server cleanup add --keep-time <N>h
|