家のネットワークを監視することにした

# 家のネットワークが遅い気がする

- ネットワークが遅い気がする．切れたりする．
    - ルータまでは接続できるがその先に行けない．
        - とりあえず監視することにした．

## とりあえず監視するツールを調べた

- Zabbix
    - 無料
    - docker image が提供されている
    - 今回は，ローカルホストから監視できると良さそう．
        - external script でもいいかも．
            - zabbix-server に `speedtest` コマンドインストールするのが面倒な気がしたので，今回は別イメージにした．
- cron
    - 設定をコードに落としておきたいので，docker compose ならその配下で実行できることが望ましい．

## 手順 - Zabbix 起動するまで

Refers に乗せてあるものと同じだが，一応

```
$ cp docker-compose_v3_alpine_mysql_latest.yaml docker-compose.yaml
$ edit .env_web  # PHP_TZ=Asia/Tokyo を追加
$ docker compose up -d
```

これだけで，`http://localhost` にアクセスできるようになる．
(ログイン情報は，公式参照

とはいえ，80 番ポートを使われると面倒なので，修正．

```diff_yaml
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 7eb3b1c0..7299bcac 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -229,8 +229,8 @@ services:
  zabbix-web-nginx-mysql:
   image: zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest
   ports:
-   - "80:8080"
-   - "443:8443"
+   - "12080:8080"
+   - "12443:8443"
   volumes:
    - /etc/localtime:/etc/localtime:ro
    - /etc/timezone:/etc/timezone:ro
```

これで，`http://localhost:12080` にアクセスできるようになる

## 手順 - cron を設定する

docker で cron を動かす [コチラ](https://qiita.com/c3drive/items/d7249a18daa09bf7689b) の記事を参考にさせて頂いた．

```diff_yaml
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 7299bcac..882b3aad 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -459,6 +459,16 @@ services:
 #    aliases:
 #     - elasticsearch

+ cron:
+  build:
+   context: cron
+  depends_on:
+   - zabbix-server
+
+
```

```dockerfile:cron/Dockerfile
FROM ubuntu:20.10

RUN apt update && \
 apt install -y cron

COPY sender_speedtest.sh /usr/local/bin/
COPY speedtest /etc/cron.d/speedtest
RUN chmod 0644 /etc/cron.d/speedtest

CMD ["cron", "-f"]
```

```shell:speedtest
* * * * * root /usr/local/bin/sender_speedtest.sh
```

```shell:sender_speedtest.sh
#!/bin/bash

touch /tmp/speedtest.log /tmp/speedtest.err

date >> /tmp/speedtest.log 2>> /tmp/speedtest.err
```

新しいイメージを起動する

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

`up` だけでrecreate してくれるのね．便利…

動作確認する．ログにデータが入っていればOK．

```
$ docker compose exec cron bash
# tail -f /tmp/speedtest.*
```

## 手順 - zabbix send する

cron でやろうとして，よく考えたら zabbix から external script とかで取った方がいいのかも？と思ったけど，
Refers の記事によると，sender で良さそうだったので，sender にする．

まず speedtest が動くようにする
必要なソフトを `cron` 用イメージに追加．

- speedtest
- zabbix-sender

```dockerfile:cron/Dockerfile
FROM ubuntu:20.10

RUN apt update && \
 apt install -y cron curl

RUN curl -s https://install.speedtest.net/app/cli/install.deb.sh | bash && \
 curl -LO https://repo.zabbix.com/zabbix/5.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1+ubuntu20.04_all.deb && \
 dpkg -i zabbix-release_5.4-1+ubuntu20.04_all.deb && \
 rm zabbix-release_5.4-1+ubuntu20.04_all.deb && \
 apt update && \
 apt install -y speedtest zabbix-sender

COPY sender_speedtest.sh /usr/local/bin/
COPY speedtest /etc/cron.d/speedtest
RUN chmod 0644 /etc/cron.d/speedtest

CMD ["cron", "-f"]
```

スクリプトを修正．

```shell:sender_speedtest.sh
#!/bin/bash

SPEEDTEST_SERVER_ID=`/usr/bin/speedtest -L | grep -E "OPEN Project" | sed 's/^ *\| *$//' | cut -d " " -f 1`
if [ -z "$SPEEDTEST_SERVER_ID" ]; then
  SPEEDTEST_SERVER_ID=`/usr/bin/speedtest -L | tail -1 | sed 's/^ *\| *$//' | cut -d " " -f 1`
fi
SPEEDTEST_RESULT=`/usr/bin/speedtest --accept-license -s $SPEEDTEST_SERVER_ID -f json`

ZABBIX_SERVER=zabbix-server
ZABBIX_HOSTNAME=speedtest.net
ZABBIX_ITEMKEY=speedtest.json

/usr/bin/zabbix_sender -z $ZABBIX_SERVER -s $ZABBIX_HOSTNAME -k $ZABBIX_ITEMKEY -o "$SPEEDTEST_RESULT"
```

接続先に OPEN Project が居なくなったりするので，最後のを使うようにした．
それと，license にaccept しないといけないので引数に追加した．

send したり，`speedtest` を実行するためにネットワーク設定が必要そうだったので追加した．

```diff_yaml
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 7299bcac..882b3aad 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -459,6 +459,16 @@ services:
 #    aliases:
 #     - elasticsearch

+ cron:
+  build:
+   context: cron
+  depends_on:
+   - zabbix-server
+  networks:
+   zbx_net_backend:
+   zbx_net_frontend:
+
+
```

テスト用に，1分おきにしていたのを，5分おきに修正

```shell:speedtest
*/5 * * * * root /usr/local/bin/sender_speedtest.sh
```

で，新しいイメージを起動する．

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

これで動いてそう．しばらく様子を見る．
(send するには，zabbix 側に trapper アイテム登録も必要なので，参考にした[記事](https://devlog.arksystems.co.jp/2021/03/23/14553/) を参照のこと

:::note
接続ができるようになるまでは，`bash -x /usr/local/bin/send_spedtest.sh` を実行してログを見たりしていた
結局，トラッパーアイテムのkey のタイポだったことを記載しておく
:::

追記

- 状況として瞬断してるようで，5分間隔だとあまりわからないことがわかった．
    - もう少し頻繁にチェックしないとわからないが，そこまですると帯域がちょっと気になっていく気がしてきた．

## Refers

https://genchan.net/it/virtualization/docker/14880/

https://tanakaxa.hatenablog.jp/entry/zabbix-compose

https://www.zabbix.com/documentation/current/manual/installation/containers#docker_compose

https://qiita.com/c3drive/items/d7249a18daa09bf7689b

https://devlog.arksystems.co.jp/2021/03/23/14553/