以前に部屋の温度を取得するように設定した。
この温度を外出先からでも見やすくするためにクラウドにデータを置くように設定を行ってみる。
温度だけでなく、ラズパイのリソースやその他Flowデータなど様々なデータをクラウドに置くようにする予定。
また、どこからでも見えるようにNginxで待ち受け、クライアント証明書による認証を行う。
クライアント証明書は試したことなかったのでやってみたいだけ。
構成
構成は上の通り。GCPにDocker-composeを利用してInfluxdbとGrafanaを構築する。
Nginxではオレオレ証明書でHTTPS化とクライアント証明書による認証の設定を入れる。
Grafanaコンテナは3000:8080でポート変換を行う。Influxdbは8086でListen.
自宅側ではtelegrafのSocket Listenerプラグインでデータを取得し、整形してInfluxdbに送る。
構築
Nginxの設定
Nginxのインストール
Nginxの構築は公式の通りインストールする。
オレオレ証明書の作成
CA用のディレクトリを作成する
# cd /etc/ssl
# sudo mkdir CA
秘密鍵の作成
# openssl genrsa -out CA.key 2048
CSRの作成
# openssl req -new -key CA.key -out CA.csr
CAの証明書(ルート証明書)作成。
# openssl x509 -days 3650 -in CA.csr -req -signkey CA.key -out CA.crt
// ルート証明書の作成。自分の秘密鍵で署名する。
サーバ証明書作成のための準備
# touch index.txt
# touch index.txt.attr
# echo 00 > serial
OpenSSLのコンフィグの設定
# cp -p /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.bak
# vim /etc/ssl/openssl.cnf
[ CA_default ]
dir = /etc/ssl/CA
certificate = $dir/CA.crt
private_key = $dir/CA.key
[ usr_cert ]
subjectAltName = @alt_names
サーバ証明書の作成
# cd /etc/ssl
# mkdir -p certs/<domain>
# cd certs/<domain>
# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -out server.csr
~
# vim san.ext
subjectAltName=DNS:<domain>
# openssl ca -in server.csr -out server.crt -days 3650 -extfile san.ext
クライアント証明書の作成
# cd /etc/ssl
# mkdir client_cert
# cd client_cert
# openssl genrsa -out client.key 2048
# openssl req -new -key client.key -out client.csr
# openssl x509 -req -days 3650 -in client.csr -CA /etc/ssl/CA/CA.crt -CAkey /etc/ssl/CA/CA.key -set_serial 01 -out client.crt
# openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile /etc/ssl/CA/CA.crt
//その後client.pfxをデバイスで読み込む
Nginxのコンフィグ
listen 443 ssl default_server;
ssl_certificate /etc/nginx/ssl/certs/<domain>/server.crt;
ssl_certificate_key /etc/nginx/ssl/certs/<domain>/server.key;
# client cert
ssl_verify_client on;
ssl_client_certificate /etc/ssl/client_cert/client.crt;
/リバプロの設定も行う。これは省略
Grafana+Influxdbの構築
Influxdbはversion2.0
Grafana+InnfluxdbはDocker-composeで動かす。
まずはdocker-compose.ymlファイルを作成。
volumesで紐付けたディレクトリが無いと動かないのでディレクトリも作成する。
version: "3"
services:
influxdb:
image: influxdb:2.0.4-alpine
container_name: local-influxdb
hostname: local-influxdb
volumes:
- /home/<user>/docker_data/influxdb_data:/var/lib/influxdb2
- /home/<user>/docker_data/influxdb_config:/etc/influxdb2
ports:
- 8086:8086
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=hogeuser
- DOCKER_INFLUXDB_INIT_PASSWORD=hogepass
- DOCKER_INFLUXDB_INIT_ORG=hogeorg
- DOCKER_INFLUXDB_INIT_BUCKET=hogebucket
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 8080:3000
user: "0:0"
volumes:
- /home/<user>/docker_data/grafana_data:/var/lib/grafana
depends_on:
- influxdb
environment:
- GF_SERVER_ROOT_URL=http://localhost:8080
- GF_SECURITY_ADMIN_PASSWORD=admin
influxdbのenvironmentに書いておくことでsetupする必要がなくなる。
起動する。
# docker-compose run -d
# docker-compoes ps
Name Command State Ports
------------------------------------------------------------------------------------------
grafana /run.sh Up 0.0.0.0:8080->3000/tcp,:::8080->3000/tcp
local-influxdb /entrypoint.sh influxd Up 0.0.0.0:8086->8086/tcp,:::8086->8086/tcp
起動が完了するとvolumesの~/docker_data/influxdb_config/influx-configs
が作成されているため表示。
# cat ~/docker_data/influxdb_config/influx-configs
[default]
url = "http://localhost:8086"
token = "TOKENTOKENTOKENTOKEN"
org = "hogeorg"
active = true
このtokenは後ほど使うため覚えておく。
NginxでリバプロでこのGrafanaを宛先と指定していたらWebからログインができる。
Webでアクセスするとクライアント証明書の選択が求められる。
選択してOKを押すとGrafanaが表示される。
Dockerで初回パスワードを設定していたので初期パスワードはadmin
admin/adminでログイン。
Add data sourceからInfluxdbを追加する。
Query LanguageはFluxを選択
URLはドメインに注意。同じマシン内ではあるがコンテナなのでコンテナ名を指定。
Organization, Default Bucketを入力し、Tokenは覚えておいたものを入力。
Telegrafの構築
TelegrafもDockerで動かす。
Docker-compose.yamlを編集
version: "2"
services:
telegraf:
image: telegraf:1.18
container_name: telegraf
restart: always
volumes:
- /home/<user>/docker-compose/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
ports:
- "8092:8092/udp"
environment:
- TZ=Asia/Tokyo
telegrafのコンフィグを変更する。
ここではデータのインプットとアウトプットの設定を行う。
# vim ./telegraf.conf
[[inputs.socket_listener]]
service_address = "udp://:8092
data_format = "influx" //influx Line Protocolによるフォーマット
[[outputs.influxdb_v2]]
token = "TOKENTOKENTOKENTOKEN"
organization = "hogeorg"
bucket = "hogebucket"
コンテナを起動する
$ docker-compose up -d
Creating telegraf ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e76336f67ec telegraf:1.18 "/entrypoint.sh tele…" 7 seconds ago Up 4 seconds 0.0.0.0:8092->8092/udp, 8094/tcp, 8125/udp telegraf
$ docker-compose logs
Attaching to telegraf
telegraf | 2021-05-03T09:46:13Z I! Starting Telegraf 1.18.2
telegraf | 2021-05-03T09:46:13Z I! Using config file: /etc/telegraf/telegraf.conf
~省略~
telegraf | 2021-05-03T09:46:13Z I! [inputs.socket_listener] Listening on udp://[::]:8092
コンテナが起動できたらホストOSは8092/UDPでListenを開始する。
ここにデータを投げる設定を行う。
データの送信
以前にデータを取得するところまでは行っていたので一部修正するだけ。
telegrafはInflux Line Protocolでデータを取り込むため、その形式で8092/UDPに投げてあげる。
データの形式にについては下の記事を参照
自分はかなり単純に echo '<measurement> temperature=<temp>,humidity=<hum>' | nc -4 -u -w 1 <host> 8092
のように、Influx Line Protocol構文をncコマンドで渡しているだけ。
これを10分毎にcrondで定時実行する。
Grafanaのグラフを変更
Grafanaにログインし、Create Dashboardを選択する。
Add new pannelを選択すると
Flux構文というのはよくわからないが、下にサンプルとSyntaxのドキュメントがあるのでそこを参考。
自分の場合は以下の通り
ここで気づいたのがContainerIDが識別に使われている。
ここは後で修正しなければならない。
あとはいい感じに調整して完成
コンテナを再起動したら別ホストのデータとして認識されてしまったのでここは後で修正。
あとはSNMPやFlowデータなんかもここに集約できたらいいなと考え中。
それはまた別の機会に。
以上