« ZoneMinder » : différence entre les versions
| (19 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 201 : | Ligne 201 : | ||
Dans cet exemple: | Dans cet exemple: | ||
* Serveur ZoneMinder : | * Serveur ZoneMinder : zmsrv0, zmsrv1... | ||
* Serveur MariaDB (SQL) : zmdatabase | * Serveur MariaDB (SQL) : zmdatabase | ||
| Ligne 213 : | Ligne 213 : | ||
}} | }} | ||
On installe les dépendances : | 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 : | 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 | On installe ZoneMinder sans MariaDB/MySQL : | ||
zmsrv0:~# apt update | |||
zmsrv0:~# apt install zoneminder mysql-server*- | |||
On ajoute l'utilisateur de Apache au groupe "video" : | On ajoute l'utilisateur de Apache au groupe "video" : | ||
zmsrv0:~# adduser www-data video | |||
On règle le fuseau horaire de PHP : | On règle le fuseau horaire de PHP : | ||
zmsrv0:~# vi /etc/php/7.4/apache2/php.ini | |||
<font color = grey>...</font> | <font color = grey>...</font> | ||
| Ligne 233 : | Ligne 233 : | ||
<font color = grey>...</font> | <font color = grey>...</font> | ||
Egalement celui du système : | 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.. | 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) : | 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> | <font color =grey>...</font> | ||
| Ligne 260 : | Ligne 255 : | ||
<font color =grey>...</font> | <font color =grey>...</font> | ||
zmsrv0:~# vi /etc/apache2/sites-enabled/default-ssl.conf | |||
<IfModule mod_ssl.c> | <IfModule mod_ssl.c> | ||
<VirtualHost _default_:443 <font color = blue>*:30000 *: | <VirtualHost _default_:443 <font color = blue>*:30000 *:30001 *:30002</font> <font color =grey>...</font> > | ||
ServerAdmin webmaster@localhost | ServerAdmin webmaster@localhost | ||
<font color =grey>...</font> | <font color =grey>...</font> | ||
zmsrv0:~# service apache2 reload | |||
On configure ZoneMinder : | On configure ZoneMinder : | ||
zmsrv0:~# vi /etc/zm/zm.conf | |||
<font color =grey>... | <font color =grey>... | ||
# Acceptable formats include hostname[:port], ip_address[:port], or localhost:unix_socket</font> | # Acceptable formats include hostname[:port], ip_address[:port], or localhost:unix_socket</font> | ||
ZM_DB_HOST=<font color = blue> | ZM_DB_HOST=<font color = blue>IP_OU_HOSTNAME_BASE_DE_DONNEES</font> | ||
<font color =grey>...</font> | <font color =grey>...</font> | ||
| Ligne 289 : | Ligne 284 : | ||
| 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 | ||
| Ligne 331 : | Ligne 327 : | ||
zmdatabase:~# mkdir -p /usr/share/zoneminder/db | zmdatabase:~# mkdir -p /usr/share/zoneminder/db | ||
*Sur un serveur ZoneMinder on exporte les fichiers sql : | *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 | {{Méta bandeau | ||
| niveau = information | | niveau = information | ||
| Ligne 345 : | Ligne 341 : | ||
==Lancement et fin de la configuration des Serveurs ZoneMinder== | ==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 : | 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 | 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é..]] | [[File:Zmmulti1.PNG|border|On valide la charte de confidentialité..]] | ||
| Ligne 354 : | Ligne 350 : | ||
[[File:Zmmulti2.PNG|border|Menu pour ajouter les serveurs]] | [[File:Zmmulti2.PNG|border|Menu pour ajouter les serveurs]] | ||
On peuple le formulaire d'ajout avec | On peuple le formulaire d'ajout avec les paramètres correspondants à tous les serveurs : | ||
[[File:Zmmulti3.PNG|border|Formulaire d'ajout de serveur..]] | [[File:Zmmulti3.PNG|border|Formulaire d'ajout de serveur..]] | ||
{{Méta bandeau | {{Méta bandeau | ||
| niveau = information | | niveau = information | ||
| icône = loupe | | icône = loupe | ||
| texte = | | texte = 192.168.1.10 à titre d'exemple.. | ||
}} | }} | ||
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 | 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 == | == 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..) | 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 | {{Méta bandeau | ||
| niveau = | | niveau = modéré | ||
| icône = | | icône = important | ||
| texte = | | 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 408 : | Ligne 413 : | ||
proxy_set_header X-Forwarded-Host $http_host; | proxy_set_header X-Forwarded-Host $http_host; | ||
proxy_pass https://<font color = blue>ADRESSE_IP_ZONEMINDER</font>/zm/; | proxy_pass https://<font color = blue>ADRESSE_IP_ZONEMINDER</font>/zm/; | ||
proxy_buffering off; | |||
} | } | ||
Version actuelle datée du 18 août 2021 à 17:07
# 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
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
ZoneMinder Multi-Serveurs
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é :
Se rendre dans "Options" -> "Servers" -> "ADD NEW SERVER" :
On peuple le formulaire d'ajout avec les paramètres correspondants à tous les serveurs :
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" :
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..)
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 :
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;
}