google-home-notifierをCentOS6で常時動かす

# はじめに
家に余っていたNetbookをサーバーにしてgoogle-home-notifierを動かしたとき、[README.md](https://github.com/noelportugal/google-home-notifier/blob/master/README.md)の中身だけでは解決出来なかったことをまとめます。特別な点は下記の2つです。

* 32bitマシン（Netbookが流行った当時のスペックなので）
* CeontOS（仕事で使っているOSなので）

2018年1月にやった作業（Nodeのインストール）と、2019年1月に実施した最新の作業（mdns関連の作業）が混じっています。

2018年1月時点での構築では、example.jsとpackege.jsのｍdnsに関する記述を消し、ルーターの設定をいじってポートフォワーディングして、google-home-notifierにアクセスしていました。ルーターの再起動をしない限りそうそうグローバルIPも変わらないので、問題なく使えていたのですが（変更を通知するスクリプトも作ったので）、mdnsに変更してみたいと思い立って、後半の作業になります。

# 環境設定
## Node.jsのインストール
Raspberry Piの手順について、[公式サイト](https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-enterprise-linux-fedora-and-snap-packages)にもあるパッケージマネージャーを使った方法が案内されていたが、32bitOSはサポート外なので、[こちらのインストーラー](https://github.com/taaem/nodejs-linux-installer)を利用して、インストール。

コレを使おうと決めた背景は公式サイトにあるWikiのリンクに紹介があったとようですが（2018年1月時点のメモ）、今は閉じられているようです。
https://github.com/nodejs/node/wiki/Installation#installing-on-linux

## mdns関連のパッケージインストール
ngrokを使って名前解決するところで、CentOS6ならではの問題がいくつかありました。

README.mdでは、

```
$sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev
```

とありますが、CentOSでは、EPELリポジトリを利用することで、avahiの依存や設定をyumが解決してくれるので、下記のコマンドでインストール可能。（gitについては省略）。

```
$sudo yum install nss-mdns
```
上記のインストールまでについてはこちらの記事を参考にさせて頂きました。
https://qiita.com/iwaim@github/items/06d1f970eb9d3748e18f

system-config-firewall-tuiのインストールが上手くいかなかったので、iptablesは直接編集しました。

```sh:/etc/sysconfig/iptables
-A INPUT -p udp --dport 5353 -j ACCEPT　#追記
```

## Avahi の起動
上記の手順でインストール後、すぐに起動を試みるも失敗するので、下記の対応を実施

D-BUSのサービスが起動している必要があるので、下記の通りで起動。

```
$sudo service messagebus start
```

カーネルでサポートとされていない SO_REUSEPORT オプションを使用する設定をOFF

```sh:/etc/avahi/avahi-daemon.conf
disallow-other-stacks=yes
```
下記、参考サイトでは、D-BUSもOFFにしていますが、上記の方法でサービスを起動すれば、avahiは起動できました。

```
$sudo service avahi-daemon start
```

参考にしたサイト
https://qiita.com/touta/items/bf968d379199aefe7225
https://dan-project.blog.so-net.ne.jp/2014-06-27

# google-home-notifierの設定と起動
google-home-notifier自体は、`git clone`して、`node example.js`で簡単に起動出来るので、基本的なことは省略します。

常時起動するため、またサーバーの再起動がかかってもngrokのURL変更に気付けるように、行った対応を書きます。

## browser.jsの変更
[README.md](https://github.com/noelportugal/google-home-notifier/blob/master/README.md)の通りでしか無いのですが、見落としがちな気がするので、[After "npm install"](https://github.com/noelportugal/google-home-notifier/blob/master/README.md#after-npm-install)のところは要注意です。

## google-tts-apiを更新する
詳細は、[google-home-notifierが気づいたら動かなくなってた時の対処法](https://qiita.com/k_keisuke/items/2974ddaf2bf24a3ea32e)の、`2018/12/15、まーた動かなくなった` にて確認ください。バージョンが古いので、更新が必要です。[早くマージされてくれる](https://github.com/noelportugal/google-home-notifier/pull/47)ことを切に願います。

## ngrokのURL失効対策＆変更通知
こちらも、[google-home-notifierが気づいたら動かなくなってた時の対処法](https://qiita.com/k_keisuke/items/2974ddaf2bf24a3ea32e) の記載の通りですが、このあとの、IFTTT連携や、GitHubの公開リポジトリにあがっても大丈夫なように下記の通りに記載しました。

```js:example.js
//（略）
const serverPort = 8091; // default port
const ngrok_token = process.env.NGROK_AUTHTOKEN;

//（略）

  ngrok.connect({authtoken: ngrok_token, addr: serverPort}, function (err, ngrok_url) {
//（略）

```

## ngrokURLの変更通知
サーバーが再起動などすると、ngrokのURLが変更されることがあるので、これをIFTTTのWebhook→LINE Notifierでお知らせすることにしました。IFTTTの設定内容は省略しますが、上記と合わせてこんな感じです。

```js:example.js
var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var request = require('request');  //追記
var app = express();
const serverPort = 8091; // default port
const ngrok_token = process.env.NGROK_AUTHTOKEN;  //追記
const ifttt_token = process.env.IFTTT_AUTHTOKEN; //追記
const ifttt_event = process.env.IFTTT_EVENT_NAME; //追記

var deviceName = 'Google Home';
var ip = '192.168.XXX.XXX'; // default IP

// (略）

app.listen(serverPort, function () {
  ngrok.connect({authtoken: ngrok_token, addr: serverPort}, function (err, ngrok_url) { //変更
    console.log('Endpoints:');
    console.log('    http://' + ip + ':' + serverPort + '/google-home-notifier');
    console.log('    ' + ngrok_url + '/google-home-notifier'); //変更
    console.log('GET example:');
    console.log('curl -X GET ' + ngrok_url + '/google-home-notifier?text=Hello+Google+Home'); //変更
    console.log('POST example:');
    console.log('curl -X POST -d "text=Hello Google Home" ' + ngrok_url + '/google-home-notifier'); //変更
    // 以下、追記
    var options = {
        url: 'https://maker.ifttt.com/trigger/' + ifttt_event + '/with/key/' + ifttt_token,
        method: 'POST',
        form: {"value1":ngrok_url},
        headers: {'Content-Type':'application/x-www-form-urlencoded'}
    }
    request(options, function (error, response, body) {
        console.log(body);
    })
    console.log(options.url);
    // ここまで
  });
})
```

## initd-foreverで常時起動
詳細は、[Nuxt.jsのアプリケーションをinitd-foreverを使ってデーモン化、自動起動する](https://qiita.com/isao_e/items/36b99b0e186b2d656b50
)が凄く丁寧なので、そちらをご確認ください。

initd-forever のインストール

```sh
$sudo npm install -g initd-forever
```

デーモンファイルの生成（rootで実行しました）

```
# initd-forever -a /home/xxxxx/google-home-notifier/example.js -n google-home-notifier
# mv google-home-notifier /etc/init.d/google-home-notifier
# chmod 755 /etc/init.d/google-home-notifier
```

また、`example.js`で環境変数を読むように変更しているので、下記の記述を追記しています。

```sh:/etc/init.d/google-home-notifier
# 略
start() {
        echo "Starting $nodeApp"

        # Notice that we change the PATH because on reboot
   # the PATH does not include the path to node.
   # Launching forever with a full path
   # does not work unless we set the PATH.
   PATH=/usr/local/bin:$PATH
        export NODE_ENV=production
        export NGROK_AUTHTOKE=XXXXXXXXXXXXXXXXXXXXXXXX #追記
        export IFTTT_EVENT_NAME=XXXXXXXXX #追記
        export IFTTT_AUTHTOKEN=XXXXXXXXXXXXXXXXXXXXXX #追記
   #PORT=80
   $foreverApp start --pidFile $pidFile -l $logFile -a -d -c "$command" $nodeApp
   RETVAL=$?
}
# 略
```

chkconfigの登録

```
# chkconfig google-home-notifier --add
# chkconfig google-home-notifier on
```

起動

```
# service google-home-notifier start
```

# まとめ
google-home-notifierの起動や設定方法についてはいろんな人がドキュメントを書いてくれてて困ることはあまりありませんでした。一番苦労したところは、CentOS6での構築でした。自宅で公開してないとはいえ、使い続けてて良いのかちょっと不安になりましたが、快適に使えているので、もうしばらく使ってみようかと思います。