Это старая версия документа!


Дата написания: октябрь 2016 г.
Автор: Graf

Сервер видеонаблюдения на базе ZoneMinder


Перед добавлением камер обязательно настраиваем аутентификацию, задаем пароль пользователю с правами админа, перезапускаем ZoneMinder и перезаходим под пользователем с правами админа, только потом добавляем камеры!

Установка

Используем Slackware Linux 14.2 64-bit без DE и всем, что с ними связанно.
Обновляем все доступные пакеты посредством slackpkg, в итоге получая ядро 4.4.19.
IP сервера куда всё устанавливаем и где настраиваем - 192.168.10.214
ZoneMinder версии 1.30.0

Устанавливаем ffmpeg от Alien, последний на день написания статьи 3.1.1.

# wget http://taper.alienbase.nl/mirrors/people/alien/restricted_slackbuilds/ffmpeg/pkg64/14.2/ffmpeg-3.1.1-x86_64-1alien.txz
# upgradepkg --install-new ./ffmpeg-3.1.1-x86_64-1alien.txz

Устанавливаем vlc плеер от Alien, последний на день написания статьи 2.2.4.

# wget http://www.slackware.com/~alien/slackbuilds/vlc/pkg64/14.2/vlc-2.2.4-x86_64-1alien.txz
# upgradepkg --install-new ./vlc-2.2.4-x86_64-1alien.txz

Устанавливаем sbopkg, синхронизируемся с его репозиторием попутно соглашаясь с созданием отсутствующих каталогов.

# wget https://github.com/sbopkg/sbopkg/releases/download/0.38.1/sbopkg-0.38.1-noarch-1_wsr.tgz
# upgradepkg --install-new ./sbopkg-0.38.1-noarch-1_wsr.tgz
# sbopkg -r

Собираем и устанавливаем необходимые пакеты.

# sbopkg -Bi "perl-Test-Inter perl-Test-Pod perl-Devel-Symdump perl-Pod-Coverage perl-Test-Pod-Coverage \
perl-yaml perl-YAML-Syck perl-net-http perl-www-robotrules perl-http-date perl-file-listing perl-IO-HTML \
perl-encode-locale perl-http-date perl-lwp-mediatypes perl-html-tagset perl-html-parser perl-http-message \
perl-http-negotiate perl-http-cookies perl-http-daemon libwww-perl perl-Date-Manip perl-Time-modules \
perl-Astro-SunTime perl-Device-SerialPort perl-X10 perl-Capture-Tiny perl-Email-Date-Format perl-MIME-Lite \
perl-Sys-Mmap perl-IO-Socket-SSL Net-SSLeay perl-Mozilla-CA perl-LWP-Protocol-https"

Собираем и устанавливаем сам ZoneMinder.

# git clone https://github.com/ZoneMinder/ZoneMinder.git
# cd ZoneMinder
# git submodule update --init --recursive 
# cmake -DCMAKE_INSTALL_PREFIX=/usr -DZM_WEBDIR=/var/www/htdocs/zm -DZM_CGIDIR=/var/www/cgi-bin \
-DZM_CONTENTDIR=/var/www/htdocs/zm 

# make
# make install DESTDIR=/tmp/ZoneMinder-1.30.0
# cd /tmp/ZoneMinder-1.30.0/
# makepkg -l y -c n /tmp/ZoneMinder-1.30.0-x86_64-1.txz
# upgradepkg --install-new /tmp/ZoneMinder-1.30.0-x86_64-1.txz

Создадим недостающие каталоги и дадим соответствующие права.

# mkdir -p /var/{run/zm,log/zm,www/htdocs/zm/{events,images,sounds}}
# chown -R apache:apache /var/{run/zm,log/zm,www/htdocs/zm}

Скопируем скрипт запуска-остановки.

# cp scripts/zm /etc/rc.d/rc.zm
# chmod +x /etc/rc.d/rc.zm

И, для автостарта при загрузке, пропишем в /etc/rc.d/rc.local

/etc/rc.d/rc.zm start

Всё необходимое поставили, перейдем к настройке.

Настройка

  • MySQL (MariaDB)

Так как MySQL (MariaDB) в Slackware Linux уже установлена, просто настроим ее и дадим пароль пользователю root

# mkdir /var/lib/mysql/mysql
# mysql_install_db
# chown -R mysql.mysql /var/lib/mysql
# chmod +x /etc/rc.d/rc.mysqld
# /etc/rc.d/rc.mysqld start
# mysql -u root
   MariaDB [(none)]> set password for 'root'@'localhost' = password('mypassword');
   Query OK, 0 rows affected (0.00 sec)
 
   MariaDB [(none)]> FLUSH PRIVILEGES;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [(none)]> \q
   Bye

Войдем под пользователем root, создадим базу ZoneMinder, для работы с базой дадим соответствующие права пользователю zmuser.

# mysql -u root -p
   Enter password: 
   MariaDB [(none)]> source /usr/share/zoneminder/db/zm_create.sql;
   …
   Query OK, 1 row affected (0.00 sec)
   Query OK, 1 row affected (0.00 sec)

   MariaDB [(none)]> use zm;
   
   Database changed
   MariaDB [zm]> 

   MariaDB [zm]> grant select,insert,update,delete,create,drop,lock tables,alter,index on zm.* to 'zmuser'@localhost identified by 'zmpass';
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [zm]> FLUSH PRIVILEGES;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [zm]> \q
   Bye
  • Apache

Редактируем /etc/httpd/httpd.conf.
Убираем знаки комментария со строк:

LoadModule cgid_module lib64/httpd/modules/mod_cgid.so
LoadModule cgi_module lib64/httpd/modules/mod_cgi.so
LoadModule rewrite_module lib64/httpd/modules/mod_rewrite.so
Include /etc/httpd/mod_php.conf

Правим необходимые секции:

Было Стало
DocumentRoot "/srv/httpd/htdocs"
<Directory "/srv/httpd/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
DocumentRoot "/srv/httpd/htdocs"
<Directory "/var/www/htdocs">
    Options Indexes FollowSymLinks IncludesNOEXEC
    AllowOverride All
    Require all granted
    <RequireAll>
      <RequireAny>
          Require user apache
      </RequireAny>
    </RequireAll>
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php
</IfModule>
<Directory "/srv/httpd/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<Directory "/srv/httpd/cgi-bin">
    AllowOverride None
    Options FollowSymLinks
    Require all granted
</Directory>

В /etc/php.ini убираем знак комментария и редактируем timezone:

[Date]
date.timezone = Europe/Moscow

Для работы сторонних приложений (например, мобильных) отредактируем файлы:

Файл Содержимое
/var/www/htdocs/zm/api/.htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule ^$ app/webroot/ [L]
   RewriteRule (.*) app/webroot/$1 [L]
#   RewriteBase /zm/api
</IfModule>
/var/www/htdocs/zm/api/app/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
#    RewriteBase /zm/api
</IfModule>
/var/www/htdocs/zm/api/app/webroot/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
#    RewriteBase /zm/api
</IfModule>

Запускаем Apache.

# chmod +x /etc/rc.d/rc.httpd
# /etc/rc.d/rc.httpd start

Проверяем работоспособность API:

http://192.168.10.214/zm/api/ - должно быть все зеленым.



http://192.168.10.214/zm/api/host/getVersion.json — должны увидеть

{
    "version": "1.30.0",
    "apiversion": "1.0"
}

Обновление

Если есть старый рабочий ZM сервер , допустим 1.28.1 , то перед обновлением нужно сделать полную копию его базы:

# mysqldump -u root -p zm > zm-all-1281.sql

Полученный файл перенести на вновь установленную Slackware Linux 14.2 и ZM-1.30.0 по данной статье. Остановить ZM и апач:

# /etc/rc.d/rc.httpd stop

Cкопировать кадры записей из /var/www/htdocs/zm/events

Если обновление делается на той же машине, то после полной копии базы, соблюдая версию Slackware Linux, обновить все необходимые пакеты - ffmpeg, vlc и весь список в sbopkg, собрать и обновить ZM.

«Подсунуть» данный файл мускулу:

# mysql -u root -p zm < /путь/до/файла/zm-all-1281.sql

или

# mysql -u root -p
   MariaDB [(none)]> use zm;
   MariaDB [zm]> source /путь/до/файла/zm-all-1281.sql;
   MariaDB [zm]> \q

и обновить базу

# zmupdate.pl

ответить на вопросы и получить базу равную 1.30.0

Запустить апач и проверить работоспособность.

Русификация

После русификации опций и помощи по ним, параметр Система→AUTH_HASH_SECRET будет перезаписан! Необходимо ввести его заново.

Архив zm_ru_ru_utf8-1.30.0.tar.gz содержит 4 файла: database.php, ru_ru.php, ru_ru_utf8.sql и functions.php.
Необходимо:
1. заменить файл database.php и functions.php в zm/includes.
Или внести изменения в ручную в database.php, поменяв строку (в ZM-1.30.0 46-ю) с

$dbConn = new PDO( ZM_DB_TYPE . $socket . ';dbname='.ZM_DB_NAME, ZM_DB_USER, ZM_DB_PASS );

на

$dbConn = new PDO( ZM_DB_TYPE . $socket . ';dbname='.ZM_DB_NAME, ZM_DB_USER, ZM_DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") );

Файл functions.php не влияет на русификацию, но в нем исправлена ошибка постоянно появляющаяся в логах - disk_total_space returned false for events.

2. заменить файл ru_ru.php в zm/lang;
3. «Скормить» MySQL ru_ru_utf8.sql

# mysql -u root -p zm < где/оно/лежит/ru_ru_utf8.sql

Всё, ZoneMinder русифицирован %% на 90 :)
Перевод выполнен мной единолично, поэтому весьма вероятны не точности и ошибки. Пишите на форуме в специальной ветке обсуждения данной статьи, попробую своевременно их исправлять.

Фильтры, zmNinja и прочее

Применение фильтров

Опишу работу с фильтрами на основе 2 примеров:

1. отправка сообщений по e-mail.
Заходим в «Параметры» → «Email» и настраиваем под себя (пример на картинке), сохраняем; заходим в «Фильтры» и настраиваем под себя (пример на картинке), сохраняем; вводим название фильтра, помечаем его на работу в фоне и сохраняем (пример на картинке). 2. удаление записей старше 7 дней.
Заходим в «Фильтры» и настраиваем под себя (пример на картинке). Для добавления новой строки с условием (и/или) нужно нажать на знак «+». Сохраняем; вводим название фильтра, помечаем его на работу в фоне и сохраняем (пример на картинке).

zmNinja

Как говорят на официальном сайте, zmNinja является потрясающим приложением для домашней безопасности, которое работает с ZoneMinder. zmNinja не поддерживается большой корпорацией. Это всего лишь один чувак, занимающийся им с 22:00 до 02:00.
Это приложение для просмотра и настройки камер на ZoneMinder. Есть мобильная (платная) версия и бесплатная для работы на компьютере. Бинарники и исходники можно скачать ТУТ.
Про самостоятельную сборку zmNinja из исходников написано ТУТ.
Для того, чтобы в zmNinja отображались камеры нужно в ZoneMinder разрешить использование API.

Если планируется только смотреть, а не управлять, то у пользователя должны быть права на просмотр монитора и поток.

Cambozola

Cambozola — это ароматизированный обезжиренный сыр, удобный Java-апплет для ZoneMinder, который используется для просмотра потока изображений в браузерах, таких как Internet Explorer, которые изначально не корректно работают с данным форматом. Рекомендуется установить данный апплет, во избежания проблем при просмотре потока в IE. Однако, если он не установлен, то изображения можно просматривать при более низкой скорости обновления.

Для сборки данного апплета необходим JDK и ant.
Собираем JDK. Переходим на сайт Oracle выбираем загрузку JDK, соглашаемся с лицензией и скачиваем архив для нашей платформы.
В моем случае, на сегодня — это jdk-8u102-linux-x64.tar.gz
Скопируем этот файл в /tmp/jdk/ и запустим java.SlackBuild с загрузочного DVD Slackware64 из extra/java или после распаковки файла java.tar.gz

# ./java.SlackBuild /tmp/jdk/jdk-8u102-linux-x64.tar.gz
...
Slackware package /tmp/jdk-8u102-x86_64-1.txz created.

Установим пакет

# upgradepkg --install-new /tmp/jdk-8u102-x86_64-1.txz
...
Package jdk-8u102-x86_64-1.txz installed.

После установки JDK, лучше повторно войти в систему или перезагрузиться.

Далее собираем и устанавливаем ant при помощи sbopkg.

# sbopkg -Bi apache-ant

Скачиваем с официального сайта cambozola-latest.tar.gz, распаковываем, переходим в каталог (на сегодня это cambozola-0.936) и запускаем ant:

# cd cambozola-0.936
# ant

В каталоге cambozola-0.936/dist/ получаем 3 файла: cambozola.jar, cambozola-unsigned.jar, cambozola-server.jar
Копируем файл cambozola.jar в каталог с установленным ZoneMinder, по статье это /var/www/htdocs/zm.

# cp cambozola-0.936/dist/cambozola.jar /var/www/htdocs/zm/

И разрешаем использование данного апплета в «Параметры» → «Изображения»

Заметки по работе с видео

1. Сглаживание видео

Если у вас идет вещание и запись с не большой скоростью, допустим, 6 к/с, то передав некоторые параметры ffmpeg, можно получить на выходе видео файл (например, avi) несколько сглаженным, без рывков. Для этого заходим «Параметры» → «Изображения» и прописываем входные и выходные параметры для ffmpeg


Большинство параметров ffmpeg на русском, хорошо описаны ТУТ.

Правда, в таком случае, при генерации видео прямо из ZoneMinder, выбранные параметры в окне генерации не повлияют на создаваемый видео файл. Обратите внимание на картинку, размер видео файла в реальном времени и увеличенном на 50, одинаков. Т.е. в любом случае видео получается со скоростью 25 к/с, которая задана в FFMPEG_OUTPUT_OPTIONS (ключ -r 25).


2. Особенности настройки мониторов

Я покажу настройку мониторов для 2 типов подключений, ffmpeg и удаленный.

FFMPEG (RTSP)
Удаленный (RTSP)
Удаленный (HTTP)


3. В большинстве браузеров не показывается одновременно более 5-6 камер

При клике на «Общий вид» показывается 5-6 камер, на местах остальных, лишь пустые квадраты. При этом Chromium/Chrome показывает в строке сообщений «Ожидание свободного сокета…». Решается путем правки DNS и указания ZoneMinder, якобы, дополнительных серверов. (Спасибо hokum13). Проверялось на браузерах Chromium/Chrome/Firefox/SeaMonkey/встроенный в WebOS на телевизоре. У тех, кто пользуется приложением zmNinja или браузером Safari, такой проблемы нет.

Если к серверу ZoneMinder, кроме локальных пользователей, подключаются еще и удалённые, то править лучше свои глобальные DNS записи, т.е. у хостеров, провайдеров, регистраторов и т.д., там где у вас есть права на изменения записей в DNS. Если сервер ZoneMinder только для нужд локалки, то соответственно, править локальный DNS или файл /etc/hosts и на сервере, и на каждом подключаемом компьютере.

В моем случае к серверу ZoneMinder есть доступ удалённым пользователям по URL, допустим, vm.mydom.ru. Для решения нашей проблемы нужно создать количество CNAME записей равных количеству камер/5. Допустим, у меня их 12 штук, значить я создам 3 CNAME записи (округлил до 15, разделил на 5, получил 3). (Пример для bind)

...
...
vm      IN      A       22.33.44.55
vm1     IN      CNAME   vm
vm2     IN      CNAME   vm
vm3     IN      CNAME   vm
...
...

Всё, записи обновятся не сразу, надо подождать. Настраиваем ZoneMinder. Переходим в «Параметры→Серверы» и добавляем наши «сервера».


Теперь проходим по каждому монитору и выбираем по каждому свой сервер, на 5 мониторов один.


В итоге получаем:


Теперь показывают все камеры.


Создано по мотивам ветки Форума
Обсуждаем на форуме

Навигация
Печать/экспорт
QR Code
QR Code wiki:articles:zm (generated for current page)