PHONE APPLI Engineer blog

エンジニアブログ

Docker で Node-RED x PostgreSQL 環境を構築したい

はじめに

こんにちは、リサーチデベロップメントの後藤です。

今回はタイトル通りの記事です。
Node-RED から DBMS を使えるようにしたいです。

Node-RED では、IoT デバイスから使用してデータを溜め込んだり、API サーバとして使用してデータを引き出したりと、データベースと共に利用されるシーンは多くあります。

がしかし、なぜかこれまであまりそういった使い方をしてこなかったので、この機会に DB 接続の方法を学習し、記事にしてみました。

今回はローカル開発環境の構築を目的としているため、Docker を使って Node-RED x PostgreSQL 環境を作成します。

Docker Compose

Docker Compose を使って環境構築をします。
今回のように複数コンテナで構成される環境の場合は、Docker Compose はとても良いツールです。
ファイルでコンテナの定義や起動・停止をおこなうので、長文の docker コマンドを実行するよりも便利に扱うことができます。

まずは、適当な場所に作業ディレクトリを作成します。

mkdir Node-RED
cd Node-RED

作業ディレクトリの中で下記のコマンドを実行し、今回必要なファイル群を用意します。

mkdir script
touch docker-compose.yml ./script/init.sql

すべてのコマンドを実行しきった後は、今回の作業ディレクトリ "Node-RED" の構成は以下のようになっているはずです。

Node-RED
.
├── docker-compose.yml
└── script
    └── init.sql

1 directory, 2 files

次に、用意した docker-compose.yml に以下を記述します。

version: '3'
services:
  node-red:
    image: nodered/node-red:latest
    container_name: Dev-node-red
    volumes:
      - node_red_data:/data
    ports:
      - "1880:1880"

  postgres:
    image: postgres:latest
    container_name: Dev-postgres
    ports:
      - 5432:5432
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./script:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

volumes:
  node_red_data:
  postgres-data:
    name: postgres-data

通常 postgres のコンテナをはじめて立ち上げた場合、データベースには何もデータが入っていない状態になりますが、postgres/volumes の ./script:/docker-entrypoint-initdb.d という記述があることで、データが入っている状態でコンテナを立ち上げることが可能です。

script ディレクトリが /docker-entrypoint-initdb.d にマウントされ、postgres を初回起動した時に script 内の sql が実行されます。

今回は、script/init.sql に下記を記述し、コンテナ起動時にデータベースとテーブル、そしていくつかのレコードを作成します。

CREATE DATABASE "BOOK"; 

\c "BOOK"

CREATE TABLE book (
    id integer,
    name varchar(10)
);

INSERT INTO book VALUES(1, 'aaa');
INSERT INTO book VALUES(2, 'bbb');

最後に、下記のコマンドでコンテナを作成&起動します。
localhost:1880 で Node-RED にアクセスできれば成功です。

docker compose up -d

念の為、postgres のほうも確認します。 BOOK データベースに入ることができれば OK です。

docker compose exec postgres bash

psql -d BOOK -U postgres

Node-RED から PostgreSQL へ接続

次に Node-RED 側から先ほど立ち上げた postgres に接続を試みます。
今回、接続には npm で公開されている以下の外部ノードを使用します。postgres 関連のノードは他にもいくつかあるようでしたが、使いやすいさや開発頻度の観点から、こちらを選択しました。

node-red-contrib-postgresql

それでは、まずはじめに Nod-RED から postgres と検索して node-red-contrib-postgresql をインストールします。

インストールが完了したら、以下のようにノードを配置します。

次に、接続先の設定です。
posgtresql ノードの編集画面に入り、Server から新たに postgreSQLConfig を追加します。

設定値の各値は docker-compose.yml で記載した内容です。

それでは、最後に postgres へクエリを発行してみます。 posgtres ノードの Query を以下に変更し、inject ノードからフローを実行します。

SELECT * FROM book;

debug ノード ( msg.payload )から、こちらの値が帰ってくれば成功です!
これで posgtres からデータを参照することができました!

[{"id":1,"name":"aaa"},{"id":2,"name":"bbb"}]

また mustache 構文を使えば、クエリーの中を動的に変更することも可能です。 フローに合わせて、適切なクエリを発行できます。

SELECT * FROM book where id = {{{ msg.id }}};

おわりに

今回の結果、Node-RED x PostgreSQL の開発環境を用意することができました。
Docker Compose を使用すると、両者をまとめて管理しやすくなるので今後の運用面でもメリットがあると思います。

また、当たり前ですが Node-RED からの DB 接続に関しては、Docker で立ち上げた PostgreSQL である必要はないため、必要に応じて接続先を変えることは可能です。node-red-contrib-postgresql ノードは使いやすいパッケージなので、みなさんも是非使ってみてください。

以上、「Docker で Node-RED x PostgreSQL 環境を構築したい」でした!


PHONE APPLIについて

phoneappli.net
phoneappli.net