VibeNVR или как запустить локальное видеонаблюдение без облаков и страданий
Каждый, кто пытался организовать домашнее видеонаблюдение на своих серверах, знает эту боль. Старый добрый ZoneMinder выглядит как привет из конца девяностых. Shinobi периодически чудит с утечками памяти. Frigate крут и производителен, но ручная правка километровых YAML-конфигов ради добавления одной камеры быстро утомляет. Про облачные решения вендоров вроде Tuya или Xiaomi и говорить нечего: абонентская плата за хранение архива и риск остаться без записей при отключении интернета энтузиастов редко радуют.
Недавно наткнулся на интересный проект VibeNVR. Это модульный локальный видеорегистратор (NVR), который упакован в Docker и нацелен на баланс между удобным графическим интерфейсом и адекватным потреблением ресурсов.
Что под капотом
Архитектурно система разделена на четыре понятных микросервиса:
- Frontend: SPA на React и Vite с чистым интерфейсом и поддержкой мобильных устройств.
- Backend: сервис на FastAPI, который берет на себя авторизацию, выдачу токенов, аудит и раздачу медиапотоков через защищенные cookie.
- VibeEngine: собственный движок обработки видео на Python. Он использует PyAV и FFmpeg для забора RTSP-потоков, OpenCV для детекции движения и TFLite или YOLOv8 для распознавания объектов.
- Database: стандартный PostgreSQL для хранения событий, логов и настроек камер.
Разработчик честно пишет в README, что это проект формата vibe coding, однако кодовая база выглядит аккуратно, а функционал закрывает практически все бытовые потребности.
Чем проект интересен на практике
Трехступенчатый стриминг с низкой задержкой
Большинство веб-интерфейсов видеонаблюдения либо отдают тяжелый MJPEG, либо заставляют ждать буферизацию HLS по несколько секунд. Здесь инженеры пошли по пути адаптивного переключения:
- WebCodecs (WebSocket + H.264). Основной режим при работе через HTTPS или на localhost. Видео декодируется напрямую аппаратными средствами браузера с задержкой менее 200 миллисекунд.
- MSE через JMuxer. Если вы открыли панель по прямому локальному IP-адресу без SSL-сертификатов, система переключается на Media Source Extensions. Задержка возрастает примерно до полутора секунд, но картинка остается плавной с частотой 30 кадров в секунду.
- MJPEG Polling. Аварийный вариант для старых браузеров или каналов с жесткими потерями пакетов.
Запись без перекодирования
Если камера уже отдает поток в H.264 или H.265, пережимать его на процессоре сервера нет никакого смысла. Движок VibeNVR умеет сбрасывать входящий RTSP-поток напрямую на диск (Direct Stream Copy). За счет этого процессор домашнего микросервера или NAS почти не нагружается.
При этом поддерживается работа с двумя потоками одновременно. На сетку мониторинга выводится легкий субпоток низкого разрешения, а в архив пишется основной поток максимального качества.
Гибкая детекция и нейросети
Обработку движения можно настроить под имеющееся железо. Есть три варианта:
- классический OpenCV по изменению пикселей в кадре с возможностью задать маски исключения;
- ONVIF Edge, когда анализ делает сама камера и шлет сигнал на сервер;
- ИИ-детекторы YOLOv8 или MobileNet SSD v2 с фильтрацией людей, машин и животных.
Если подключить ускоритель Google Coral Edge TPU, распознавание объектов происходит почти мгновенно без нагрева CPU. При этом в настройках есть общий рубильник: если отключить ИИ целиком, тяжелые модели просто выгружаются из оперативной памяти.
Интерфейс и возможности интеграции
Внутри веб-панели есть все, к чему привыкли пользователи современных систем: таймлайн событий с фильтрацией по типам распознанных объектов, поиск камер в локальной сети через ONVIF, управление поворотными камерами (PTZ) и настройка зон приватности.
| Экран входа | Просмотр архива |
|:---:|:---:|
|
|
|
| Сетка камер | Таймлайн событий |
|:---:|:---:|
|
|
|
Для умного дома предусмотрен встроенный MQTT-клиент с поддержкой автообнаружения в Home Assistant. Статусы камер, детекция движения и распознанные метки объектов сразу улетают в топики брокера.
| Сканер сети | Группы камер |
|:---:|:---:|
|
|
|
Как развернуть
Поднимается комплекс стандартно через Docker Compose.
Сначала скачиваем конфигурационный файл:
git clone https://github.com/spupuz/VibeNVR.git
cd VibeNVR
Копируем файл окружения и задаем надежные ключи:
cp .env.example .env
В файле .env обязательно нужно заполнить SECRET_KEY и WEBHOOK_SECRET строками длиной не менее 32 символов, иначе приложение откажется запускаться в целях безопасности. Также тут можно выбрать тип аппаратного ускорения (HW_ACCEL_TYPE=intel, nvidia или amd).
Запуск выполняется одной командой:
docker compose -f docker-compose.prod.yml up -d
Интерфейс по умолчанию будет доступен на порту 8080. Для нормальной работы WebCodecs и минимальной задержки видео разработчики рекомендуют закрыть сервис обратным прокси-сервером (например, Nginx Proxy Manager) и выпустить SSL-сертификат.
| Общие настройки камеры | Настройка детекции движения |
|:---:|:---:|
|
|
|
| Системные параметры | Каналы уведомлений |
|:---:|:---:|
|
|
|
Тонкости при установке на NAS и Proxmox
В документации отдельно описана частая проблема с правами на ядрах Proxmox (pve-kernel), системах OpenMediaVault, Synology и QNAP. Из-за ограничений AppArmor и seccomp контейнеры PostgreSQL или backend могут падать с ошибкой PermissionError: [Errno 13].
Лечится это добавлением параметров безопасности в docker-compose.yml:
security_opt:
- seccomp:unconfined
- apparmor:unconfined
В крайнем случае можно выставить privileged: true, но для изолированных систем первого варианта обычно достаточно.
Мобильный интерфейс
Веб-приложение адаптировано под экраны смартфонов. Отдельное нативное приложение ставить не требуется: интерфейс корректно масштабирует сетку камер, карточки аналитики и полосу таймлайна.
| Дашборд на телефоне | Мобильный Live View | Мобильный таймлайн |
|:---:|:---:|:---:|
|
|
|
|
Кому подойдет проект
VibeNVR отлично впишется в домашний сервер или небольшой офис, где нужно подключить от 2 до 15 IP-камер без лишних затрат. Если вам надоело вручную прописывать потоки в текстовых файлах Frigate и хочется удобной веб-панели с человеческим поиском записей, проект определенно стоит пощупать. Лицензия MIT дает полную свободу для экспериментов.
Исходный код и инструкции по настройке доступны в репозитории проекта на GitHub.
