久しぶりに作ったものが紹介できるよ!!!(ちゃんと動くところまで滅茶苦茶時間がかかった)
で何作ったの?
家のラズパイ監視アプリ!!!
背景としては、家にラズパイが5台くらいあって、それぞれ、(ローカル)dnsサーバ、vpnサーバ、NAS、ホームハックサーバとか色んなロールが割り振られているのですが、何故か唐突に死ぬ。 電源の問題なのかな・・・まじで急にこっくり行く・・・(USBの5台くらい給電できる奴使ってるのですが、それがどっかで調子悪くなっているのが濃厚)
それはそうとして、ラズパイが生きてるか確認したい。とりあえず、死んでたら、コンセント抜き差しでラズパイ再起動すれば良い。
欲しい機能
- デバイスの状態確認をしたい。具体的にはサーバが他のラズパイにpingを送って、帰ってこなかったら死んでる、帰ってきたら生きてる、の2パターンを想定。
- PWAが良い(WoTを感じられるので)、後はスマホ以外からアクセス出来るようにレスポンシブ対応とかしていきたい。
- GET http://<ホームハックサーバのIP>/?light=on で部屋の明かりが付くようにしているのでそれをWebアプリからやりたい(簡単なGETリクエストとかをアプリから)送れるようにしたい。
使いたい技術
- PWAといえばnuxtのイメージがあるのでnuxtを使ってみたい。そもそもVueを触っていたのでせっかくなのでnuxtも学んで行きたい!
- GoとかDB(ORM)をバで学んでいるので活用していきたい。AutoMigrationに甘えきった人間になります。
- 配布や導入を簡単にするためにdockerを使いたい。使ったことないけどPostgresやGo、Nodejsの3つのコンテナが通信し合うのでdocker-composeを使用する必要があるかな。
で生まれたもの
Macからだとこんな感じ
スマホだとこんな感じ
こんな感じでデバイスの追加ができます
オラッgitリポジトリだ!
仕組み
理想はポートの消費を1つにしたいんだけど、後述の内容からポートの消費を3つにしてしまいました。
まず、今回のアプリケーションは3つのコンテナで動いています。
-
nodejs12 (フロントエンド、ユーザのアクセス部分)
-
Go 1.12 (バックエンド、DBとの疎通を行う)
-
postgresql (DB)
で、まずはメイン機能であるpingを送るためには、dockerコンテナ内の閉じたネットワークではなく、ホストのネットワークに属する必要があります。
ここで、pingを送るのはGoアプリのコンテナなので、Goアプリのコンテナにはnetwork_mode=“host"を指定しています。(ここでポートの消費が発生)
で、次にDBです。本当はコンテナネットワークにおくべきですが、アクセス元のGoがhostのネットワークに属する以上、Dockerのネットワークのアドレスを指定する必要があるなどしてもうめんどい!普通にpublishしてGoではhost=localhostって感じにして接続させます(またポート消費)
でフロントはもちろんpublishしないとダメだよね(ここでまたポート消費)
って感じになってます。
感想
作って動かしてから気づいたけど、家のサーバが唐突に止まる時、どうやらプロセスが死んでるっぽい(終了)