zoneminderのインストール

以下の構成を前提にインストール作業を行います。ここでは、Linux初心者も対象としているため、Ubuntuのインストールから解説します。

  • Ubuntu20.04
  • Apache
  • MySQL
  • zoneminder 1.35.6~1.35.9

Ubuntu20.04のインストール

zoneminderをインストールする先のOSとして、人気のあるLinuxディストリビューションの1つであるUbuntu20.04(Server)をインストールします。Windowsとは違って無料のOSとなります。

追って、設定中で日本語化する為、ここでは「English」を選択します。
場合によっては、上記画面が出る事があります。単純にインストールしようとしているよりも新しいパッケージがある旨の注意となります。どちらでもいい為、「Continue without updating」を選択しています。
キーボードのレイアウトに「Japanese」を選択します。
IPアドレスを設定します。説明の都合上、ここではDHCPで自動取得したIPが表示されていることを確認します。サーバの場合は、固定IPが好まれることもある為、ここで固定IPを指定しても問題ありません。(インストール後に固定IPに設定しなおすことも可能です)
proxyは無しのままとします。
Mirror addressはデフォルトのままにします。
ここでは、LVMをそのまま使うことにして、次へ行っています。ストレージ情報を個々に設定したい場合には、「Custom storage Layout」を選択します。
必要に応じて、パーティションを設定します。/mnt/camera等のパーティションに1TB以上のディスクを割り当てられるとより良いです。
HDDに設定値を書き込み、インストールする為データが消える旨の警告です。新規のHDDや、データ消去して問題ないHDDを使っていると思いますので、「Continue」を押下します。
ユーザー名とそのパスワード、サーバ名を入力します。ここではユーザー名はzm、サーバー名はmyserverとしています。お好きな名前で設定してください。
後でメンテナンスしやすいようにSSHをインストールしておきます。
他のパッケージについては特にインストールしません。
インストール中は、上記のような画面となりますので、インストール完了するまで待ちます。
インストール完了したら「Reboot」が選べるようになるので、押下して再起動します。

zoneminderのインストール

ubuntu20.04のインストールが完了したら、zoneminderをインストールします。

ログインプロンプトに、先ほどインストールした際に指定したユーザー名を入力し、「Enter」を押下します。続いてパスワードを入力して「Enter」を押下します。
ip addr コマンドを打つと、上記画面のように、inetに続いてサーバのIPアドレスが表示されます。IPアドレスが解ったら、手元のWindowsクライアントなどから、Putty等を利用してSSH接続してください。(もちろん、このままサーバ上のコンソールで作業しても問題ありませんが、SSH接続しての作業の場合、コマンドのコピペがしやすいので、その方が良いかと思います。)

SSHログインした後、以下の通り、必要なソフトウェアのインストールを行っていきます。

# パッケージの最新化
sudo apt update ; sudo apt upgrade
sudo reboot

# 再起動完了後に必要パッケージを追加インストール
sudo apt update && sudo apt install -y \
    apt-transport-https curl wget gnupg ca-certificates

# zoneminderのリポジトリを追加
sudo cp /etc/apt/sources.list /etc/apt/sources.list.org
echo "deb https://zmrepo.zoneminder.com/debian/master focal/" | sudo tee -a /etc/apt/sources.list
wget -O - https://zmrepo.zoneminder.com/debian/archive-keyring.gpg | sudo apt-key add -

# 必要なパッケージをまとめてインストール 
sudo apt update && sudo apt upgrade && sudo apt install -y \
    sudo git build-essential cmake gdb ccache devscripts debhelper \
    cdbs fakeroot lintian equivs rpm alien dh-systemd \
    libdistro-info-perl apache2-dev bzip2 dh-linktree docutils-common \
    ffmpeg fontconfig fontconfig-config fonts-dejavu-core gir1.2-polkit-1.0 \
    libapr1 libapr1-dev libaprutil1 libaprutil1-dev libasound2 libasound2-data \
    libass9 libasyncns0 libavc1394-0 libavcodec-dev libavcodec58 libavdevice-dev \
    libavdevice58 libavfilter-dev libavfilter7 libavformat-dev libavformat58 \
    libswresample-dev libswresample3 libavutil-dev libavutil56 \
    libb-hooks-op-check-perl libbluray2 libbs2b0 libbz2-1.0 libbz2-dev libcaca0 \
    libcairo2 libcdio-cdda2 libcdio-paranoia2 libcdio18 libchromaprint1 \
    libclass-mix-perl libcrypt-eksblowfish-perl libcrypt-rijndael-perl \
    libcrystalhd3 libcurl3-gnutls libcurl4-gnutls-dev libdata-entropy-perl \
    libdata-float-perl libdata-uuid-perl libdate-manip-perl libdatrie1 \
    libdbd-mysql-perl libdbi-perl libdc1394-22 libdevel-callchecker-perl \
    libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 \
    libdrm2 libdynaloader-functions-perl libedit2 libexpat1 \
    libexpat1-dev libfftw3-double3 libflac8 libflite1 libfontconfig1 \
    libfreetype6 libfribidi0 libgcrypt20-dev libgdk-pixbuf2.0-0 \
    libgdk-pixbuf2.0-common libgl1 libgl1-mesa-dri libglapi-mesa libglib2.0-0 \
    libglib2.0-bin libglib2.0-data libglib2.0-dev libglib2.0-dev-bin libglvnd0 \
    libglx-mesa0 libglx0 libgme0 libgmp-dev libgmpxx4ldbl libgnutls-dane0 \
    libgnutls-openssl27 libgnutls28-dev libgnutls30 libgnutlsxx28 \
    libgpg-error-dev libgraphite2-3 libgsm1 libharfbuzz0b libhttp-lite-perl \
    libidn11 libidn2-0-dev libidn2-dev libiec61883-0 libjack-jackd2-0 libjbig0 \
    libjpeg-turbo8 libjpeg-turbo8-dev libjs-jquery \
    libjs-mootools libjs-sphinxdoc libjs-underscore libldap-2.4-2 libldap-common  \
    libldap2-dev libllvm7 libmp3lame0 libmp4v2-2 libmp4v2-dev libmpg123-0 \
    libmysofa1 libmariadb-dev-compat libmariadb3 libnorm1 libnuma1 libogg0 \
    libopenal-data libopenal1 libopenjp2-7 libopenmpt0 libopus0 libp11-kit-dev \
    libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libparams-classify-perl \
    libpciaccess0 libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 \
    libpgm-5.2-0 libphp-serialization-perl libpixman-1-0 libpng16-16 \
    libpolkit-agent-1-0 libpolkit-gobject-1-0 libpolkit-gobject-1-dev \
    libpostproc-dev libpostproc55 libpulse0 libpython2-stdlib \
    libraw1394-11 librsvg2-2 \
    librubberband2 libsamplerate0 libsctp-dev libsctp1 libsdl2-2.0-0 libsensors5 \
    libshine3 libslang2 libsnappy1v5 libsndfile1 libsndio7.0 libsodium23 \
    libsoxr0 libspeex1 libssh-gcrypt-4 libssl-dev libssl1.1 \
    libswscale-dev libswscale5 libsys-mmap-perl libtasn1-6-dev \
    libthai-data libthai0 libtheora0 libtiff5 libtwolame0 libunbound8 \
    libusb-1.0-0 libuuid1 libv4l-0 libv4l-dev libv4l2rds0 libv4lconvert0 \
    libva-drm2 libva-x11-2 libva2 libvdpau1 libvlc-dev libvlc5 libvlccore9 \
    libvorbis0a libvorbisenc2 libvorbisfile3 libvpx6 libwavpack1 \
    libwayland-client0 libwayland-cursor0 libwayland-egl1 libwebp6 libwebpmux3 \
    libwrap0 libx11-6 libx11-data libx11-xcb1 libx264-155 libx264-dev \
    libx265-179 libxau6 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 \
    libxcb-render0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1 \
    libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3 libxi6 libxinerama1 \
    libxkbcommon0 libxrandr2 libxrender1 libxshmfence1 libxss1 libxv1 \
    libxvidcore4 libxxf86vm1 libzmq5 libzvbi-common libzvbi0 mysql-common \
    net-tools nettle-dev pkg-config python python-alabaster python-babel \
    python-babel-localedata python-certifi python-chardet python-docutils \
    python-idna python-imagesize python-jinja2 python-markupsafe \
    python-pkg-resources python-pygments python-roman python-six \
    sphinx-doc python3-sphinx python-typing python-tz \
    python3-distutils python3-lib2to3 sgml-base zlib1g-dev \
    shared-mime-info sphinx-common tzdata uuid-dev x11-common xkb-data xml-core \
    bzip2 libbz2-1.0 libcurl3-gnutls libexpat1 libglib2.0-0 libglib2.0-data \
    libgnutls30 libldap-2.4-2 libpcre3 libssl1.1 shared-mime-info

# zoneminderをインストールするうえで必要になるサーバソフトウェア関係をインストール
sudo apt install mysql-server mysql-client apache2 php php-mysql \
    libapache2-mod-php php-mbstring build-essential \
    libmysqlclient-dev libssl-dev libnumber-bytes-human-perl \
    language-pack-ja-base language-pack-ja ibus-mozc

# mysqlの文字コードがuft8mb4になっていることを確認
# 注意:uft8mb4ではないと、日本語が使えない
sudo mysql
mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

> exit

# zoneminderをインストールしてDBを作成する。
sudo apt install zoneminder
sudo mysql -uroot < /usr/share/zoneminder/db/zm_create.sql

# ZoneMinderのDBへ権限設定
sudo mysql
CREATE USER 'zoneminder'@'localhost' IDENTIFIED BY '98jZX*()j32jiodsfadfdcsa)(D3';
GRANT ALL ON zm.* TO 'zoneminder'@'localhost';
flush privileges;
exit;

# ZoneMinderのconfファイルを編集。
# ZM_DB_PASSは適当なパスワードを指定していますので、適宜変更してください。
sudo cp /etc/zm/zm.conf /etc/zm/zm.conf.org
sudo sed -i "s/^[# ]*ZM_DB_PASS *=.*/ZM_DB_PASS=98jZX*()j32jiodsfadfdcsa)(D3/g" /etc/zm/zm.conf
sudo sed -i "s/^[# ]*ZM_DB_USER *=.*/ZM_DB_USER=zoneminder/g" /etc/zm/zm.conf
sudo diff /etc/zm/zm.conf /etc/zm/zm.conf.org

# ZoneMinderの日本語対応
sudo cp /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak
sudo sed -i 's/;date.timezone =/date.timezone = "Asia\/Tokyo"/g' /etc/php/7.4/cli/php.ini
sudo diff /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak

# Shift_JISのままだと文字化けする為、UTF-8へ変更
sudo sed -i 's/Shift_JIS/UTF-8/g' /usr/share/zoneminder/www/lang/ja_jp.php


# 当サイト上に格納されている日本語ランゲージセットをダウンロードして差し替えます。
sudo cp /usr/share/zoneminder/www/lang/ja_jp.php /usr/share/zoneminder/www/lang/ja_jp.php.bak
cd /tmp
wget https://zoneminder.senritu.net/wp-content/downloads/ja_jp.php.zip
unzip ja_jp.php.zip
sudo mv ja_jp.php /usr/share/zoneminder/www/lang/ja_jp.php
sudo chown root:root /usr/share/zoneminder/www/lang/ja_jp.php

# Apacheの設定
sudo a2enmod cgi
sudo a2enmod rewrite
sudo a2enconf zoneminder
sudo systemctl restart apache2.service

# 関係サービスの起動と登録
sudo systemctl enable zoneminder
sudo systemctl start zoneminder

# USB WebCamを使う場合があるときのみ実行してください。
sudo usermod -a -G video www-data




zoneminderインストール完了後の初期設定

zoneminderのインストールが完了した後は、ブラウザでzoneminderサーバにアクセスして設定を行っていきます。

接続先URLは以下の通りで、【zoneminderインストール先サーバのIP】には、SSH接続した際のサーバのIPアドレスを入れてください。

http://【zoneminderインストール先サーバのIP】/zm

画面下の「Accept」を選択して「APPLY」を押下

上記画面がエンドレスループしてしまう場合は「こちら」を参考に直してください。

ログイン直後は、以下のようにコンコール画面が表示されます。監視カメラを登録するごとに、そのカメラのサマリ情報が表示されるようになりますが、まだインストール直後で未登録の為、以下のようにこざっぱりした画面となっています。

「Options」を選ぶと、「Systems」の中が表示されます。その中にあるLANG_DEFAULTを「ja_jp」にします。

上記の設定までを実施したことで、下記画面のように、メニュー回りが日本語化されます。しかし、設定項目の説明等がまだ英語のままなので、そちらも日本語化することにします。

設定項目の説明を日本語化する

こちらで紹介している日本語化用のSQLを実行することで、設定項目が日本語化できます。

cd /tmp
wget https://zoneminder.senritu.net/wp-content/downloads/update_db_to_japanease.sql.zip
unzip update_db_to_japanease.sql.zip
sudo mysql zm < update_db_to_japanease.sql

ログイン認証の有効化

オプション⇒システムから、以下赤枠を設定して、一番右下の保存を押下します。

OPT_USE_AUTHログイン認証の有効化
AUTH_TYPEzoneminderのビルトインを使うか、リモート認証を使うか選択できます。builtinを選択します。
AUTH_RELAYhashedを選択します
AUTH_HASH_SECRET認証を強固にするために文字列を指定します。
AUTH_HASH_IPS認証元のIPが固定の場合は有効にしても問題ありませんが、VPN経由でアクセスする要件やDHCPを使っている環境では無効にしてください。
AUTH_HASH_LOGINS有効にします

ログイン設定を有効にすると、ログイン画面になります。初期ユーザー名と初期パスワードは「admin/admin」です。

ログイン後、adminユーザーのパスワードを変更します。

オプション⇒利用者⇒adminを押下

新しいパスワードと、言語を「ja_jp」にして保存します。

コンソール画面の機能説明

zoneminderのコンソール画面の主な機能説明は以下の通りです。

No項目説明
コンソールカメラの概要やイベント情報等、サマリ的な画面となります。
オプションzoneminderの設定画面
ログログ一覧画面
グループ
フィルター特定の条件が満たされたときにアクションを実行するメカニズムを指定可能。例えば、特定のイベントが発生した際にメール送信する等はここで指定できます。
サイクル表示構成された各モニターのライブビューをサイクル表示します。
大型店舗でお客様向けに防犯カメラ映像を見せる用途等に使われることのある機能です。
カメラ映像リアルタイムのカメラ映像を確認できます。
録画映像録画した映像を表示します。過去のある時点を確認する際などに利用します。
監査イベントレポートパワーユーザー向け機能。イベントのギャップの記録とmp4ファイルの記録に関する問題を探すのに利用できます。
ログインユーザー現在ログインしているユーザー
機能カメラ映像を記録する方法を定義する。詳細は下表「カメラ映像を記録する方法」参照。
ソースカメラのタイプ(IPカメラ、USBカメラ)を示す。緑色は問題なし。赤色はカメラに問題がある事を示します。
イベント情報zoneminderの主機能の一つです。イベントの記録結果を、時間、日、週、月に記録された数を表示します。
ゾーンカメラのイベント検知エリアを指定できます。デフォルトだとカメラ全体を検知エリアとしています。
しかし、カメラの中に常時動きのある物体があった場合、常に検知イベントがあがってしまいます。そのような状態を回避するために、検知対象のエリア(ゾーン)を設定可能です。設定時はゾーン列の下の数字のリンクをクリックします。
Function意味
Noneモニターは現在無効になっています。ストリームを表示したり、イベントを生成したりすることはできません。何も記録されません。
Monitorモニターはライブストリーミングでのみ使用できます。画像分析は行われないため、アラームやイベントは生成されず、何も記録されません。
ModectMOtion DEteCTtionの略。キャプチャされたすべての画像が分析され、モーションが検出された録画ビデオでイベントが生成されます。
Recordモニターは継続的に記録されます。固定長のイベントは、従来のタイムラプスビデオレコーダーと同様に、モーションに関係なく生成されます。このモードでは、動きの検出は行われません。
Mocordモニターは継続的に記録され、それらのイベント内でモーションが強調表示されます。
NodecNo DEteCTtioの略。外部トリガーで使用するように設計された特別なモードです。 Nodectではモーション検出は行われませんが、外部トリガーで必要な場合はイベントが記録されます。
カメラ映像を記録する方法

設定完了後にすること

ZoneMinderリポジトリのコメントアウト

/etc/apt/sources.list.orgに追加したリポジトリは、頻繁に更新が行われています。それ自体は非常にありがたいのですが、日本語化した場所が都度、元に戻ってしまい、DBの更新も手動で行わないとエラーでZoneMinderが起動しないこともあります。
ですので、以下行をコメントアウトしてください。

sudo vi /etc/apt/sources.list.org
#deb https://zmrepo.zoneminder.com/debian/master focal/ <<コメントアウト

最初のころ、上記を気にせず運用しており、ZoneMinderが起動しなくなったり、文字化けするたびに修正しておりました。お勧めは、メジャーバージョンアップ時にのみコメントアウトを戻してアップグレードする運用です。

上記まででzoneminderのインストールから初期設定が完了しました。しかし、まだカメラを登録していないので、カメラ画像が一切映っておらずつまらないと思います。

ですので、次にカメラを登録してください。