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


はじめに

家に余っていたNetbookをサーバーにしてgoogle-home-notifierを動かしたとき、README.mdの中身だけでは解決出来なかったことをまとめます。特別な点は下記の2つです。

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

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

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

環境設定

Node.jsのインストール

Raspberry Piの手順について、公式サイトにもあるパッケージマネージャーを使った方法が案内されていたが、32bitOSはサポート外なので、こちらのインストーラーを利用して、インストール。

コレを使おうと決めた背景は公式サイトにある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は直接編集しました。

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

Avahi の起動

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

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

$sudo service messagebus start

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

/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の通りでしか無いのですが、見落としがちな気がするので、After "npm install"のところは要注意です。

google-tts-apiを更新する

詳細は、google-home-notifierが気づいたら動かなくなってた時の対処法の、2018/12/15、まーた動かなくなった にて確認ください。バージョンが古いので、更新が必要です。早くマージされてくれることを切に願います。

ngrokのURL失効対策&変更通知

こちらも、google-home-notifierが気づいたら動かなくなってた時の対処法 の記載の通りですが、このあとの、IFTTT連携や、GitHubの公開リポジトリにあがっても大丈夫なように下記の通りに記載しました。

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の設定内容は省略しますが、上記と合わせてこんな感じです。

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を使ってデーモン化、自動起動するが凄く丁寧なので、そちらをご確認ください。

initd-forever のインストール

$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で環境変数を読むように変更しているので、下記の記述を追記しています。

/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での構築でした。自宅で公開してないとはいえ、使い続けてて良いのかちょっと不安になりましたが、快適に使えているので、もうしばらく使ってみようかと思います。