DockerでNode-REDを構築する:HomeLab自動化のための6ヶ月間運用レビュー

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

ホームオートメーションにおける「ミッシングリンク」

私は過去3年間、HomeLabの構築に励んできましたが、ある時壁にぶつかりました。10数台のスマートデバイスとHome Assistantのダッシュボードがあるのは素晴らしいスタートですが、それは真の「自動化」ではありませんでした。ソーラーパネルの発電量が3.5kWを超えたときにバックアップスクリプトを実行したり、サーバーラックが35°Cに達したときにTelegramでアラートを送信したりといった、異種システム間を橋渡しする方法が必要だったのです。そこで私の救世主となったのがNode-REDでした。

Node-REDはフローベースのプログラミングを採用しており、複雑なロジックをまるでレゴブロックで遊ぶかのように構築できます。200行のPythonコードと格闘する代わりに、画面上でいくつかのノードをドラッグし、仮想のワイヤーで繋ぐだけで済むのです。6ヶ月間毎日使用してみて、単なる「もし〜なら〜する」といった単純なルーチンを超え、プロフェッショナル仕様のホーム・インテリジェンスへと進化させるための最も重要なツールであると確信しました。

クイックスタート:5分でNode-REDをデプロイする

Node-REDをDockerで運用していないなら、無駄な苦労をしていると言わざるを得ません。コンテナを使えばホストOSをクリーンに保てますし、新しいRaspberry PiやNUCへの移行もわずか5分で完了します。以下は、私が初日から使用しているDocker Composeの構成です。

1. ディレクトリの準備

まず、永続データを保存するための専用フォルダを作成します。これにより、コンテナを再起動してもフローやカスタムノード、認証情報が消えることはありません。

mkdir -p ~/homelab/nodered/data
cd ~/homelab/nodered

2. Docker Composeファイルの作成

docker-compose.ymlという名前のファイルを作成し、以下の設定を記述します。

services:
  node-red:
    image: nodered/node-red:latest
    container_name: nodered
    environment:
      - TZ=Asia/Tokyo
    ports:
      - "1880:1880"
    volumes:
      - ./data:/data
    restart: unless-stopped

3. コンテナの起動

次のコマンドひとつで、サービスをバックグラウンドで起動します。

docker-compose up -d

ブラウザで http://<your-ip>:1880 にアクセスしてください。すぐにエディタが読み込まれ、最初のフローを作成する準備が整います。

ディープダイブ:長期安定運用のための設定

基本的なセットアップはテストには十分ですが、本番グレードのHomeLabにはさらなる配慮が必要です。フロー의 数が50を超えたあたりで、トラブルを避けるためにデフォルト設定の微調整が必要だと気づきました。

ロジックの保護

/data ボリュームのマッピングは必須です。このフォルダには flows.jsonpackage.json ファイルが格納されます。私は一度、イメージの更新中にパスの設定を誤り、2週間分かけて作り込んだ複雑なロジックを一瞬で失うという苦い経験をしました。初回起動後は、ホスト側の ./data フォルダに実際にファイルが生成されているか必ず再確認してください。

エディタのセキュリティ対策

デフォルト状態のNode-REDは、誰でもアクセスできる状態です。VPNを使用していたり、ネットワークを共有していたりする場合、これは大きなセキュリティホールになります。データディレクトリ内の settings.js ファイルを編集して、アクセスを制限する必要があります

  1. docker exec -it nodered node-red-admin hash-pw を実行して、暗号化されたパスワードを作成します。
  2. ~/homelab/nodered/data/settings.js を開きます。
  3. adminAuth セクションを見つけてコメントアウトを解除し、作成したハッシュをパスワードフィールドに貼り付けます。

高度な活用法:エコシステムの構築

Node-REDが真価を発揮するのは、異なるプロトコルの「脳」として機能するときです。私が毎日活用している3つの統合機能を紹介します。

MQTT:IoTのバックボーン

ESP32やZigbee2MQTTデバイスなどの自作ハードウェアの多くは、MQTT経由で通信します。Node-REDはこれをネイティブにサポートしています。私はZigbeeセンサーのデータをInfluxDBに流し込み、長期的なグラフ作成に利用しています。「mqtt in」ノードを配置し、ブローカーを指定するだけで、リアルタイムのデータストリームを操作できるようになります。

Home Assistantとの統合

すでにHome Assistantを運用しているなら、node-red-contrib-home-assistant-websocket パレットをインストールしましょう。これにより、Node-REDから家中のすべてのセンサーやスイッチにアクセスできるようになります。YAMLでのトラブルシューティングはNode-REDのリアルタイムデバッグノードに比べれば悪夢のようなものなので、私は複雑なロジックをすべてこちらに移しました。

Telegram Bot API

NASのドライブ温度が45°Cを超えた際に通知するカスタムシステムを構築しました。node-red-contrib-telegrambot を使えば、サーバーと対話することさえ可能です。ボットに「/reboot-plex」と送信すれば、Node-REDがSSHノード経由でDockerの再起動コマンドを自動的に実行するようにしています。

6ヶ月間の本番運用から得た教訓

24時間365日稼働させて分かった、公式ドキュメントには載っていないヒントを紹介します。

1. サブフローで「スパゲッティ状態」を解消する

最初の頃のワークスペースは、デジタルな災害現場のようでした。もし5つの異なる照明に対して同じロジックをコピーしているなら、すぐに手を止めてください。それらのノードを選択して右クリックし、「選択範囲をサブフロー化」を選びましょう。これにより、絡まったワイヤーの山が、再利用可能なひとつのカスタムノードにスッキリまとまります。

2. 常にJSONノードを使用する

最近のAPIの多くはデータをJSON形式で出力します。HTTP Requestノードの直後には必ずJSONノードを配置しましょう。生の文字列をJavaScriptオブジェクトに変換してくれるので、複雑な正規表現を書かなくても msg.payload.temp のように特定の値を簡単に取得できるようになります。

3. メモリ使用量を監視する

Node-REDは通常軽量で、アイドル時のRAM使用量は120MB〜150MB程度です。しかし、重い画像処理や書き方の悪いFunctionノードはメモリリークを引き起こす可能性があります。私は node-red-contrib-cpu ノードを使用してコンテナを監視しています。メモリ使用量が400MBを超えた場合、Docker API経由でコンテナを再起動させるフローを組んでいます。

4. バックアップの自動化

私の flows.json ファイルは、毎晩午前3時にプライベートのGitHubリポジトリにプッシュされます。これはシンプルなシェルスクリプトや、内蔵の「プロジェクト」機能で実現できます。安価なSDカードに自分の努力の結晶を託してはいけません。ハードウェアはいつか壊れますが、Gitは永遠です。

Node-REDの導入は、私のHomeLabを完全に変えました。バラバラだったアプリの集まりが、まとまりのあるインテリジェントなシステムへと進化したのです。Dockerを動かしているなら、これを試さない手はありません。

Share: