[Linux] - Video surveillance avec motion et motion-UI

Motion-UI est une interface web (User Interface) développée pour gérer plus aisémment le fonctionnement et la configuration de motion, un célèbre logiciel open-source de détection de mouvement généralement utilisé pour faire de la vidéo surveillance.

Il s’agit d’un projet open-source disponible sur github : https://github.com/lbr38/motion-UI

Présentation

L’interface se présente comme étant très simpliste et responsive, ce qui permet une utilisation depuis un mobile sans avoir à installer une application. Les gros boutons principaux permettent d’exécuter des actions avec précision sur mobile même lorsque la vision n’est pas optimale (soleil, mouvements…).

Elle permet en outre de mettre en place des alertes mail en cas de détection et d’activer automatiquement ou non la vidéo-surveillance en fonction d’une plage horaire ou de la présence de périphériques « de confiance » sur le réseau local (smartphone…).



L’interface web se décompose en deux parties :

  • Une partie dédiée à motion, permettant de démarrer/stopper le service ou de configurer des alertes en cas de détection. Quelques graphiques permettent de résumer l’activité récente du service et des évènements (events) aillant eu lieu, avec également la possibilité de visualiser les images ou vidéos capturées directement depuis la page web.

  • Une partie dédiée à la visualisation en direct (image par image raffraichie toutes les X secondes) de caméras http sur le réseau local. Les caméras sont alors disposées en grilles à l’écran (du moins sur un écran PC) un peu à la manière des écrans de vidéo-surveillance d’un établissement par exemple.

Pré-requis

Motion-UI doit être installé sur le même hôte/serveur exécutant le service motion.

L’installation préconisée est de dédier un serveur uniquement à l’exécution de motion et de motion-UI, et qu’il soit le point d’entrée unique pour la vidéo surveillance sur le réseau local : les caméras diffusent leur stream au serveur et c’est le serveur qui analyse les images et détecte d’éventuels mouvements et avertit l’utilisateur. La visualisation des caméras se fait également par le biais du serveur depuis l’interface motion-UI. C’est ce cas de figure qui sera détaillé ici.

  • Le paquet motion doit être installé (version minimale >= 4.2)

  • Un serveur web nginx doit être à minima configuré

  • Une version récente de php-fpm (PHP 8.1 par ex.).

  • Quelques dépendances pour motion-UI, pour sa base de données, pour l’envoi de mail de notification et cas de détection et afin qu’il puisse récupérer ses dernières mises à jour depuis github

Installer les dépendances :

apt/yum install motion sqlite3 mutt curl

Installer nginx et PHP si ce n’est pas déjà fait :

# Debian (il faut au prélable installer un repo de paquets pour PHP8.1, trouvable sur internet)
apt install nginx php8.1-fpm php8.1-cli php8.1-sqlite3 php8.1-curl

# RHEL/CentOS (il faut au prélable installer un repo de paquets pour PHP8.1, fourni par Remi Collet)
yum install nginx php-fpm php-cli php-pdo php-curl

Si vous souhaitez pouvoir vous rendre sur motion-UI depuis l’extérieur, il faudra également :

  • Un nom de domaine avec un enregistrement DNS pointant vers l’adresse IP publique de votre box.

  • Il faudra mettre en place les redirections de ports qui vont bien depuis l’interface de votre box/routeur, ainsi que les règles de pare-feu n’autorisant que vous même à vous connecter à l’interface web motion-UI.

Installation

Installer le paquet git si ce n’est pas déjà fait :

apt/yum install git

Cloner le projet motion-UI :

git clone https://github.com/lbr38/motion-UI.git

Exécuter le script d’installation et se laisser guider. Le script nécessite des droits sudo car il devra être en mesure de créer le répertoire où seront stockées les sources web (par défaut /var/www/motionui), de créer le répertoire où seront stockées les données (/var/lib/motionui) ainsi que de créer un service systemd “motionui” :

cd motion-UI
sudo ./motionui --install

Une fois l’installation terminée, il ne reste plus qu’à mettre en place un vhost qui diffusera l’interface web de motion-UI.

Vhost nginx

Je ne peux pas détailler la configuration générale de nginx et PHP mais voici l’exemple de vhost nginx préconisé permettant de servir motion-UI.

Créer un nouveau fichier de vhost dans le répertoire dédié.

Insérer le contenu suivant en adaptant certaines valeurs :

  • Le chemin vers le socket unix dédié à PHP

  • La valeur de la variable $WWW_DIR = indiquer le répertoire racine où vous avez choisi de stocker les sources web de motion-UI (notamment demandé lors de l’installation avec le script d’installation)

  • Le paramètre SERVER-IP = l’adresse IP du serveur nginx

  • Les paramètres SERVERNAME.MYDOMAIN.COM = le nom de domaine dédié à motion-UI

  • Les chemins vers le certificat SSL et clé privée associée

# Path to unix socket
upstream php-handler {
    server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
    listen SERVER-IP:80;
    server_name SERVERNAME.MYDOMAIN.COM;

    # Force https
    return 301 https://$server_name$request_uri;

    # Path to log files
    access_log /var/log/nginx/SERVERNAME.MYDOMAIN.COM_access.log;
    error_log /var/log/nginx/SERVERNAME.MYDOMAIN.COM_error.log;
}

server {
    # Set motion-UI web directory location
    set $WWW_DIR '/var/www/motionui'; # default is /var/www/motionui

    listen SERVER-IP:443 ssl;
    server_name SERVERNAME.MYDOMAIN.COM;

    # Path to log files
    access_log /var/log/nginx/SERVERNAME.MYDOMAIN.COM_ssl_access.log combined;
    error_log /var/log/nginx/SERVERNAME.MYDOMAIN.COM_ssl_error.log;

    # Path to SSL certificate/key files
    ssl_certificate PATH-TO-CERTIFICATE.crt;
    ssl_certificate_key PATH-TO-PRIVATE-KEY.key;

    # Add headers to serve security related headers
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Path to motionui root dir
    root $WWW_DIR/public;

    # Enable gzip
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    location = /robots.txt {
        deny all;
        log_not_found off;
        access_log off;
    }

    location / {
        index index.php;
    }

    location ~ \.php$ {
        root $WWW_DIR/public;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        #include fastcgi.conf;
        fastcgi_param HTTPS on;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ \.(?:css|js|svg|gif|map|png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri $uri/ =404;
        access_log off;
    }
}

Redémarrer nginx pour appliquer la configuration et se rendre sur motion-UI depuis un navigateur web en se connectant avec les identifiants par défaut :

  • Login : admin

  • Mot de passe : motionui

Il est possible de modifier son mot de passe depuis l’espace utilisateur (en haut à droite).

Si un message indique que le service motionui n’est pas démarré, le démarrer depuis le terminal :

sudo systemctl start motionui

Configuration de motion

La version minimale du paquet motion doit être >= 4.2. Sans quoi certaines fonctionnalités de motion-UI seront indisponibles.

La configuration générale de motion est propre à chacun et à chaque utilisation. Par défaut motion met à disposition plusieurs fichiers de configuration :

  • motion.conf qui est le fichier de configuration principal

  • des fichiers de configuration supplémentaires, 1 pour chaque caméra.

La bonne pratique étant d’utiliser motion.conf pour la configuration générale et d’utiliser les fichiers de configuration supplémentaires pour configurer individuellement chaque caméra. Puis de faire prendre en compte ces fichiers de configuration par le fichier principal (voir tout en bas de motion.conf pour inclure des fichiers supplémentaires).

Pour chaque caméra :

  • veiller à préciser à minima un Id de caméra (camera_id).

  • veiller si possible et si la version de motion le prend en charge, de préciser un nom de caméra (camera_name).

  • veiller à préciser un répertoire de destination pour l’enregistrement des images et/ou vidéos et que celui-ci soit accessible en lecture et écriture au groupe motionui.

Voir la documentation de motion pour plus d’informations sur chaque paramètre : https://motion-project.github.io/motion_config.html#Configuration_OptionsAlpha

Paramétrer l’enregistrement des évènements

Pré-requis :

  • La version minimale du paquet motion doit être >= 4.2.

  • Le paramètre camera_id doit être configuré pour chaque caméra.

Motion propose plusieurs déclencheurs permettant d’exécuter une commande lorsqu’ils sont invoqués :

  • on_event_start = lorsqu’un nouvel évènement démarre

  • on_event_end = lorsqu’un évènement prend fin

  • on_motion_detected = lorsqu’un mouvement est détecté

  • on_movie_start = lorsqu’un nouveau fichier vidéo vient d’être généré suite à une détection

  • on_movie_end = lorsqu’un fichier vidéo a terminé sa génération suite à une détection

  • on_picture_save = lorsqu’une image a été générée suite à une détection

motion-UI propose de paramétrer automatiquement l’enregistrement des évènements (on_event_start) en base de données lorsqu’une nouvelle détection a lieu. Ces évènements deviennent alors visibles depuis l’interface motion-UI avec les images et vidéos associées.

L’enregistrement des évènement est également nécessaire pour la réception d’alertes mail (on reçoit une alerte lorsqu’un nouvel évènement a lieu).

Pour chaque fichier de caméra, utiliser le bouton Set up event registering pour paramétrer automatiquement l’enregistrement d’évènements :


Ceci aura pour effet de configurer les 3 paramètres de motion suivants :

  • on_event_start

  • on_event_end

  • on_movie_end

Tester l’enregistrement des évènements

Pour cela depuis l’interface motion-UI :

  • Démarrer manuellement motion (gros bouton power “Start capture”)

Depuis un terminal sur le serveur exécutant motion-UI, vérifier en continu l’état du service motionui pour s’assurer qu’il ne remonte pas de message d’erreur :

watch systemctl status motionui

Puis faire un mouvement devant une caméra pour déclencher un évènement.

Si tout se passe bien, un nouvel évènement en cours devrait apparaitre dans l’interface motion-UI.

Démarrage et arrêt automatique de motion

Il est possible de configurer deux types de démarrages et arrêts automatiques de motion :

  • En fonction des plages horaires renseignées pour chaque journée. Le service motion sera alors actif entre la plage d’horaire renseignée.

  • En fonction de la présence d’un ou plusieurs appareils IP connecté(s) sur le réseau local. Si aucun des appareils configurés n’est présent sur le réseau local alors le service motion démarrera, considérant que personne n’est présent au domicile. Motion-UI envoi régulièrement un ping pour déterminer si l’appareil est présent sur le réseau, il faut donc veiller à configurer des baux d’IP statiques depuis la box pour chaque appareil du domicile (smartphones).


Configurer les alertes

La configuration des alertes nécessite trois points de configuration :

  • Configurer le client mail mutt pour qu’il puisse envoyer des alertes depuis l’un de vos comptes mail (gmail, etc…)

  • L’enregistrement des évènements doit être paramétré (voir Paramétrer l’enregistrement des évènements)

  • Le service motionui doit être en cours d’exécution

Configuration de mutt

  • Utiliser le bouton Generate muttrc config template pour générer un nouveau fichier de configuration mutt. Ce fichier est créé dans /var/lib/motionui/.muttrc.

  • Entrer les informations concernant l’adresse mail qui sera émettrice des messages d’alertes ainsi que le mot de passe associé. Utiliser une adresse dédiée ou bien la même adresse qui recevra les mails (et qui s’enverra des alertes à elle même du coup).

  • Entrer les informations concernant le serveur SMTP à utiliser. Par défaut le template propose d’utiliser le smtp de gmail, ceci est valide uniquement si votre adresse mail émettrice est une adresse gmail. Sinon vous devrez chercher sur Internet les informations concernant le serveur SMTP à utiliser pour votre compte mail :


Configuration des créneaux d’alertes

  • Renseigner les créneaux horaires entre lesquels vous souhaitez recevoir des alertes si détection il y a. Pour activer les alertes toute une journée, il convient de renseigner 00:00 pour le créneau de début ET de fin.

  • Renseigner l’adresse mail destinataire qui recevra les alertes mails. Plusieurs adresses mails peuvent être spécifiées en les séparant par une virgule.


Tester les alertes

Une fois que les points précédemment évoqués ont été correctement configurés et que le service motionui est bien en cours d’exécution, il est possible de tester l’envoi d’alertes.

Pour cela depuis l’interface motion-UI :

  • S’assurer d’avoir activé les alertes (le gros bouton avec la cloche doit être rouge)

  • Désactiver provisoirement l’autostart de motion si activé

  • Démarrer manuellement motion (gros bouton power “Start capture”)

Depuis un terminal sur le serveur exécutant motion-UI, vérifier en continu l’état du service motionui pour s’assurer qu’il ne remonte pas de message d’erreur :

watch -n1 systemctl status motionui

Puis faire un mouvement devant une caméra pour déclencher une alerte.

Pour tout problème, n’hésitez pas à poser une question sur le dépôt du développeur ou à ouvrir une nouvelle issue :