« ZoneMinder » : différence entre les versions

De Le Wiki de Lug
Aller à la navigation Aller à la recherche
Ligne 218 : Ligne 218 :
  zmsrv0:~# apt install software-properties-common
  zmsrv0:~# apt install software-properties-common
  zmsrv0:~# add-apt-repository ppa:iconnor/zoneminder-master
  zmsrv0:~# add-apt-repository ppa:iconnor/zoneminder-master
On install ZoneMinder sans MariaDB/MySQL :
On installe ZoneMinder sans MariaDB/MySQL :
  zmsrv0:~# apt update
  zmsrv0:~# apt update
  zmsrv0:~# apt install zoneminder mysql-server*-
  zmsrv0:~# apt install zoneminder mysql-server*-
Ligne 289 : Ligne 289 :
   | texte  = <font color = violet>nom_serveur_zoneminder</font> nom unique du serveur sur lequel est effectué la modification, servira pour attribuer le serveur en charge de chaques caméras.
   | texte  = <font color = violet>nom_serveur_zoneminder</font> nom unique du serveur sur lequel est effectué la modification, servira pour attribuer le serveur en charge de chaques caméras.
  }}
  }}
== Base de données ==
== Base de données ==
{{Méta bandeau
{{Méta bandeau

Version du 8 juin 2021 à 16:30

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 root -p
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 : zmsrv0, zmsrv1...
  • 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 :

zmsrv0:~# apt update && apt upgrade
zmsrv0:~# 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 :

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

On installe ZoneMinder sans MariaDB/MySQL :

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

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

zmsrv0:~# adduser www-data video

On règle le fuseau horaire de PHP :

zmsrv0:~# 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 :

zmsrv0:~# timedatectl set-timezone Europe/Paris

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

zmsrv0:~# a2enconf zoneminder
zmsrv0:~# a2enmod rewrite headers expires ssl
zmsrv0:~# a2ensite default-ssl
zmsrv0:~# 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) :

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

On configure ZoneMinder :

zmsrv0:~# 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 :
zmsrv0:~# 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 :

zmsrv0:~# 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 les paramètres correspondants à tous les 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.

Accès Internet Via Reverse-Proxy Nginx

Pour accéder, depuis Internet, à une installation multiserveurs de ZoneMinder, il faut que tous les serveurs soient individuellement joignable depuis le Net (les flux vidéos sont distribués directement par le serveur en charge de la caméra idoine). Dans cet exemple nous utiliseront simplement un reverse-proxy avec un nom de domaine pour chaque serveur (exemple: zoneminder.exemple.net, zoneminder2.exemple.net..)

Un zolie plan réseau d'ezemple !

Configuration ZoneMinder

Depuis l'interface web de l'un des serveurs, connecté avec l'utilsateur "admin", se rendre dans "Options" -> "Servers" et modifier le nom d'hote de tous les serveurs :

Exemple de configuration.. Autre exemple..

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/;
            proxy_buffering off;
    }

    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;

}