序章

Node-RED は、モノのインターネットの交換機です。これは、お気に入りのアプリ、ウェブサイト、ハードウェアを接続して、新しく便利なことを行うのに役立つビジュアルツールです。 ほとんどの場合、 IFTTTや後期のYahooPipesと比較して、Node-REDははるかに強力で柔軟なインターフェースを備えており、さまざまなノードを作成する大規模なオープンソースコミュニティがあります。アプリとサービス。

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

前提条件

このチュートリアルに従うには、次のものが必要です。

  • ルート以外のsudoユーザーと基本的なファイアウォールを備えた1つのUbuntu16.04サーバーは、このUbuntu16.04サーバーセットアップチュートリアルに従ってセットアップされます。 このチュートリアルでは、 sammy というユーザーを使用しますが、もちろん、好きなものを選択して、必要に応じて置き換えることができます。

  • Ubuntu 16.04にNginxをインストールする方法で説明されているように、ポート80および443( Nginx Full )でトラフィックを許可するようにファイアウォールが更新されたWebサーバーNginxがインストールされています

  • DigitalOcean でホスト名を設定する方法で説明されているように、サーバーを指すドメイン名。 このチュートリアルでは、全体を通してnode-red.example.comを使用します。

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

ステップ1—Node.jsとnpmをインストールする

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

  1. sudo apt-get install nodejs-legacy

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

:Node-REDの起動スクリプトはNode.jsバイナリの名前がnodeであると想定しているため、パッケージの-legacyバージョンをインストールすることが重要ですが、標準パッケージでは代わりにnodejs。 これは、既存のパッケージとの名前の競合が原因です。

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

  1. node -v

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

Output
v4.2.6

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

  1. sudo apt-get install npm

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

  1. npm -v
Output
3.5.2

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

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

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

  1. 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を使用するので、それを許可しましょう。

  1. sudo ufw allow 1880

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

  1. node-red

一部の「WelcometoNode-RED」メッセージが端末に出力されます。 コンピューターで、Webブラウザーをサーバーのポート1880にポイントします。 この例では、それはhttp://node-red.example.com:1880です。 Node-REDのメイン管理インターフェースがロードされます。

正常に機能した場合は、端末にCTRL+Cと入力して、Node-REDをシャットダウンし、コマンドプロンプトに戻ることができます。 Node-REDを正常にインストールしてテストしたので、次に、システムの起動時に起動するように設定します。

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

起動時にNode-REDを自動的に起動するには、従来のinitスクリプトではなく、node-red.serviceファイルをインストールする必要があります。 これは、Ubuntu16.04が初期システムにsystemdを使用する最初のLTSリリースであるためです。 これと他のUbuntu16.04の変更の概要は、 Ubuntu16.04の新機能にあります。

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

  1. 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/sammy/
User=sammy
Group=sammy

[Install]
WantedBy=multi-user.target

systemdサービスファイルの完全な説明はこのチュートリアルを超えていますが、 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を再起動しようとすることを意味し、KillSignalは、プロセスをシャットダウンまたは再起動する必要があるときにNode-REDを終了する最良の方法をsystemdに指示します。

/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/sammy/
User=sammy
Group=sammy

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

/etc/systemd/system/node-red.service
[Install]
WantedBy=multi-user.target

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

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

  1. sudo systemctl enable node-red

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

  1. sudo systemctl start node-red

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

  1. sudo systemctl stop node-red

ステップ4—Nginxを設定する

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

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

  1. sudo nano /etc/nginx/sites-enabled/node-red.example.com

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

/etc/nginx/sites-enabled/node-red.example.com
server {
    listen 80;
    listen 443 ssl http2;
    server_name node-red.example.com;
    ssl_certificate /etc/letsencrypt/live/node-red.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/node-red.example.com/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’sEncryptから取得した証明書を指しています。 残りの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サービスを紹介します。 localhostのポート1880で利用できるので、そこに接続を渡します。 この構成ブロックの残りの部分では、適切なプロキシ機能に重要ないくつかのヘッダーを設定します。 UpgradeおよびConnectionヘッダーは、Node-REDのWebSocket接続を処理するために特に重要です。

最後に、Let’sEncryptチャレンジ応答がNginxのデフォルトのWebルートから引き続きフェッチされるようにするためのブロックがあります。

/etc/nginx/sites-enabled/node-red.example.com
location '/.well-known/acme-challenge' {
    root /var/www/html;
}

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

  1. sudo systemctl reload nginx

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

  1. sudo systemctl start node-red

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

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

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

  1. node-red-admin hash-pw

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

  1. nano ~/.node-red/settings.js

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

settings.js
adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
        permissions: "*"
    }]
},

ファイルを開いている間に、行の先頭にある//を削除して、uihost行のコメントも解除します。

settings.js
uiHost: "127.0.0.1",

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

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

  1. sudo ufw deny 1880

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

  1. sudo systemctl restart node-red

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

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

結論

これで、SSL証明書にLet’s Encryptを使用してNginxによってプロキシされ、Node-REDがかなり安全にインストールされました。 ログインして配線を取得してください! Node-REDのウェブサイトにはさらに多くの情報とプロジェクトのインスピレーションがあります。