Документ описывает эксплуатацию Sesame DVR после установки: первый вход, добавление камер, просмотр live/архива, ONVIF-события, управление хранилищем, обновления, диагностику и типовые неисправности.
Руководство рассчитано на администратора сервера и оператора системы. Оно не заменяет внутренние runbook-документы для сборки protected artifacts и администрирования license server.
- Назначение Sesame DVR
- Требования к серверу
- Установка
- Первый вход и доступы
- Обзор web-интерфейса
- Потоки и камеры
- Просмотр live и архива
- ONVIF и события движения
- Агенты
- Клиенты
- Мониторинг и журналы
- Лицензия и обновления
- Хранилище архива
- Глобальные настройки
- Служебные команды
- Файлы и каталоги
- Безопасность
- Типовые сценарии
- Диагностика проблем
- HTTP endpoints для интеграций
Sesame DVR - серверная система видеозаписи и просмотра IP-камер. Сервер принимает RTSP/URL-потоки, пишет архив на диск, отдаёт live-видео, архивные HLS плейлисты, preview, MP4 export и предоставляет web-интерфейс администратора.
Основные задачи:
- подключение RTSP-камер, push-потоков, статических JPEG-источников и других видеоисточников;
- запись архива с настраиваемым сроком хранения;
- live-просмотр через embed-плеер, HLS и WebRTC/WHEP;
- просмотр архива по временной шкале;
- выгрузка фрагментов архива в MP4;
- сбор ONVIF motion events;
- мониторинг потоков, сервера, дисков, клиентов и журналов;
- управление хранилищем в SingleVolume и MultiVolume режимах;
- штатное обновление protected-версии без исходников на сервере клиента.
Поддерживаемая production-установка:
- Ubuntu 22.04 / 24.04 / 26.04 или Debian 12 / 13;
- архитектура
amd64 / x86_64; systemd;sudoили root-доступ для установки;- исходящий HTTPS к
https://license.sesameware.comиhttps://license-2.sesameware.com; - достаточная пропускная способность сети до камер;
- отдельный диск или раздел под архив желательно монтировать в
/var/dvr.
Для публичного доступа через домен:
- DNS A/AAAA запись домена должна указывать на сервер;
- входящий TCP
80; - для HTTPS и Let's Encrypt также входящий TCP
443; - если используется cloud firewall/security group, эти порты нужно открыть там отдельно.
Производительность зависит от числа камер, codec, bitrate, длительности хранения, скорости дисков, CPU и включённых функций. WebRTC работает без транскодирования, поэтому зависит от поддержки codec в браузере.
Обычно установка выполняется одной командой, которую администратор получает из license-панели. Команда содержит activation key и параметры публикации.
curl -fsSL https://license.sesameware.com/sesame-dvr-artifacts/bootstrap-protected-install.sh \
| sudo bash -s -- \
--license-key '<activation-key>' \
--server-name "$(hostname -f)" \
--publish-service \
--publish-server-name dvr.example.com \
--publish-acme \
--acme-email admin@example.comЗамените:
<activation-key>на выданный ключ;dvr.example.comна домен сервера;admin@example.comна email для Let's Encrypt.
curl -fsSL https://license.sesameware.com/sesame-dvr-artifacts/bootstrap-protected-install.sh \
| sudo bash -s -- \
--license-key '<activation-key>' \
--server-name "$(hostname -f)" \
--publish-service \
--publish-server-name dvr.example.comИнсталлятор:
- определяет ОС и архитектуру;
- скачивает подходящий protected artifact;
- активирует лицензию через license server;
- при необходимости ждёт сборки per-instance anchor;
- устанавливает приложение в
/opt/sesame-dvr; - создаёт state directory
/var/lib/sesame-dvr; - создаёт архивный root
/var/dvr; - устанавливает systemd service
sesame-dvr; - устанавливает support tools в
/usr/local/sbin; - при
--publish-serviceнастраивает nginx; - при
--publish-acmeвыпускает Let's Encrypt сертификат; - печатает ссылку для первого входа, если был создан management token.
Admin UI доступен по:
https://<domain>/admin
или, если HTTPS не настроен:
http://<domain>/admin
На чистой установке UI может запросить:
login: admin
password: admin
После первого входа нужно сменить стандартный пароль администратора.
Если installer вывел ссылку вида:
https://<domain>/admin?token=...
откройте её в браузере. Management token будет сохранён в браузере и будет
использоваться для management API. В разделе Настройки можно:
- применить существующий management token;
- сгенерировать новый token;
- сбросить token в текущем браузере;
- сменить пароль UI панели;
- выйти из admin UI.
Главные разделы:
Потоки- список камер, управление потоками, live/archive playback, ffprobe и логи выбранного потока.Мониторинг- текущие метрики и графики CPU, памяти, дисков, сети, ingest, BEAM/runtime и процессов.Журналы- общий журнал событий Sesame DVR с фильтрами по уровню и source.Клиенты- активные playback client users, WebRTC-сессии и недавние HLS-клиенты.ONVIF- список ONVIF-устройств, проверка capabilities, подписка на events.Агенты- удалённые SesameDVR Edge Agents: enrollment, статус подключения, список камер агента, ONVIF scan на стороне объекта, diagnostics/logs, команды агенту и создание потоков из камер агента.Настройки- лицензия, обновления, хранилище, tokens, orphan cleanup и global config.
Поток - это камера или другой источник видео. Основные поля потока:
Имя- стабильный идентификатор камеры в URL и архиве. Используйте латиницу, цифры, дефис или подчёркивание.Тип источника-directдля RTSP/HTTP URL,udp_multicastдля UDP multicast/MPEG-TS,pushдля потока, который публикуется в SesameDVR извне по RTMP или SRT, илиimageдля статического JPEG-источника.Source- адрес или путь источника. Дляdirectэто RTSP/HTTP URL, напримерrtsp://user:password@10.0.0.10:554/stream1. Дляudp_multicastиспользуйте URL видаudp://@239.10.10.10:5000?localaddr=192.168.0.1&overrun_nonfatal=1&fifo_size=5000000. Дляpushэто логический ingest endpoint. Дляimageэто путь к загруженному JPEG вdvrRoot/static-sources; после загрузки к пути может добавляться version query, чтобы running-поток перезапустился при замене файла.JPEG файл- файл, который web UI загружает на сервер дляsourceType=image. Из негоffmpeg_nifформирует статический H.264/fMP4 видеопоток для live HLS, WHEP/WebRTC, preview и embed-плеера.Писать архив- включает долговременное хранение сегментов потока. Если выключить, сервер оставляет только минимальный live-buffer для live playback и сразу удаляет старые сегменты этого потока из storage/catalog. Для JPEG источников архив по умолчанию выключен, но live-buffer всё равно держит последниеliveWindowfMP4-сегментов, чтобы HLS-плееры стартовали без ожидания накопления нескольких обновлений playlist.Retention- срок хранения архива. Можно задавать числа в днях или строки7d,6h,180m. Строковое значение сохраняется в конфиге и затем отображается в интерфейсе как было введено; числовое значение считается днями для совместимости со старыми конфигами.Authorization:none- playback endpoints доступны без token;static- playback требует query?token=<token>;auth backend- доступ проверяется внешним backend URL из global config.
Disable audio- отключает аудио в ingest/playback для потока.Enabled- поток включён в config и должен запускаться после старта сервиса.
В protected-версии producer не выбирается на уровне отдельного потока:
используется global/default ffmpeg_nif. Он пишет self-initializing fMP4
segments напрямую в выбранный storage volume. Внешний ffmpeg producer
доступен только в unprotected/dev-сборках и будет отклонён protected runtime.
В секции Failover у потока можно включить прикладное резервирование между
двумя SesameDVR-нодами без участия Portal:
none- обычный поток без резервирования;master- основной поток, который пишет архив и после восстановления может забрать недостающие интервалы с Backup;backup- резервный поток, который следит за health Master и стартует запись только после устойчивого отказа.
Peer URL должен указывать на связанный поток другой DVR-ноды в формате:
https://peer.example/api/failover/streams/<peer-stream>?token=<playback-token>
token здесь - обычный playback token peer-потока. Он используется для
health/read-side failover запросов и чтения архива через обычные playback
endpoints. Control-действия backup/start, backup/stop, repair/run,
cleanup/run и repair-ack требуют management/failover auth.
В защищённой сборке failover включается отдельной license feature
dvr_failover. Если feature отключена в лицензии или lease, сервер запрещает
сохранение failover.mode=master|backup, возвращает 403 license_feature_disabled на /api/failover/... и останавливает активные
Backup/hot-buffer runtime.
Для Backup можно включить Hot-buffer: тогда резервный runtime постоянно пишет
короткий standby-буфер, даже пока Master здоров. Буфер ограничивается
Hot-buffer duration и опционально Hot-buffer quota. При реальном failover
последние секунды hot-buffer перед стартом Backup сохраняются как repair window,
чтобы закрыть gap между фактическим отказом Master и моментом обнаружения.
Hot-buffer создаёт второе постоянное подключение к камере; на single-client
RTSP камерах этот режим нужно оставлять выключенным.
Для ручной или внешней автоматизации распределения Backup-потоков есть
DVR-side placement planner API. GET /api/failover/nodes/local/resources
возвращает resource snapshot текущей ноды, а
POST /api/failover/placement/plan принимает список нод и потоков, считает
estimated bitrate, требуемый backup storage на заданный downtime, выбирает
Backup-ноду по capacity/weights и возвращает dry-run warnings. Это не Portal
cluster planner: SesameDVR только считает и, через
POST /api/failover/placement/apply, может применить patches для своей
локальной ноды.
Эксплуатационные проверки, ручной старт Backup, repair и cleanup описаны в runbook DVR-side failover.
sourceType=image нужен для статической картинки, которую SesameDVR показывает
как обычный поток. Типовые сценарии: тестовый источник, placeholder вместо
камеры, демонстрационный экран или интеграция, которая периодически обновляет
один JPEG.
Настройка через UI:
- Создайте или откройте поток в разделе
Потоки. - Укажите
Тип источника=image. - Загрузите JPEG-файл в поле
JPEG файл. - Сохраните поток и включите его.
Сервер сохраняет файл в dvrRoot/static-sources и использует его как вход для
ffmpeg_nif. При повторной загрузке JPEG поток получает новую версию source и
перезапускается, чтобы viewers увидели обновлённое изображение.
sourceType=udp_multicast используется, когда SesameDVR должен принимать
локальный multicast MPEG-TS поток напрямую из сети. Такой источник обычно
публикуется сетевым оборудованием, IPTV headend или другим медиасервером внутри
LAN.
Пример source:
udp://@239.10.10.10:5000?localaddr=192.168.0.1&overrun_nonfatal=1&fifo_size=5000000
localaddr указывает локальный IP интерфейса, через который сервер должен
подписаться на multicast group. Это важно для серверов с несколькими сетевыми
интерфейсами или несколькими VLAN. Параметры overrun_nonfatal и fifo_size
уменьшают риск остановки ingest при кратковременных всплесках входящего потока.
SRT поддерживается как транспорт доставки для потоков с sourceType=push.
Типовой сценарий - камера находится за NAT или в нестабильной сети, локальный
Edge Agent читает её по RTSP/ONVIF и публикует media в SesameDVR по SRT/MPEG-TS.
Также SRT может использовать внешний publisher, если он отправляет MPEG-TS и
указывает правильный stream id.
SesameDVR поднимает общий SRT acceptor/router на одном публичном UDP-порту и
маршрутизирует входящие потоки по streamid=sesame:stream=<streamName>. Отдельный
публичный порт на каждую камеру не нужен. Обычно agent получает SRT caller URL
из control-команды, например:
srt://dvr.example.com:10080?mode=caller&transtype=live&pkt_size=1316&streamid=sesame%3Astream%3Dgate
Основные настройки SRT на стороне SesameDVR:
SESAME_DVR_SRT_PUBLISH_HOST- публичный host, который попадёт в caller URL;SESAME_DVR_SRT_BIND_HOST- bind host router-а, по умолчанию0.0.0.0;SESAME_DVR_SRT_BASE_PORT- единый публичный UDP-порт, по умолчанию10080;SESAME_DVR_SRT_LATENCY_MS- latency SRT, по умолчанию120;SESAME_DVR_SRT_PASSPHRASE- опциональный общий passphrase для защиты SRT порта.
Для работы SRT нужно открыть входящий UDP-порт SESAME_DVR_SRT_BASE_PORT в
firewall/security group. SRT защищает участок доставки publisher/agent ->
SesameDVR, но не является локальным store-and-forward буфером и не исправляет
проблемы RTSP-участка камера -> agent.
Сохранить- записать изменения в config.Старт- запустить runtime без измененияenabledв config.Стоп- остановить runtime без измененияenabledв config.Рестарт- перезапустить runtime выбранного потока.Вкл- включить поток в config и запустить.Выкл- выключить поток в config и остановить.Удалить- удалить поток из config. Архив на диске автоматически не удаляется как часть удаления потока.
В левой панели можно выбирать несколько потоков и выполнять bulk-действия:
Старт, Стоп, Вкл, Выкл, Удалить.
В карточке и заголовке выбранного потока отображаются:
- runtime state: запущен/остановлен/ошибка;
- ingest producer;
- codec и audio codec;
- готовность WebRTC;
- статус ONVIF;
- состояние архива и задержка последнего сегмента;
- срок хранения.
Если поток включён, но не пишет архив, в первую очередь проверьте вкладки
Логи, Ffprobe инфо, Мониторинг и доступность RTSP URL с сервера.
В разделе Потоки вкладка Монитор показывает embed-плеер выбранной камеры.
Он умеет:
- live playback;
- переключение к архивному времени;
- отображение временной шкалы архива;
- отображение ONVIF events на шкале;
- воспроизведение архива только по участкам движения;
- воспроизведение архива в режиме timelapse, если он включён для потока;
- управление масштабом timeline;
- переход к выбранному времени;
- выгрузку MP4-фрагмента.
По умолчанию архивный HLS в embed-плеере остаётся конечным VOD playlist, чтобы
не менять поведение существующих внешних встраиваний. Для новых интеграций
доступен отдельный режим archive_playlist=sliding:
https://dvr.example.com/cam1/embed.html?dvr=true&archive_playlist=sliding
В этом режиме player запрашивает растущий archive HLS EVENT playlist без
#EXT-X-ENDLIST. Сервер сначала отдаёт короткое окно архива, а затем расширяет
его при повторных запросах hls.js с учётом текущей скорости воспроизведения.
Это уменьшает видимые перезапуски при длинном архивном просмотре и особенно
при быстрых скоростях 8x/16x. В браузерах с native HLS режим автоматически
не используется: они остаются на обычном VOD playlist.
Кнопка режима движения включает воспроизведение архива только по ONVIF motion=true участкам. Плеер строит специальный HLS playlist из событий движения, добавляет запас по краям события и пропускает промежутки без движения без перезагрузки video source. Индикатор текущего воспроизведения остаётся на реальной шкале времени архива: когда HLS перескакивает дыру без события, индикатор тоже перескакивает на следующий архивный участок.
Если в настройках потока включена Писать timelapse, рядом с обычным архивом
появляется режим Timelapse. Сервер сохраняет raw timelapse frames как staging,
фоново собирает из них HLS/fMP4 chunks и отдаёт готовый materialized manifest
через /<camera>/timelapse.m3u8. С start=...&end=... playlist
ограничивается реальным окном архива. Плеер показывает длительность ускоренного
media отдельно, а timeline и seek остаются привязаны к реальному archive time.
Частота сохранения задаётся настройкой Кадров в час, глубина хранения задаётся
в формате d/h/m, а скорость итогового HLS - через FPS воспроизведения.
Если у потока выключено Писать архив, embed-плеер работает как live-only:
не показывает режим Archive, не рисует archive timeline и не предлагает MP4
export, даже если URL открыт с dvr=true.
Ссылка на embed-плеер:
/<camera>/embed.html
Например:
https://dvr.example.com/cam1/embed.html
Вкладка WebRTC запускает live WebRTC playback. WebRTC зависит от codec:
- H.264 обычно поддерживается браузерами лучше всего;
- HEVC зависит от браузера, ОС и аппаратной поддержки;
- если WebRTC недоступен, используйте HLS/embed fallback.
HLS и WebRTC также учитывают лицензионный лимит активных playback client users.
Если лимит исчерпан, новый клиент получит ошибку max_client_users_exceeded,
а уже активные клиенты продолжат работать.
Архивные интервалы отображаются на timeline. Для ручного просмотра можно задать
начало и конец периода и нажать Архив HLS.
Если архив показывает gaps:
- камера могла не писать в этот период;
- volume мог быть offline/read-only/full;
- retention мог удалить старые сегменты;
- поток мог перезапускаться или терять RTSP;
- после ручных переносов данных может потребоваться audit/rebuild catalog.
Выберите диапазон времени в embed-плеере и используйте download/export. Export собирает MP4-файл из архивных сегментов. Временные export-файлы автоматически очищаются после короткого времени.
Sesame DVR может генерировать короткие preview MP4, а также JPG frames, если это включено в настройках. Preview является cache: его можно потерять и пересоздать из сегментов.
Если previewMp4CacheEnabled=false, отдельные MP4 preview-файлы не создаются:
MP4 preview endpoints используют ближайший архивный сегмент, а
previewDuration относится только к режиму отдельного MP4 cache.
Раздел ONVIF используется для устройств, у которых есть ONVIF endpoint.
Основные операции:
Сканировать RTSP- попытаться найти ONVIF-устройства на основе RTSP-камер;Новое устройство- добавить ONVIF endpoint вручную;ONVIF камерав карточке выбранного потока - открыть привязанное ONVIF-устройство или попробовать добавить его по RTSP URL этого потока;Проверить возможности- получить capabilities устройства;Запустить события- подписаться на PullPoint events;Остановить события- остановить сбор событий;Очистить журнал- удалить сохранённые events выбранного устройства.
Если ONVIF добавляется из выбранного RTSP-потока, SesameDVR сначала пробует
найти endpoint автоматически только для этой камеры. Если автопоиск не нашёл
устройство, UI открывает форму добавления и подставляет Host,
Username/Password, имя потока и срок хранения из RTSP-настроек. ONVIF Port
и Path всё равно надо проверить вручную, потому что RTSP port обычно не равен
ONVIF port. Если автопоиск нашёл endpoint, SesameDVR попросит подтвердить
добавление или привязку устройства перед записью в конфиг.
Поля ONVIF-устройства:
Name- имя устройства;Host- IP или hostname камеры;Port- ONVIF port, часто80,8080или нестандартный порт;Path- обычно/onvif/device_service;UsernameиPassword- учётные данные камеры;Events retention days- срок хранения ONVIF events;Pull interval seconds- интервал опроса PullPoint events.
ONVIF events хранятся отдельно от видеоархива, потому что их проще периодически бэкапить и восстанавливать. В UI они отображаются рядом с архивными интервалами, чтобы быстрее находить движение.
Раздел Агенты используется для удалённых объектов, где SesameDVR не имеет
прямого доступа к локальным RTSP/ONVIF-камерам или где удобнее поставить
небольшой Edge Agent внутри локальной сети объекта.
В разделе можно:
- создать агента и выдать enrollment password;
- включить, отключить, удалить агента, отозвать или ротировать agent secret;
- проверить online/offline статус, capabilities и последнюю активность агента;
- посмотреть камеры, которые агент нашёл или передал в SesameDVR;
- получить snapshot камеры через агента;
- запустить ONVIF scan на стороне агента;
- запросить diagnostics/log tail и отправить команду агенту;
- создать поток SesameDVR из камеры агента.
После enrollment агент сам подключается к SesameDVR по WebSocket, получает
команды и публикует media через push ingest: RTMP/FLV или SRT/MPEG-TS. Для таких
камер поток SesameDVR обычно имеет sourceType=push: агент читает локальный
RTSP/ONVIF источник, а SesameDVR принимает опубликованный поток и дальше пишет
архив, отдаёт live, preview, HLS/WebRTC и API так же, как для обычной камеры.
Функциональность Edge Agent включается лицензией. Если feature не включена,
раздел Агенты и соответствующие API будут недоступны.
Раздел Клиенты показывает:
- сводку активных playback client users и лицензионный лимит;
- активные WebRTC-сессии из native WHEP registry;
- недавние HLS-клиенты по запросам к playlist/segment.
Это полезно, чтобы понять, кто сейчас смотрит камеры и создаёт нагрузку на сервер.
Playback client user считается по сочетанию IP-адреса клиента и User-Agent.
Для HLS активность держится коротким TTL после последних playlist/segment
запросов, для WebRTC используется live registry активных WHEP-сессий. Лицензия
может задавать лимит maxClientUsers; для старых лицензий также учитывается
legacy поле maxClientConnections.
Раздел Мониторинг показывает:
- CPU всего и CPU Sesame DVR;
- отдельную нагрузку ingest, ONVIF, nginx и BEAM runtime;
- память процесса и системы;
- диски и storage volumes;
- сеть;
- ingest-процессы;
- BEAM profile и top runtime consumers.
Если CPU вырос, сначала проверьте:
- сколько камер реально пишут архив;
- не запущены ли массовые playback/API запросы;
- нет ли частых ошибок в логах;
- не идёт ли rebuild/audit catalog;
- не перегружен ли диск.
Sesame DVR отдаёт OpenMetrics snapshot для Prometheus по endpoint:
GET /metrics
Endpoint предназначен для регулярного scrape со стороны Prometheus и содержит
пер-поточные метрики с labels server_id и name: ts_delay,
stream_bitrate, stream_bytes_in, stream_input_retries,
stream_online_clients, а также дополнительные sesame_dvr_stream_*
состояния и ingest counters. Метрика play_bytes оставлена для совместимости с
Flussonic-like dashboards; сейчас Sesame DVR не считает playback bytes и отдаёт
для неё 0.
Авторизация /metrics задаётся отдельно от admin UI и playback tokens в
Настройки -> Global config:
Metrics auth mode:disabled,none,bearerилиbasic;Metrics bearer token: write-only token дляAuthorization: Bearer ...;Metrics basic username;Metrics basic password: write-only пароль Basic auth.
Режим disabled полностью выключает выдачу метрик: GET /metrics отвечает
404. Режим none оставляет endpoint открытым без авторизации.
Raw secrets не сохраняются в config.json: после сохранения остаются только
hash-поля. Если поле token/password в UI оставить пустым, текущий сохранённый
секрет не меняется.
Пример Prometheus scrape config с Bearer token:
scrape_configs:
- job_name: sesame-dvr
scheme: https
metrics_path: /metrics
bearer_token: <metrics-token>
static_configs:
- targets: ["dvr.example.com"]Пример с Basic auth:
scrape_configs:
- job_name: sesame-dvr
scheme: https
metrics_path: /metrics
basic_auth:
username: prometheus
password: <metrics-password>
static_configs:
- targets: ["dvr.example.com"]Подробное руководство с API-примерами, PromQL и alert rules: prometheus-metrics-endpoint.ru.md.
В разделе Журналы доступен общий event log. В карточке потока есть отдельная
вкладка Логи с ingest/ffmpeg логами выбранной камеры.
Типичные источники проблем:
rtspилиconnection refused- камера недоступна или неправильный URL;401/403- неверный логин/пароль камеры или playback token;archive stale- архив не обновляется;license- проблема лицензии или lease;storage- volume offline, read-only, full или ошибка catalog.
Раздел Настройки -> Лицензия показывает:
- статус лицензии;
- срок действия;
- лимиты потоков, retention и playback client users;
- fingerprint;
- lease status и срок действия lease;
- детали license/anchor.
Кнопка Renew принудительно обновляет lease с license server. Runtime обычно
обновляет lease сам по расписанию.
Раздел Настройки -> Обновления показывает:
- текущую версию сервера;
- доступную версию;
- статус последней проверки;
- состояние update launcher;
- лог сервиса обновления.
Кнопки:
Проверить- запросить актуальную доступную версию;Обновить- запустить штатное full release обновление черезsesame-dvr-update.service;Обновить без перезапуска- применить совместимый BEAM hot patch, если license server опубликовалbeam_hot_patchдля текущегоbuildId.
Во время обновления UI показывает журнал. На этапе рестарта сервиса страница должна дождаться возврата API и затем показать новую версию или ошибку. Hot patch не перезапускает service и применим только к ограниченному набору BEAM-модулей; формат manifest описан в beam-hot-patch-manifest.ru.md.
Sesame DVR поддерживает два режима:
SingleVolume- один архивный root;MultiVolume- несколько томов хранения.
Legacy config без блока storage автоматически работает как SingleVolume с
volume default, root равным dvrRoot.
Для каждого volume внутри root могут находиться:
segments- архивные self-initializing fMP4 сегменты;segments/<camera>/<YYYY>/<MM>/<DD>/<HH>/.hour_index*.hidx- primary per-hour индекс сегментов для конкретного часа;segments/<camera>/<YYYY>/<MM>/<DD>/<HH>/.hour_index*.term- legacy fallback для чтения старых индексов во время runtime-миграции;previews- cache preview, а также per-hour preview рядом с segment shard;timelapse- готовые timelapse HLS/fMP4 chunks и manifest;.sesame-dvr/camera_indexes/.../*.cidx- производные индексы камеры;.sesame-dvr/volume_index*- производный индекс volume;.sesame-dvr/volume_write_state.term- состояние cursor записи.
Источником истины остаются segment files и primary HourIndex в формате
*.hidx. CameraIndex (*.cidx) и VolumeIndex являются производными
индексами: они ускоряют поиск архива, status endpoints и retention planner, но
могут быть пересобраны из HourIndex.
Обновление индексов идёт каскадом:
- Commit нового сегмента обновляет
HourIndexдля{volume, camera, hour}. CameraIndexMaterializerасинхронно применяет изменения часов кCameraIndex.VolumeIndexMaterializerасинхронно применяет изменения камер кVolumeIndex.
Такой каскад отделяет запись сегмента от более тяжёлых производных индексов. На Dashboard в debug diagnostics можно смотреть pending/lag materializer-ов и максимальное отставание materialization pipeline от физической записи сегмента.
Retention planner ставит устаревшие файлы и часовые директории в DeleteQueue.
Физическое удаление выполняется через общий IO pipeline; после удаления
индексы получают feedback/tombstones, чтобы уже удалённые часы не попадали в
планировщик повторно.
Raw fMP4 timelapse frames используются как staging, а не как playback-источник.
Когда накопилось достаточно кадров для одного ускоренного HLS chunk, фоновая
задача собирает chunk, атомарно кладёт его в timelapse storage, обновляет
metadata/HourIndex и manifest, а raw staging удаляет. Поэтому запрос
/<camera>/timelapse.m3u8 читает готовый manifest и не должен каждый раз
обходить архив или строить playlist заново.
Новые segments пишутся на volume, выбранный текущей write policy. Если запись на volume выключается, уже открытый segment завершается штатно, а следующие segments переходят на другой writable volume. Сводка archive status в списке потоков берётся из catalog summaries и не должна блокироваться медленными проверками каждого каталога.
single- новые сегменты пишутся в выбранный основной том.round_robin- новые сегменты распределяются по writable volumes по очереди.weighted_round_robin- как round-robin, но с учётомWeight.least_used- выбирается volume с меньшимusedPercent, затем с большимfreeBytes.
Scope:
camera- отдельный cursor на каждую камеру. Это режим по умолчанию и лучший выбор, если нужно при отказе одного изnдисков потерять примерно1/nархива каждой камеры;global- один общий cursor на все камеры. Может ровнее распределять мгновенную write-нагрузку, но при отказе тома хуже соответствует цели равномерной потери архива каждой камеры.
Fallback:
- пустой - первый writable volume по порядку config;
least_used- fallback выбирает наименее заполненный writable volume.
Требовать mountpoint включает более строгую проверку, что volume действительно
смонтирован. Это полезно на production-серверах с отдельными дисками, но может
мешать тестовым конфигурациям с обычными директориями.
ID- стабильный идентификатор volume. Используется в archive URLs/dvr/v/<volume_id>/....Root- абсолютный путь к корню volume.Weight- вес дляweighted_round_robin.Max usage %- порог заполнения, после которого volume считается full для записи.Min free bytes- минимальный запас свободного места.Включён- volume доступен как archive source.Запись включена- writer может писать новые сегменты на volume.
Изменить- загрузить volume в форму редактирования.Проверить- audit catalog без записи.Выключить- выключить volume как online archive source и одновременно выключить запись.Включить- вернуть volume в работу. Запись после этого включается отдельной кнопкойВключить запись.Выключить запись- оставить volume читаемым, но запретить новые записи. Если есть активный segment writer, UI покажет ожидание завершения.Включить запись- разрешить новые записи на volume.Пересобрать каталог- пересканировать volume и восстановить indexes/catalog из segment files.Удалить- удалить volume только из config. Данные на диске не удаляются.
В Настройки есть блок Осиротевшие архивы. Он ищет архивы, preview и
служебные файлы, которые больше не относятся к текущим configured streams.
Используйте:
Посчитать размер- безопасный scan без удаления;Удалить архивы и превью- удалить найденные orphan data.
Перед удалением убедитесь, что нужные камеры не были временно удалены из config и что архив не нужен для восстановления.
В разделе Настройки -> Global config доступны:
Interface language- язык UI;DVR root- корневой каталог архива для legacy/single-volume режима;Ingest producer- глобальный producer по умолчанию. В protected-установке должен оставатьсяffmpeg_nif; внешнийffmpegпредназначен только для unprotected/dev-сборок и будет отклонён protected runtime.Segment duration- длительность сегмента архива, по умолчанию 4 секунды;Live window- число live-сегментов в окне HLS;External WHEP base URL- внешний base URL для WHEPLocation, если DVR стоит за NAT/reverse proxy и внешний hostname/port отличается от внутреннего;FFmpeg restart delay ms- задержка перед перезапуском ingest;Camera stop timeout ms- таймаут остановки камеры;Preview duration,Preview check interval ms,Preview max concurrency,Preview min interval ms;FFprobe max concurrency;ONVIF events poll interval default, sec;Cleanup interval minutes;Archive stale restart after seconds;Generate separate MP4 preview files;Also generate JPG frames;Metrics auth mode,Metrics bearer token,Metrics basic username,Metrics basic password- отдельная авторизация Prometheus endpoint/metrics; режимdisabledвыключает endpoint;Archive stale restart.
Меняйте эти параметры аккуратно: они влияют на все камеры и runtime-нагрузку.
sudo systemctl status sesame-dvr --no-pager
sudo systemctl restart sesame-dvr
sudo systemctl stop sesame-dvr
sudo systemctl start sesame-dvrЖурнал сервиса:
sudo journalctl -u sesame-dvr -n 200 --no-pager
sudo journalctl -u sesame-dvr -fЕсли включён отдельный ONVIF service:
sudo systemctl status sesame-dvr-onvif --no-pager
sudo journalctl -u sesame-dvr-onvif -n 200 --no-pagersudo sesame-dvr-license status
sudo sesame-dvr-license status --json
sudo sesame-dvr-license renew
sudo sesame-dvr-license fingerprint
sudo sesame-dvr-license fingerprint --rawsudo sesame-dvr-update
sudo sesame-dvr-update --preflight-only
sudo sesame-dvr-update --force
sudo sesame-dvr-repairsesame-dvr-repair переустанавливает текущий build из artifact index и
обновляет matching anchor, если он требуется.
Если публичный доступ был настроен через --publish-service, обычный
sesame-dvr-update автоматически обновляет installer-managed nginx site и
проверяет публичный HLS/DVR segment в smoke.
sudo sesame-dvr-storage smoke
sudo sesame-dvr-storage smoke --jsonsudo sesame-dvr-support-diagnostics
sudo sesame-dvr-support-diagnostics --with-onvif-serviceКоманда создаёт sanitized bundle. В bundle не должны попадать raw
license.json, license-lease.json, config.json, private keys и archive
data.
Типовая protected-установка:
/opt/sesame-dvr/current- текущий release;/opt/sesame-dvr/releases/<build>- установленные releases;/var/lib/sesame-dvr/config.json- конфигурация сервера;/var/lib/sesame-dvr/sesame-dvr.env- environment и tokens;/var/lib/sesame-dvr/license.json- лицензия;/var/lib/sesame-dvr/license-lease.json- online lease;/var/lib/sesame-dvr/current_anchor.so- текущий per-instance anchor;/var/dvr/segments- видеоархив legacy/default layout;/var/dvr/previews- preview cache;/var/dvr/onvif-events- ONVIF events;/var/dvr/tmp- временные файлы installer/update/debug;/etc/systemd/system/sesame-dvr.service- unit сервиса;/etc/nginx/sites-available/sesame-dvr.conf- nginx site при публикации.
В MultiVolume режиме архивные данные могут находиться на нескольких volume
root. URL содержит volume_id, поэтому после переноса volume сервер может
использовать новый путь, если catalog/audit видит данные.
Рекомендации:
- сразу сменить стандартный пароль
admin / admin; - хранить activation keys и management token как секреты;
- использовать HTTPS для публичного доступа;
- не публиковать
/adminбез пароля и token; - для внешнего playback использовать
authMode=staticилиauth backend; - не хранить RTSP-пароли в публичных документах и скриншотах;
- ограничить SSH-доступ к серверу;
- регулярно обновлять Sesame DVR и ОС;
- перед отправкой diagnostics использовать только sanitized support bundle.
Playback token для authMode=static передаётся так:
https://dvr.example.com/cam1/live.m3u8?token=<token>
- Откройте
Потоки. - Нажмите
Новый поток. - Укажите
Имя,Source,Retention. - Включите
Enabled. - Нажмите
Сохранить. - Нажмите
ВклилиСтарт. - Проверьте live в embed-плеере.
- Через несколько секунд проверьте timeline архива.
- Откройте
ONVIF. - Нажмите
Новое устройствоилиСканировать RTSP. - Укажите host, port, path, username/password.
- Нажмите
Проверить. - Нажмите
Проверить возможности. - Нажмите
ПодписатьсяилиЗапустить события. - Проверьте появление events на вкладке устройства и на timeline.
Если камера уже заведена как RTSP-поток, можно быстрее: откройте поток в
Потоки, нажмите ONVIF камера, дождитесь автопоиска или проверьте
предзаполненную форму, затем сохраните устройство.
- Подключите новый диск и создайте root directory.
- В
Настройки -> Тома хранениявыберитеMultiVolume. - Добавьте volume с уникальным
IDи абсолютнымRoot. - Убедитесь, что volume online и доступен для записи.
- Выберите policy, например
round_robinилиweighted_round_robin. - Оставьте
Scope = по камерам, если цель - равномерная потеря1/nархива каждой камеры при отказе одного диска. - Нажмите
Сохранить хранилище. - Запустите
ПроверитьилиПересобрать каталогдля перенесённых данных. - Проверьте, что новые сегменты появляются на нужных volumes.
- Откройте
Настройки -> Тома хранения. - На нужном volume нажмите
Выключить запись. - Дождитесь, пока активные записи завершатся.
- Убедитесь, что новые сегменты пишутся на другие writable volumes.
- После этого volume можно отключать, обслуживать или копировать.
- Откройте
Настройки -> Обновления. - Нажмите
Проверить. - Если доступна новая версия, нажмите
Обновить. - Следите за логом обновления.
- После рестарта проверьте версию сервера, license status и состояние потоков.
CLI-вариант:
sudo sesame-dvr-updatesudo sesame-dvr-support-diagnostics --with-onvif-serviceОтправляйте полученный .tar.gz bundle. Не отправляйте raw config.json,
license.json, private keys или архивные видеофайлы без отдельной договорённости.
Проверьте:
sudo systemctl status sesame-dvr --no-pager
sudo systemctl status nginx --no-pager
sudo nginx -t
curl -sS http://127.0.0.1:3000/api/system/statusТакже проверьте DNS, firewall и открытые порты 80/443.
Проверьте:
- поток включён и запущен;
- RTSP URL доступен с сервера;
- лог потока на вкладке
Логи; Ffprobe инфо;- лимиты лицензии по количеству потоков;
- свободное место и состояние storage volume;
- нет ли
archive staleв журнале; - не выключена ли запись на volume.
Возможные причины:
- камера не отдаёт keyframes достаточно часто;
- ingest получает поток, но writer не может писать на диск;
- volume offline/read-only/full;
- проблема с правами на каталог archive root;
- catalog/index требует rebuild после ручного переноса файлов.
Действия:
sudo sesame-dvr-storage smoke
sudo journalctl -u sesame-dvr -n 200 --no-pagerВ UI запустите Проверить или Пересобрать каталог на нужном volume.
Проверьте:
- codec камеры поддерживается браузером;
- WebRTC статус в карточке потока;
- нет ли ошибок license capabilities;
- работает ли HLS fallback;
- не блокирует ли proxy нужный WHEP endpoint.
Для HEVC в браузере возможны ограничения ОС/браузера. В таких случаях HLS может работать, а WebRTC нет.
Проверьте:
- playlist открывается по URL;
- segment URLs из playlist возвращают
200 OK, а не404; - nginx alias
/dvr/настроен на актуальный archive root; - для MultiVolume доступен endpoint
/dvr/v/<volume_id>/...; - файлы сегментов реально существуют на volume;
- catalog после переноса данных пересобран.
Проверьте:
- правильный host и port ONVIF;
- path
/onvif/device_serviceили vendor-specific path; - логин/пароль камеры;
- доступность камеры с сервера;
- capabilities check;
- PullPoint events поддерживаются конкретной камерой.
Некоторые камеры отдают в ONVIF XAddr с недоступным адресом. В таком случае сервер должен использовать фактический host/port устройства, если fallback поддержан текущей версией.
Проверьте:
sudo sesame-dvr-license status
sudo sesame-dvr-license renew
sudo journalctl -u sesame-dvr -n 200 --no-pager | grep -i licenseТакже проверьте исходящий HTTPS к:
https://license.sesameware.com
https://license-2.sesameware.com
Проверьте лог в UI или:
sudo systemctl status sesame-dvr-update --no-pager
sudo journalctl -u sesame-dvr-update -n 300 --no-pagerДля проверки без переключения версии:
sudo sesame-dvr-update --preflight-onlyДля переустановки текущего build:
sudo sesame-dvr-repairПроверьте:
Настройки -> Тома хранения;Мониторинг -> Диски;- retention по камерам;
- orphan archives;
- не выключен ли cleaner;
- нет ли offline volume с pending retention cleanup.
Если volume full, writer исключает его из новых записей. После освобождения
места может потребоваться Проверить или Пересобрать каталог.
Полный справочник всех HTTP API методов, параметров и payloads: sesame-dvr-api.ru.md.
Основные playback endpoints:
GET /<camera>/embed.html
GET /<camera>/live.m3u8
GET /<camera>/dvr.m3u8?start=<unix>&end=<unix>
GET /<camera>/dvr.m3u8?start=<unix>&end=<unix>&sliding=1
GET /<camera>/motion_dvr.m3u8?start=<unix>&end=<unix>
GET /<camera>/motion_dvr_map.json?start=<unix>&end=<unix>
GET /<camera>/timelapse.m3u8
GET /<camera>/timelapse.m3u8?start=<unix>&end=<unix>
GET /<camera>/recording_status.json
GET /<camera>/timeline_ranges.json
GET /<camera>/motion_events.json
GET /<camera>/preview.mp4
GET /<camera>/preview.jpg
GET /<camera>/archive-<from_unix>-<duration_seconds>.mp4
POST /<camera>/whep/
DELETE /<camera>/whep/<session_id>
/<camera>/motion_events.json принимает from/to в Unix seconds и отдаёт только запрошенный кусок событий движения. Embed-плеер при первом открытии показывает окно 12 часов вокруг live-точки и загружает события только для видимой части шкалы, чтобы не читать всю ONVIF-историю.
/<camera>/recording_status.json отдаёт совместимые с Flussonic диапазоны
архива; в каждом range поля from и duration отдаются целыми Unix seconds.
Для потоков с выключенным Писать архив этот endpoint возвращает пустой список
ranges и archiveEnabled=false.
/<camera>/timeline_ranges.json используется embed-плеером для шкалы архива.
Он принимает from/to в Unix seconds и bucket в секундах, возвращает только
нужное окно ranges и при большом масштабе может агрегировать соседние диапазоны.
Для live-only потоков возвращает пустой список ranges и archiveEnabled=false.
Внешним интеграциям нужно продолжать использовать recording_status.json.
Обычный /<camera>/dvr.m3u8?start=...&end=... отдаёт конечный VOD playlist.
Растущий archive playlist включается только явно через sliding=1 или через
embed-параметр archive_playlist=sliding; старые интеграции без этих
параметров не меняют поведение.
/<camera>/motion_dvr.m3u8?start=...&end=... отдаёт archive HLS только по
motion=true интервалам, а /<camera>/motion_dvr_map.json отдаёт карту
соответствия media time и реального archive time. Эти endpoints нужны
embed-плееру для режима просмотра по событиям: видео идёт непрерывно по
сегментам с движением, а UI timeline остаётся привязан к настоящему времени
архива.
/<camera>/timelapse.m3u8 отдаёт HLS VOD из готовых timelapse chunks, если для
потока включена запись timelapse. Если передать start=...&end=..., playlist
ограничивается этим реальным окном архива. Playback path читает
материализованный manifest; сборка chunks и обновление manifest выполняются
фоновыми задачами при записи timelapse. Файлы хранятся под
timelapse/<camera>/YYYY/MM/DD/HH/ на storage volume и чистятся по отдельной
настройке глубины хранения timelapse.
Для административного API GET /api/onvif/devices/:id/events параметры page/pageSize и before/after загружают список кусками. timelineFrom/timelineTo задают отдельный кусок timelineEvents, timelineCarry=true добавляет последнее событие перед началом окна для восстановления состояния, а events=false отключает выдачу страницы списка и используется для лёгких timeline-only запросов.
Прямые archive/data endpoints:
GET /dvr/<camera>/...
GET /dvr/v/<volume_id>/<camera>/...
Management API используется admin UI и требует management token/session:
GET /api/system/status
GET /api/system/version
GET /api/system/license
POST /api/system/license/renew
GET /api/system/update/status
POST /api/system/update/check
POST /api/system/update/start
POST /api/system/update/hot-patch/start
GET /api/streams
POST /api/streams
PUT /api/streams/<name>
PUT /api/streams/<name>/static-image
DELETE /api/streams/<name>
GET /api/agents
POST /api/agents
POST /api/agents/enroll
GET /api/agents/<id>
PATCH /api/agents/<id>
DELETE /api/agents/<id>
POST /api/agents/<id>/enrollment-password
POST /api/agents/<id>/rotate-secret
POST /api/agents/<id>/revoke
GET /api/agents/<id>/cameras
GET /api/agents/<id>/cameras/<camera_id>/snapshot.jpg
POST /api/agents/<id>/cameras/scan
POST /api/agents/<id>/diagnostics
GET /api/agents/<id>/logs
GET /api/agents/<id>/commands
POST /api/agents/<id>/commands
GET /streamer/api/v3/streams
GET /streamer/api/v3/streams/<name>
PUT /streamer/api/v3/streams/<name>
GET /metrics
GET /api/storage/volumes
GET /api/storage/catalog-jobs/<job_id>
POST /api/storage/volumes/<volume_id>/audit
POST /api/storage/volumes/<volume_id>/rebuild-catalog
POST /api/storage/volumes/<volume_id>/enable
POST /api/storage/volumes/<volume_id>/disable
POST /api/storage/volumes/<volume_id>/writable-on
POST /api/storage/volumes/<volume_id>/writable-off
POST /api/storage/volumes/<volume_id>/drain
GET /api/onvif/devices
POST /api/onvif/devices
POST /api/onvif/devices/scan
POST /api/onvif/devices/scan-stream
Совместимый с Flussonic слой /streamer/api/v3/streams использует тот же
management token. Для заголовка авторизации принимаются варианты
Authorization: Bearer <token>, Authorization: <token> и
X-Management-Token: <token>. PUT /streamer/api/v3/streams/<name> принимает
Flussonic body, где inputs[0].url становится source, disabled становится
обратным значением enabled, dvr.expiration в секундах превращается в
retentionDays, а on_play.url задаёт глобальный authBackendUrl и
authMode=authBackend для потока. Удаление в этом слое выполняется только через
PUT с disabled=true; Flussonic DELETE намеренно не используется.
stats.bytes_in в совместимом API берётся из native ingest счётчика входных
байтов. Значение становится 0, если поток остановлен или за последние 30
секунд не было входных пакетов, поэтому фильтр
stats.alive=false&stats.running=true&stats.bytes_in=0 ищет запущенные потоки
без текущего входного трафика от камеры. Накопленный счётчик текущего процесса
доступен как stats.bytes_in_total.
Для playback с authMode=static добавляйте query token:
?token=<playback-token>
Для production-интеграций лучше использовать documented UI/API flows и
сохранять совместимость URL камеры, volume_id и management token.