2023年12月6日

Ubuntu20.04 Node-REDのインストールと設定

宮島の対岸の廿日市市にある大頭神社の妹背の滝
宮島対岸にある大頭神社の妹背の滝



さて,前回までRaspberryPiを使ったプログラミング環境の構築方法を学習しました。IoTには,データを集めるクライアント装置と,それを分析するための環境が必要になります。多くはデータをサーバに集めて,AIなどを活用して分析・可視化することになります。

そのため,サーバ側にもプログラミングする環境が必要です。クラウドサーバであるUbuntuサーバにNode-REDをインストールして,データ蓄積・分析・視覚化・他のWebAPIとの連携といった環境を整えて行きます。

まずは,UbuntuサーバへのNode-REDのインストールです。それでは,学習を開始しましょう。

サーバスペックは,以下のとおりです。

種 別 内 容
OS Ubuntu 20.04 LTS
サーバ形態 VPS
サーバスペック 3CPU メモリ2GB SSD 50GB


  Node-REDとは

Node-REDとは,あらかじめ用意されたパーツ(ノード)を繋いでいくことでプログラムを作成することができるローコードツールです。元はIBMのサービスチームによって開発され、 現在はOpenJS Foundationのプロジェクトの一部となっています。

システム構成的にはこの組織で扱っているNode.jsの上で動く仕組みで,Node.jsの影響を強く受ける特徴があります。

プログラムとは一定の理(ことわり)のもと,ある目的を達成するために作られた論理的産物ですが,これには「入力ー>処理ー>出力」という流れ(フロー)が必ず存在します。

これを古い概念では,リクエスト・アンサー型プログラムと言います。つまり,何らかの要求に対して何らかの処理をして返すということです。これを見事にビジュアル的に体現したのがNode-REDになります。

言葉ではなかなか理解できませんが,プログラムを作り始めると解ってきます。いろんな人がいろいろなノードを作っており,Ubuntuとも親和性が高いのでIoTやWebApiではポピュラーなプログラム開発ツールになっています。

詳しくは,Node-RED User Group Japanのポームページをご覧ください。

Node-REDは,パレット上に左のノード群から部品を選択してきて,各部品ノードを線で結んでいきます。プログラム作成には,そのためのルールが若干ありますので習得する必要があります。

  UbuntuサーバへのNode-REDインストール

Ubuntuサーバへのインストールは,Node-RED User Group Japanのポームページにおいて,「ドキュメント>Getting Started >ローカル」サイトのUbuntuに記載のあるインストールスクリプトをホームディレクトリ上で実行します。

しかし,サーバ上のNode-REDは基本ソフトとしての特性が求められることから,インストールにおけるホームディレクトリをどこにするかは考えなければなりません。

今回は,クライアントであるIoTからデータを集める必要があること,そのデータを他のユーザディレクトリで分析する必要があること,WebからのアクセスではSSLを利用して暗号化する必要があることなどを考慮して,最も権限の強い「root」ディレクトリでインストールすることにしました。

まずは,ユーザログイン環境の「$」表示から,sudo権限でルートディレクトリに入ります。次のコマンドを入力して,ルートログイン環境に変更します。

コード

sudo su -

パスワードを聞いてきますが,「/root」ホームディレクトリ環境である「#」にログイン出来たものと思います。もし,ホームディレクトリが違っている場合は,cdコマンドでディレクトリを変えて下さい。

ここで,Node-RED User Group Japanのホームページのインストールスクリプトを以下のとおり実行します。このインストールはRaspberryPiの場合と同様です。

コード

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)


Node-REDは,Nodejs上で動作するため,Node.jsのバージョンと整合性をとるのが難しく,実際には上記インストールスクリプトで整合性を取る方が簡単です。

何回か動作方法を聞いてきますが,基本的にはyesで回答すればよいです。なお,RaspberryPi系の「node set」のインストールを聞いてきたら,Noで良いと思います。


  Node_REDの「require」命令文の利用許可(RaspberryPiの場合と同じ)

Node-REDは,Node.js言語の上に構成されており,外部ファイルを読んだり書いたりするのに,Node.jsのrequire命令を利用します。そのため,Node-REDで「require」命令文が使えるように設定します。

今回は,rootユーザにNode-REDをインストールしましたので,Node-REDの設定ファイルは,「/root/.node-red」のフォルダ下に「settings.js」という設定ファイルが作成されています。

この設定ファイルは,node-REDのパスワードやSSLなど重要な要素を定義するファイルになります。そのファイルの中の該当する個所を,次のコマンドのように書き換えてください。(事前にバックアップを取ってから行ってくださいね。)

コード

functionGlobalContext: {
   fs:require('fs')
   // os:require('os'),
},    

これにより,Node-redからfsオブジェクトを使って外部ファイルが読めるようになります。

気づき:Vimエディタについて

設定ファイル「settings.js」の中を修正するのですが,vimエディターを使って編集する場合,vimが自動的にビジュアルモードになって,マウスによるCopy&Pasteがうまく動作しない時があります。これは,今回のUbuntuにインストールされているvimの初期設定において自動的にマウスがビジュアルモード(コマンド入力できない)になるように設定されているからです。

その場合は,vimが自動的にビジュアルモードにならないように,vimを動かすディレクトリ上で次のファイル「~/.vimrc」を作成します。

コード

echo 'set mouse=' >> ~/.vimrc

「.vimrc」ファイルの中身が「set mouse=」になっていればOKです。これで,vimを動かしても自動でビジュアルモードに切り替わりません。



  Node_REDのパスワード設定とポート番号変更(RaspberryPiの場合と同じ)

次に,Node-REDのログインパスワードの設定をします。デフォルトでは誰でも入室可能ですので,これを変更します。これについては,Node-RED User Group Japanホームページの「ドキュメント>ユーザーガイド>セキュリティ」のコチラを参照してください。

Node-REDに入室する際にユーザ認証を有効化するには、 設定ファイルのadminAuthプロパティを変更します。

adminAuthプロパティはユーザオブジェクトの配列です。 これを使うと複数のユーザが異なるアクセス許可を持つような設定が可能です。

先ほどのホームページにある設定例では,adminユーザがエディタ内のすべてを実施できる権限「*」を持っており, georgeユーザは読み込み権限しかありません。

パスワードは安全性を高めるためにbcryptアルゴリズムを使用してハッシュ化されています。

【参考:ポート番号の変更】
サーバのNode-REDはインターネットに晒されますので,ファイアーウォール等で守るほか,必要により設定ファイル内の「uiPort:」のポート番号を変更してください。49513~65535までの番号は、ユーザーで自由に使えるポート番号です。


  パスワードのハッシュ値生成(RaspberryPiの場合と同じ)

Node-RED 1.1.0 かそれ以降を使っている場合、次のコマンドを使って,任意の文字列をハッシュ化することができます。パスワードを聞いてきますので,入力します。

コード

node-red admin hash-pw

ほとんどは,このコマンドで出来ると思いますが,出来ない場合は先ほどのサイトをご確認下さい。また,さらに厳しい認証を必要とする場合も同様にこちらのサイトをご覧ください。


  HTTPノードのセキュリティ(RaspberryPiの場合と同じ)


HTTPノードによって公開されるルートはBasic認証を利用することで保護します。
設定ファイルの「httpNodeAuth」および「httpStaticAuth」プロパティによって、 Node-REDフローへアクセスできる単一のユーザ名およびパスワードを設定することができます。設定ファイルの以下のところを修正してください。

コード

httpNodeAuth:{user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHOMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
httpStaticAuth:{user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4MyOMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},

passプロパティは、adminAuthと同様の書式で利用することができます。詳細な情報はパスワードのハッシュ値生成を参照してください。

httpStaticプロパティによって設定された静的コンテンツへのアクセスは、 httpStaticAuthプロパティを同様の書式で利用することにより保護できます。

これで,最低限のセキュリティ対応が完了です。さらに強化したい場合は,Node-RED User Group Japanポームページの「ドキュメント>ユーザーガイド>セキュリティ」のコチラを参照してください。

  SSL証明書の登録

サーバにインストールするNode-REDの場合は,プログラムとしてブラウザからアクセスされるため。SSL証明書による暗号化通信をサポートする必要があります。そのため,Apacheで利用しているSSL証明書を設定ファイル内に定義する必要があります。

今回は,SSL証明書としてLetsEncryptを利用していますので,復習ですがCertbotツールで取得したLetsEncryptのSSL証明書は,/etc/letsencrypt/live/domain_nameフォルダ下に作成されています。

作成されているファイルは
   · cert.pem…公開鍵を含むSSLサーバ証明書
   · chain.pem…中間証明書
   · fullchain.pem…cert.pemとchain.pemが結合されたファイル
   · privkey.pem…公開鍵に対応する秘密鍵
の4種類で、SSL/TLSを有効化する際に必要となります。

今回は,このうち,「privkey.pem…公開鍵に対応する秘密鍵」と「fullchain.pem…cert.pemとchain.pemが結合されたファイル」を利用して,設定ファイル内の「https:」文を以下のように変更します。このSSL証明書は,root権限でしか扱えませんので,サーバのNode-REDはroot権限で動作させます。

コード

https: {key: require("fs").readFileSync('/etc/letsencrypt/live/domain_name/privkey.pem'),
        cert: require("fs").readFileSync('/etc/letsencrypt/live/domain_name/fullchain.pem')
       },


certは,「cert.pem」で良いと思ったのですが,「fullchain.pem」でないと上手くいきませんでした。


  Node-REDの起動・停止・再起動

RaspberryPiでの起動は,ログインユーザでVT画面「$」から「node-red-start」と入力すれば良かったのですが,私の場合は,このコマンドを使うとroot権限で起動することができませんでした。
そのため,「/root」ディレクトリ上で,Node-REDをプロセス起動することにしました。昔のUNIXではごく当たり前ですが,次のコマンドを「/root」ディレクトリ「#」表示上で入力します。

【起動する時】

コード

node-red &

この時,「&」を付けておくと,バックグランドで動作しますので,TeraTermなどのVTターミナルを閉じても動作し続けることが可能です。

【停止する時】
終了するにはNode-REDのプロセス番号を知った上で,Killコマンドで終了させることになります。


コード

ps -e | grep node-red
 プロセス番号 00:00:03 node-red

プロセス番号がわかりましたので,強制終了します。

コード

kill プロセス番号


【参考】
もうひとつの方法として,先ほどのNode-REDのインストールスクリプトを使った場合,RaspberryPi用に起動・停止サービスが用意されています。その場合は,サービス定義「/lib/systemd/system/nodered.service」のUser,GroupおよびWorkingDirectoryを希望する形に変更することで,「node-red-start」,「node-red-stop」のバックグランドコマンドが他のユーザで利用できるようになります。 メモリスペースの数値をMBを使って設定することもできます。


コード

User=<root>
Group=<root>
WorkingDirectory=/root
Environment="NODE_OPTIONS=--max_old_space_size=256"


ファイルを編集したあと、「#」表示下で,以下のコマンドを実行して systemdデーモンをリロードし、Node-REDサービスを再起動します。

コード

systemctl daemon-reload
node-red-stop
node-red-start


なお,このコマンドは,sudo権限を付けることでユーザーログイン下「$」表示下でも,バックグランドで動作します。

コード

sudo node-red-stop
sudo node-red-start


  Node-REDの起動確認

Node-REDがSSLを使って動作しているかを確かめるため,PC等のブラウザから https://サーバドメイン:1880/ にアクセスします。Node-REDのログオン画面が出力されればOKです。

Node-REDにパスワードが設定されていると,ユーザIDとパスワードを入力する画面が出力されます。


  最後に

基本的なUbuntuサーバへのNode-REDのインストールはこれで終了です。あとは,Node-RED上でどんなプログラムを作るかになります。このNode-REDのプログラミング技法については,多くの書籍もありますし,説明サイトも増えてきましたので,参考にして頂ければいいかと思います。

UbuntuサーバとRaspberryPiのプログラミング環境の構築は今回で一旦終了します。

次回以降は実際のプログラム作成になりますが,若干,検討する必要がありますので,2023年はここまでにします。UbuntuサーバとRaspberryPiを使ったNode-REDの活用事例が報告できればと考えています。

それでは皆さん良いお年をお迎えください。


(注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。

0 件のコメント: