モノのインターネットをUbuntu 16.04のNode-REDに接続する方法

前書き

Node-REDは、モノのインターネットのスイッチボードです。これは、お気に入りのアプリ、ウェブサイト、ハードウェアを接続して新しい便利なことを行うのに役立つ視覚的なツールです。 ほとんどの場合、https://ifttt.com/ [IFTTT]や後期のYahoo Pipesと比較して、Node-REDははるかに強力で柔軟なインターフェイスを備えており、さまざまなアプリやサービス。

このチュートリアルでは、Node.jsとNode-REDをインストールし、Let’s EncryptからSSL証明書を取得し、Nginxを使用してNode-REDの安全な接続を処理します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [このUbuntu 16.04サーバーセットアップチュートリアル]。 このチュートリアルでは、* sammy *というユーザーを使用しますが、もちろん、好きなものを選択して、必要に応じて置き換えることができます。

  • WebサーバーNginxがインストールされ、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-で説明されているように、ポート80および443(* Nginx Full *)のトラフィックを許可するようにファイアウォールが更新されていますon-ubuntu-16-04 [Ubuntu 16.04にNginxをインストールする方法]

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [ホスト名の設定方法]で説明されているように、サーバーを指すドメイン名DigitalOcean]で。 このチュートリアルでは、全体で `+ node-red.example.com +`を使用します。

  • Encryptをインストールし、上記で設定したドメイン用に証明書を生成しましょう。 Ubuntu 16.04でLet’s Encryptを使用してNginxを保護する方法必要な手順を説明します。 Nginxの設定に関する手順(手順3〜5)は無視できます。これについては、ここで説明します。 証明書が正常に発行されたことを確認し、自動更新を処理するように「+ cron +」ジョブを設定します。

ステップ1-Node.jsとnpmのインストール

Ubuntu 16.04は、デフォルトのリポジトリに含まれているため、Node.jsの最新の長期サポート(LTS)リリースを簡単にインストールできます。

sudo apt-get install nodejs-legacy

このコマンドはNode.js v4.2.x LTS(長期サポート)をインストールします。つまり、Node.js Foundationは、2015年10月12日のリリース日から30か月間、このバージョンを引き続きサポートします。

バージョンを確認して、インストールが成功したことを確認します。

node -v

Node.jsがバージョン番号を出力するのがわかります。

Outputv4.2.6

Node Package Manager( + npm +)は、Node.jsソフトウェアパッケージのインストールと管理を支援します。これを使用してNode-REDをインストールします。 + apt-get`を使用して + npm`をインストールします。

sudo apt-get install npm

インストールが成功したことを確認するには、 `+ npm +`にバージョン情報を出力するように依頼します:

npm -v
Output3.5.2

エラーなしでバージョン番号が出力されたら、次のステップに進むことができます。この場合、 `+ npm +`を使用してNode-RED自体をインストールします。

ステップ2-Node-REDのインストール

+ npm`を使用して + node-red + + node-red-admin`というヘルパーユーティリティをインストールします。

sudo npm install -g --unsafe-perm node-red node-red-admin

`+ npm `は通常、パッケージを現在のディレクトリにインストールします。 ここでは、「-g 」フラグを使用してパッケージを「グローバルに」インストールし、「 / usr / local / bin 」などの標準システムの場所に配置します。 `-unsafe-perm `フラグは、 ` npm `がネイティブモジュール(CやC + vs.などのコンパイルされた言語で記述されたモジュール JavaScript)

少しダウンロードしてファイルをシャッフルすると、通常のコマンドラインプロンプトに戻ります。 インストールをテストしましょう。

まず、ファイアウォールのポートを開く必要があります。 Node-REDはデフォルトでポート「1880」を使用するため、許可します。

sudo ufw allow 1880

そして、Node-RED自体を起動します。 ポート「1880」はルート権限を必要としないほど高いため、「+ sudo +」は必要ありません。

node-red

一部の「Welcome to Node-RED」メッセージが端末に出力されます。 お使いのコンピューターで、Webブラウザーでサーバーの「1880」ポートを指定します。 この例では、「+ http://:1880+」です。 Node-REDのメイン管理インターフェースがロードされます。

image:https://assets.digitalocean.com/articles/node-red/jpWUEbI.png [Node-REDのメイン編集インターフェイス]

うまくいった場合は、ターミナルで「+ CTRL + C +」と入力してNode-REDをシャットダウンし、コマンドプロンプトに戻ることができます。 Node-REDを正常にインストールしてテストしたので、次に、システムの起動時に起動するようにセットアップします。

ステップ3-起動時にNode-REDを起動する

起動時にNode-REDを自動的に起動するには、従来のinitスクリプトの代わりに `+ node-red.service `ファイルをインストールする必要があります。 これは、Ubuntu 16.04がinitシステムに ` systemd +`を使用する最初のLTSリリースであるためです。 この概要およびその他のUbuntu 16.04の変更の概要は、https://www.digitalocean.com/community/tutorials/what-s-new-in-ubuntu-16-04 [Ubuntu 16.04の新機能]で確認できます。

`+ node-red.service +`という空のサービスファイルを開きます。

sudo nano /etc/systemd/system/node-red.service

以下をコピーして貼り付け、ファイルを保存して閉じます。

/etc/systemd/system/node-red.service

[Unit]
Description=Node-RED
After=syslog.target network.target

[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT

# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

# non-root user to run as
WorkingDirectory=/home//
User=
Group=

[Install]
WantedBy=multi-user.target

systemdサービスファイルの完全な説明はこのチュートリアルの範囲を超えていますが、https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journalを読むことでさらに学ぶことができます[Systemd Essentials:サービス、ユニット、およびジャーナルの操作]。

そうは言っても、サービスファイルのいくつかのセクションを分解しましょう。

/etc/systemd/system/node-red.service

[Unit]
Description=Node-RED
After=syslog.target network.target

これは私たちのサービスを説明し、ネットワーキングとsyslogが機能した後に開始する必要があることを示しています。

/etc/systemd/system/node-red.service

[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT

+ ExecStart +`は、サービスを開始するために必要なコマンドです。 単純な `+ node-red +`の代わりに `+ node-red-pi +`を呼び出して、Node.jsにいくつかのメモリ節約オプションを渡すことができます。 これにより、当然、Node-REDで作成するフローの数(およびそれらの複雑さ)に応じて、適切なサイズのサーバーで適切に実行できるようになります。 `+ Restart = on-failure`は、クラッシュした場合にsystemdがNode-REDの再起動を試みることを意味し、 + KillSシグナル `は、システムをシャットダウンまたは再起動する必要があるときにNode-REDを終了する最適な方法を伝えます。

/etc/systemd/system/node-red.service

# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

これにより、ロギング時に使用されるラベルが設定され、すべての出力がsyslogサービスに記録されます。

/etc/systemd/system/node-red.service

# non-root user to run as
WorkingDirectory=/home//
User=
Group=

非rootユーザーとしてNode-REDを実行します。 上記の行は、ユーザーとグループを使用して、ホームディレクトリ内からNode-REDを起動するようにsystemdに指示します。

/etc/systemd/system/node-red.service

[Install]
WantedBy=multi-user.target

`+ WantedBy +`は、サービスが実行されるターゲットを示します。 この場合、Ubuntuがマルチユーザーモードで起動すると、Node-REDサービスも起動することがわかります。 マルチユーザーモードはデフォルトの起動ターゲットです。

サービスファイルがインストールされ、理解されたので、有効にする必要があります。 これにより、起動時に実行できるようになります。

sudo systemctl enable node-red

今すぐ手動でサービスを開始して、まだ機能していることをテストしましょう。

sudo systemctl start node-red

ブラウザをサーバーのポート「1880」に戻し、Node-REDがバックアップされていることを確認します。 ある場合は、次のステップでインストールを保護するまでシャットダウンします。

sudo systemctl stop node-red

ステップ4-Nginxのセットアップ

Nginxを使用して、Node-REDサービスを_プロキシ_します。 これは、Nginxがポート「443」でSSL接続をすべて処理し(以前に設定したLet’s Encrypt証明書を使用)、トラフィックをNode-REDに渡すことを意味します。

サイトの新しいNginx構成を開きます。

sudo nano /etc/nginx/sites-enabled/

次をコピーして貼り付け、サーバー名と証明書パスを変更します。

/etc/nginx/sites-enabled/node-red.example.com

server {
   listen 80;
   listen 443 ssl http2;
   server_name ;
   ssl_certificate /etc/letsencrypt/live//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
   ssl_prefer_server_ciphers On;
   ssl_session_cache shared:SSL:128m;
   ssl_stapling on;
   ssl_stapling_verify on;
   resolver 8.8.8.8;

   location / {
       if ($scheme = http) {
           return 301 https://$server_name$request_uri;
       }
       proxy_pass http://localhost:1880;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
   }

   location '/.well-known/acme-challenge' {
       root /var/www/html;
   }
}

ファイルを保存して閉じます。 このファイルの機能を説明しましょう。

最初の3行は、Nginxがリッスンするポートと応答するドメイン名を示しています。 「+ ssl_certificate 」および「 ssl_certificate_key 」行は、Let’s Encryptから取得した証明書を指します。 残りの ` ssl_ +`行は、デフォルトよりも安全なプロトコル、暗号、およびオプションを選択します。

`+ location / +`は、Node-REDプロキシを実際に定義するブロックを開始します。

/etc/nginx/sites-enabled/node-red.example.com

if ($scheme = http) {
   return 301 https://$server_name$request_uri;
}

このブロックは、プレーンで安全でないhttp接続と一致し、それらをhttpsバージョンのサイトにリダイレクトします。

/etc/nginx/sites-enabled/node-red.example.com

proxy_pass http://localhost:1880;

ここでNode-REDサービスを示します。 これは、ポート「1880」の「+ localhost 」で利用できるため、そこで接続を渡します。 この構成ブロックの残りの部分では、適切なプロキシ機能に重要なヘッダーを設定します。 Node-REDのWebソケット接続を処理するには、「 Upgrade 」および「 Connection +」ヘッダーが特に重要です。

最後に、NginxのデフォルトのWebルートからLet’s Encryptチャレンジレスポンスが引き続き取得されるようにするブロックがあります。

/etc/nginx/sites-enabled/node-red.example.com

location '/.well-known/acme-challenge' {
   root /var/www/html;
}

Nginxをリロードして、新しい構成を取得します。

sudo systemctl reload nginx

最後に、再度Node-REDを起動します。

sudo systemctl start node-red

もう一度、サーバーに移動します: + http:// ++ https:// +( `+ https +`に注意)にリダイレクトされ、Node-RED管理インターフェイスが表示されます。 これは、Nginxを介してNode-REDをプロキシしていることを意味します。 Node-REDをロックダウンするための調整がいくつかありますが、それで終了です。

ステップ5-Node-REDの保護とまとめ

接続が安全になったので、Node-RED管理者にパスワードを追加しましょう。 裸のパスワードを設定ファイルに直接入力する代わりに、まず一方向の暗号化ハッシュを作成し、代わりにそれを使用します。 `+ node-red-admin`を使用してハッシュを作成します。

node-red-admin hash-pw

パスワードの入力を求められます。 入力して、 `+ ENTER +`を押すと、画面にハッシュが表示されます。 それをクリップボードにコピーして、Node-RED設定ファイルを開きます。

nano ~/.node-red/settings.js

下にスクロールして、「+ adminAuth 」ブロックのコメントを解除します(各行の前にある「//」を削除します)。 ` username on`を好きなものに変更し、ハッシュを` + password`フィールドに貼り付けます。

settings.js

adminAuth: {
   type: "credentials",
   users: [{
       username: "",
       password: "",
       permissions: "*"
   }]
},

ファイルを開いた状態で、行の先頭にある「+ // 」を削除して、「 uihost +」行のコメントも外します。

settings.js

uiHost: "127.0.0.1",

これは、Node-REDがローカルインターフェイスでのみリッスンし、外部から直接到達できないことを意味します(Nginxプロキシを介してのみアクセスされます)。 これで、ファイルを保存して閉じることができます。

Node-REDが直接アクセスできないようにするために、最後にもう一度ファイアウォールを更新します。

sudo ufw deny 1880

最後に、Node-REDを再起動します。

sudo systemctl restart node-red

`+ https:// +`に移動すると、メインの編集インターフェイスの代わりにログイン画面が表示されます。

image:https://assets.digitalocean.com/articles/node-red/W10ckeg.png [Node-REDのログイン画面]

サイトにログイン画面と「+ https +」接続が表示されている場合は、すべてが正しく設定されています。

結論

これで、合理的に安全なNode-REDのインストールが完了し、SSL証明書にLet’s Encryptを使用してNginxによってプロキシされます。 ログインして配線してください! http://nodered.org [Node-REDのWebサイト]には、さらに多くの情報とプロジェクトのインスピレーションがあります。