DockerでZabbix 5.0インストール→障害時にSlack通知を設定するまで

![Ubuntu-20.04.01](https://img.shields.io/badge/Ubuntu-20.04.01-brightgreen) ![Zabbix-5.0.3](https://img.shields.io/badge/Zabbix-5.0.3-brightgreen) ![Git-2.28.0](https://img.shields.io/badge/Git-2.28.0-brightgreen) ![Docker-19.03.13](https://img.shields.io/badge/Docker-19.03.13-brightgreen) ![CPython-3.7.7](https://img.shields.io/badge/CPython-3.7.7-brightgreen) ![OpenSSL-1.1.0](https://img.shields.io/badge/OpenSSL-1.1.0-brightgreen)

サーバー監視、ドメイン監視を行いたい。
Zabbixの利用経験がなかったため、学習も兼ねて実装を行う。
障害時にSlackの指定チャンネルに通知が行くまでをゴールとする。

## 環境用意
|名称|バージョン|
|:---|---:|
|Ubuntu|20.04.01|
|Zabbix|5.0.3|
|Git|2.28.0|
|Docker|19.03.13|
|docker-compose|1.27.3, build 4092ae5d|
|docker-py|4.3.1|
|CPython|3.7.7|
|OpenSSL|1.1.0l  10 Sep 2019|


## 手順
インストール手順です。

### Zabbixをclone

```
git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker
```

今回はAlpine + PostgreSQL の構成でいきます。
Dockerを利用する際にはAlpineで十分のため、あまりサイズが大きいイメージは不必要と考えています。
MySQLではなくPostgreSQLを選ぶ理由は今後、設定が肥大化した際にMySQLではチューニングだけでは大量クエリを捌くのに向かないと判断したためです。後からMySQL→PostgreSQLに変えることも良いとは思いますが、コストを考え最初からPostgreSQLでいくことにしました。

選定には

* [Zabbixのデータベース ベンチマークレポート PostgreSQL vs MySQL](https://www.sraoss.co.jp/event_seminar/2013/20130829_Zabbix_PG_vs_MySQL.pdf)
* [大規模監視サーバでのPostgreSQL](https://www.pgecons.org/wp-content/uploads/2020/02/PGECons_20200212_Seminar_3_SRA.pdf)

を参考にしました。

### YAMLをコピー

```
$ cp docker-compose_v3_alpine_pgsql_latest.yaml docker-compose.yml
```

### DBのUser、Passwordの修正

```
#下記ファイルを必要に応じて修正
.POSTGRES_USER
.POSTGRES_PASSWORD
```

### 起動

```
$ sudo docker-compose up -d

$ sudo docker-compose ps
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus
                 Name                                Command                  State                           Ports                     
----------------------------------------------------------------------------------------------------------------------------------------
zabbix-docker_db_data_mysql_1             sh                               Exit 0                                                       
zabbix-docker_db_data_pgsql_1             sh                               Exit 0                                                       
zabbix-docker_mysql-server_1              docker-entrypoint.sh mysql ...   Up                                                           
zabbix-docker_postgres-server_1           docker-entrypoint.sh postgres    Up                                                           
zabbix-docker_zabbix-agent_1              /sbin/tini -- /usr/bin/doc ...   Up                                                           
zabbix-docker_zabbix-java-gateway_1       docker-entrypoint.sh /usr/ ...   Up                                                           
zabbix-docker_zabbix-proxy-mysql_1        /sbin/tini -- /usr/bin/doc ...   Up             0.0.0.0:10071->10051/tcp                      
zabbix-docker_zabbix-proxy-sqlite3_1      /sbin/tini -- /usr/bin/doc ...   Up             0.0.0.0:10061->10051/tcp                      
zabbix-docker_zabbix-server_1             /sbin/tini -- /usr/bin/doc ...   Up             0.0.0.0:10051->10051/tcp                      
zabbix-docker_zabbix-snmptraps_1          /usr/bin/supervisord -c /e ...   Up             0.0.0.0:162->1162/udp                         
zabbix-docker_zabbix-web-apache-pgsql_1   docker-entrypoint.sh /usr/ ...   Up (healthy)   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   
zabbix-docker_zabbix-web-nginx-pgsql_1    docker-entrypoint.sh             Up (healthy)   0.0.0.0:8081->8080/tcp, 0.0.0.0:8443->8443/tcp
```

Warningが出たので念の為調べます。
`WARNING: The following deploy sub-keys are not supported and have been ignored: resources.reservations.cpus (次のdeployサブキーはサポートされていないため無視されました)`

```
 deploy:
   resources:
    reservations:
      cpus: '0.5'
```

> これらのオプションは、スウォームモードサービスのスケジュールオプションです
>（つまり、実際にはリソースを予約せず、ノードでコンテナをスケジュールするときにswarmにそれらを考慮させるだけです）。
>
> Docker Composeはスウォームモード（ローカルコンテナーをデプロイする）では機能しないため、
> これらの制限を考慮に入れるオーケストレーターはありません。

参考：[Compatibility mode #5684](https://github.com/docker/compose/pull/5684)

reservationを使わなければwarningは消えそうです。
無視されているため、このエラーごと無視して問題なさそうなのですが
確認するたびに毎度Warningが出るのは心理的にも良くないため、該当行をコメントアウトしました。

```
      #reservations:
      #cpus: '0.5'
      #memory: 512M
```

それでは再度実行します。

```
$ sudo docker-compose up -d --build

$ sudo docker-compose ps
                 Name                                Command                       State                               Ports                     
-------------------------------------------------------------------------------------------------------------------------------------------------
zabbix-docker_db_data_mysql_1             sh                               Exit 0                                                                
zabbix-docker_db_data_pgsql_1             sh                               Exit 0                                                                
zabbix-docker_mysql-server_1              docker-entrypoint.sh mysql ...   Up                                                                    
zabbix-docker_postgres-server_1           docker-entrypoint.sh postgres    Up                                                                    
zabbix-docker_zabbix-agent_1              /sbin/tini -- /usr/bin/doc ...   Up                                                                    
zabbix-docker_zabbix-java-gateway_1       docker-entrypoint.sh /usr/ ...   Up                                                                    
zabbix-docker_zabbix-proxy-mysql_1        /sbin/tini -- /usr/bin/doc ...   Up                      0.0.0.0:10071->10051/tcp                      
zabbix-docker_zabbix-proxy-sqlite3_1      /sbin/tini -- /usr/bin/doc ...   Up                      0.0.0.0:10061->10051/tcp                      
zabbix-docker_zabbix-server_1             /sbin/tini -- /usr/bin/doc ...   Up                      0.0.0.0:10051->10051/tcp                      
zabbix-docker_zabbix-snmptraps_1          /usr/bin/supervisord -c /e ...   Up                      0.0.0.0:162->1162/udp                         
zabbix-docker_zabbix-web-apache-pgsql_1   docker-entrypoint.sh /usr/ ...   Up (health: starting)   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   
zabbix-docker_zabbix-web-nginx-pgsql_1    docker-entrypoint.sh             Up (health: starting)   0.0.0.0:8081->8080/tcp, 0.0.0.0:8443->8443/tcp
```

無事、WARNINGも消えたため、次に本題に戻りたいと思います。

#### ホスト名について
コンテナがある本サーバーからは`http://localhost/`で確認ができます。
同一ネットワーク帯からは`http://192.168.x.x/`で接続が確認できました。

#### プロキシの設定
logsを確認するとエラーを確認。

```
zabbix-server_1            |    211:20200923:130201.825 cannot parse proxy data from active proxy at "172.16.238.4": proxy "zabbix-proxy-sqlite3" not found
zabbix-server_1            |    211:20200923:130202.452 cannot parse proxy data from active proxy at "172.16.238.6": proxy "zabbix-proxy-mysql" not found
```

下記のとおり対処。
[Zabbix4.2 を docker で立ち上げてみた](https://hawksnowlog.blogspot.com/2019/06/zabbix42-on-docker.html)

####  cannot send list of active checks to "xxx": host [yyy] not found
エラーが出続ける。下記の通り対処。
[【zabbix】ログに「-cannot-send-list-of-active-checks-to-127-0-0-1」が出続ける](https://vamdemicsystem.black/zabbix/%E3%80%90zabbix%E3%80%91%E3%83%AD%E3%82%B0%E3%81%AB%E3%80%8C-cannot-send-list-of-active-checks-to-127-0-0-1%E3%80%8D%E3%81%8C%E5%87%BA%E7%B6%9A%E3%81%91%E3%82%8B)

### ログイン

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/68073528-7f12-3a5f-8e50-bd9cf19ee4e9.png" width="30%" alt="zabbix5.0ログイン画面">


初期ID、PWは以下の通りです。(大文字注意)

|ID|PW|
|:---|:---|
|Admin|zabbix|


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/f49d162c-63aa-2551-16bb-90b98bb684a6.png" width="50%" alt="zabbix5.0ログイン後、初期画面">

こちらはログイン後の初期画面です。

### 日本語化
左サイドバーの「User setting」→「Language」→「Japanese(ja_JP)」に変更します。
初期パスワードでは脆弱のため、パスワードも同時に変えてしまいましょう。

### 「Zabbix Server利用不可」を解消する

下記を参考に、修正しました。
[Zabbix Server の 利用不可 を解消する](https://qiita.com/zembutsu/items/d98099bf68399c56c236#zabbix-server-%E3%81%AE-%E5%88%A9%E7%94%A8%E4%B8%8D%E5%8F%AF-%E3%82%92%E8%A7%A3%E6%B6%88%E3%81%99%E3%82%8B)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/83180351-c9a4-aecb-057e-7609e68c9afb.png" width="50%" alt="Zabbix Server の 利用不可 を解消する">
※「設定」→「ホスト」→「インターフェース」より。


### ホスト・テンプレート・メール設定まわり
ここらへんはぐぐったら色々載ってるかと思います。
私は下記を参考にしました。

* [Zabbix 5.0 : 監視ホストの設定](https://www.server-world.info/query?os=Ubuntu_20.04&p=zabbix50&f=4)
* [Zabbix3 で Web 監視するための設定方法](https://www.wivern.com/security20170119.html)

※サーバー構築よりこっちのほうが理解が難しかった・・・。

### タイムゾーン
Alpine版Zabbixは日本時間ではなかったため修正が必要。


* [Zabbix5.0をdocker-composeで速攻起動する](https://qiita.com/uzresk/items/5c617a564840d3d9fac7)

どこを変更すればいいのか詰まってましたが「.env_web」を修正しました。

#### グラフの文字化けの修正
ここを参考。

[ARM系CPUのマシンにDockerでZabbixサーバを構築する - 日本語フォントのダウンロード](https://qiita.com/sakai00kou/items/285d0a4008b8492f5937#%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)

```
sudo apt-get install -y fonts-ipafont
```

こんな感じで該当フォントを直接マウントしました。

```docker-compose.yml
 zabbix-web-nginx-pgsql:
  image: zabbix/zabbix-web-nginx-pgsql:alpine-5.0-latest
  ports:
   - "80:8080"
   - "443:8443"
  links:
   - postgres-server:postgres-server
   - zabbix-server:zabbix-server
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - /etc/timezone:/etc/timezone:ro
   - ./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro
   - ./zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules/:ro
   - /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf:/usr/share/zabbix/assets/fonts/DejaVuSans.ttf:ro
```

これで再度dockerを立ち上げると日本語になっていることが確認できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/3b473802-a551-e5c3-8de6-d4a302adaee6.png" width="50%" alt="日本語表示を確認したZabbix5.0のグラフの一部">

これで日本語フォント周りは完了。

## Slack通知の設定
下記を参考
[Zabbix 5.0でslack通知を設定する](https://qiita.com/migaras/items/bc0dde421af9650d109c)


# 結果
とりあえず、やりたかった監視体制を構築することが出来た。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/18535989-f385-3d34-b7cf-9b34072ae803.png" width="50%" alt="zabbixからslackに障害時に通知を飛ばした際のサンプル">


# 感想

* 監視サービス、初見では人に聞かないと使い方無理(エージェントis何みたいな)
* Zabbix4の経験者に色々聞いて使い方を理解できた
* 公式のドキュメント、普通に読みづらい
* 構築まではスムーズに行っていたが、実際の運用方法までを考えたやり方に苦戦した。
* zabbix-agent、ホスト、テンプレート、アイテム、WEB、トリガー、グラフなど、最低限の機能を知らないと使えなさそう。
* 現場の運用者にはある程度使い方を指南、またはドキュメントを作らないと触れなさそう。
* そもそもagentが使えないレン鯖運用が多いところだと管理が面倒
* Zabbix検証用に動いているサーバーと障害が出ているサーバーを用意しておくと楽
* 参考の多さからわかるように、結構調べないと進まないので初心者は注意

# 参考
[DockerでのZabbix 5.0の環境構築メモ](https://qiita.com/migaras/items/3aa24b74a55a6fc715d1)
[Zabbix 5.0でslack通知を設定する](https://qiita.com/migaras/items/bc0dde421af9650d109c)
[Ubuntu で git のバージョンを最新版にする](https://loumo.jp/archives/23149)
[Zabbixのデータベース ベンチマークレポート PostgreSQL vs MySQL](https://www.sraoss.co.jp/event_seminar/2013/20130829_Zabbix_PG_vs_MySQL.pdf)
[大規模監視サーバでのPostgreSQL](https://www.pgecons.org/wp-content/uploads/2020/02/PGECons_20200212_Seminar_3_SRA.pdf)
[超軽量なAlpine Linuxについて調べた](https://qiita.com/ryuichi1208/items/6020cfabc92bd8153654)
[Zabbix 5.0 を Docker Compose で起動する手順](https://qiita.com/zembutsu/items/d98099bf68399c56c236)
[ubuntuに最新版のdockerをインストールする](https://qiita.com/____easy/items/37ded5632b59dfd06223)
[Ubuntu20.04に最新のdocker composeをインストールする](https://mebee.info/2020/03/17/post-7561/)
[Docker Compose Limitsを実行する際の生産性のヒントとベストプラクティス - Docker Composeのための実践的なエクササイズ その4](https://qiita.com/KentOhwada_AlibabaCloudJapan/items/e0adaf455aed7cdbae56)
[【備忘録】zabbixでDockerのリソース監視方法](https://qiita.com/jampanti/items/8354d8144a370162e1f9)
[Zabbix 5.0 : 監視ホストの設定](https://www.server-world.info/query?os=Ubuntu_20.04&p=zabbix50&f=4)
[Zabbixを初めて学んだときにハマったこと（小ネタ・随時更新予定）](https://cosol.jp/techdb/2018/09/zabbix_mistaking/)
[Zabbix 5.0 LTS Docker版 起動からログインまで](https://qiita.com/cloudsnow/items/92fba5506f53300aa87c)
[ARM系CPUのマシンにDockerでZabbixサーバを構築する](https://qiita.com/sakai00kou/items/285d0a4008b8492f5937)
[ZabbixでWeb監視を行う（前編）](https://qiita.com/jinnai73/items/1d1101a865206ddb82ac)
[Zabbix5.0をdocker-composeで速攻起動する](https://qiita.com/uzresk/items/5c617a564840d3d9fac7)