
自宅サーバー構築記録④──Home Assistant導入
DockerでHome Assistantを構築し、SwitchBot連携とCloudflare Tunnel公開を設定した記録です。
はじめに
自宅のスマートホーム機器を一元管理するためにHome Assistantを導入しました。
SwitchBotのハブが複数あり、それぞれのアプリで管理するのが面倒になってきたため、Home Assistantで統合することにしました。
この記事では以下を構築します。
Home AssistantをDockerコンテナで起動(既存のOpenCloudと共存)
SwitchBot Cloud APIで全デバイスを連携
Cloudflare Tunnelで外部からHTTPSアクセス
WireGuard VPN経由でのLANアクセスも可能
前提:
Ubuntu 24.04サーバーが稼働していること
Dockerと /opt/opencloud/docker-compose.yml がセットアップ済み(記事③参照)
Cloudflare TunnelとDDNSが設定済み(記事②③参照)
なぜDockerの network_mode: host を使うか
Home AssistantをDockerで動かす場合、通常の bridge ネットワークモードではなく network_mode: host を使います。
理由は2つです。
mDNS(マルチキャストDNS) ── 同一LAN上のスマートホームデバイスをHome Assistantが自動検出するために必要
デバイス直接アクセス ── 一部のデバイス統合でホストのネットワークインターフェースに直接アクセスする必要がある
network_mode: host の場合、ポートマッピング(ports:)の記述は不要です。コンテナがホストのポートを直接使います。
ステップ1:docker-compose.yml にHome Assistantを追加
既存の /opt/opencloud/docker-compose.yml に追記します。
services:
opencloud:
# 既存の設定(変更なし)
...
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
restart: unless-stopped
privileged: true
network_mode: host
volumes:
- /opt/homeassistant/config:/config
- /etc/localtime:/etc/localtime:ro
privileged: true はBluetooth等のデバイスアクセスに使われますが、SwitchBot Cloud連携のみなら不要です。念のため設定しています。
ステップ2:起動
sudo mkdir -p /opt/homeassistant/config
cd /opt/opencloud
sudo docker compose up -d homeassistant
# ログ確認
sudo docker logs homeassistant --tail 50
初回起動時はHome Assistantの初期化に1〜2分かかります。
ステップ3:初期セットアップ
ブラウザでLANから http://192.168.10.138:8123 にアクセスします(サーバーのLAN IPに置き換えてください)。
アカウント作成 ── ユーザー名とパスワードを設定
位置・タイムゾーン設定 ── タイムゾーンは Asia/Tokyo
デバイス検出 ── LAN内のスマートホームデバイスが自動検出されることがあります
ステップ4:Cloudflare Tunnel経由のアクセスに必要な設定
Cloudflare Tunnelを使う場合、Home AssistantはリバースプロキシのIPを「信頼できる送信元」として認識する必要があります。この設定がないと 400: Bad Request エラーが発生します。
/opt/homeassistant/config/configuration.yaml の末尾に追記:
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
- ::1
YAMLのインデントに注意: http: はインデントなし(ルートレベル)、その下は2スペースずつです。インデントミスがあるとHome Assistantが起動しなくなります。
追記後に再起動:
cd /opt/opencloud
sudo docker compose restart homeassistant
ステップ5:Cloudflare TunnelにHome Assistantを追加
/etc/cloudflared/config.yml を更新:
tunnel: YOUR_TUNNEL_ID
credentials-file: /home/your-username/.cloudflared/YOUR_TUNNEL_ID.json
ingress:
- hostname: ha.your-domain.com
service: http://localhost:8123
- hostname: cloud.your-domain.com
service: http://localhost:80
- service: http_status:404
Cloudflare Dashboard → DNS → レコード追加:
タイプ: CNAME
名前: ha
内容: YOUR_TUNNEL_ID.cfargotunnel.com
プロキシ: オン(オレンジ雲)
cloudflaredを再起動:
sudo systemctl restart cloudflared
ブラウザで https://ha.your-domain.com にアクセスできれば成功です。
ステップ6:UFWのポート設定
Home AssistantはLAN内アクセス用にポート8123を開放します。ただし外部公開はCloudflare Tunnel経由のため、LAN内のみに制限します。
sudo ufw allow from 192.168.10.0/24 to any port 8123
sudo ufw reload
ステップ7:SwitchBot連携
SwitchBot APIキーの取得
SwitchBotアプリを開く
プロフィール → 設定(右上の歯車)
アプリバージョンの表示部分を10回連続タップ
「開発者向けオプション」が現れる
トークンとシークレットをメモ(この2つが必要)
Home AssistantでSwitchBot連携を設定
Home Assistant → 設定 → デバイスとサービス
右下「+ インテグレーションを追加」
検索欄に「SwitchBot」と入力
「SwitchBot Cloud」 を選択(ローカル版とは別です)
トークンとシークレットを入力 → 送信
正常に連携されると、SwitchBotハブに接続された全デバイス(スイッチ・カーテン・温湿度計・エアコンリモコン等)が自動的に検出されます。
SwitchBot Cloud vs ローカルAPI: SwitchBot Hub 2以降はローカルAPIも利用可能です。アプリ → Hub設定 → 「ローカルネットワークから制御」をONにしてから「SwitchBot」(Cloudなし)を選ぶとCloud不要でアクセスできます。
アクセス方法まとめ
外部(Cloudflare Tunnel): https://ha.your-domain.com ── どこからでも
LAN内: http://192.168.10.138:8123 ── 自宅ネットワーク内
VPN経由(WireGuard): http://10.0.0.1:8123 ── 外出先からLAN的に
サービス管理コマンド
# 起動・停止・再起動
cd /opt/opencloud
sudo docker compose up -d homeassistant
sudo docker compose stop homeassistant
sudo docker compose restart homeassistant
# ログ確認
sudo docker logs homeassistant --tail 50
# イメージ更新
sudo docker compose pull homeassistant
sudo docker compose up -d homeassistant
トラブルシューティング
外部からアクセスすると「400: Bad Request」
Cloudflare Tunnelのリバースプロキシを信頼するhttp設定が抜けています。
/opt/homeassistant/config/configuration.yaml に以下を追記:
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
- ::1
再起動:
sudo docker compose restart homeassistant
Home Assistantが起動しない
YAMLのインデントエラーが多いです。ログを確認します:
sudo docker logs homeassistant --tail 30
configuration.yaml をYAMLバリデーターで確認するか、追記した部分を削除してデフォルト状態で起動を確認します。
SwitchBotデバイスが検出されない
SwitchBotアプリでハブがオンラインになっているか確認
トークンとシークレットの入力ミスがないか確認
一度インテグレーションを削除して再追加してみる
バックアップについて
Home Assistantの設定・履歴・自動化はすべて /opt/homeassistant/config/ に保存されています。このフォルダをrsyncのバックアップ対象に追加しておくことを推奨します。
/usr/local/bin/backup-data.sh がある場合、同様の形式で追加:
rsync -av --delete /opt/homeassistant/config/ /media/Backup/homeassistant/config/
まとめ
Home Assistantの導入でよく詰まるポイントは以下の3つです。
network_mode: host ── LAN上のデバイス自動検出に必要
http: trusted_proxies ── Cloudflare Tunnel経由で400エラーを防ぐために必須
SwitchBotはTokenとSecretの2つが必要 ── Tokenだけでは動かない
このシリーズを通じて、格安の古いPCをベースに、クラウドストレージ・スマートホーム・VPNが統合された自宅サーバー環境を構築できました。
同じような構成を検討している方の参考になれば幸いです。