◆ ForgeVis
Skip to content

Очистка архива ​

Записи удаляет отдельная команда forgevis --retention, а не сам сервис. Сервис только пишет: решение об удалении принимается расписанием, которое задаёт администратор, и выполняется процессом, который можно остановить, не трогая запись.

Сколько хранить ​

Глубина архива задаётся параметром retention_days в cameraDefaults и, если камера отличается от остальных, на самой камере:

yaml
cameraDefaults:
  record_path: "/rpool/%path/%Y/%m/%d/stream-%path_%Y-%m-%d_%H-%M-%S.mp4"
  retention_days: 30

cameras:
  entrance:
    source: "rtsp://192.168.1.10:554/stream"
    retention_days: 90    # у проходной хранить дольше

Если у камеры параметра нет, берётся значение из cameraDefaults. retention_days: 0 на камере означает бессрочное хранение — так одна камера выводится из-под общего правила. Когда параметра нет нигде, не удаляется ничего: это состояние по умолчанию, и в поставляемом конфиге параметр закомментирован. Записи камеры, которой больше нет в конфигурации, хранятся по значению из cameraDefaults: они остаются от камеры, которую удалили или перенесли на другой сервер, и без общего значения копились бы вечно.

Удаляется всё, что старше retention_days от момента запуска — с точностью до времени, а не до даты. Поэтому два запуска в сутки делят дневной объём пополам, а четыре — на четыре части, без отдельных настроек.

Проверка перед включением ​

--dry-run показывает, что команда сделала бы, и не удаляет ничего:

bash
forgevis --retention --dry-run

Отчёт идёт по камерам: сколько записей всего, сколько уходит, каким объёмом и какой глубины останется архив. Отдельным блоком — то, на что стоит посмотреть: камера без записей, камеры с бессрочным хранением, записи камер не из конфигурации и файлы, по имени которых нельзя определить время.

Боевой запуск печатает такой же отчёт, поэтому его можно сравнить с тем, что показывал --dry-run.

Запуск по расписанию ​

15 4 * * *  /usr/bin/forgevis --retention

Несколько запусков в сутки распределяют нагрузку: каждый забирает только то, что накопилось с прошлого раза.

15 */6 * * *  /usr/bin/forgevis --retention

Два запуска одновременно невозможны: команда держит блокировку /run/forgevis/retention.lock, и второй запуск завершается, ничего не делая. Блокировка принадлежит только ей — с записью она не пересекается и никогда её не ждёт.

Если очистка долго не запускалась и накопился большой объём, снимите камеры с сервера, выполните очистку и верните их обратно: команда рассчитана на ежедневную работу, а не на разбор многомесячного долга под нагрузкой.

Параметры ​

ПараметрЗначение
--dry-runПоказать, что было бы удалено, и не удалять
--config <path>Файл конфигурации (по умолчанию — тот же, что у сервиса)
--camera <id>Ограничить запуск одной камерой
--jobs <n>Число потоков удаления (по умолчанию половина ядер, от 2 до 4)
--verboseВывести каждый файл, а не только сводку по камерам

Как находятся записи ​

Файлы ищутся по шаблону record_path — по имени, а не по времени изменения файла: копирование, восстановление из бэкапа и переиндексация меняют mtime, но не меняют момент, когда запись была сделана.

Шаблон может быть любым. /rpool/%path/%Y/%m/%d/stream-%path_%Y-%m-%d_%H-%M-%S.mp4 даёт каждой камере дерево по дням, /recordings/%path/stream-%path_%Y-%m-%d_%H-%M-%S.mp4 — один каталог на камеру; оба читаются одинаково. Файлы, записанные по прежнему шаблону, тоже находятся — время берётся из их имени.

Что не удаляется никогда:

  • файлы, по имени которых нельзя определить время (они попадают в отчёт);
  • файлы с другим расширением, чем в шаблоне;
  • записи камеры с retention_days: 0.

После удаления файлов убираются опустевшие каталоги — каталог дня, когда из него ушла последняя запись, и каталог камеры, когда ушёл последний день. Корень архива остаётся всегда.

Узлы с базой данных и кластеры ​

Отдельного режима у команды нет: она берёт камеры оттуда же, откуда их берёт сам узел.

  • Отдельный узел. Камеры из config.yaml и conf.d, файлы — с диска.
  • Узел с базой данных. К ним добавляются камеры платформы вместе с заданной на них глубиной архива, а из таблицы записей приходит список файлов, записанных именно этим узлом.
  • Кластер. Своего списка камер у узла нет, поэтому отвечает только база: узел запрашивает записи со своим именем и удаляет лишь их. Камера, которая за сутки несколько раз переезжала между узлами, разбирается сама собой — каждый узел получает свой список и чужого не трогает.

Вместе с файлом удаляется и его строка в таблице записей: иначе платформа продолжала бы показывать в архиве запись, которой уже нет. Если файла на диске не оказалось, строка всё равно убирается — это не ошибка.

Proprietary software.