>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
JavaScript

VibeNVR ou Comment Configurer une Vidéosurveillance Locale Sans Cloud et Sans Souffrance

VibeNVR Logo

Quiconque a essayé de configurer une vidéosurveillance domestique sur ses propres serveurs connaît cette galère. Le bon vieux ZoneMinder ressemble à une relique de la fin des années 90. Shinobi fait des siennes périodiquement avec des fuites mémoire. Frigate est cool et performant, mais éditer manuellement des fichiers YAML interminables juste pour ajouter une caméra, ça devient vite épuisant. Les solutions cloud comme Tuya ou Xiaomi sont encore pires : frais d'abonnement pour le stockage des archives et risque de perdre les enregistrements quand internet tombe, ça n'attire guère les passionnés.

Récemment, je suis tombé sur un projet intéressant appelé VibeNVR. C'est un NVR local modulaire packagé dans Docker, conçu pour allier une interface utilisateur conviviale à une consommation de ressources raisonnable.

VibeNVR Demo

Sous le capot

L'architecture est clairement divisée en quatre microservices :

  • Frontend : SPA construite avec React et Vite, offrant une interface épurée et un support mobile.
  • Backend : service FastAPI gérant l'autorisation, l'émission de tokens, la journalisation d'audit et le streaming média via des cookies sécurisés.
  • VibeEngine : moteur personnalisé de traitement vidéo en Python. Il utilise PyAV et FFmpeg pour l'ingestion de flux RTSP, OpenCV pour la détection de mouvement, et TFLite ou YOLOv8 pour la reconnaissance d'objets.
  • Base de données : PostgreSQL standard pour stocker les événements, les logs et les paramètres des caméras.

Le développeur indique honnêtement dans le README que c'est un projet de vibe coding, mais la base de code semble propre et les fonctionnalités couvrent pratiquement tous les besoins du quotidien.

Ce qui rend ce projet intéressant en pratique

Streaming adaptatif à trois niveaux avec faible latence

La plupart des interfaces web de surveillance servent soit du MJPEG lourd, soit vous forcent à attendre plusieurs secondes pour le buffering HLS. Ici, les ingénieurs ont opté pour une commutation adaptative :

  1. WebCodecs (WebSocket + H.264). Mode principal en HTTPS ou sur localhost. La vidéo est décodée directement par le matériel du navigateur avec moins de 200 millisecondes de latence.
  2. MSE via JMuxer. Si vous avez ouvert le panneau via une adresse IP locale directe sans certificats SSL, le système bascule sur Media Source Extensions. La latence passe à environ une seconde et demie, mais l'image reste fluide à 30 images par seconde.
  3. Polling MJPEG. Option de repli pour les navigateurs legacy ou les canaux avec des pertes de paquets importantes.

Enregistrement sans transcodage

Si votre caméra diffuse déjà en H.264 ou H.265, il n'y a aucune raison de la ré-encoder sur le CPU du serveur. Le moteur VibeNVR peut sauvegarder le flux RTSP entrant directement sur le disque (Direct Stream Copy). Cela maintient le CPU d'un microserveur domestique ou d'un NAS presque inactif.

Dans le même temps, il prend en charge le travail avec deux flux simultanément. La grille de surveillance affiche un sous-flux léger basse résolution, tandis que l'archive enregistre le flux principal en qualité maximale.

Détection flexible et réseaux de neurones

Le traitement des mouvements peut être configuré pour votre matériel existant. Trois options sont disponibles :

  • Classique OpenCV basé sur les changements de pixels dans l'image, avec la possibilité de définir des masques d'exclusion ;
  • ONVIF Edge, quand la caméra effectue elle-même l'analyse et envoie un signal au serveur ;
  • Détecteurs IA YOLOv8 ou MobileNet SSD v2 avec filtrage pour les personnes, véhicules et animaux.

Si vous connectez un accélérateur Google Coral Edge TPU, la reconnaissance d'objets se fait presque instantanément sans faire monter la température du CPU. Il y a un interrupteur principal dans les paramètres : si vous désactivez complètement l'IA, les modèles lourds sont simplement déchargés de la RAM.

Dashboard

Interface et capacités d'intégration

Le panneau web dispose de tout ce que les utilisateurs des systèmes modernes attendent : une timeline d'événements avec filtrage par types d'objets reconnus, découverte des caméras sur le réseau local via ONVIF, contrôle des caméras PTZ et configuration des zones de confidentialité.

| Écran de connexion | Lecture des archives | |:---:|:---:| | Login | Video Playback |

| Grille des caméras | Timeline d'événements | |:---:|:---:| | Live View | Timeline |

Pour les passionnés de domotique, il y a un client MQTT intégré avec support de la découverte automatique Home Assistant. Les statuts des caméras, les événements de détection de mouvement et les labels d'objets reconnus sont immédiatement publiés sur les topics du broker.

| Scanner réseau | Groupes de caméras | |:---:|:---:| | Scanner | Groups |

Comment déployer

Le stack se déploie de manière standard via Docker Compose.

Premièrement, téléchargez le fichier de configuration :

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

Copiez le fichier d'environnement et définissez des clés robustes :

cp .env.example .env

Dans le fichier .env, vous devez remplir SECRET_KEY et WEBHOOK_SECRET avec des chaînes d'au moins 32 caractères, sinon l'application refusera de démarrer pour des raisons de sécurité. Vous pouvez également sélectionner le type d'accélération matérielle ici (HW_ACCEL_TYPE=intel, nvidia ou amd).

Le démarrage se fait avec une seule commande :

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

Par défaut, l'interface sera disponible sur le port 80. Pour un bon fonctionnement des WebCodecs et une latence vidéo minimale, les développeurs recommandent de sécuriser le service avec un reverse proxy (comme Nginx Proxy Manager) et de délivrer un certificat SSL.

| Paramètres généraux de la caméra | Paramètres de détection de mouvement | |:---:|:---:| | Config General | Config Motion |

| Paramètres système | Canaux de notification | |:---:|:---:| | System Settings | Notifications |

Subtilités d'installation sur NAS et Proxmox

La documentation aborde spécifiquement un problème courant avec les permissions sur les noyaux Proxmox (pve-kernel), OpenMediaVault, Synology et QNAP. En raison des restrictions AppArmor et seccomp, les conteneurs PostgreSQL ou backend peuvent planter avec le code de sortie PermissionError: [Errno 13].

Cela se corrige en ajoutant des paramètres de sécurité dans docker-compose.yml :

security_opt:
  - seccomp:unconfined
  - apparmor:unconfined

En dernier recours, vous pouvez définir privileged: true, mais pour les systèmes isolés, la première option est généralement suffisante.

Interface mobile

L'application web est adaptée aux écrans de smartphones. Aucune application native séparée n'est nécessaire : l'interface redimensionne correctement la grille des caméras, les cartes d'analytique et la barre de timeline.

| Tableau de bord téléphone | Vue en direct mobile | Timeline mobile | |:---:|:---:|:---:| | Mobile Dashboard | Mobile Live View | Mobile Timeline |

À qui s'adresse ce projet

VibeNVR s'installe parfaitement sur un serveur domestique ou un petit bureau needing to connect 2 à 15 caméras IP sans coûts excessifs. Si vous en avez assez de configurer manuellement les flux dans les fichiers texte de Frigate et voulez un panneau web pratique avec une recherche d'enregistrements conviviale, ce projet mérite définitivement d'être essayé. La licence MIT vous donne une liberté totale pour expérimenter.

Le code source et les instructions d'installation sont disponibles dans le dépôt du projet sur GitHub.

Projets similaires