コンテナのことを全く知らない一般人がRaspberry pi上でInfluxDB +Grafanaコンテナを作ってグラフ表示

基本的に私は怠惰です。
よってコードなんか一から作りたくないし、できることならコピペで行きたい!!!!
でもって生活豊かにしたい!!!!

な状況でいままでSwitchbotのAPIをかまってきていなかったのですが、ちょっとかまってみようかな、その結果蓄積してグラフを見てみたいなと思いついた次第。

基本的には初心者(私)の
1. コンテナってどういうもの？
1. 過去事例の見返し
1. 各ソフトに関しての知見

がこの投稿の目的です。
初心者なので認識等がすごく曲解/間違っている可能性が高いですが指摘等していただけると知見の積み上げになります

## なぜなに
- なぜコンテナ上で?
ざっと検索したところコンテナ作成例が多くみられた。
今までかまっていなかったため、便利なら使いたいなー程度のノリ
- なぜRaspberrypi?
データベースの蓄積が重要です。ということは常時稼働(消費電力)が必要です。
よってRaspberry pi 4(Linux)上で作成できれば64Bit対応したらしい2Wでも稼働できるかもしれないし、NAS稼働もできるかもしれない。
ただ初回からNAS稼働だと最悪NASの初期化も考えなければいけない可能性もあるので、それだったらSD初期化で済むRaspberry piは知見を学ぶには良。

## コンテナとは？
初期定義何もないWebソフトウェア。
よってそのまま起動しただけではほぼ役に立つことはないが、そこのところはいろいろ便利なことが考えられている

- ポートの割り付けが自由自在
- データの保存場所設定が可能
- ネットワークの分離等の設定が可能
- 初期設定なども文章設定できる

だがこれをコマンドで打とうとすると覚えてられるかぁぁ!!!( ﾉ ﾟｰﾟ)ﾉ
となるのは当然である。しかも一つ一つにこれが必要なわけで…
そんなあなたに朗報です。
DockerのLinux版にはDocker composeというソフトがあります。
どこかに`./docker`フォルダを作りましょう(名称は任意)
その下部に`compose.yaml`を作成します。
これの中に任意の設定を入れて`docker compose up -d`をすればあら不思議!
ソフトが立ち上がるではありませんか!!!
ちなみにこのyamlファイルですが、
```
services:
  software1:
    image:image1
  software2:
    image:image2
```
と記載すればすべてのイメージが立ち上がります。便利!!
ちなみに検索すると`docker-compose`というコマンドがQiitaの中で大量に見つかりますが、今は`docker compose`に置き換わっています。（VersionがV1→V2になりました。）

https://qiita.com/search?sort=&q=Docker+compose

## とりあえずいろいろインストールから起動まで
まずは何よりインストール
```bash
sudo apt install docker.io
sudo usermod -aG docker $USER
```

先ほど前項のようにフォルダを作成後、
とりあえずyamlには以下を記載して実行してみましょう

```compose.yaml
services:
  grafana:
    image: grafana/grafana
    container_name: grafana
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
    volumes:
      - grafana-storage:/var/lib/grafana
    ports:
      - 3000:3000
    networks:
      - frontend

  influxdb:
    image: influxdb:2.7.6
    container_name: influxdb
    volumes:
      - ./influxdb2/data/:/var/lib/influxdb2/
      - ./influxdb2/config/:/etc/influxdb2/
    ports:
      - 8086:8086
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=xxxxxxxxx
      - DOCKER_INFLUXDB_INIT_PASSWORD=xxxxxxxxx
      - DOCKER_INFLUXDB_INIT_ORG=xxxxxxxxx
      - DOCKER_INFLUXDB_INIT_BUCKET=xxxxxxxxx
    networks:
      - frontend

networks:
  frontend:
    driver: bridge
    ipam:
      driver: default

volumes:
  grafana-storage:
```

そうすれば対象のポートでWebアプリが開かれているはずです。
たまにポートが開かれていない場合は`docker compose ps -a`で立ち上がっているか確認しましょう。
volumesの作成がrootになっていたりする場合があり、書き込めなくてexitedになっている可能性が高いです。

上記ではさっくり流しましたが、上のgrafanaとinfluxdbではデータの保管方法が違います。
grafanaではDockerのVolume機能使ってgrafana-storage（実態は別名称に保存されるっぽい？）を使って`var/lib/docker/volumes/`内にデータが保存されますが、
influxdbではyamlのある場所`~/docker`に保存されます。
大抵は上のDockerのVolume機能を使うほうが（所有者問題等の）問題は少ないと思われますが、`var/lib/docker/`内はrootが占有していますので悩みどころかと思われます。

さくっと作成したら次はInfluxDBに移りましょう

# InfluxDB
時系列データベースとあるように時間は送れません。
つまりは**送った時間が記録時間**です。
逆に言えば時間は送らなくていいのであとは**何を測定してどの結果だったか**だけ送ればいいのでなかなか便利です。

しかもInfluxDBには代表的な4つのIoT言語のサンプルが載っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/78482a48-022a-6e13-c51b-0f6057678aaa.png)

:::note warn
注意点として
API忘れた＆コードなんだっけ？とGetTokenやInitialize Clientをむやみやたらに開かないようにしましょう
LoadData>API TokensでAPIを確認できますが、このページを開くたびにAPIが発行されるので気づいたら使ってるAPIが埋もれてる、なんてことがあるかも(逆にAPIを忘れたら?LoadData>API Tokensから再発行しましょう)
![スクリーンショット 2024-10-14 013126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/531a6097-0deb-f96d-a145-6b655966ec25.png)
:::
例題としてPythonの例題を上げます
```python
  point = (
    Point("measurement1") // 測定の対象（個体名称）
    .tag("tagname1", "tagvalue1") // なくてもかまわない（任意：複数OK）
    .field("field1", value) // 測定の結果（任意：複数OK）
  )
```

何らかのデータを送ると結果としてDataExplorerで受信データが観測できるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/5b1b6290-0a4b-149a-88c2-bd7537afbdda.png)
先ほども言ったように時系列なので、初回はしばらく時間をおかないと結果として見えてきませんね

# Grafana
さて。グラフ化ツールのお話です。
ここに来るまでに何個かcomposeに仕掛けをしました。
例えば下記です
```compose.yaml
services:
  grafana:
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
```
これによってGrafanaの閲覧権限を外すことができます。
毎度ログインしなくていいなんて!!!
ただし書き込み制限はあるのでGradinaに入ったら`Sign in`で初回アカウント登録やログインをしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/6f534478-3bd4-53e6-460a-82fb96c4744e.png)

初回のパスワードは
User:`admin`
Password:`admin`
で入力に成功すると下記の新規パスワード入力が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/3aa58c73-186b-0d3e-c5be-762d2147e4d9.png)

入ると中央付近に下記が見えるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/bfe5f43d-10c1-cefc-47f7-f3fc757713a8.png)
まずはinfluxdbと連携させなければいけないのでDatasourceからですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/ef01cd46-546f-b295-fe72-29add066670d.png)
ここで注意が二つほど。

- Query language
Query languageが選択できますが、今回インストールしたのはinfluxdb:2.7.6なのでSQLは使えません。
そのため、FluxかinfluxQLのどちらかになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/be84b05e-c182-1ca6-56d3-22b7026e5c57.png)
そしてもう一つ。ここで選択されるのはどうやってデータを取り出すかの質問なので、後述の実装が全くと言っていいほど変わっています。
これはGurafanaの実装によるものなので、おそらくはGrafanaのVersionによって変更されるはずです。(当該のスクリーンショットはGrafana v11.2.0 (2a88694fd3))
:::note info
influxQLによるQuery
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/caceac99-9c94-10c8-8b8c-5f88b8dbe226.png)
:::
:::note info
FluxによるQuery
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/1f4353b5-3766-ccf7-473f-1d7c2eb6a505.png)
:::
- URL
URLには`http://localhost:8086`とあります。
コンテナ由来の条件となりますが、compose.yamlでnetworksなどを設定したはずです。
```compose.yaml
services:
  grafana:
    networks:
      - frontend
  influxdb:
    networks:
      - frontend
networks:
  frontend:
    driver: bridge
    ipam:
      driver: default
```
上記のように設定すると`http://<container_name>:8086`とすると接続できます。
この場合は`http://influxdb:8086`ですね。


Connections>Data sourcesで記載する場所は
- Query languageの選択(今回はFlux)
- HTTP>URL
- InfluxDB Details> Organization & Token & Default Bucket

の箇所のみです。
datasource is workingと表示されたなら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/4cb20d9f-6d6b-63d2-e959-6632a128439b.png)

ダッシュボードに行き、Add>Visualizationを見てみましょう。
先ほどのFluxによるQueryの書式記入ができるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/0cc7cf17-a731-db6e-57e1-44a13fe746a3.png)

下記を入力して中央付近のリフレッシュマークを押します。
```:Flux
from(bucket: "<データを保存したDOCKER_INFLUXDB_INIT_BUCKETの名前>")
  |> range(start: 0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79385/ccd94db6-1de4-9ef1-c418-71303747c6a5.png)

さっくり表示できたはずです。
Fluxの言語については下記を参照してください。Flux language syntaxからも飛べます。

https://docs.influxdata.com/influxdb/v2/query-data/get-started/

2024/10/27:Grafanaデータストレー関連等追加