« ZoneMinder » : différence entre les versions
| (Une version intermédiaire par le même utilisateur non affichée) | |||
| Ligne 342 : | Ligne 342 : | ||
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 | 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 379 : | Ligne 379 : | ||
[[File:Zmmulti5a.PNG|border|Exemple de configuration..]] | [[File:Zmmulti5a.PNG|border|Exemple de configuration..]] | ||
[[File:Zmmulti5b.PNG|border|Autre exemple..]] | [[File:Zmmulti5b.PNG|border|Autre exemple..]] | ||
===VHost pour Reverse- | ===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''']] : | 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 { | ||
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;
}