Node Redの紹介

Node-REDの紹介
-----

自宅オンプレミスでCIサーバーを作りたかったので、色々調べたときに、ふと見つけたOSSを紹介します。

注意
-----

信頼境界の概念を
セキュリティは最低限行いましょう

Node-REDとは？
----

- もともとはIoT用として作られた

なぜ、そのようなものを作ろうかと思ったのか？
----

- Mac環境を使ったセキュアな自作CIサーバーが欲しかった
- electronのビルドに必要
- 原因は不明だが、何故かうまくいかない
    - travis ci 仮装mac環境
    - ~~circle ci 仮装mac環境~~  <=お金かかるのでしていない


どんなことに使えるか
-----

- slackで通知されたら、ローカルであるプログラムを起動したい
- 私設サーバーに機密情報をおきたくない
- IoTを使って、温度などを定期的に取りたい
- 情報のフローを頻繁に変えたい
- めんどくさいプログラミングしたくない
- 速さよりも機能

使ってみて感じたこと
-----

- マイナーバージョンリリースではあるが使えるユースケースは多そう
- 初期設定では、セキュリティ機能は一切ないので、第３者からいじり放題
    - サーバーにおセキュリティを自分ですべてしなければならない
    - https化、dockerとか (結構敷居高い)
    - 専門の人にやってもらったほうがいいかも


遭遇したバグ
----

Node-REDのセキュリティ関連の機能は、nginxプロキシをさせると、一部がバグる(パレッド画面に移動しないなど)
![名称未設定ファイル.png (44.4 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/2fbbf27b-7c66-4eac-bb37-b9776d85fa11.png)


Node-REDの起動方法
-----

```bash
$ mkdir -p $HOME/Desktop/nodered/data
$ docker run -it --rm \
-p 1880:1880 \
-v $HOME/Desktop/nodered/data:/data \
--name app-nodered \
nodered/node-red-docker
````

- -p 1880:1880
    - http://localhost:1880/ でアクセスできるようになる
- `$HOME/Desktop/nodered/data`
    - Node-Redの設定ファイル、プログラミング情報が保存されている

※ `$HOME/Desktop/nodered/data`が自動的に作られる
ディレクトリ構成はこんな感じ
<img width="838" alt="スクリーンショット 2017-11-08 08.29.19.png (27.2 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/2098e533-ea53-4ef8-b851-12168e6f45a2.png">


「 http://localhost:1880/ 」にアクセスしてて

画面のパーツの説明
-----

パーツは大きく分けて、３つに別れる

![名称未設定ファイル (1).png (41.8 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/168c02b4-9a30-4d49-9c16-7c727db311a4.png)



実際に触れてみよう
-----

1. プログラミングを行うには、「左の  flow メニュー」からドラッグ＆ドロップで要素を選ぶ
    ![名称未設定ファイル (2).png (37.2 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/59354399-909a-4be4-a04f-a7d6ed4654df.png)

2. 要素をダブルクリック。各flowに詳細設定を行う(なんのURLをトリガとするか)
    <img width="812" alt="スクリーンショット 2017-11-08 08.51.54.png (84.1 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/5437c65a-9cdf-4d31-a7c8-563a4a615399.png">

- 各項目の説明
    - メソッド(どのメソッドをトリガとするか)
        - <img width="343" alt="" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/5afd8ced-e953-4bac-a1f8-24f73f3881d8.png">
    - URL (どのパスから来たものをイベントとしてトリガーするか)
    - 名前 (Node Red内部で使う、ラベルのようなもの)


プログラミングしてみよう
-----

### 最小構成

httpで`/test`にGETでアクセスすると、何かしらのデータが入ってくるものを作る

 <img width="325" alt="スクリーンショット 2017-11-08 09.00.56.png (25.7 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/7f181dd9-d935-4719-8a3c-1a1edb9b88bc.png">

flowの設定を書き換える

<img width="443" alt="スクリーンショット 2017-11-08 08.54.26.png (20.7 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/1298531e-7ea3-4349-a4fc-a5d67fcb0c54.png">

デプロイボタンでデプロイ

<img width="149" alt="スクリーンショット 2017-11-08 09.01.05.png (4.8 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/0cb8d07d-843b-4690-a801-be1a14afec02.png">


```bash
$ curl http://localhost:1880/test\?payload\=messages
{"payload":"messages"}%
```


### slackとの連携

slack との連携をするには、plaginが必要になる
↓
プラグインのインストール


![名称未設定ファイル (4).png (45.8 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/150013f9-f9e4-4afa-8d01-6e1826f8cad3.png)

コレ選択。右下の「ノードを追加」をクリックすると、インストールができる
![名称未設定ファイル (5).png (35.0 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/b24ef951-87db-4639-a0a3-f56e64d3c488.png)

slackのflowが使えるようになります。

<img width="150" alt="スクリーンショット 2017-11-08 11.02.50.png (23.6 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/2d57f2b3-42c1-40b9-abff-63506bd464f8.png">

slackbotのapi tokenを使用することで、slack簡単に連携することができます。

![名称未設定ファイル (6).png (16.4 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/43a85fa7-0319-4cf0-886a-4476698a1724.png)

slackを用いた、全体的なフロー図はこのようにしました

![名称未設定ファイル (3).png (64.3 kB)](https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/f1e30865-ad41-4781-9982-9ec8a0a2cb27.png)

セキュリティについて
-----

Node-REDには、セキュリティ機能として、ユーザ管理機能が**一応**実装されている([詳しくはここを見よう](https://nodered.org/docs/security.html))

(といっても、ハードコーディングなのだが)
<img width="603" alt="スクリーンショット 2017-11-08 08.34.29.png (80.3 kB)" src="https://img.esa.io/uploads/production/attachments/4290/2017/11/08/20729/c0938665-7f29-4415-a434-e2879cdfd9a0.png">