Dockerを使ってHomebridgeとHome Assistantを導入する

HomeKitを使う

一般的なWindows向け小型パソコンのIntel NUCに、Ubuntuを入れて、dockerを動かして、それにHomebridgeとHome Assistantをインストールしました。

先日の記事ではこのNUCにHome Assistantのイメージをインストールしましたが、気が変わってHomebridgeとHome Assistantの両方をdockerで入れることにしました。コロコロ変わってすみません。

Intel NUCにHome Assistantをインストールする
一般的なWindows用小型デスクトップPCであるIntel NUCに、Home Assistantをインストールしました。初めて使うHome Assistantなので、いまだに使い方が良くわからないのですが、とりあえずはESPHome使っ...

仮想環境でサーバを動かす

OSの上で直接サーバデーモンを動かすのではなくて、仮想機械(VM)やコンテナのような仮想環境を作ってその上でサーバを動かす方式が流行っている気がします。大昔の大型コンピュータでも、VMの上で古いOSを動かして、古いプログラムを動かしていたらしいです。流行が繰り返しているのでしょうか。

今までHomebridgeを使ってましたが、Home Assistantも試してみたいと考えていました。Home Assistantはイメージでのインストールを推奨しています。なので当初は、Raspberry Piを1個新調して、そちらをHome Assistant専用にしようと考えてました。でもRaspberry Piが品不足で入手困難になってしまいました。それで、前回の記事では、もう一台予備で持っていたIntel NUCをHome Assistant専用サーバとして構成しました。ただ、このNUCも別の場所でサーバとして使いたく思うようになりました。それで、今Homebridgeで使用しているIntel NUCの上に、仮想環境を作り、Homebridgeと共存させることにしました。

Intel NUCで仮想環境を作るならば、流行りのもので、KVMかDockerでしょうか。ただ本格的なVMだと、メモリとかCPUコアのリソースを分配する調整が面倒に思います。それでコンテナ方式のDockerでサーバ構築することにしました。

Ubuntuをインストールする

ゼロから作り直す方がスッキリすると思い、初代Intel NUC DC3217IYEにUbuntuをインストールしなおしました。 搭載CPUはモバイル向け第3世代のIntel(R) Core(TM) i3-3217U CPU @ 1.80GHzです。メモリは8GB、ストレージは64GBのmSATA SSDです。Windowsが動く普通のパソコンなので、あちらこちらでうち捨てられている旧式のコンピュータのどれでも同じ方法で使えるはずです。スマートホームのサーバーとして蘇らせてあげましょう。

Ubuntuのインストール方法はいくらでも見つかると思いますので、あらすじだけ。

まずはUbuntuのサイトに行って、最新のUbuntuサーバー (22.04.1 LTS) のisoファイルを入手します。ここではMacにダウンロードしました。ubuntu-22.04.1-desktop-amd64.isoという名前の、1.4GBくらいのファイルでした。

次に、これが収まるサイズのUSBメモリ(今回は8GB)を用意して、ddコマンドで、

sudo dd of=/dev/rdisk5 if=ubuntu-22.04.1-desktop-amd64.iso bs=16m

のようにしてUSBメモリにコピーします。この例はUSBメモリがdisk5にある場合です。bsはコピーするブロックサイズの指定ですが、デフォルトだと遅いです。16MBくらいが最適らしいです。

最後に、このUSBメモリを、インストール先のパソコン(Intel NUC)に挿して起動すれば、Ubuntuのインストールを開始できます。インストール途中で、mosquittoやdockerをインストールするのか聞かれました。うっかりインストールをお願いしてしまったら、snapという枠組みでインストールされました。snapも、Dockerに近い考え方で、サーバを独立した環境で管理する方式のようです。でもその関係で、設定ファイルが素のままではリードオンリーになっていて、書き換え面倒でした。結局、削除しました。

Dockerとは

軽量の仮想機械のようなものかと理解してます。Linuxの上でWindowsを動かそうとすると、ハードウェアに近いレベルから仮想化しないとダメですが、Linuxの上で別のLinuxを動かすならば、共通で使えるカーネル部分のレベルで仮想化すれば十分なはずです。そうすれば無駄が少なくて効率よく実装できます。以下が構成図です。

(https://knowledge.sakura.ad.jp/13265/ から引用)

一つのコンピュータに多数のサーバを組み込んでいくと、依存関係が複雑になったり、どれかのサーバの不具合で他にも支障が出たりと、厄介です。でも別の仮想環境(コンテナと呼んでいるようです)でサーバを動かせば、個別に再起動したり、丸ごとバックアップしたり、実験的に動かしたりすることが容易です。

Docker CEをインストールする

Dockerにも色々なバージョンがあるようです。Docker Desktopというのが有料版で(個人利用はまだ無料らしいです)、Docker CEというのが無償版のようです。こちらの手順を参考にしてDocker CEをインストールしました。

パッケージリストを更新して:

sudo apt update

HTTP経由のレポジトリを使うパッケージをインストールして:

sudo apt install -y apt-transport-https

GPGキーをダウンロードして(wgetが無いと言われたので、メッセージに従ってsudo apt install wgetしました):

wget -qO - https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker CE repositoryを追加します:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" | sudo tee /etc/apt/sources.list.d/docker.list

ここでいよいよDocker CEをインストールします:

sudo apt update
sudo apt install -y docker-ce

これでインストール終了のようです。aptコマンド以外は呪文みたいでした。

Docker CEを動かす

デフォルトでは、rootとsudoできるユーザだけがDockerを使えます。インストールの過程でdockerというグループが作られているので、それ以外のユーザがdockerを使えるようにするには、dockerグループに加えておけば良いようです。sudoコマンドを打つ手間が省けるので、自分をdockerグループに加えておきます。

sudo usermod -a -G docker $USER

これを有効にするには、一旦ログアウトして、ログインしなおします。動作を確認するために、dockerのversionを見ます。

docker version

それっぽい表示が出たので大丈夫のようでした。dockerサービスが動いているかどうか確認します:

sudo service docker status

このほか以下のコマンドで停止、起動、再起動ができます。

sudo service docker stop
sudo service docker start
sudo service docker restart

ちなみにこのページのガイドでは、serviceコマンドを使ってますが、いつも使っている、

sudo systemctl status docker

などのコマンドでも同じことができました。

Hello Worldの動作テスト

hello-worldを表示するイメージファイルがあるようです。それでテストできます。

docker run hello-world

このコマンドは、テスト用のイメージをダウンロードして、コンテナで動かして、メッセージを表示して、終了するものだそうです。

Docker CEを削除する方法

削除方法も書いてありました。#以下で補足して羅列します。

sudo apt purge --autoremove -y docker-ce
sudo groupdel docker #グループ削除
sudo ip link delete docker0 #network interface削除
#GPG keyとリポジトリを削除:
sudo rm -rf /usr/share/keyrings/docker-archive-keyring.gpg
sudo rm -rf /etc/apt/sources.list.d/docker.list
#Docker設定、イメージ、コンテナなどのディレクトリを削除
sudo rm -rf /etc/docker
sudo rm -rf /var/lib/docker
sudo rm -rf /run/docker
sudo rm -rf /var/run/docker.sock
sudo rm -rf /var/lib/containerd
sudo rm -rf /opt/containerd

Homebridgeをインストールする

Homebridge本家のサイトからリンクされている、こちらのガイドに従いました。

Install Homebridge on Docker
HomeKit support for the impatient. Contribute to homebridge/homebridge development by creating an account on GitHub.

ここではdocker-composeというユーティリティを使っているようです。Docker CE本体とは別に配布されているツールのようです。通常はdocker runコマンドに長いオプションを付けてでコンテナを起動するのですが、docker-composeコマンドはあらかじめymlファイルで定義した内容に従ってコンテナを起動します。何をどういうオプションで動かしたかもymlファイルで残るので、管理も楽そうです。

Homebridgeを動かすには、以下の内容のdocker-compose.ymlというファイルを作ります。どこでも良いようなので、ホームディレクトリに作りました。

version: '2'
services:
  homebridge:
    image: oznu/homebridge:ubuntu
    container_name: homebridge
    restart: always
    network_mode: host
    environment:
      - HOMEBRIDGE_CONFIG_UI_PORT=8581
    volumes:
      - ./homebridge:/homebridge

この後、docker-compose.ymlをおいたディレクトリで、

docker-compose up -d

コマンドを動かせば良いようです。今回は、docker-composeがインストールされていないと言われたので、メッセージに従って、

sudo apt install docker-compose

してインストールしました。インストール終了後、http://xxx.xxx.xxx.xxx:8581/に接続したところ動いてました。

Home Assistantをインストールする

Home Assistantもdocker-composeを使ってインストールしました。方法はこちらを参考にしました。

Linux
Install Home Assistant on a Linux

ここにdocker-compose.ymlの内容が書いてあります。多分、上のHomebridgeのインストールに使ったファイルに、ここに書かれているhomeassistantの部分を追加すれば良いはずです。以下の水色の部分を追加しました。

version: '2'
services:
  homebridge:
    image: oznu/homebridge:ubuntu
    container_name: homebridge
    restart: always
    network_mode: host
    environment:
      - HOMEBRIDGE_CONFIG_UI_PORT=8581
    volumes:
      - ./homebridge:/homebridge
homeassistant:
  container_name: homeassistant
  image: "ghcr.io/home-assistant/home-assistant:stable"
  volumes:
    - /PATH_TO_YOUR_CONFIG:/config
    - /etc/localtime:/etc/localtime:ro
  restart: unless-stopped
  privileged: true
  network_mode: host

これで、

docker-compose up -d

コマンドを動かした後、http://xxx.xxx.xxx.xxx:8581/に接続したところ動いてました。

まとめ

UbuntuにDockerを入れて、その上にコンテナとしてHomebridgeとHome Assistantをインストールしました。Home Assistantはイメージとしてインストールするのが推奨されているようなので、他のサーバも同居させるためには仮想マシンかDockerを使うのが良いと思いました。

今後、mosquittoやzigbee2mqttなども使う予定ですが、これらのサーバは、従来通り、大元のUbuntuにインストールする予定です。HomebridgeやHome Assistantはwebからのインタフェースが充実してますが、mosquittoなどは設定ファイルやログファイルを見る必要があるので、従来通りの運用が楽かと考えています。

コメント

タイトルとURLをコピーしました