ProjetsMini enregistreur NVR dockerisé

 Langue  

Mini enregistreur NVR dockerisé

Introduction

Mini stack Docker qui permet de facilement enregistrer, nettoyer et servir les enregistrements CCTV effectués via RTSP tout en utilisant un minimum de ressources.

Ce stack est principalement destiné à être utilisé comme solution de secours lorsque d'autres solutions plus complètes tombent en panne ou doivent être arrêtées.

Remarques

Ce stack enregistre les flux des caméras tels quels sans les ré-encoder.
Il consommera donc plus d'espace disque.
Référez-vous à la section "Exemple de statistiques d'utilisation" pour plus d'informations.

Il est aussi fortement recommandé de mettre le serveur web derrière un reverse-proxy si vous souhaitez le rendre accessible hors de votre réseau local.

Installation

L'entièreté de la configuration se fait via les variables d'environnement dans le fichier docker-compose.yml.

Cette étape ne devrait prendre que 2-3 minutes si vous avez déjà l'URL de flux RTSP sous la main.
Si vous ne l'avez pas, consultez le manuel d'utilisation de votre caméra et testez les URLs avec VLC.

Caméras

Chaque conteneur d'enregistrement doit se voir attribuer une URL de flux RTSP et un dossier unique dans lequel les enregistrements seront stockés.

L'URL doit être fourni via la variable d'environnement NP_CCTV_URL, et le dossier de sortie via un volume monté sous /data dans le conteneur.

Exemple
nvr_stack:
  cctv_recorder_cam1:
    container_name: cctv-recorder-cam1
    build:
      context: .
      dockerfile: Dockerfile_recorder
    environment:
      - TZ=Europe/Brussels
      - "NP_CCTV_URL=rtsp://user:password@address:554/sub-path"
    volumes:
      - ./recordings/cam1:/data
    restart: unless-stopped

L'exemple ci-dessus utilise l'URL rtsp://user:password@address:554/sub-path et stocke ses enregistrements dans ./recordings/cam1.

Nettoyeur

Le script de nettoyage nommé cleaner.py nécessite uniquement de définir une variable d'environnement nommée NP_MAX_FILE_AGE_HOURS, correspondant au nombre maximal d'heures pendant lesquelles un enregistrement doit être conservé.

Si cette variable n'est pas définie, le script supprimera automatiquement les enregistrements de plus de 72 heures.

Exemple
nvr_stack:
  cctv_cleaner:
    container_name: cctv-cleaner
    build:
      context: .
      dockerfile: Dockerfile_cleaner
    environment:
      - TZ=Europe/Brussels
      - "NP_MAX_FILE_AGE_HOURS=72"
    volumes:
      - ./recordings:/data
      - ./cleaner.py:/app/app.py:ro
    restart: unless-stopped

Interface Web

L'interface Web doit avoir une ligne de configuration pour chaque caméra que vous souhaitez rendre disponible.
Additionellement, vous pourrez aussi configurer le titre et le pied de page si vous le souhaitez.

Chaque caméra devra être référencée via une variable d'environnement au format suivant :
  NP_CAM_<camId> = <Nom de la caméra>

Voici un exemple pour cam1 si elle est nommée Caméra #1 :
  NP_CAM_cam1 = Caméra #1

docker-mini-cctv-nvr.commons.web.vars.title
Exemple
nvr_stack:
  cctv_web:
    container_name: cctv-web
    image: php:apache
    ports:
      - 26880:80
    environment:
      - TZ=Europe/Brussels
      - "NP_CAM_cam1=Camera #1"
      - "NP_CAM_cam2=Camera #2"
      - "NP_TITLE=NibblePoker's Mini CCTV NVR"
      - "NP_FOOTER=Made by <i>BOZET Herwin</i>"
    volumes:
      - ./htdocs:/var/www/html  # Cannot be ":ro" since the recordings are mounted into it.
      - ./apache2.conf:/etc/apache2/apache2.conf:ro
      - ./recordings:/var/www/html/data:ro
    restart: unless-stopped

Démarrage

Une fois la configuration du stack terminée, vous pouvez simplement exécuter la commande suivante :

docker-compose up --build -d

Captures d'écran

Exemple de statistiques d'utilisation

  • NanoPi R4S 4GB
    • Consomme 0.008 kWh / 8 Watts avec d'autres conteneurs et un HDD USB & SSD USB
  • 4 caméras IP
    • Tous les flux RTSP TCP en H.256 4K
    • Environ 220 Go de données par jour
      • Environ 20.4 Mbit/s ou 2.6 Mo/s
  • Moins de 200 Mo d'utilisation RAM
    • ~32 Mo par enregistreur
    • 4 Mo pour le nettoyeur
    • 4 Mo pour le serveur web
  • Utilisation moyenne d'environ 10 % du CPU sur 6 cœurs
    • Moyenne de 15 % par enregistreur
    • Moyenne de 1-5 % pour le nettoyeur et le serveur web

Licence

Ce logiciel, ainsi que la feuille de style Simplette CSS utilisée pour l'interface Web, sont tous deux sous licence Unlicense.

Liens

#docker#cctv#nvr