Appearance
Очистка архива
Записи удаляет отдельная команда 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, файлы — с диска. - Узел с базой данных. К ним добавляются камеры платформы вместе с заданной на них глубиной архива, а из таблицы записей приходит список файлов, записанных именно этим узлом.
- Кластер. Своего списка камер у узла нет, поэтому отвечает только база: узел запрашивает записи со своим именем и удаляет лишь их. Камера, которая за сутки несколько раз переезжала между узлами, разбирается сама собой — каждый узел получает свой список и чужого не трогает.
Вместе с файлом удаляется и его строка в таблице записей: иначе платформа продолжала бы показывать в архиве запись, которой уже нет. Если файла на диске не оказалось, строка всё равно убирается — это не ошибка.