Windows ServerのIISにNode-REDをデプロイ

# 初めに
- Windows server 2008
- iisnodeを用いて簡単にIIS上にNodeアプリをデプロイする
- 今回はNode-REDをインストールする

## 手段
- `Windows Server バックアップ`上でバックアップを作成
- [Node](https://nodejs.org/en/)からLTS版をダウンロードしてをインストールする
- [Azure/iisnode](https://github.com/Azure/iisnode)のページからビルドをダウンロードしてインストールする
- 再起動する
- `C:\Program Files\iisnode`の`setupsamples.bat`を実行。注意事項が出るので十分に読んで続行すること
- カスタムユーザーグループがある場合はIIS上でそのグループにアクセス権限を付与する
    
## node-REDインストール
- `C:\Program Files\iisnode\www\`に`xred`ディレクトリを作成し、そこに移動する。
- ファイル（`server.js`, `settings.js`, `web.config`）、ディレクトリ（`node-red`）を作成
- `C:\Program Files\iisnode\www\xred`上でpowershellを起動。以下のコマンドを実行
    - node-redは`--global`でインストールしない。これは、別のExpressアプリでラップするため、globalである必要がないためである。（globalの場合はリバースプロキシを使う必要があり、httpだけでなくwebsocketも対応する必要がある。私の能力ではwebsocketの対応はできず、動かなかった。）

```powershell
npm install --global --production windows-build-tools
npm install --unsafe-perms node-red
```

### server.jsの内容
```javascript
var express = require("express");
var RED=require('node-red');
var app= express();
var http=require('http');

const PORT=process.env.PORT; //||8000;

var server=http.createServer(app);
var settings=require("./settings.js");

RED.init(server,settings);

app.use(settings.httpAdminRoot,RED.httpAdmin);
app.use(settings.httpNodeRoot,RED.httpNode);
 
server.listen(settings.uiPort);
console.log(`listening port:${settings.uiPort}`);
RED.start();
```

### settings.jsの内容
```javascript
module.exports = {
    httpAdminRoot:"/node/xred/",
    httpNodeRoot: "/node/xred/",
    userDir:"./node-red/",
    uiPort: process.env.PORT, // || 8000
    }
```

### web.configの内容
```html
<!--
     This configuration file is required if iisnode is used to run node processes behind
     IIS or IIS Express.  For more information, visit:
     https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config
-->

<configuration>
  <system.webServer>
    <webSocket enabled="false" />
    <handlers>
      <!-- Indicates that the server.js file is a node.js site to be handled by the iisnode module -->
       <add name="iisnode" path="server.js" verb="*" modules="iisnode" /> 
	  <!--<add name="iisnode" path="hello.js" verb="*" modules="iisnode"/>-->
    </handlers>
    <rewrite>
      <rules>
        <!-- Do not interfere with requests for node-inspector debugging-->
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="server.js\/debug[\/]?" />
        </rule> 

        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
        <rule name="StaticContent">
          <action type="Rewrite" url="public{PATH_INFO}" />
        </rule>

        <!-- All other URLs are mapped to the node.js site entry point-->
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
          </conditions>
          <action type="Rewrite" url="server.js" />
        </rule>
      </rules> 
    </rewrite>
    
    <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
    <security>
      <requestFiltering>
        <hiddenSegments>
          <remove segment="bin" />
        </hiddenSegments>
      </requestFiltering>
    </security>

    <!-- Make sure error responses are left untouched -->
    <httpErrors existingResponse="PassThrough" />

    <!--
      You can control how Node is hosted within IIS using the following options:
      See iisnode on github for a full list of options
    -->
    <iisnode watchedFiles="web.config;*.js" loggingEnabled="true" logDirectory="iisnode" debuggingEnabled="true" />
  </system.webServer>
</configuration>
```

### コメント
- `cannot GET`と出た場合はsettings.jsのパスが間違っている可能性が高い
- 初めてアクセスした場合に`Not started`と出る。これは正常であり、しばらくしてからアクセスすれば正常に動く
- 403エラーが出る場合はIISでエラーページの詳細設定から詳細なログを表示に設定し、原因を特定する
    - 自分の場合は`node/index.php`を探していて、ファイルがないと怒られた
    - IISの既定のドキュメントでindex.htmを一番上に移動すると`node/index.htm`を探すようになる
- なぜかNode-REDはノードをインストールするとき、以下に列挙するディレクトリををmkdirしようとする。原因が特定できなかったため、サーバーのターミナル上でnpmコマンドを叩きノードのインストールを行った。


## 参考リンク
https://qiita.com/joeartsea/items/93e8483a31292067c654
https://nodered.org/docs/getting-started/windows#running-on-windows
https://discourse.nodered.org/t/installing-on-win-2012-server-r2/4585/3
https://freefielder.jp/blog/2015/05/windows-dot-folder-name.html