admin@pi:~$ cat README

Свой NVR на одноплатнике.
Без облачной подписки

zorcam-nvr превращает Raspberry Pi и обычные IP-камеры в видеорегистратор: Live по WebRTC, детектор движения, ролики и снимки, push на iPhone, роли пользователей. Записи — на вашем диске. Python без фреймворков, ffmpeg, go2rtc, systemd. Исходники открыты для чтения.

python3 stdlibffmpeggo2rtcWebRTC systemddebian 13 · aarch64source-available
~/zorcam-nvr/app/install.sh
==> Packages
  OK  ffmpeg, python3-pil, python3-cryptography, curl
==> go2rtc 1.9.14
  OK  installed v1.9.14 (go2rtc_linux_arm64)
==> systemd
  restarted zorcam-nvr-go2rtc
  restarted zorcam-nvr-gallery
  restarted zorcam-nvr-capture
==> Verification
  OK  camera front connects, codec H.264
  OK  WebRTC listens on port 8555 (TCP and UDP)
  OK  gallery answers on port 80

Done. Now open http://192.168.1.60/ — the setup wizard asks for the cameras.

Как устроено

Три сервиса под systemd с watchdog и лимитами памяти. Одно подключение к каждой камере — у go2rtc; всё остальное берёт поток у него. Пароли камер не попадают в аргументы процессов.

 IP-камера ──RTSP──▶ go2rtc ──WebRTC :8555──────────────────▶ браузер / iPhone (Live)
   (H.264)            │   └─HLS (запасной)
                      │ rtsp://127.0.0.1:8554/<id>[.sub]
                      ▼
               zorcam-nvr-capture   процесс на камеру, надзиратель перезапускает зависшие
                 ffmpeg → JPEG ключевых кадров → детектор (1/8, серый, 160×90)
                 ├─ снимки на диск раз в N с
                 ├─ ролики: из кадров в памяти или из кусков потока без перекодирования
                 └─ сигнал галерее ──▶ zorcam-nvr-gallery :80
                                         http.server · роли · мастер · push (VAPID)
                                         мониторинг · очистка по срокам
            опционально: zorcam-nvr-cloud ── frpc / wss:443 ──▶ облако Zorcam (доступ извне)

// детектор

Анализирует только ключевые кадры: JPEG декодируется сразу в 1/8 и сравнивается в 160×90. Задержка реакции ≈ интервал ключевых кадров. Второй (облегчённый) поток камеры — для разгрузки Pi.

// надёжность

systemd watchdog, MemoryMax/CPUQuota в юнитах, нарастающая пауза переподключений, ограниченная очередь кодирования, временное — в /dev/shm, чтобы беречь SD.

// без зависимостей

Только стандартная библиотека Python и пакеты Debian (python3-pil, python3-cryptography, ffmpeg). Никаких pip, node и контейнеров на Pi.

// доступ

Роли admin / viewer / liveviewer, камеры видны только тем, кому разрешены. PBKDF2, сессии, CSRF.

// уведомления

Web Push (VAPID + RFC 8291) на iPhone с экрана «Домой»: движение по камере, проблемы и восстановление. Датчики движения для «Дома с Алисой».

// диагностика

diagnose.py читает журналы: просадки питания, троттлинг, SD-карта, счётчик high в memory.events. debug.sh save — архив без паролей.

Железо

Что проверено и на чём стоит пробовать. Видео плата не перекодирует (кроме роликов из ключевых кадров), поэтому важнее память и стабильное питание, чем частота.

ПлатаСтатусСколько камерЗаметки
Raspberry Pi 3B / 3B+проверено4–5 со вторым потоком1 ГБ: следите за high в памяти детектора. Блок питания от 2.5 А
Raspberry Pi 4 / 5должно работатьбольшеТот же Debian/Raspberry Pi OS 64-бит. Отчёты приветствуются
Orange Pi Zero 3 (2 ГБ)экспериментальнооценка: как Pi 3 и большеArmbian на Debian 12/13. Нет vcgencmd — данные о питании «n/a»; шаг установщика с cmdline.txt пропускается. Пока не проверено нами
x86 тонкий клиентдолжно работатьзависит от CPUDebian 13 amd64, установщик берёт go2rtc для x86_64
Pi Zero 2 Wмало памяти1–2512 МБ, без Ethernet

// камеры

  • RTSP, видео H.264 (H.265 — только запись «весь поток», не Live в браузере)
  • второй поток камеры (sub) сильно разгружает Pi
  • поиск по ONVIF прямо из мастера

// носитель

  • SD-карта работает, но запись на неё сведена к минимуму
  • для круглосуточной записи лучше USB-SSD
  • сроки хранения кадров и роликов — для каждой камеры

Установка

Raspberry Pi OS Lite (Debian 13, 64-бит), пользователь с sudo, интернет. Скрипт идемпотентный: повторный запуск обновляет только изменённое.

bash
# 1. скачать
sudo apt update && sudo apt install -y git
git clone https://github.com/davydovv-creator/zorcam-nvr-community.git ~/zorcam-nvr

# 2. поставить: пакеты, go2rtc, сервисы zorcam-nvr-*
~/zorcam-nvr/app/install.sh

# 3. открыть http://<ip-pi>/ — мастер: пароль admin, камеры

# обновить
cd ~/zorcam-nvr && git pull && ./app/install.sh

# что происходит
python3 ~/zorcam-nvr/app/diagnose.py
journalctl -u zorcam-nvr-capture -n 50
Первый релиз скоро. Исходники появятся в репозитории с релизом 2.6.0 — до этого там только соглашение участника. Пакет .deb и apt-репозиторий на zorcam.ru — следом: sudo apt install zorcam-nvr.

Лицензия и участие

Честно о модели: это source-available, а не open source. Код можно читать, ставить и бесплатно использовать на своих устройствах — в том числе в своём бизнесе. Нельзя продавать программу или устройства с ней и распространять изменённые сборки без договора. Issue и pull request принимаем: каждый PR читаем, но принять не обязаны; принятое переносится в основной репозиторий и выходит в следующем релизе. Для PR нужно подписать CLA — бот попросит сам.