ARM系CPUのマシンにDockerでZabbixサーバを構築する

# はじめに
先日リリースされたZabbix5.0を試しがてら自宅ネットワークの監視環境を整備したかったため、常時起動しているNAS ([QNAP TS-231+](https://www.qnap.com/ja-jp/product/ts-231+)) のアプリ、[*Container Station*](https://www.qnap.com/solution/container_station/ja-jp/) を使ってZabbixサーバをDockerで動かしてみようと思います。

# 構成
[QNAP TS-231+](https://www.qnap.com/ja-jp/product/ts-231+)は家庭向けNASのため、スペックは期待できません。

また、他の製品にはIntel製CPUが搭載されている製品もありますが、[QNAP TS-231+](https://www.qnap.com/ja-jp/product/ts-231+) はARM製CPUで、かつ32ビットCPUとなるため、使用できるDockerイメージは大分絞られます。

||QNAP TS-231+|
|:--|--:|
|CPU|ARM Cortex-A15|
|アーキテクチャ|armv7l (32ビット)|
|メモリ|1GB|

# 構築準備
以下QNAPに構築する前提で進めます。
他のARMマシンにインストールする場合は適宜読み替えて下さい。

## 公式Dockerファイルダウンロード
GitHubで [Zabbix公式Dockerファイル](https://github.com/zabbix/zabbix-docker) が公開されているため *[Clone or download] → [Download ZIP]* でダウンロードします。
![01_github.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/95898a0e-a34f-11ad-f1eb-3f76200916dd.jpeg)

ダウンロードしたファイルはQNAPの適当な場所にアップロードして、`unzip`コマンドで展開しておきます。

```shell-session
# unzip zabbix-docker-5.0.zip
```

### `zabbix-docker-5.0`の中身
`zabbix-docker-5.0`配下のファイル構成はざっくり分けて以下の様な構成となっています。

|ファイル、ディレクトリ種類|ファイル、ディレクトリ例|
|:--|--:|
|docker-composeファイル|docker-compose_v3_alpine_mysql_latest.yaml 等|
|ローカル用Dockerディレクトリ|server-mysql 等|
|環境変数ファイル|.env_web 等|
|DBユーザ名、パスワードファイル|.POSTGRES_USER 等|
|ビルド用シェル|build.sh 等|
|Kubernetes用ファイル|kubernetes.yaml|

## 日本語フォントのダウンロード
Zabbixのグラフ表示に使用しているフォントは日本語対応していないため、何もしないと以下の様に文字化けしてしまいます。
![02_graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/deb17df9-0716-c801-d728-9864c002b6d9.jpeg)

そのため、[IPAのサイト](https://ipafont.ipa.go.jp/)からフリーの日本語フォントをダウンロードして使用することにします。

- [IPA Pゴシック](https://ipafont.ipa.go.jp/old/ipafont/download.html)

# 構築
QNAPにSSHログインして実際に構築していきます。
先ほどダウンロードしたフォントファイルはTTFファイルだけ抜き出し、`zabbix-docker-5.0`ディレクトリの中に入れておきます。

```
┗━ zabbix-docker-5.0
    ┣━ <Zabbixファイル等>
    ┗━ ipagp.ttf
```

## Dockerファイルの作成
前述の通り、[Zabbix公式Dockerファイル](https://github.com/zabbix/zabbix-docker)は日本語対応のフォントが実装されていないため、グラフ表示が文字化けしてしまいます。

実装するためにはDockerイメージにフォントを格納してビルドする必要があるため、Dockerファイルを作成していきます。

`zabbix-docker-5.0`ディレクトリに移動し、Dockerfileとフォントファイルを格納するディレクトリを作成＆格納します。

```shell-session
# mkdir -p web-nginx-pgsql-custom/fonts/
# mv ipagp.ttf web-nginx-pgsql-custom/fonts/
```

`zabbixmultiarch/zabbix-web-nginx-pgsql:alpine-5.0-latest`イメージにフォントの設定を行うため、Dockerfileを作成します。

基となるDockerイメージはZabbixユーザで動作するようになっていますが設定ファイル等が格納されているディレクトリはroot権限となっているため、そのままだと設定変更したりできません。

そのため少々無理やりですが、最初にroot権限で操作するようにrootユーザ(`USER 0`)を指定して、設定後再度Zabbixユーザ(`USER 1997`)を指定しなおすようにします。

以下内容を`web-nginx-pgsql-custom/Dockerfile`に書き込むようにして下さい。

```dockerfile:web-nginx-pgsql-custom/Dockerfile
FROM zabbixmultiarch/zabbix-web-nginx-pgsql:alpine-5.0-latest
COPY ["fonts/", "/usr/share/zabbix/assets/fonts/"]
USER 0
RUN sed -i -e "/ZBX_GRAPH_FONT_NAME/s/DejaVuSans/ipagp/g" /usr/share/zabbix/include/defines.inc.php
USER 1997
```

## docker-composeファイルの編集
`zabbix-docker-5.0`内のdocker-composeファイルはOS、DBの種類、latestを使うかローカルのものを使うかによってyamlファイルが分かれていますが、今回は軽量Dockerイメージの`alpine`と`postgresql`、`latest`を使用します。

### 不要サービスのコメントアウト
docker-composeファイルの`services:`は各機能ごとにセクションが分かれており、使用しない機能も含まれていることから今回は以下サービスのみ使用して、他のサービスは丸ごとコメントアウトします。

- zabbix-server
- zabbix-web-nginx-pgsql
- zabbix-agent
- zabbix-snmptraps
- postgres-server
- db_data_pgsql

### 不要サービスリンクのコメントアウト 
使用するサービスの中に、不要サービスのリンクが記載されている箇所があるので以下コメントアウトします。

```yaml:docker-compose_v3_alpine_pgsql_latest.yaml
(zabbix-serverセクション23行目をコメントアウト)
#   - zabbix-java-gateway:zabbix-java-gateway

(zabbix-serverセクション45行目をコメントアウト)
#   - zabbix-java-gateway
```

### Zabbixイメージの変更
ZabbixのDockerイメージは[DockerHub](https://hub.docker.com/)で公開されておりますが、前述の通り、QNAPはARM系CPUのため、docker-composeファイルに記載されているZabbixのイメージが使用できません。
そのため、ARM系CPUにも対応した`zabbixmultiarch`イメージを使用するようイメージ名を変更します。

```shell-session
# sed -i -e "/image:/s/zabbix\//zabbixmultiarch\//g" docker-compose_v3_alpine_pgsql_latest.yaml
```

### カスタムイメージの設定
今回は先ほど作成したDockerfileを使用するため、`zabbix-web-nginx-pgsql`セクションの設定を変更します。
基のdocker-composeファイルはDockerイメージが指定されておりますが、今回はDockerfileでビルドするよう変更します。

``` yaml:docker-compose_v3_alpine_pgsql_latest.yaml
(抜粋)
 zabbix-web-nginx-pgsql:
#  image: zabbixmultiarch/zabbix-web-nginx-pgsql:alpine-5.0-latest
  build: ./web-nginx-pgsql-custom
```

## .env_webファイルの編集
`.env_web`ファイルにはWebサーバやPHP関連の変数が記載されています。
その中の`PHP_TZ`（PHPのタイムゾーン）を`Asia/Tokyo`に変更します。

```shell:.env_web
(以下追加)
PHP_TZ=Asia/Tokyo
```

## docker-compose実行
いよいよ作成したdocker-composeファイルを実行してZabbixサーバを作成します。
yamlファイルは`zabbix-docker-5.0`内に沢山あるので、`-f`でyamlファイルを指定して実行します。

```shell-session
# docker-compose -f docker-compose_v3_alpine_pgsql_latest.yaml up -d
```

実行後、エラーが出なければ、QNAPの [*Container Station*](https://www.qnap.com/solution/container_station/ja-jp/) から作成したZabbixサーバが見えてきます。

ちなみに [*Container Station*](https://www.qnap.com/solution/container_station/ja-jp/) から見ると`zabbix-docker-50_db_data_pgsql_1`のコンテナが止まっていますがデータ専用コンテナなので止まっていて問題ありません。

## Zabbixサーバ起動後の設定
`http://*[QNAPのIPアドレス]*:8081/`でアクセスすると、Zabbixのログイン画面が表示されるため、*Username*：`Admin`、*Password*：`zabbix`でログインします。

### `Zabbix agent is not available`の対処
Zabbix管理画面にログインすると`Zabbix server`のホストで`Zabbix agent is not available`のエラーが表示されているはずです。

これは`zabbix-agent`をZabbixサーバとは別コンテナで動かしているため、「127.0.0.1」で通信できないことからエラーとなっています。

`zabbix-agent`のIPアドレスを指定してもエラーは解消されますが、docker-composeで作成したZabbixのサービス間はdocker-composeに記載されているaliases名でやり取りできるので、*[設定]→[ホスト]→[Zabbix server]* から以下の様に設定を変更します。

|項目|設定|
|:-:|:-:|
|DNS名|zabbix-agent|
|接続方法|DNS|

![03_host.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/7025857b-93ea-4558-e84f-85bada49015d.jpeg)

# まとめ
ZabbixサーバのDockerを動かしてみた感じ、CPU使用率は裏で動いているサービスの増減が激しいので参考になりませんが、メモリはZabbixサーバ実装前が50%前半だったので15%程度の増加で落ち着いています。

スペックが低いのであくまでも個人、テスト用途となりますが、自宅ネットワークで使う分には問題ないかと思います。
![03_cpu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/19aeb3ad-d159-ad56-4f8f-f62f66e24ef4.jpeg)