« ZoneMinder » : différence entre les versions

De Le Wiki de Lug
Aller à la navigation Aller à la recherche
 
(36 versions intermédiaires par le même utilisateur non affichées)
Ligne 18 : Ligne 18 :
  ZM_DB_PASS='''zmpass'''
  ZM_DB_PASS='''zmpass'''


  # mysql -U
  # mysql -u root -p


  mysql> ALTER USER 'zmuser'@'localhost' IDENTIFIED BY 'mdpnouveau';
  mysql> ALTER USER 'zmuser'@'localhost' IDENTIFIED BY 'mdpnouveau';
Ligne 43 : Ligne 43 :
  # service apache2 reload
  # service apache2 reload


 
# apt install php7.4-fpm
# a2enconf php7.4-fpm
# systemctl reload apache2




Ligne 76 : Ligne 78 :
  # service apache2 restart
  # service apache2 restart
=NGINX Reverse Proxy=
=NGINX Reverse Proxy=
  # vi /etc/zm/conf.d/01-system-paths.conf
=Vhost=
* Penser à rediriger la plage de ports multicast de votre routeur sur le proxy...
 
  server {
    if ($host = <font color = blue>zoneminder.exemple.net</font>) {
        return 301 <nowiki>https</nowiki>://$host$request_uri;
    } # managed by Certbot
listen 80;
    listen [::]:80;
    server_name    <font color = blue>zoneminder.exemple.net</font>;
    # return 404;
    return 301 <nowiki>https://</nowiki>$host$request_uri;
}
server {
server_name    <font color = blue>zoneminder.exemple.net</font>;
    error_page 403  https:/<font color = blue>zoneminder.exemple.net</font>;
    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://<font color = blue>ADRESS_IP_ZONEMINDER</font>/zm/;
    }
    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    <font color = green>listen 30000 ssl;
    listen 30001 ssl;
    listen 30002 ssl;
    listen 30003 ssl;
    listen 30004 ssl;</font> # Ports multicast
<font color =grey>...</font>
<font color =grey>...</font>
    ssl_certificate /etc/letsencrypt/live/<font color = blue>zoneminder.exemple.net</font>/fullchain.pem; # managed by Certbot 
    ssl_certificate_key /etc/letsencrypt/live/<font color = blue>zoneminder.exemple.net</font>/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/<font color = blue>zoneminder.exemple.net</font>/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://<font color = blue>utilisateur</font>:<font color = blue>motdepasse</font>@<font color = blue>IP_ADRESSE_OU_DNS</font>:<font color = green>554</font>/?chID=<font color = blue>NUMERO_CAMERA</font>&streamType=<font color = green>main</font>&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=<font color = green>"</font>'''<font color = blue>nouveaumotdepasse</font>'''<font color = green>"</font>
 
# mysql -u root -p
 
mysql> ALTER USER 'zmuser'@'localhost' IDENTIFIED BY '<font color = blue>nouveaumotdepasse</font>';
mysql> FLUSH PRIVILEGES;
mysql> exit
 
# vi /etc/php/7.4/apache2/php.ini
 
[Date]
; Defines the default timezone used by the date functions
; <nowiki>http://php.net/date.timezone</nowiki>
date.timezone = <font color = blue>Europe/Paris</font>
 
# timedatectl set-timezone <font color = blue>Europe/Paris</font>
 
# 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 =
[https://wiki.zoneminder.com/MySQL Source]
 
= ZoneMinder Multi-Serveurs =
[https://zoneminder.readthedocs.io/en/stable/installationguide/multiserver.html 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==
{{Méta bandeau
  | niveau = modéré
  | icône = important
  | texte  = Procédure à effectuer sur tous les serveurs 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
 
<font color = grey>...</font>
[Date]
; Defines the default timezone used by the date functions
; <nowiki>http://</nowiki>php.net/date.timezone
<font color = blue>date.timezone = <font color = green>Europe</font>/<font color = green>Paris</font></font>
<font color = grey>...</font>
Egalement celui du système :
zmsrv0:~# timedatectl set-timezone <font color = blue>Europe</font>/<font color = blue>Paris</font>
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
 
<font color =grey>...</font>
<IfModule ssl_module>
        Listen 443
        <font color= blue>Listen 30000
        Listen 30001
        Listen 30002
        Listen 30003
        Listen 30004</font>
        <font color =grey>...</font>
        <font color =grey>...</font>
</IfModule>
<font color =grey>...</font>
 
zmsrv0:~# vi /etc/apache2/sites-enabled/default-ssl.conf
 
<IfModule mod_ssl.c>
        <VirtualHost _default_:443 <font color = blue>*:30000 *:30001 *:30002</font> <font color =grey>...</font> >
                ServerAdmin webmaster@localhost
<font color =grey>...</font>
 
zmsrv0:~# service apache2 reload
On configure ZoneMinder :
zmsrv0:~# vi /etc/zm/zm.conf
 
<font color =grey>...
# Acceptable formats include hostname[:port], ip_address[:port], or localhost:unix_socket</font>
ZM_DB_HOST=<font color = blue>IP_OU_HOSTNAME_BASE_DE_DONNEES</font>
<font color =grey>...</font>


<font color =grey>...
# ZoneMinder database password</font>
ZM_DB_PASS="<font color =blue>supermotdepassebdd</font>"
  <font color =grey>...</font>
  <font color =grey>...</font>
  # ZoneMinder url path to the zms streaming server
 
  <font color = green>#</font>ZM_PATH_ZMS=/zm/cgi-bin/nph-zms
<font color =grey>...
  <font color = green>ZM_PATH_ZMS=/cgi-bin/nph-zms</font>
  # in the Servers tab under Options</font>
  ZM_SERVER_HOST=<font color = violet>nom_serveur_zoneminder</font>
{{Méta bandeau
  | niveau = information
  | icône = loupe
  | 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 ==
{{Méta bandeau
  | niveau = information
  | icône = important
  | texte  = Installer la base de données sur un disque SSD (fortement recommandée à partir de 10 caméras).
}}
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 :
  <font color =grey>...
[mysqld]</font>
<font color = blue>#</font>skip-networking
  <font color =grey>...</font>
  <font color =grey>...</font>
* Puis on décommente la ligne suivante pour écouter le réseau :
<font color = grey>...</font>
<font color = blue>bind-address=0.0.0.0</font>
<font color = grey>...</font>
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/* <font color = blue>IP_SERVEUR_MARIADB</font>:/usr/share/zoneminder/db/
{{Méta bandeau
  | niveau = information
  | icône = loupe
  | texte  = Si votre base de donées est sur Alpine Linux il vous faudra installer un [[SSH#Installation Alpine Linux|'''serveur SSH''']] pour pouvoir transférer via la commande "scp".
}}
De retour sur le serveur MariaDB on crée la base de données à l'aide du fichier récupéré :


=Vhost=
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'@'<font color =blue>192.168.1</font>.%' identified by '<font color =blue>supermotdepassebdd</font>';"
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 serveurs via "<nowiki>https://</nowiki><font color = blue>IP_SERVEUR_ZONEMINDER</font>/zm" et on valide la charte de confidentialité :
 
[[File:Zmmulti1.PNG|border|On valide la charte de confidentialité..]]
 
Se rendre dans "Options" -> "Servers" -> "ADD NEW SERVER" :
 
[[File:Zmmulti2.PNG|border|Menu pour ajouter les serveurs]]
 
On peuple le formulaire d'ajout avec les paramètres correspondants à tous les serveurs :
 
[[File:Zmmulti3.PNG|border|Formulaire d'ajout de serveur..]]
{{Méta bandeau
  | niveau = information
  | icône = loupe
  | texte  = 192.168.1.10 à titre d'exemple..
}}
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" :
 
[[File:Zmmulti4.PNG|border|Exemple avec le port 30.000]]
 
 
Le cluster est prêt, il faudra penser à activer l'authentification pour protéger l'accès aux serveurs et distribuer la gestion des caméras entre les serveurs pour équilibrer la charge..
 
== 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 [[Nginx_ReverseProxy_LXC_Alpine_Linux|'''reverse-proxy''']] avec un nom de domaine pour chaque serveur (exemple: zoneminder.exemple.net, zoneminder2.exemple.net..)
 
[[File:Zmmulti plan.PNG|border|Un zolie plan réseau d'ezemple !]]
{{Méta bandeau
  | niveau = modéré
  | icône = important
  | texte  = Rediriger la plage de ports multicast sur le proxy.
}}
===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 '''<u>tous</u>''' les serveurs :
 
[[File:Zmmulti5a.PNG|border|Exemple de configuration..]]
[[File:Zmmulti5b.PNG|border|Autre exemple..]]
===VHost pour Reverse-Proxy Nginx===
Pour terminer on doit créer un vhost pour '''<u>tous</u>''' les serveurs (exemple: zoneminder.exemple.net, zoneminder2.exemple.net..) sur le [[Nginx_ReverseProxy_LXC_Alpine_Linux|'''reverse-proxy''']] :
   server {
   server {
     if ($host = <font color = blue>zoneminder.exemple.net</font>) {
     if ($host = <font color = blue>zoneminder.exemple.net</font>) {
Ligne 103 : Ligne 399 :
  server_name    <font color = blue>zoneminder.exemple.net</font>;
  server_name    <font color = blue>zoneminder.exemple.net</font>;
     error_page 403  https:/<font color = blue>zoneminder.exemple.net</font>;
     error_page 403  https:/<font color = blue>zoneminder.exemple.net</font>;
    location / {
        return 301 /zm/;
    }
   
   
     location / {
     location / {
Ligne 112 : Ligne 412 :
             proxy_set_header X-Forwarded-Protocol $scheme;
             proxy_set_header X-Forwarded-Protocol $scheme;
             proxy_set_header X-Forwarded-Host $http_host;
             proxy_set_header X-Forwarded-Host $http_host;
             proxy_pass https://<font color = blue>ADRESS_IP_ZONEMINDER</font>/zm/;
             proxy_pass https://<font color = blue>ADRESSE_IP_ZONEMINDER</font>/zm/;
            proxy_buffering off;
     }
     }
   
   
    listen [::]:443 ssl; # managed by Certbot
    listen [::]:443 ssl; # managed by Certbot
<font color =grey>...</font>
     listen 443 ssl; # managed by Certbot
     listen 443 ssl; # managed by Certbot
     listen 30000 ssl;
     <font color = blue>listen 30000 ssl;
     listen 30001 ssl;
     listen 30001 ssl;
     listen 30002 ssl;
     listen 30002 ssl;
     listen 30003 ssl;
     listen 30003 ssl;
     listen 30004 ssl;
     listen 30004 ssl;</font> # Ports multicast
  <font color =grey>...</font>
  <font color =grey>...</font>
  <font color =grey>...</font>
  <font color =grey>...</font>

Version actuelle datée du 18 août 2021 à 17:07

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 *:30001 *:30002 ... >
                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_HOSTNAME_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 serveurs 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 aux serveurs et distribuer la gestion des caméras entre les serveurs pour équilibrer la charge..

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-Proxy Nginx

Pour terminer on doit créer un vhost pour tous les serveurs (exemple: zoneminder.exemple.net, zoneminder2.exemple.net..) sur le reverse-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://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;

}