
Пришло время реанимировать домашнюю систему видеонаблюдения на базе ZoneMinder. У меня как раз есть китайская камера BESDER 6024pb-jw201 которая уже год как не используется и просто смотрит в коридор для устрашения хулиганов.
Установка ZoneMinder
Тут стоит отметить, все очень удобно и вам потребуется просто перейти по адресу https://cloud.zoneminder.com/downloads.html, выбрать версию вашей операционной системы и получить собранный пакет.
В моем случае получается так:
root@srv-prod-rain-01:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 25.04
Release: 25.04
Codename: plucky
И для такой свежей системы собранной стабильной версии просто нет и мы можем использовать пакет для более старой версии и он будет работать или собрать из исходных кодов https://github.com/ZoneMinder/zoneminder/releases.

Для начала мы установим пакет для LTS Ubuntu 22.04 и нам понадобится ряд зависимостей без которых ZoneMinder работать не будет.
В нашем случае мы сделаем хитро и просто установим пакет и сделаем фикс сломанных зависимостей.
# wget https://zmrepo.zoneminder.com/debian/release-1.36/jammy/zoneminder_1.36.35~20241022.27-jammy_amd64.deb7
# dpkg -i ./zoneminder_1.36.35~20241022.27-jammy_amd64.deb7
# apt --fix-broken install
# apt-get upgrade
Активируем и запускаем сервис ZoneMinder.
# systemctl enable zoneminder
# systemctl start zoneminder
Работать ненастроенным он конечно не будет, так как у нас не настроена база данных.
авг 27 07:52:42 srv-prod-rain-01 zmpkg.pl[10785]: Compilation failed in require at /usr/bin/zmpkg.pl line 34.
авг 27 07:52:42 srv-prod-rain-01 zmpkg.pl[10785]: BEGIN failed--compilation aborted at /usr/bin/zmpkg.pl line 34.
авг 27 07:52:42 srv-prod-rain-01 zmpkg[10785]: ERR [Error reconnecting to db: errstr:Access denied for user 'www-data'@'localhost' (using password: NO) error val:]
Установка MySQL для ZoneMinder
Устанавливаем Mysql server.
# aptitude install mysql-server
# systemctl enable mysql
# systemctl start mysql
Создаем пользователя и базу данных.
# mysql
mysql> CREATE USER user_zoneminder@'%' IDENTIFIED BY 'xxxxPASSWORDxxx';
mysql> CREATE DATABASE db_zoneminder;
mysql> GRANT ALL PRIVILEGES ON db_zoneminder.* TO user_zoneminder@'%';
mysql> FLUSH PRIVILEGES;
Инициализируем базу данных. И перед инициализацией закомментируйте в файле zm_create.sql создание и переключение на базу данных zm.
# cat /usr/share/zoneminder/db/zm_create.sql | mysql db_zoneminder
# cat /usr/share/zoneminder/db/triggers.sql | mysql db_zoneminder
Попытка настройки ZoneMinder
Прописываем логин и пароль для базы данных в файле cat /etc/zm/zm.conf.
# ZoneMinder database hostname or ip address and optionally port or unix socket
# Acceptable formats include hostname[:port], ip_address[:port], or
# localhost:/path/to/unix_socket
ZM_DB_HOST=localhost
# ZoneMinder database name
ZM_DB_NAME=db_zoneminder
# ZoneMinder database user
ZM_DB_USER=user_zoneminder
# ZoneMinder database password
ZM_DB_PASS=xxxxPASSWORDxxx
Перезапускаем сервис и сильно удивляемся, что ничего не изменилось и он все еще пытается подключиться под пользователем www-data.
В целом понятно почему это происходит и сервис не может скомпилировать Perl-скрипт.
root@srv-prod-rain-01:~# systemctl status zoneminder
× zoneminder.service - ZoneMinder CCTV recording and surveillance system
Loaded: loaded (/usr/lib/systemd/system/zoneminder.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Sat 2025-08-30 08:23:57 +07; 4min 18s ago
Invocation: ad3ac41ff4434295ae0da2259e6c5624
Docs: http://zoneminder.readthedocs.org/en/latest/
Process: 1262 ExecStart=/usr/bin/zmpkg.pl start (code=exited, status=255/EXCEPTION)
Mem peak: 15.3M
CPU: 180ms
авг 30 08:23:57 srv-prod-rain-01 zmpkg.pl[1262]: Unable to connect to DB. ZM Cannot continue.
авг 30 08:23:57 srv-prod-rain-01 zmpkg.pl[1262]: BEGIN failed--compilation aborted at /usr/share/perl5/ZoneMinder/Config.pm line 150.
авг 30 08:23:57 srv-prod-rain-01 zmpkg.pl[1262]: Compilation failed in require at /usr/share/perl5/ZoneMinder.pm line 33.
авг 30 08:23:57 srv-prod-rain-01 zmpkg.pl[1262]: BEGIN failed--compilation aborted at /usr/share/perl5/ZoneMinder.pm line 33.
авг 30 08:23:57 srv-prod-rain-01 zmpkg.pl[1262]: Compilation failed in require at /usr/bin/zmpkg.pl line 34.
авг 30 08:23:57 srv-prod-rain-01 zmpkg.pl[1262]: BEGIN failed--compilation aborted at /usr/bin/zmpkg.pl line 34.
авг 30 08:23:57 srv-prod-rain-01 zmpkg[1262]: ERR [Error reconnecting to db: errstr:Access denied for user 'www-data'@'localhost' (using password: NO) error val:]
авг 30 08:23:57 srv-prod-rain-01 systemd[1]: zoneminder.service: Control process exited, code=exited, status=255/EXCEPTION
авг 30 08:23:57 srv-prod-rain-01 systemd[1]: zoneminder.service: Failed with result 'exit-code'.
авг 30 08:23:57 srv-prod-rain-01 systemd[1]: Failed to start zoneminder.service - ZoneMinder CCTV recording and surveillance system.
Дальше всякое интересное изнасилование моего мозга 🙂 И в целом лучше сразу переходить к этапу мэйнтейнер забил на все в 2020 году и мы просто запустимся в ручном режиме и удивимся. Настройки применились, но получили другую ошибку.
авг 30 08:02:47 srv-prod-rain-01 zmpkg[51524]: ERR [Error reconnecting to db: errstr:Plugin 'mysql_native_password' is not loaded error val:]
авг 30 08:02:47 srv-prod-rain-01 systemd[1]: zoneminder.service: Control process exited, code=exited, status=255/EXCEPTION
авг 30 08:02:47 srv-prod-rain-01 systemd[1]: zoneminder.service: Failed with result 'exit-code'.
авг 30 08:02:47 srv-prod-rain-01 systemd[1]: Failed to start zoneminder.service - ZoneMinder CCTV recording and surveillance system.
Подключаем плагин. Для чего создаем файл /etc/mysql/conf.d/enable-mysql-native-password.cnf со следующим содержимым:
[mysqld]
mysql_native_password=ON
Перезапускаем сервис:
# systemctl restart mysql
Создаем пользователя с шифрованием пароля в native password:
mysql> CREATE USER 'user_zoneminder'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxxPASSWORDxxx';
Проверяем, что пользователь теперь использует native password:
mysql> SELECT user, host, plugin FROM mysql.user WHERE plugin='mysql_native_password';
+-----------------+-----------+-----------------------+
| user | host | plugin |
+-----------------+-----------+-----------------------+
| user_zoneminder | localhost | mysql_native_password |
+-----------------+-----------+-----------------------+
1 row in set (0,00 sec)
Запуск ZoneMinder в Docker
Эксперименты начнем с https://hub.docker.com/r/zoneminderhq/zoneminder, там правда четыре года ничего не менялось, но как я понимаю и весь проект уже как раз в то время и заглох.
Запуск для теста будет выглядеть следующим образом.
# docker run -d -t -p 1080:443 \
-v /disk/zoneminder/events:/var/lib/zoneminder/events \
-v /disk/zoneminder/mysql:/var/lib/mysql \
-v /disk/zoneminder/logs:/var/log/zm \
--name zoneminder \
zoneminderhq/zoneminder:latest-el7
Выглядит рабочим и даже web-интерфейс доступен.

Но наша цель немного не такая и хотелось бы запустить это недоразумение локально и без докер-оберток. Странно, но это чудо похоже и в Docker не хочет работать.
==> /var/log/zoneminder/zmdc.log <==
09/01/25 09:00:03.379709 zmdc[570].FAT [main:195] [Can't connect to zmdc.pl server process at /var/lib/zoneminder/sock/zmdc.sock: No such file or directory]
Это уже становится интересной задачей и давайте соберем все это из исходников стабильной-ветки https://github.com/ZoneMinder/zoneminder.
Сборка ZoneMinder из исходных кодов
Удаляем к чертовой матери прошлые эксперименты.
# aptitude purge zoneminder
И соберем все сами из мастер ветки, для чего нам понадобятся ряд зависимостей. И интересно, что теперь для сборки используется GitLab CI и Docker, они честно об этом предупреждают в описании проекта, но мы попробуем по старой схеме.
# apt-get install build-essential
# apt-get install devscripts
Сборка получается довольно странная, но dev-пакеты получилось установить автоматически.
# ./utils/do_debian_package.sh --snapshot=stable --type=binary --interactive=no --dput=no --debbuild-extra=--no-sign
Собранные пакеты находятся в корне репозитория.

Установим собранные пакеты, а недостающие пакеты также установим через apt –fix-broken install.
# dpkg -i ./zoneminder_1.36.35-plucky_amd64.deb
# apt --fix-broken install
# apt-get install postfix libmojolicious-perl libapache2-mod-perl2 libnet-jabber-perl libtemplate-plugin-gd-perl libtemplate-plugin-xml-perl php-pear
Итог
На Ubuntu 25.04 это работать не будет и тут или надо под более старую версию виртуализировать или смотреть другие решения. Увы.