Je vais décrire ici l’installation complète de ZoneMinder sur un Raspberry Pi RBCA000 Carte Mère ARM 1176JZF-S 512 Mo RAM HDMI 2x USB 2.0 3,5 Watt  acheté sur Amazon et monté en RaspBian.

L’installation finale fait tourner Zoneminder avec NGinx/PHP-FPM et un wrapper CGI géré par xinetd. Zoneminder gère deux caméras, une caméra IP de surveillance Wansview NCB-543W pour l’extérieur et une vieille caméra USB Logitech C170 *pour l’intérieur. Les deux caméras sont paramétrées avec les FPS suivants: 5 FPS maximum en fonctionnement et *10 FPS **en détection, ce qui est tout à fait honorable pour mes besoins de vidéosurveillance privée.

Pour de raisons pratiques j’ai également installé Webmin pour gérer facilement pour RPI.

L’ensemble tourne de manière très raisonnable la machine overclockée en mode Medium (900 MHz ARM, 250 MHz core, 450 MHz SDRAM, 2 overvolt). Les versions de Zoneminder testées sont la v1.25.0 puis la v1.26.5-3.

La carte SD est une carte Transcend TS16GSDHC10 Carte mémoire SDHC Classe 10 16 Go.

Je suppose ici que votre Raspberry PI est correctement paramétré sur votre réseau local personnel. Pour ceux qui débutent, il existe un excellent article ici.

Installer Webmin

L’installation de Webmin est plus qu’optionnelle, notamment parce que celui-ci emprunte un peu de ressource à notre modeste serveur:

cd /tmp wget http://sourceforge.net/projects/webadmin/files/webmin/1.670/webmin_1.670_all.deb dpkg --install webmin_1.670_all.deb  

En solution de remplacement je suis tombé sur cet article.

Installer NGinx/PHP-FPM

L’installation de NGinx avec PHP-FPM se faire facilement. Nous allons ajouter la librairie php-apc qui, par expérience accélère beaucoup de chargement des pages PHP:

apt-get install php5-fpm libgd2-xpm libpcrecpp0 libxpm4 php-apc  php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-cgi

On active php-apc de la manière suivante: éditer le fichier /etc/php5/conf.d/20-apc.ini ajouter les lignes suivantes:

extension=apc.so apc.enabled=1 apc.shm_size=12M*

Pour tester l’installation, dans /var/www/, créer le fichier phpinfo.php suivant:

Installer Zoneminder

L’installation de Zoneminder se fait également assez simplement dans un premier temps. En effet, la distribution RaspBian propose le package.

apt-get install-y apache2 mysql-server build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm subversion automake autoconf libjpeg8-dev libjpeg8 apache2-mpm-prefork libapache2-mod-php5  libphp-serialization-perl libgnutls-dev libjpeg8-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libv4l-dev libtool ffmpeg libnetpbm10-dev libavdevice-dev libmime-lite-perl dh-autoreconf dpatch zoneminder  

Ajouter l’utilisateur www-data dans le groupe video:

 sudo adduser www-data video

Créer le lien suivant:

ln -s /usr/share/javascript /usr/share/zoneminder/javascript  

Modifier le fichier* /usr/share/perl5/ZoneMinder/Memory.pm*
changer la ligne
our $arch = int(3.2*length(~0));
en
our $arch = 32;

Ajuster la mémoire partagée

echo kernel.shmmax = 536870912 > /etc/sysctl.d/60-kernel-shm.conf

Redémarrer Zoneminder

service zoneminder restart  

On teste l’installation de Zoneminder en visitant le lien http://:8080/zm.

Par défaut, l’authentification n’est pas activée et l’utilisateur administrateur est “admin”, mot de passe “admin”. Il faut veiller à changer ces paramètres avant de mettre en ligne et peut-être aprèsavoir tout paramétré et testé correctement.

Paramètres de la caméra USB Logitech C170

J’ai choisi une alimentation un peu plus solide pour mon Raspberry de manière à pouvoir également alimenter la caméra via le port USB.

root@raspberrypi:~# lsusb  
 Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
 Bus 001 Device 004: ID 046d:082b Logitech, Inc.
root@raspberrypi:~# ls -al  /dev/video0  
 crw-rw---T 1 root video 81, 0 janv.  1  1970 /dev/video0

Paramètres Zoneminder:

ZMCam1-1

ZMCam1-2

Paramètres de la caméra VansView

J’ai utilisé le logiciel Windows fourni avec la caméra pour paramétrer celle-ci en IP fixe sur 192.168.0.3 avec un utilisateur avec les droit de visionnage (toto/toto pour la démonstration).

ZMCam2-1

ZMCam2-2

Sources

http://www.zoneminder.com/wiki/index.php/Documentation#Installation

http://doc.ubuntu-fr.org/zoneminder

http://www.raspberrypi.org/forum/viewtopic.php?f=63&t=617

http://jeremyblythe.blogspot.co.uk/2012/06/battery-powered-wireless-motion.html

Paramétrage de NGinx

NGinx ne gère pas le CGI, juste le fast-CGI. Nous avons donc besoin, si l’on veut se débarrasser d’Apache, de “wrapper” le service.

Installation de xinetd

Installer xinetd:

apt-get install xinetd

Comme pour tous les inetd-service nous avons besoin de definir un numéro de port dans* /etc/services:
Donc, il faut éditer
/etc/services* et ajouter la ligne ci-dessous:

zms-inetd 85/tcp # Zoneminder ZMS inetd-wrapper

Créer le fichier /usr/local/bin/zms-inetd suivant

#!/bin/bash
#
# Inetd-wrapper for ZMS (Zoneminder Streaming Server)
#
# Version:      2007-09-27
# Author:       Kurt Zankl <kz@xon.uni.cc>
# Inspiration:  http://www.debian-administration.org/articles/371
# Requirements: bash, inetd
# License:      GNU General Public License, Version 2
#
# /etc/services:
#   zms-inetd       85/tcp   # Zoneminder ZMS inetd-wrapper
#
# /etc/inetd.conf:
#   zms-inetd       stream tcp nowait    www-data   /usr/local/bin/zms-inetd  zms-inetd
#
# ZM Options / Paths / Web path to zms streaming server:
#   ZM_PATH_ZMS = http://<server>:85/<anypath>
#

# configuration
ZMCONF="/usr/local/etc/zm.conf"  
CGIBIN="zms"

# error handler
function errormsg {  
  echo "HTTP/1.0 500 Internal Server Error"
  echo "Content-Type: text/html"
  echo
  echo "<title>ERROR</title><h1>ERROR</h1>"
  echo -e "<pre>$1</""pre>"
  exit 1
}

# get request
read REQUEST  
# skip headers
HEADER="nothing"; while [ "$HEADER" != $'\r' -a -n "$HEADER" ]; do read HEADER; done

# read ZM configuration
[ -r $ZMCONF ] || errormsg "Error reading Zoneminder configuration \"$ZMCONF\""
. $ZMCONF
ZMS="$ZM_PATH_CGI/$CGIBIN"  
[ -x $ZMS ] || errormsg "Error finding ZMS executable \"$ZMS\""

# check request
[ -z "$REQUEST" ] && errormsg "Request is empty"

# split request
URL="${REQUEST#GET }"  
URL="${URL% HTTP/*}"  
QUERY="${URL#*\?}"  
URL="${URL%%\?*}"

# check query
[ "$QUERY" == "$URL" ] && errormsg "Invalid query"

# execute ZMS
# (STDERR output is discarded as this confuses MPEG streaming clients)
export QUERY_STRING="$QUERY"  
echo "HTTP/1.0 200 OK"  
"$ZMS" 2>/dev/null
echo  
exit 0  

Mettre à jour les droits du fichier:

chmod 755 /usr/local/bin/zms-inetd chown www-data:www-data /usr/local/bin/zms-inetd  

Créer le fichier* /etc/xinetd.d/zms-inetd* suivant:

service zms-inetd {  
 disable         = no
 id              = zms-inetd
 socket_type     = stream
 protocol        = tcp
 user            = www-data
 wait            = no
   port            = 85
 server          = /usr/local/bin/zms-inetd
 }

Redémarrer xinetd:

service xinetd restart  

Vérifier que le service est actif:

netstat -tulpn | grep 85  

Configuration NGinx

Dans * /etc/nginx/sites-available/* créer le fichier suivant, en adaptant à votre configuration (nom de serveur, https etc….):

upstream zm_application  {  
        server 127.0.0.1:85 max_fails=1 fail_timeout=30s;
 }
 # redirect http to https.
 server {
   listen 80;
   server_name_in_redirect on;
   server_name monredmine.com;
   rewrite ^ https://$server_name$request_uri? permanent;  # enforce https
  }
 server {
      listen 443 ssl;
     server_name_in_redirect on;
     ssl_certificate      /etc/nginx/conf.d/server.crt;
    ssl_certificate_key  /etc/nginx/conf.d/server.key;
   server_name  monredmine.com;
     root /usr/share/zoneminder;
     index index.php;
     location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
      access_log off;
         expires 30d;
     }
     error_page 404 /index.php;
     error_page 500 502 503 504 /50x.html;
     location = /50x.html {
         root /var/www/nginx-default;
     }
     location ~ \.php$ {
         fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME /usr/share/zoneminder/$fastcgi_script_name;
 fastcgi_param QUERY_STRING $query_string;
 fastcgi_param REQUEST_METHOD $request_method;
 fastcgi_param CONTENT_TYPE $content_type;
 fastcgi_param CONTENT_LENGTH $content_length;
 include /etc/nginx/fastcgi_params;
 }
 location ~ /\.ht {
 deny all;
 }
 location  /cgi-bin/ {
 proxy_pass             http://zm_application;
 }
 }

Activer le site:

ln -s /etc/nginx/sites-available/zoneminder /etc/nginx/sites-enabled/zoneminder  

On stoppe apache

service apache2 stop  

Recharger NGinx

service nginx reload  

Et voilà! Zoneminder doit être disponible à l’URL indiqué dans le fichier de configuration de NGinx.

Sources

http://www.puccinellidigital.com/musings/notes/zoneminder-nginx

http://www.zoneminder.com/wiki/index.php/Zms-inetd

http://ag-up.com/?p=1195

http://forums.fedoraforum.org/showthread.php?t=288585
http://www.ispyconnect.com/man.aspx?n=Wansview

Conclusions

Il reste encore à paramétrer le mail et remplacer la librairie libjpeg8 par libjpeg-turbo. Néanmoins je suis satisfait de cette solution à moins de 120 euros caméras inclues qui, avec une consommation électrique minimalisée, permet de surveiller son environnement privé.

J’ai du m’y reprendre à plusieurs reprises pour pouvoir faire fonctionner correctement ce système, aussi il se peut que j’ai oublié une étape. N’hésitez pas à me faire savoir tout commentaire au moyen de la page de contact.