ZoneMinder

De Le Wiki de Lug
Aller à la navigation Aller à la recherche

Source

# apt update && apt upgrade
# apt install software-properties-common
# add-apt-repository ppa:iconnor/zoneminder-master
# apt install zoneminder
# adduser www-data video
# mysql_secure_installation
# vi  /etc/zm/zm.conf
# ZoneMinder database password
ZM_DB_PASS=zmpass
# mysql -u root -p
mysql> ALTER USER 'zmuser'@'localhost' IDENTIFIED BY 'mdpnouveau';
mysql> FLUSH PRIVILEGES;
mysql> exit
# vi /etc/php/7.4/apache2/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Madrid
# timedatectl set-timezone Europe/Madrid
# a2enconf zoneminder
# a2enmod rewrite
# a2enmod headers
# a2enmod expires
# a2enmod ssl
# a2ensite default-ssl
# systemctl enable zoneminder
# service zoneminder start
# service apache2 reload
# apt install php7.4-fpm
# a2enconf php7.4-fpm
# systemctl reload apache2


Autentification

Options -> System -> OPT_USE_AUTH

multicast

source

MIN_STREAMING_PORT 30000
# vi /etc/apache2/ports.conf
...
<IfModule ssl_module>
        Listen 443
        Listen 30000
        Listen 30001
        Listen 30002
        Listen 30003
        Listen 30004
        ...
        ...
</IfModule>
...
# vi /etc/apache2/sites-enabled/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443 *:30000 *:30002 *:30004 ... >
                ServerAdmin webmaster@localhost
...
# service apache2 restart

NGINX Reverse Proxy

Vhost

  • Penser à rediriger la plage de ports multicast de votre routeur sur le proxy...
 server {
    if ($host = zoneminder.exemple.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


listen 80;
    listen [::]:80;
    server_name     zoneminder.exemple.net;
   # return 404;
    return 301 https://$host$request_uri;


}

server {
server_name     zoneminder.exemple.net;
    error_page 403  https:/zoneminder.exemple.net;

    location / {
       return 301 /zm/;
   }

    location / {
            client_max_body_size 0; ##no limites :)
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Protocol $scheme;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_pass https://ADRESS_IP_ZONEMINDER/zm/;
    }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    listen 30000 ssl;
    listen 30001 ssl;
    listen 30002 ssl;
    listen 30003 ssl;
    listen 30004 ssl; # Ports multicast
...
...
    ssl_certificate /etc/letsencrypt/live/zoneminder.exemple.net/fullchain.pem; # managed by Certbot  
    ssl_certificate_key /etc/letsencrypt/live/zoneminder.exemple.net/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;                               
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;                                 
    add_header Strict-Transport-Security "max-age=31536000" always;                
    ssl_trusted_certificate /etc/letsencrypt/live/zoneminder.exemple.net/chain.pem;
    ssl_stapling on;       
    ssl_stapling_verify on;

}

NVR TVT

Minimum à remplir :

  • General :

name: un_nom

Source Type: ffmpeg

Function: choisir fonction souhaitée (Description uniquement disponlible avec le serveur en anlais chez moi, penser à régler le langage de ce compte sur "en_us" dans "Option" -> "Users" -> "admin*" -> "Language")

  • Source :

Source Path : rtsp://utilisateur:motdepasse@IP_ADRESSE_OU_DNS:554/?chID=NUMERO_CAMERA&streamType=main&linkType=tcp

Capture Resolution (pixels): 1080P (reel :960x1072)

Installation

Ubuntu Sever 20.04

# apt update && apt upgrade
# apt install apache2 php mariadb-server php-mysql libapache2-mod-php
# mysql_secure_installation
# apt install software-properties-common
# add-apt-repository ppa:iconnor/zoneminder-master
Press [ENTER] to continue or Ctrl-c to cancel adding it.

Entrée pour valider

# apt update
# apt install zoneminder
# vi  /etc/zm/zm.conf
# ZoneMinder database password
ZM_DB_PASS="nouveaumotdepasse"
# mysql -U
mysql> ALTER USER 'zmuser'@'localhost' IDENTIFIED BY 'nouveaumotdepasse';
mysql> FLUSH PRIVILEGES;
mysql> exit
# vi /etc/php/7.4/apache2/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Paris
# timedatectl set-timezone Europe/Paris
# adduser www-data video
# a2enconf zoneminder
# a2enmod cgi
# a2enmod rewrite
# a2enmod headers
# a2enmod expires
# a2enmod ssl
# a2ensite default-ssl
# service apache2 reload
# systemctl enable zoneminder
# service zoneminder start

Optimisation MYSQL

Source

ZoneMinder Multi-Serveurs

Source

Dans cet exemple:

  • Serveur ZoneMinder : znsrv0, znsrv1...
  • Serveur MariaDB (SQL) : zmdatabase

Serveur de Fichier

Tous les serveurs ZoneMinder doivent partager le même dossier "events". Ici, sous Ubuntu, le dossier est " /var/cache/zoneminder/events ".

Serveur ZoneMinder

On installe les dépendances :

znsrv0:~# apt update && apt upgrade
znsrv0:~# apt install apache2 php php-mysql libapache2-mod-php

On installe "software-properties-common" si nécessaire et on ajoute le dépôt "iconnor/zoneminder-master" aux sources :

znsrv0:~# apt install software-properties-common
znsrv0:~# add-apt-repository ppa:iconnor/zoneminder-master

On install ZoneMinder sans MariaDB/MySQL :

znsrv0:~# apt update
znsrv0:~# apt install zoneminder mysql-server*-

On ajoute l'utilisateur de Apache au groupe "video" :

znsrv0:~# adduser www-data video

On règle le fuseau horaire de PHP :

znsrv0:~# vi /etc/php/7.4/apache2/php.ini
...
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Paris
...

Egalement celui du système :

znsrv0:~# timedatectl set-timezone Europe/Paris

On active ZoneMinder sur Apache avec divers modules, ssl, etc..

znsrv0:~# a2enconf zoneminder
znsrv0:~# a2enmod rewrite headers expires ssl
znsrv0:~# a2ensite default-ssl
znsrv0:~# service apache2 reload

Il faut également configurer Apache pour pouvoir lire plus de 6 flux simultanément, dans cet exemple on utilise les port 30.000 et au dessus, en fonction du nombre de caméras (1 port par caméra) :

znsrv0:~# vi /etc/apache2/ports.conf
...
<IfModule ssl_module>
        Listen 443
        Listen 30000
        Listen 30001
        Listen 30002
        Listen 30003
        Listen 30004
        ...
        ...
</IfModule>
...
znsrv0:~# vi /etc/apache2/sites-enabled/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443 *:30000 *:30002 *:30004 ... >
                ServerAdmin webmaster@localhost
...
znsrv0:~# service apache2 reload

On configure ZoneMinder :

znsrv0:~# vi /etc/zm/zm.conf
...
# Acceptable formats include hostname[:port], ip_address[:port], or localhost:unix_socket
ZM_DB_HOST=IP_OU_HOSTNANE_BASE_DE_DONNEES
...
...
# ZoneMinder database password
ZM_DB_PASS="supermotdepassebdd"
...
...
# in the Servers tab under Options
ZM_SERVER_HOST=nom_serveur_zoneminder

Base de données

On installe MariaDB en fonction de sa distribution, exemple avec Alpine Linux :

zmdatabase:~# apk update && apk upgrade
zmdatabase:~# apk add mariadb mariadb-common mariadb-client
zmdatabase:~# service mariadb setup
zmdatabase:~# rc-update add mariadb default
zmdatabase:~# service mariadb start

On sécurise MariaDB :

zmdatabase:~# mysql_secure_installation
Set root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
... Success!

On configure mariaDB pour écouter sur le réseau :

zmdatabase:~# vi /etc/my.cnf.d/mariadb-server.cnf
  • On commente la ligne suivante pour ne pas ignorer le réseau :
...
[mysqld]
#skip-networking
...
  • Puis on décommente la ligne suivante pour écouter le réseau :
...
bind-address=0.0.0.0
...
zmdatabase:~# service mariadb restart

Pour créer la base de données il faut d'abord récupérer les fichiers "/usr/share/zoneminder/db/zm_create.sql" et "/usr/share/zoneminder/db/triggers.sql" sur un serveur ZoneMinder :

  • Sur le serveur MariaDB on crée d'abord le chemin des fichiers :
zmdatabase:~# mkdir -p /usr/share/zoneminder/db
  • Sur un serveur ZoneMinder on exporte les fichiers sql :
znsrv0:~# scp /usr/share/zoneminder/db/* IP_SERVEUR_MARIADB:/usr/share/zoneminder/db/

De retour sur le serveur MariaDB on crée la base de données à l'aide du fichier récupéré :

zmdatabase:~# mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql

Puis on crée et autorise un utilisateur pour accéder à la base de données "zm" depuis un réseau (ici depuis 192.168.1.X) :

zmdatabase:~# mysql -u root -p -e "grant all on zm.* to 'zmuser'@'192.168.1.%' identified by 'supermotdepassebdd';"
zmdatabase:~# mysql -u root -p -e "flush privileges;"

Lancement et fin de la configuration des Serveurs ZoneMinder

Sur tous les serveurs ZoneMinder on active au démarrage et immédiatement le service idoine :

znsrv0:~# systemctl enable --now zoneminder

On se rend avec son navigateur favori sur l'un des serveur via "https://IP_SERVEUR_ZONEMINDER/zm" et on valide la charte de confidentialité :

On valide la charte de confidentialité..

Se rendre dans "Options" -> "Servers" -> "ADD NEW SERVER" :

Menu pour ajouter les serveurs

On peuple le formulaire d'ajout avec els paramètres correspondants à ses serveurs :

Formulaire d'ajout de serveur..

On répète l'opération pour tous les serveurs puis on active les ports de flux vidéo dans "options" -> "Network" -> "MIN_STREAMING_PORT" :

Exemple avec le port 30.000

Le cluster est prêt, il faudra penser à activer l'authentification pour protéger l'accès et distribuer la gestion des caméras entre les serveurs pour équilibrer la charge, enfin on peut créer un vhost si l'on souhaite utiliser un reverse-proxy, il suffira de le rediriger sur l'un des serveurs.

VHost pour Reverse-Prox Nginx

 server {
    if ($host = zoneminder.exemple.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


listen 80;
    listen [::]:80;
    server_name     zoneminder.exemple.net;
   # return 404;
    return 301 https://$host$request_uri;


}

server {
server_name     zoneminder.exemple.net;
    error_page 403  https:/zoneminder.exemple.net;

    location / {
       return 301 /zm/;
   }

    location / {
            client_max_body_size 0; ##no limites :)
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Protocol $scheme;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_pass https://ADRESSE_IP_ZONEMINDER/zm/;
    }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    listen 30000 ssl;
    listen 30001 ssl;
    listen 30002 ssl;
    listen 30003 ssl;
    listen 30004 ssl; # Ports multicast
...
...
    ssl_certificate /etc/letsencrypt/live/zoneminder.exemple.net/fullchain.pem; # managed by Certbot  
    ssl_certificate_key /etc/letsencrypt/live/zoneminder.exemple.net/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;                               
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;                                 
    add_header Strict-Transport-Security "max-age=31536000" always;                
    ssl_trusted_certificate /etc/letsencrypt/live/zoneminder.exemple.net/chain.pem;
    ssl_stapling on;       
    ssl_stapling_verify on;

}