Введение
Доброго времени суток.
Имея в наличии домашний NAS, который работает под управлением Debian 8 (ранее я использовал Ubuntu Server 12.04 и 14.04), возникла идея возложить на него, помимо прочего, роль сервера видеонаблюдения. В качестве серверной части был выбран Zoneminder. Алгоритм работы видеонаблюдения должен быть такой: круглосуточная запись не нужна, но требуется в случае необходимости возможность включения записи по наступлению события — срабатывание на движение, с последующей отправкой уведомления на электронную почту со скриншотами с места события. Это нужно чтобы обеспечить контроль за квартирой в момент отсутствия кого-либо дома. Ну и, конечно, нужна возможность удалённо подключиться и проверить — всё ли в порядке.
На сайте разработчика я нашёл подробнейшую Wiki, посвященную именно установке на Debian 8 64-bit. Соответственно, инструкцию по установке я возьму оттуда, пояснив некоторые моменты своими комментариями.
Установка Zoneminder
Итак, у нас есть сервер с установленным в минимальной конфигурации Debian 8 64-bit (я использовал netinstall). Сначала нужно отредактировать sources.list, добавив в него Jessie backports:
sudo nano /etc/apt/sources.list
В конец файла добавим:
deb http://http.debian.net/debian jessie-backports main
Либо раскомментируем эту строку, если она там уже есть, то есть удалим # в начале строки. Обновляем индекс пакетов:
sudo apt-get update
Теперь всё готово для установки Zoneminder, что мы и сделаем:
sudo apt-get install zoneminder
В процессе установки будут также автоматически установлены Apache, MySQL, PHP.
После завершения установки, создаём базу MySQL:
sudo mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
В процессе создания базы, будет предложено выбрать пароль root базы. Далее выполняем последовательно следующие команды (через sudo), вводя пароль в случае запроса:
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
mysqladmin -uroot -p reload
chmod 740 /etc/zm/zm.conf
chown root:www-data /etc/zm/zm.conf
Включаем автозапуск Zoneminder:
systemctl enable zoneminder.service
Добавляем пользователя www-data в группу sudo, это нужно для доступа к локальным видеокамерам:
adduser www-data sudo
Запускаем Zoneminder:
systemctl start zoneminder.service
Проверяем, что Zoneminder запущен:
systemctl status zoneminder.service
Если всё в порядке, вывод команды должен быть, примерно, такой:
? zoneminder.service - ZoneMinder CCTV recording and surveillance system
Loaded: loaded (/lib/systemd/system/zoneminder.service; enabled)
Active: active (running) since Вс 2016-07-10 18:48:30 IRKT; 5h 31min ago
Process: 6413 ExecStop=/usr/bin/zmpkg.pl stop (code=exited, status=0/SUCCESS)
Process: 6455 ExecStart=/usr/bin/zmpkg.pl start (code=exited, status=0/SUCCESS)
Main PID: 6474 (zmdc.pl)
CGroup: /system.slice/zoneminder.service
+-6474 /usr/bin/perl -wT /usr/bin/zmdc.pl startup
+-6507 /usr/bin/perl -wT /usr/bin/zmfilter.pl
+-6514 /usr/bin/perl -wT /usr/bin/zmaudit.pl -c
L-6521 /usr/bin/perl -wT /usr/bin/zmwatch.pl
Настраиваем Apache:
a2enmod cgi
a2enmod rewrite
a2enconf zoneminder
Добавляем свой часовой пояс в PHP:
sudo nano /etc/php5/apache2/php.ini
Ищем секцию [Date] и меняем date.timezone на нужный:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Irkutsk
Сохраняем — Ctrl+O, выходим — Ctrl+X.
Перезапускаем Apache:
service apache2 restart
Чтобы была возможность управлять Zoneminder через Internet Explorer, нужно установить Cambozola:
cd /usr/src && wget http://www.andywilcock.com/code/cambozola/cambozola-latest.tar.gz
tar -xzvf cambozola-latest.tar.gz
replace 936 with cambozola version downloaded
cp cambozola-0.936/dist/cambozola.jar /usr/share/zoneminder
На этом установка Zoneminder завершена. Теперь нужно настроить почтовый транспорт для того, чтобы Zoneminder мог уведомлять о событиях по электронной почте.
Настройка почтового транспорта
Для отправки уведомлений, Zoneminder умеет использовать ssmtp, его и установим:
sudo apt-get update
sudo apt-get install ssmtp
Заодно установим mailutils, если этот пакет ещё не установлен:
sudo apt-get install mailutils
Теперь настроим параметры почты, от имени которой будут идти уведомления. Предположим, что ящик находится на gmail.com. Открываем ssmtp.conf:
sudo nano /etc/ssmtp/ssmtp.conf
и приводим к такому виду, указав, соответственно, ваши данные:
root=mymail@gmail.com
mailhub=smtp.gmail.com:587
hostname=localhost
RewriteDomain=gmail.com
UseSTARTTLS=YES
UseTLS=YES
AuthUser=mymail@gmail.com
AuthPass=myverystrongpassword
Правим revaliases:
sudo nano /etc/ssmtp/revaliases
приводим к такому виду:
root:pp@gmail.com:smtp.gmail.com:587
www-data:pp@gmail.com:smtp.gmail.com:587
И проверяем корректность настроек, отправив тестовое письмо:
echo "Hello, World" | mail -s "My email check" mne@napochtu.ru
Если тест прошёл успешно, переходим к следующему шагу — установка MIME::Lite и Net::SMTP. Проверим, установлены ли эти компоненты:
perl -MMIME::Lite -e "print \"Module installed.\\n\";"
perl -MNet::SMTP -e "print \"Module installed.\\n\";"
Устанавливаем, зайдя в оболочку perl:
sudo perl -MCPAN -e shell
install MIME::Lite
install Net::SMTP
Сейчас нужно внести очень важные изменения, без которых почтовый транспорт от Zoneminder работать не будет. Обратите внимание, что эти изменения нужно вносить только в том случае, если версия установленного Zoneminder — 1.29 или ниже. Начиная с версии 1.30, эти действия производить не нужно.
Откроем в редакторе файл zmfilter.pl:
sudo nano /usr/bin/zmfilter.pl
Перейдя на строку 1179, мы видим следующее:
### Send the Message
MIME::Lite->send( "smtp", $Config{ZM_EMAIL_HOST}, Timeout=>60 );
$mail->send();
Закомментируем строки
MIME::Lite->send( "sendmail", $Config{ZM_EMAIL_HOST}, Timeout=>60 );
и $mail->send();
и добавим под ними строку
$mail->send('sendmail','/usr/sbin/ssmtp',$Config{ZM_EMAIL_ADDRESS});
В итоге, начиная со строки 1179 (в моём случае, но не обязательно именно этот номер строки), код должен выглядеть так:
### Send the Message
#MIME::Lite->send( "sendmail", $Config{ZM_EMAIL_HOST}, Timeout=>60 );
#$mail->send();
$mail->send('sendmail','/usr/sbin/ssmtp',$Config{ZM_EMAIL_ADDRESS});
Сохраняем, выходим. На этом работа с терминалом завершена.
Веб-интерфейс Zoneminder
Управление доступно по адресу ip.adress.servera/zm, заходим. Первое, что нужно сделать, это зайти в Options -> Users, и задать пароль пользователю admin:
Затем зайти в Options -> System, и поставить галочку напротив OPT_USE_AUTH:
Если этого не сделать, то Zoneminder позволяет зайти в веб-интерфейс или подключиться через клиентское приложение без запроса логина\пароля, что, естественно, небезопасно. Странно, что эта очень нужная галочка не отмечена по умолчанию.
Теперь настроим отправку электронной почты. Заходим в Optons -> Email и настраиваем по аналогии:
В поле EMAIL_BODY можно настроить формат уведомлений так, как нужно именно вам. Например, если в поле добавить %EI1%, то к сообщению будет прикреплен первый скриншот с момента срабатывания датчика движения. Полный список опций для уведомлений доступен здесь.
Добавление камер
Zoneminder умеет работать как с usb, так и с IP-камерами. На данный момент, мои камеры ещё в пути, поэтому в качестве тестово-настроечно-временного варианта камеры, я использую мой старый Android-смартфон Alcatel Pop C2, на котором установлено приложение IP Webcam, превращающее смартфон в Wi-Fi IP-камеру. После установки и запуска приложения (предварительно рекомендую выставить разрешение видеопотока в настройках приложения, я выставил 800х480), на дисплее смартфона отображается IP и порт, по которому можно зайти в веб-интерфейс и посмотреть, что здесь есть интересного:
Настроек, в общем, довольно много, но нас интересует адрес, по которому отдается видеопоток. И мы видим, что есть информация для настройки Zoneminder, что не может не радовать. А именно, указан Remote host path, путь, который нужно будет прописать в настройках Zoneminder — после IP камеры нужно добавить /video:
Возвращаемся в веб-интерфейс Zoneminder, чтобы добавить камеру, выбираем Add New Monitor:
В поле Name пишем желаемое имя, Source type -> Remote:
Во вкладке Source заполняем поля: Remote Host Name -> IP смартфона, Remote Host Port -> порт, на котором работает IP Webcam, Remote Host Path -> путь, который мы подсмотрели в настройках IP Webcam, а также указываем разрешение видеопотока, которое должно совпадать с выбранным нами ранее в настройках IP Webcam:
Сохраняем настройки -> Save, и в главном меню Zoneminder видим добавленную нами камеру:
При нажатии на название которой, мы видим изображение:
Камеры могут работать в нескольких режимах, который определяется параметром Function в главном меню:
Режим, в котором запись ведется только при наличии движения в кадре, называется Modect, его и выберем. Теперь система не будет записывать видеопоток постоянно, а только при наличии веских на то причин. Но нам ведь ещё нужно уведомление о движении в кадре. Для это нужно настроить фильтр. Открываем Filters в главном меню Zoneminder, настраиваем согласно скриншоту, сохраняем под любым именем:
И не забываем поставить галочку напротив Run filter in background:
Таким образом, если в кадре будет обнаружено движение, система запишет видео и отправит на почту уведомление.
Клиентские приложения
Если есть постоянный IP, ничто не мешает пробросить порты в маршрутизаторе и подключаться со смартфона извне через веб-интерфейс, тем более, что в настройках Zoneminder можно выбрать мобильную версию интерфейса, но, помимо этого, я решил поискать какое-нибудь мобильное приложение для этой цели. Поискав в Google Play по ключевому слову «zoneminder», я остановился на zmNinja, т.к. рейтинг достаточно высокий и скриншоты понравились. Приложение платное, триальной версии для предварительной оценки, увы, нет. Функционал более чем достаточный — просмотр видеопотока в реальном времени, просмотр архива, записанных событий, переключение режимов камер и т.д.
Также есть десктопные версии zmNinja для Linux, Windows, Mac OS X — они распространяются бесплатно. Так выглядит версия для Linux, запущенная на моём Mint 18:
В общем, для всех систем интерфейс единообразен.
На этом всё, спасибо за внимание.
Комментарии (40)
memtew
13.07.2016 12:40Я для для домашнего видеонаблюдения использую самосборный пк с ОС от nas synology. Работает без нареканий уже год.
KDorokhov
13.07.2016 14:58Сам сейчас решаю вопрос с регистратором. Сейчас работает на оригинальном синолоджи, но аналитика так себе. DSM 4
В стороннем ПО побогаче будет — пересечение линии, распознавание лица.
webhamster
13.07.2016 13:16Ну как там, в новом Zoneminder появился таймлайн с графиком активности перед камерой?
kvaps
13.07.2016 18:44График есть, но управление им дико нелогичное. Приходится мириться, т.к. без него никуда.
Правда, со временем привыкаешь.
PaulZi
13.07.2016 13:44sanrega, а вы какие-нибудь другие приложения использовали, кроме ZoneMinder, motion например? Буквально в ближайшие дни буду тоже заниматься настройкой это добра, хотелось бы советов от опытных людей.
aleyer
13.07.2016 15:16+1Когда мне нужно было настроить видеонаблюдение в нескольких помещениях, искал человеческий в плане работы, настройки и интерфейса проигрывателя вариант. Zoneminder под эти критерии, на мой взгляд, не подпадает. Остановился на бесплатном Ivideon без подключения к их облаку, работает с 2013 года без вмешательств, пишет по детектору, смотреть видео удобно, разве что, если правильно помню, для мобильных устройств приложение работает только с облаком. Даже частичный выход из строя одного диска в lvm-массиве из 3 дисков на 3ТБ не помешали вручную удалить часть видеозаписей, перенести все на один рабочий диск, вручную поправить SQLite базу, убрав оттуда упоминания удаленных записей и перенести все это потом на рабочий массив.
Собственно, благодаря наличию блога на хабре, о них и узнал.silverjoe
13.07.2016 16:49Мобильное приложение вполне себе работает без подключения тарифов — онлайн просмотр камер и локального архива, без облачного архива.
buggykey
13.07.2016 15:20+2У меня дома motion на древнющем компе с процом AMD Athlon 900 МГц и памятью DDR-1 512 МБ крутится круглосуточно уже почти год. Удобно, что можно обвешать собственными скриптами. Стабильно, как утюг. Не падало ни разу.
Vadimner
15.07.2016 15:31+1Около двух лет назад организовал виденоаблюдение за своим двором (с тех пор как начал ставить там машину) с помощью Ubuntu 14.04 и motion, работает без нареканий. Настроилось все лекго и быстро хотя на тот момент опыта работы с Линкусом было чуть больше нуля.
sanrega
21.07.2016 09:22Использовал Xeoma. В общем и целом очень удобная система, хоть и не opensource и с ограничениями при использовании бесплатной лицензии, для полноценного использования в формате клиент-сервер нужна коммерческая лицензия, которая рассчитывается из количества камер. Но мне не понравились некоторые моменты, из-за которых я отказался от этого продукта.
SchmeL
13.07.2016 14:02Да, настройка ZM тот еще праздник. А вот от телефона в качестве камер пришлось к сожалению отказаться, так как при постоянном подключении зарядного устройства, через пару месяцев батареи сдохли — на 2х аппаратах вздулись, а на других просто не включались.
sanrega
21.07.2016 09:42Согласен, именно поэтому ко мне едут IP-камеры. Телефон использовался только для настройки и тестирования.
SamoilowAlex
13.07.2016 14:24Преобразование набора изображений(а именно так zabbix хранит видео с камер) в полноценные видео файлы каким образом решали? Или не решали?
sanrega
21.07.2016 09:38В режиме просмотра событий через браузер есть штатная функция экспорта в видеофайл.
SamoilowAlex
21.07.2016 11:54Тьфу, во первых извеняюсь что перепутал zabbix и zonemonder, только заметил.
А если надо хранить видео с 20 камер несколько месяцев, очень быстро закончатся inod'ы и в целом тупить будет от большого числа мелких файлов. Имеет смысл все что старше недели переводить в видео(например по 12 часов длинной) и отправлять в бекап. Когда о решал данную проблему через ffmpeg, но он не умеет regexp и группу файлов надо указывать через некий fprint, вот было бы интересно иные варианты решения почитать.sanrega
21.07.2016 13:44Никак не могу прокомментировать практическую реализацию по этим требованиям, т.к. не было задач хранения больших объёмов архивной видеоинформации. ZM, собственно, через ffmpeg преобразует jpeg в видео, настройках. В Options -> Images -> Path to (optional) ffmpeg mpeg encoder у меня указан /usr/bin/ffmpeg, а также в Formats to allow for ffmpeg video generation указано mp4, только вот не помню на каком этапе настройки я его туда прописывал, но точно помню что это делал я сам, а не было предустановлено.
Если бы у меня возникла задача, подобная вашей, я бы копал в сторону настройки Filters, ну и, возможно, где-то понадобится вручную скрипт прикрутить. Но, может быть, и по другому можно решить. У меня такой задачи нет, т.к. всего лишь маленькая домашняя система видеонаблюдения =)
miron36357
13.07.2016 14:25+1Я никак не могу написать на хабре про собственную поделку, созданную как раз из-за убогости Zoneminder.
Это кому же в голову пришло сохранять архив в куче JEPG?
Камеры стримят в удобнейшем H264, сказка же, берем и кладем в контейнер. И нагрузка на процессор минимальна. А если, допустим, на сервере идет запись с 1080P камер?
У меня ZM на ВМ с одним ядром Xeon E5345 не справилась даже с двумя потоками. При том что самопис-обертка над ffmpeg загружает ядро на 2% на одну камеру.rstepanov
13.07.2016 15:29А у вас анализ движения в кадре то есть?
miron36357
14.07.2016 00:41Неа, руки не дойдут написать, но если можете, с радостью отправляйте пулл реквест :)
https://github.com/mironoff111/PartCCTVrstepanov
14.07.2016 10:19Несколько лет назад ковырял motion, там это одной функцией было сделано, не особо сложно. Другое дело, что для этого сначала делается декомпрессия кадра и сравнение с предыдущим, в результате использование процессора быстро вернется к показателям ZM, если только не сумеете оптимизировать за счет какого нибудь расширенного набора инструкций процессора…
miron36357
14.07.2016 15:25В современных айпи камерах обычно по 2 потока, можно обернуть motion так, чтобы ему посылать легкий стрим, но да, тут уже близко к ZM по нагрузке будет. Далее, помню, в большинстве нормальных камерах (Axis, Hikvision) детектор движения встроенный, вроде бы по ONVIF работает. Только этот ONVIF такооой сложный, но если разобраться, то всё можно. Еще можно копать в сторону аппаратного декодирования, но это фишка будет требовать видеокарты в сервере записи.
P.S. Я в PartCCTV обходил стороной запись по движению, просто необходимости не было. Есть двухтерабайтник, так его на 30 дней непрерывной записи хватает.
В любом случае, буду рад пулл реквестам. Вместе мы спасем мир :)
lopatoid
13.07.2016 17:09Zoneminder хорош для аналоговых камер, которые не стримят в удобнейшем H264.
k0ldbl00d
14.07.2016 07:32А аналоговые камеры куда потом подключаются? Правильно — к плате захвата, которая оцифровывает потоки и, в большинстве случаев, даёт на выходе всё тот же h264 (или MPEG2, если плата очень старая).
Urshulyak
13.07.2016 16:53Использую дома настройку над Motion — Ccrisan/Motioneye:
4 камери, 3 usb (2usb orangepi + 1usb raspberry pi2), 1 IP camera
Работает в Docker контейнере на виртуалке (KVM),
По ресурсах — объективно где-то 15% CPU от i5 6600.
kvaps
13.07.2016 18:41Есть еще один интересный проект: MJPG-streamer
Если есть необходимость подключить удаленую камеру без мозгов, можно экспортировать ее поток в mjpeg и подключить в zoneminder.
edgi
13.07.2016 21:55Есть вот такой открытый проект. github.com/kerberos-io/machinery
Можно подключать несколько ip камер. по возможностям уступает конечно zoneminder
AVictor
14.07.2016 11:49Если нужно подключить до 4-х камер, то есть приложения намного лучше. Мне очень нравится Avreg. Устанавливается из репов, удобен в настройке, ip-камеры по протоколу onvif определяет автоматически. Есть еще программа XEOMA (она кстати тоже от отечественного разработчика).
lolipop
14.07.2016 12:34Что люди не придумывают, лишь бы не ставить локальный(локальный!!! если не хочется облака от ивидеона — можно без него) ivideon-сервер. и это не реклама, эта штука реально работает из коробки, с любыми камерами, что usb, что ip, идеально работает определение движения в кадре, для транляции через облако — две камеры бесплатно. локальных камер(с видеоархивом, можно настроить запись только движения в архив) можно хоть 100 повесить.
да, не опенсорс, ну, можно и пережить. я просто в виртуалке его кручу для собственного спокойствия.Strange
14.07.2016 14:19Please note that Ivideon Server for Linux is intended to be run in a graphical desktop environment. The current version doesn’t support configuration over a LAN yet, though we’ll certainly add this feature in the future—keep an eye out for updates.
Радует, что планируют фиксить.lolipop
14.07.2016 14:38форвард иксов не так уж и сложно настроить. один раз настроил через гуй, дальше запуск безголовый(headless).
KonstantinSpb
14.07.2016 14:46И работает на не х86 платформах? Т.е. на Raspberry подобных? На сайте пишут, что пока только для х86, и нафига такое чудо нужно.
dkv
14.07.2016 17:53И этот распиаренный ivideon до сих пор не умеет работать с onvif (и не предполагает уметь, как ответили они мне на форуме), в связи с чем детект движения делается через декомпрессию кадра с соответствующей нагрузкой на систему.
wayf1nder
Когда-то пользовался Zoneminder'ом. Вначале работает хорошо, но со временем по непонятным причинам начинает тормозить все сильнее до полного отказа. Помогает очистка базы MySQL и видеоархива. Надеюсь, в свежих версиях проблема решена.