Synology DS216jにhomebridgeをインストールする

久しぶりの更新。まだ生きてます。

唐突ですが、時代はいまやスマートホーム()! 常時起動させているNAS、DS216jにhomebridgeを入れて、Siriから格安Wi-Fi対応学習リモコン経由で家電を音声操作しちゃおう!と思い立ちました。

超ざっくり処理の流れを説明すると、

iPhone(Siri) → homebridge(DS216j) → Wi-fi対応リモコン(RM mini3(eRemote mini)など) → 家電機器

となります。homebridgeはnode.jsで動くプログラムで、node.jsがパッケージセンターに公式に用意されていることから、さくっと30分くらいでインストール終わるんじゃね?と最初は思っていましたがhomebridgeがエラーを吐いて動かない。てこでも動かない。opkg環境を構築してソースからビルドしても動かない。dockerコンテナなら超さくっとインストールできるぜ?なんて情報もありましたが、上位機種じゃないとだめ。というわけでdocker全盛?の2018年にchroot監獄です。この記事を書くのも含めて結局トータル12時間くらいかかったという・・・。こんなに苦労するなら転がってるラズパイに環境構築すればよかったと後悔していなくもないです。

というわけで、homebridgeと学習リモコンの設定はぶっちゃけチョロなので、苦労したhomebridgeのインストール手順のみとなりますがまとめました。ここ↓
Setup Homebridge on Synology NAS without Docker
の手順を参考にしましたが結構アレンジしてます。というかせざるを得なかった。 同じCPUアーキテクチャの後継機種DS218jでも同じ手順が使えそうですね。

とここで注意事項。以下の手順でNASに入れるdebian-chrootパッケージは、DSM6.0以降のDiskStation(以降DS)に入れてアンインストールすると、DSが”brick(煉瓦化)”(日本でいうところの文鎮)する致命的な不具合が報告されています。対処方法は2018年10月19日現在、完全に確立されていないようです。したがって、

以下の手順を実施してもたらされる全ての結果の責任は手順実施者が負うことを認識してください。
責任を自分で負えないのであれば以下の手順を絶対に行わないでください。
実施する場合も必ずのNAS上にあるデータのバックアップを取ってください。

それではスタート

0. administratorsグループに所属するユーザをNAS上に作成しておく

1. Enable SSH your NAS. (いきなり英語でびっくりした?調査中英語ばっかりで疲れたのでこの疲れをおすそ分け)
なお、22番ポート以外のポートを使うように設定しておく。(10022など。以降、10022番ポートに設定した前提で手順を記載する)

2. コントロールパネル→ファイルサービス→詳細→「Bonjourサービスの検出を有効にする」のチェックを外して適用する

(chroot環境のmDNSを有効化するためDS側は無効にする)

3. パッケージセンター→設定→全般→トラストレベルを「Synology Inc.および信用された製造元」に変更、パッケージソースタブで場所「http://packages.synocommunity.com/」、名前は適当にsynocommunityとかにして追加してOK

4. パッケージセンターの検索バーに「python」と入力してエンターを押す。コミュニティカテゴリのPythonをインストール

5. ここにアクセスし、「5.2 armada38x」をクリックしてdebian-chroot.v7.f5644[armada38x].spkをダウンロードする。

6. 5.でダウンロードしたファイルをパッケージセンターから手動インストールする。

7. teratermなどでNASにsshログイン(10022番ポート)する。ログインユーザは0.で作成したユーザ

8. rootになる

【ネイティブDS環境】$ sudo -i

9. debian chrootを発動する

【ネイティブDS環境】# /var/packages/debian-chroot/scripts/start-stop-status chroot

10. aptデータベースを更新

【chroot環境】# apt-get update

11. 必要なツール類をインストール

【chroot環境】# apt-get install build-essential
【chroot環境】# apt-get install chkconfig
【chroot環境】# apt-get install python2.7
【ネイティブDS環境】$ sudo -i
【ネイティブDS環境】# cd /volume1/@appstore/python/lib/python2.7/site-packages
【ネイティブDS環境】# pip install --upgrade pip
【ネイティブDS環境】# pip install --upgrade setuptools
【ネイティブDS環境】# pip install pyextdirect
【ネイティブDS環境】# cd /usr/lib/python2.7/site-packages/
【ネイティブDS環境】# cp -pR pyextdirect /volume1/@appstore/python/lib/python2.7/site-packages/

12. 作業用ディレクトリを作成して移動する

【chroot環境】# mkdir ~/work
【chroot環境】# cd ~/work

13. node.jsのソースをhttp://nodejs.org/dist/からダウンロードして展開(お好きなバージョンをどうぞ。動かなくても知らんけどne)

【chroot環境】# wget http://nodejs.org/dist/latest-v8.x/node-v8.12.0.tar.gz
【chroot環境】# tar xvzf node-v8.12.0.tar.gz

14. node.jsをビルドしてインストール。(2~3時間かかるので昼寝でもしてね)

【chroot環境】# cd node-v8.12.0
【chroot環境】# ./configure
【chroot環境】# make -j2
【chroot環境】# make install

15. homebridgeに必要なマルチキャストDNS関連のパッケージをインストールして起動

【chroot環境】# apt-get install libavahi-compat-libdnssd-dev
【chroot環境】# cd /
【chroot環境】# mount -t proc proc proc/
【chroot環境】# /etc/init.d/dbus start
【chroot環境】# /etc/init.d/avahi-daemon start

16. homebridgeをインストール

【chroot環境】# npm config set python /usr/bin/python2.7
【chroot環境】# npm install -g --unsafe-perm homebridge

あとは自分の学習リモコンに応じて必要なプラグインもここらへんでインストールしておく。私の場合は

【chroot環境】# npm install -g homebridge-broadlink-rm

17. homebridgeをサービスとして起動するように設定

【chroot環境】# useradd -s /bin/false -b /var/run homebridge
【chroot環境】# cd ~/work
【chroot環境】# wget https://gist.githubusercontent.com/gregwym/d7b31606758acfb61896f588d13c3dda/raw/a7350fe13df3f99312bdaea85aca0cc4a1389e8f/init.d.homebridge.sh
【chroot環境】# cp init.d.homebridge.sh /etc/init.d/homebridge
【chroot環境】# chmod 755 /etc/init.d/homebridge

18. homebridge起動確認。1回起動してすぐに停止させる。この操作によりchroot環境の/var/run/homebridge配下に.homebridge/が作成される。せっかちな人向け(for the impatient)が笑いをさそう

【chroot環境】# service homebridge start
[ ok ] Starting HomeKit support for the impatient: homebridge.
【chroot環境】# service homebridge status
[ ok ] homebridge is running.
【chroot環境】# service homebridge stop
[ ok ] Stopping HomeKit support for the impatient: homebridge.

19. いったんログアウトしてchroot環境を抜ける(teratermを閉じる)

20. NASにsshログイン(10022番ポート)する。ログインユーザは0.で作成したユーザ

21. rootになる

【ネイティブDS環境】$ sudo -i

22. /var/packages/debian-chroot/scripts/start-stop-statusのバグ?を修正する。
(start-stop-status start(またはstop)はDSM6.0環境では正常動作はしていない。
しかし、DS起動時に呼ばれ/procや/dev/ptsをchroot環境にマウントする処理をしてくれるので有用)

【ネイティブDS環境】# vi /var/packages/debian-chroot/scripts/start-stop-status

73行目付近のexit 1をexit 3に変更する
(省略)
    status)
        if daemon_status; then
            echo ${DNAME} is running
            exit 0
        else
            echo ${DNAME} is not running
            exit 1 ←←←←←←←←←←←←←←←← ここをexit 3に変更する
        fi
        ;;
(省略)

23. パッケージセンターからDebian Chrootを開き、「実行」をクリックする。(間違ってもアンインストールを選んでクリックしないこと!

24. chroot環境に直接sshできる環境を構築する。(chroot環境に直接sshする場合は22番ポートで接続する環境となる)

【ネイティブDS環境】# /var/packages/debian-chroot/scripts/start-stop-status chroot
【chroot環境】# apt-get install ssh

25. chroot環境にsshログインするためのユーザ(例:mainte)を作成する

【chroot環境】# useradd mainte -m
【chroot環境】# passwd mainte

26. chroot環境でsshしたユーザがrootにsuできるように、rootのパスワードを設定する

【chroot環境】# passwd

27. いったんログアウトしてchroot環境を抜ける(teratermを閉じる)

28. NASにsshログイン(10022番ポート)する。ログインユーザは0.で作成したユーザ

29. rootになる

【ネイティブDS環境】$ sudo -i

30. chroot後にchroot環境で各種サービスが自動起動するように設定する

サービス起動スクリプトを作成

【ネイティブDS環境】# vi /usr/local/debian-chroot/var/chroottarget/root/service_start.sh

以下の内容で作成
#!/bin/sh
service dbus start
service avahi-daemon start
service homebridge start
service ssh start

作成したスクリプトに実行権を付与

【ネイティブDS環境】# chmod 755 /usr/local/debian-chroot/var/chroottarget/root/service_start.sh

「/var/packages/debian-chroot/scripts/start-stop-status chroot」実行時に上記スクリプトを実行するように修正する

【ネイティブDS環境】# vi /var/packages/debian-chroot/scripts/start-stop-status

78行目付近の「chroot ${CHROOTTARGET}/ /bin/bash」行をコメントアウトし、
下記のように「chroot ${CHROOTTARGET}/ /bin/bash -c "/root/service_start.sh"」行を追加する
(省略)
    chroot)
#        chroot ${CHROOTTARGET}/ /bin/bash ←←←←←←←←←←←←←←←←←←←← コメントアウト
        chroot ${CHROOTTARGET}/ /bin/bash -c "/root/service_start.sh" ←←←←←←←← 追加
(省略)

31. NAS起動時に自動的にchrootするようにする

【ネイティブDS環境】# vi /etc/rc.local

以下の内容で作成。/bin/sleep 60はいらないかも
#!/bin/sh
/bin/sleep 60
/var/packages/debian-chroot/scripts/start-stop-status chroot

作成したファイルに実行権を付与

【ネイティブDS環境】# chmod 755 /etc/rc.local

32. NASを再起動する

【ネイティブDS環境】# reboot

33. NAS起動後chroot環境が自動で出来上がっているので、sshログイン(22番ポート)する。ログインユーザは25.で作成したユーザ

32. rootになる

【chroot環境】$ su -

34. あとはネット上にごろごろしているhomebridgeの設定方法を参考にしてconfig.jsonをがしがし書く。config.jsonは/var/run/homebridge/.homebridge/に配置。homebridgeの停止・起動・再起動は、以下のようにserviceコマンドで。

【chroot環境】# service homebridge stop
【chroot環境】# service homebridge start
【chroot環境】# service homebridge restart

補足. homebridge-broadlink-rmでリモコンを学習させる(サービス起動時に標準出力の内容を確認する方法を確立するのが面倒くさかったのでrootで通常起動する方法)

【ネイティブDS環境】$ su -
【chroot環境】# service homebridge stop
【chroot環境】# cp -R /var/run/homebridge/.homebridge /root/
【chroot環境】# chown -R root:root /root/.homebridge

/root/.homebridge/config.jsonは起動に必要な最低限の内容にする

【chroot環境】# vi /root/.homebridge/config.json
{
        "bridge": {
                "name": "Homebridge",
                "username":"34:EA:34:AA:AA:AA", ←自分の環境にあわせる
                "port": 51826,
                "pin": "999-99-999"
        },
        "description": "Homebridge",
        "platforms": [
                {
                        "platform": "BroadlinkRM",
                        "name": "Broadlink RM",
                        "accessories": [
                                {
                                        "name": "テレビ",
                                        "type": "switch",
                                        "data": {
                                                "on": "",
                                                "off": ""
                                        }
                                }
                        ]
                }
        ]
}

rootでhomebridgeを起動する。ホームアプリからbridgeが認識されない場合は一度bridgeを削除してもういちど登録する。ホームアプリから学習モードをONにして学習させれば結果が標準出力に表示される。学習したデータを控えたらCTRC+Cで終了する

【chroot環境】# homebridge

おわり。長いねw

宮城県好きな道ランキング

突然ですが、遅い夏休みに入って時間もあるので、私が宮城県の県道や国道で走って楽しいと感じる道をランキング形式でつれづれなるままに紹介します。宮城の道をくまなく走っているわけではなく、また他にも楽しい道はたくさんあるので、参考までに。(´へωへ`*)

第5位 県道263号泉ケ丘熊ケ根線
距離が約20kmある長い県道。このうち楽しい区間は、根白石~大倉の区間である。ワインディングロードが比較的長い区間続く。大倉側は一部道幅が狭い区間があるがそれ以外はセンターラインのある片側一車線の道であり、昼間であれば普通にドライブが楽しめる。夜間は走り屋が出没する道なので注意が必要である。

第4位 県道55号定義仙台線
北環状線の終端と国道48号が交わる付近にひっそりと入り口がある県道。しばらくはそこそこ普通の道幅が続くが、途中から牙を剝く。県内屈指の険道かもしれない。走るには相応の覚悟が必要だが、20km以上あるこの県道を完走したときにはおだやかな達成感につつまれる、かもしれない。

第3位 県道40号利府松山線
仙台から県北東部(登米方面)に向かうのに私がよく利用する道である。それほどきつくないコーナーが適度に続き、運転していて飽きない。路面の状態も比較的良い。信号がほとんどなく交通量も少なくとても快適な道である。県道241号とのセットは至高のドライビングルート。

第2位 県道56号仙台三本木線
信号が少ない、交通量が少ない、適度にコーナーがありアップダウンもある、道幅もそこそこあるという楽しい県道の要素がつまった道である。さらに仙台から古川方面に向かう道として国道4号の代替ルートとしても使える実用性も兼ね備え、非の打ち所がない、と言ったら言い過ぎであろうか。

第1位 国道457号
宮城県に起点も終点もない国道は、この国道457号と国道4号、国道113号だけだろうか。県西部を縦断するルートで色々な顔をみせる道であり、一口に魅力を伝えるのが難しい。根白石付近の長い直線で思わず見入ってしまう霊峰(嘘)泉ヶ岳、宮城県最高峰の屏風岳擁する蔵王連峰など、数々の絶景ポイントがあるこの国道、まずは一度走ってみてあなた自身で素晴らしさを体感してみて欲しい。(文を書くのに疲れてきたので閲覧者に丸投げして終)

DS216jで405 not allowedエラーを回避

某サイトの記事で妙に推されているSynologyのNAS、DS216jをAmazonの春のSALEパワーに負けて買ってしまいました。ここ最近はCeleronJ1800を積んだマザーのマシンでNAS兼Webサーバを運用していて特に問題はありませんでした。しかし諸事情によりRAIDが組めないのがちょっと不安ということもあり、NASとしてはもちろんWebサーバにもなってwordpressも動かせる、他にもなんか色々やたらと多機能でアプリ追加でDTCP-IPにも対応予定の神がかったDS216jを買うしかないっ!という考えにいたった訳です。性能自体はJ1800のほうが上だと思いますが、物欲に負けました。(^^;

で、さっさと移行するぜ~と作業していたんですが、元のサーバからエクスポートしたwordpressのデータをphpMyAdminでインポートしようとすると、バーンと 405 not allowed バーイnginx とエラーが表示されてうまくいかないわけです。それだけじゃ何がなんだか分からんだろとw
とりあえずsshを有効にして、/var/log/nginx/error.log をみると upstream timed out というエラーが出ていました。あっ(察し)ということで能書きはこの辺にして以下に回避方法を紹介します。

$ sudo -i
Password: (管理者のパスワードを入力)
# cd /var/packages/phpMyAdmin/target/synology_added
# cp -p www.phpMyAdmin.enable.conf www.phpMyAdmin.enable.conf.org
# vi www.phpMyAdmin.enable.conf
(省略)
location ~ ^/phpMyAdmin/(.*)\.php$ {
    root /var/services/web/;
    include fastcgi.conf;
    fastcgi_pass unix:/run/php-fpm/php56-fpm.sock;
    fastcgi_read_timeout 600; ←追記
}
(省略)

タイムアウトの設定値の単位は秒です。自分がインポートするデータ量に応じて適宜決めましょう。
設定の変更後、パッケージセンターからphpMyAdminを停止、実行することで設定が有効になります。
ちなみにwordpressのアップデートのときにも 405 not allowed エラーが出たりしますが、上記と同様の方法で対処できそうな気がします。

というわけで現在はホームページのデータを移し終わり、このブログをDS216jで表示させています。 (´へωへ`*)