Home Assistant ContainerをHTTPSで公開する
はじめに
Home Assistantを外部に公開すると、自宅の外やGoogle Assistantなどから利用できるようになります。公開する方法の1つとして、公式ではアドオンのDuckDNSを利用する方法が紹介されています。しかし、Home Assistant Containerはアドオンに対応していません。そこでこの記事では、比較的簡単に公開ができるCloudflare Tunnelを使用します。
Cloudflare Tunnelとは
Cloudflare Tunnelはサーバからアウトバウンド通信のみで外部からの安全なサーバへのアクセスを実現するサービスです。サーバ上でcloudflared
という軽量デーモンを立ち上げることによって暗号化された通信を提供します。
Cloudflare Tunnelの初期設定
前提条件
- Cloudflareでドメイン名が管理されている
手順
- CloudflareのDashboardの左ペインから
Zero Trust
をクリック -
Networks
内のTunnels
をクリック -
Cerate a tunnel
をクリック - Select tunnel typeでは
Cloudflared
を選択
- Name your tunnelではわかりやすい名前を入力
- Install and run connectorsでは起動コマンドが表示されるので控えておく(この中のトークンをあとで使用する)
- Route Trafficではホスト名とサービスを設定する
サービスのTypeはHTTP
、URLはHome Assistantを設置するサーバのローカルIPアドレスを指定する
デーモンの起動
Cloudflare Tunnelの初期設定が完了したので、cloudflaredとHome Assistantを実行します。
version: '3'
services:
cloudflared:
container_name: cloudflared
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel run
environment:
- TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}
homeassistant:
container_name: homeassistant
image: "ghcr.io/home-assistant/home-assistant:stable"
volumes:
- path/to/config:/config #要変更
- /etc/localtime:/etc/localtime:ro
- /run/dbus:/run/dbus:ro
restart: unless-stopped
privileged: true
network_mode: host
CLOUDFLARE_TUNNEL_TOKEN= #トークンを入力
docker compose up -d
で起動後、ダッシュボードのトンネル一覧を見るとステータスが変わっています。
Home Assistant Containerの設定
ただ起動しただけでは設定したホスト名にアクセスしても400エラーが返されます。これはHome Assistant側がcloudflaredを信頼していないために発生するものです。
Home Assistantのconfiguration.yaml
に以下を追加することで解決できます。
http:
use_x_forwarded_for: true
trusted_proxies:
- 172.20.0.2 #各自異なる
指定するプライベートIPアドレスはcloudflaredのものです。トンネル一覧から該当のトンネルをクリックしてConnector ID
をクリックした先で確認できます。
設定が完了したらHome Assistantのコンテナを再起動してください。
ここまで行えば設定したホスト名へ正しくアクセスできるようになります。
最後に
Cloudflare Tunnelを使ってHome Assistant ContainerをHTTPSで公開する手順を説明しました。Cloudflare TunnelはCloudflare Accessというゼロトラストネットワークアーキテクチャを実現するサービスと連携することでポリシー設定などと使うことが可能です。(Home Assistantのスマホアプリと一部相性が悪い)
間違いを発見した際はご指摘いただけますと幸いです。
Discussion