>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
JavaScript

VibeNVR, czyli jak skonfigurować lokalny monitoring bez chmur i cierpienia

VibeNVR Logo

Każdy, kto próbował skonfigurować domowy monitoring wideo na własnych serwerach, zna ten ból. Dobry stary ZoneMinder wygląda jak relikt z końca lat dziewięćdziesiątych. Shinobi co jakiś czas szaleje z wyciekami pamięci. Frigate jest cool i wydajny, ale ręczna edycja kilometrowych plików YAML tylko po to, żeby dodać jedną kamerę, szybko nuży. Rozwiązania chmurowe jak Tuya czy Xiaomi są jeszcze gorsze: opłaty abonamentowe za archiwum i ryzyko utraty nagrań przy awarii internetu rzadko przemawiają do entuzjastów.

Ostatnio natknąłem się na ciekawy projekt o nazwie VibeNVR. To modularny lokalny NVR spakowany w Dockerze, zaprojektowany tak, by zbalansować przyjazny interfejs z rozsądnym zużyciem zasobów.

VibeNVR Demo

Pod maską

Architektura jest czysto podzielona na cztery mikroserwisy:

  • Frontend: SPA zbudowane z React i Vite, z przejrzystym interfejsem i wsparciem mobilnym.
  • Backend: Usługa FastAPI obsługująca autoryzację, wydawanie tokenów, logowanie audytowe i streaming mediów przez bezpieczne ciasteczka.
  • VibeEngine: Własny silnik przetwarzania wideo w Pythonie. Wykorzystuje PyAV i FFmpeg do pobierania strumieni RTSP, OpenCV do wykrywania ruchu oraz TFLite lub YOLOv8 do rozpoznawania obiektów.
  • Baza danych: Standardowy PostgreSQL do przechowywania zdarzeń, logów i ustawień kamer.

Developer szczerze zaznacza w README, że to projekt vibe coding, jednak kod wygląda schludnie, a funkcjonalność pokrywa praktycznie wszystkie codzienne potrzeby.

Co czyni ten projekt interesującym w praktyce

Trójwarstwowy streaming o niskim opóźnieniu

Większość webowych interfejsów monitoringu albo serwuje ciężki MJPEG, albo zmusza do czekania kilku sekund na buforowanie HLS. Tutaj inżynierowie postawili na adaptacyjne przełączanie:

  1. WebCodecs (WebSocket + H.264). Podstawowy tryb przy pracy przez HTTPS lub na localhost. Wideo jest dekodowane bezpośrednio przez sprzętową obsługę przeglądarki z opóźnieniem poniżej 200 milisekund.
  2. MSE przez JMuxer. Jeśli otworzysz panel przez bezpośredni adres IP lokalny bez certyfikatów SSL, system przełącza się na Media Source Extensions. Opóźnienie wzrasta do około półtorej sekundy, ale obraz pozostaje płynny przy 30 klatkach na sekundę.
  3. Odpytywanie MJPEG. Opcja zapasowa dla starszych przeglądarek lub kanałów z poważną utratą pakietów.

Nagrywanie bez transkodowania

Jeśli twoja kamera już streamuje w H.264 lub H.265, nie ma sensu ponownie kodować jej na CPU serwera. Silnik VibeNVR może zapisywać przychodzący strumień RTSP bezpośrednio na dysk (Direct Stream Copy). To utrzymuje CPU domowego mikroserwera lub NAS niemal w spoczynku.

Jednocześnie obsługuje pracę z dwoma strumieniami jednocześnie. Siatka monitoringu wyświetla lekki podstrumień o niskiej rozdzielczości, podczas gdy archiwum nagrywa główny strumień w maksymalnej jakości.

Elastyczne wykrywanie i sieci neuronowe

Przetwarzanie ruchu można skonfigurować pod twoje istniejące urządzenia. Dostępne są trzy opcje:

  • Klasyczny OpenCV oparty na zmianach pikseli w kadrze, z możliwością ustawienia masek wykluczających;
  • ONVIF Edge, gdy kamera sama wykonuje analizę i wysyła sygnał do serwera;
  • Detektory AI YOLOv8 lub MobileNet SSD v2 z filtrowaniem ludzi, pojazdów i zwierząt.

Jeśli podłączysz akcelerator Google Coral Edge TPU, rozpoznawanie obiektów odbywa się niemal natychmiast, nie obciążając CPU. W ustawieniach jest główny przełącznik: jeśli całkowicie wyłączysz AI, ciężkie modele są po prostu usuwane z RAM.

Dashboard

Interfejs i możliwości integracji

Panel webowy ma wszystko, czego użytkownicy nowoczesnych systemów się spodziewają: oś czasu zdarzeń z filtrowaniem po typach rozpoznanych obiektów, wykrywanie kamer w sieci lokalnej przez ONVIF, sterowanie kamerami PTZ i konfiguracja stref prywatności.

| Ekran logowania | Odtwarzanie archiwum | |:---:|:---:| | Login | Video Playback |

| Siatka kamer | Oś czasu zdarzeń | |:---:|:---:| | Live View | Timeline |

Dla entuzjastów smart home jest wbudowany klient MQTT z obsługą auto-odkrywania Home Assistant. Statusy kamer, zdarzenia wykrycia ruchu i etykiety rozpoznanych obiektów są natychmiast publikowane w tematach brokera.

| Skaner sieci | Grupy kamer | |:---:|:---:| | Scanner | Groups |

Jak wdrożyć

Stack wdrażany jest standardowo przez Docker Compose.

Najpierw pobierz plik konfiguracyjny:

git clone https://github.com/spupuz/VibeNVR.git
cd VibeNVR

Skopiuj plik środowiskowy i ustaw silne klucze:

cp .env.example .env

W pliku .env musisz uzupełnić SECRET_KEY i WEBHOOK_SECRET ciągami znaków o długości co najmniej 32 znaków, w przeciwnym razie aplikacja odmówi startu ze względów bezpieczeństwa. Możesz tu też wybrać typ akceleracji sprzętowej (HW_ACCEL_TYPE=intel, nvidia lub amd).

Uruchomienie odbywa się jednym poleceniem:

docker compose -f docker-compose.prod.yml up -d

Domyślnie interfejs będzie dostępny na porcie 80. Dla prawidłowego działania WebCodecs i minimalnego opóźnienia wideo deweloperzy zalecają zabezpieczenie usługi reverse proxy (jak Nginx Proxy Manager) i wystawienie certyfikatu SSL.

| Ogólne ustawienia kamery | Ustawienia wykrywania ruchu | |:---:|:---:| | Config General | Config Motion |

| Parametry systemowe | Kanały powiadomień | |:---:|:---:| | System Settings | Notifications |

Niuanse instalacji na NAS i Proxmox

Dokumentacja szczególnie porusza częsty problem z uprawnieniami na jądrach Proxmox (pve-kernel), OpenMediaVault, Synology i QNAP. Z powodu ograniczeń AppArmor i seccomp kontenery PostgreSQL lub backendu mogą się zawieszać z kodem wyjścia PermissionError: [Errno 13].

Naprawia się to dodając parametry bezpieczeństwa do docker-compose.yml:

security_opt:
  - seccomp:unconfined
  - apparmor:unconfined

W ostateczności możesz ustawić privileged: true, ale dla izolowanych systemów pierwsza opcja zwykle wystarcza.

Interfejs mobilny

aplikacja webowa jest dostosowana do ekranów smartfonów. Nie jest potrzebna osobna natywna aplikacja: interfejs poprawnie skaluje siatkę kamer, karty analityki i pasek osi czasu.

| Panel telefonu | Podgląd na żywo mobilny | Oś czasu mobilna | |:---:|:---:|:---:| | Mobile Dashboard | Mobile Live View | Mobile Timeline |

Dla kogo jest ten projekt

VibeNVR idealnie sprawdza się na domowym serwerze lub w małym biurze potrzebującym podłączyć od 2 do 15 kamer IP bez nadmiernych kosztów. Jeśli masz dość ręcznego konfigurowania strumieni w plikach tekstowych Frigate i chcesz wygodnego panelu webowego z przyjaznym wyszukiwaniem nagrań, ten projekt zdecydowanie warto wypróbować. Licencja MIT daje ci pełną swobodę eksperymentowania.

Kod źródłowy i instrukcje konfiguracji są dostępne w repozytorium projektu na GitHub.

Powiązane projekty