Zoneminder as an NVR

I posted about ShinobiCCTV awhile back and I still think that it is still a great FOSS NVR. However, ShinobiCCTV not for me. I have been testing Shinobi instance both on a VM and Docker container, and I could not get it to work properly. There were several issues that I was having with Shinobi and these issues were constant whether I use a VM or Docker container.

These were the issues that I was having during when I was piloting Shinobi. I simply don’t have enough time to sit down and keep tweaking or troubleshooting it. The list below are the issues that I encountered on both VM and Docker container instances.

  • The primary issue that I was having was my cameras randomly disconnect from Shinobi and would not reconnect
  • The dashboard 70% of the time the cameras show a blank screen
  • There was 60% – 70% chance that the cameras were connected but not recording despite the active motion
  • Searching for specific motion in timeline is very slow
  • Viewing the list of recorded video, the load time was very slow
  • A lot of smearing even after following the recommended settings by the dev and community

I tested Zoneminder in the past, but quickly abandoned it due to high CPU usage. I am not sure when the H.264 passthrough has been added to ZM, but with this feature enabled, it reduces the CPU utilization by ~80%. I am not an expert or even a power user in regards to NVR system, I just want to replace my Reolink desktop app that I am currently using. To get the H.264 pass-through working, the camera must support it to begin with.

For the Timezone selection, pick one from here https://www.php.net/manual/en/timezones.php. To locate the php.ini file, enter this command:

php -i | grep "Loaded Configuration File"

CentOS 8

To install Zoneminder on CentOS 8 (yeah I know – hopefully there is an easy migration to Rocky)

dnf install -y mariadb mariadb-server mod_ssl php-mbstring php php-mysql httpd wget
dnf install -y epel-release
dnf install --nogpgcheck https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
dnf config-manager --enable PowerTools
dnf update -y
dnf search zoneminder

# Disable SELinux
setenforce 0
sed -i --follow-symlinks 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux

# Configure mariaDB
systemctl enable --now mariadb
mysql < /usr/share/zoneminder/db/zm_create.sql
mysql -e "GRANT ALL ON zm.* to 'zmuser'@localhost identified by 'zmpass';"
mysql -e "FLUSH PRIVILEGES;"

# Configure Apache
cd /etc/httpd/conf.d
ln -s /etc/zm/www/zoneminder.httpd.conf
sed -i --follow-symlinks 's/;date.timezone =/date.timezone = America\/Los_Angeles/g' /etc/php.ini
cd

# Enable httpd and zoneminder
systemctl enable --now httpd
systemctl enable --now zoneminder

# Allow port 80/tcp and 443/tcp inbound
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

# Restart the host machine
reboot

OpenSUSE 15.2

There is an issue with openSUSE that I could not figure out how to fix at this point. I can get ZoneMinder installed, but it keeps barking that the timezone does not match between the ZoneMinder and the system. I have updated the php.ini, ZoneMinder and mariadb, but no luck. Anyways, I am leaving it here just in case that in the newer version of ZoneMinder for openSUSE gets updated.

# Need to add the repository to install the libx264.so.160
zypper addrepo https://download.opensuse.org/repositories/home:ecsos/openSUSE_Leap_15.2/home:ecsos.repo

# Add the repository to download ZoneMinder
zypper addrepo https://download.opensuse.org/repositories/home:ecsos:server/openSUSE_Leap_15.2/home:ecsos:server.repo

# Refresh zypper
zypper refresh

# Install ZoneMinder
zypper install ZoneMinder

# Configure mariaDB 
systemctl enable --now mariadb
mysql < /usr/share/zoneminder/db/zm_create.sql
mysql -e "GRANT ALL ON zm.* to 'zm_admin'@localhost identified by 'zmpass';"
mysql -e "FLUSH PRIVILEGES;"

# Fix the apache timezone from UTC to desire timezone
sed -i --follow-symlinks 's/UTC/America\/New_York/g' /etc/php7/apache2/php.ini

# Enable and start the apache and zoneminder
systemctl enable --now apache2
systemctl enable --now zm

Docker

Probably the easiest and somewhat universal is the Docker installation. Make sure to install Docker and Docker Compose. Below is the docker-compose file from ZoneMinder. I changed the networking part since my network is segmented by zone/vlan. Here is the original docker-compose file.

version: '3.1'
services:
  zoneminder:
    container_name: zoneminder
    image: zoneminderhq/zoneminder:latest-ubuntu18.04
    restart: unless-stopped
    ports:
      - 8080:80
    networks:
      sec:
        ipv4_address: 10.0.5.9
    privileged: true
    shm_size: 512M
    environment:
      - TZ=America/New_York
    volumes:
      - /mnt/pool_surv/zoneminder/events:/var/cache/zoneminder/events
      - /mnt/pool_surv/zoneminder/iamges:/var/cache/zoneminder/images
      - /mnt/pool_surv/zoneminder/logs:/var/log/zoneminder
      - /mnt/disk13/appdata/zoneminder/mysql:/var/lib/mysql


networks:
  sec:
    driver: macvlan
    driver_opts:
      parent: eth0.5
    ipam:
      config:
        - subnet: 10.0.5.0/24

Before running the docker-compose up -d, make sure that you have the permission and owner fixed for the volumes. In my case, the volume specified in docker-compose file above. Otherwise, none of the volumes will get created.

chown -R :users /mnt/pool_surv/zoneminder
chmod -R 774 /mnt/pool_surv/zoneminder
chown -R :users /mnt/disk13/appdata/zoneminder
chmod -R 774 /mnt/disk13/appdata/zoneminder

Currently the www-data does not have access to the volumes. To fix this, we need to bash-into zoneminder container and chown the volumes.

docker-compose exec zoneminder chown -R www-data:www-data /var/cache/zoneminder/events
docker-compose exec zoneminder chown -R www-data:www-data /var/cache/zoneminder/images
docker-compose exec zoneminder chown -R www-data:www-data /var/log/zonemider

Make sure that firewalld is allowing inbound for port 8080/tcp if you are using “Bridge”. I am using Debian with this Docker installation

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

To fine tune the monitors, I found this wiki from ZoneMinder. Here is a great instruction how to fine tune each monitor’s zone.

I think this is it for now. My follow-up is how I added the cameras/monitors. Cheers!

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
WordPress Appliance - Powered by TurnKey Linux