Home Assistantを単一コンテナから高可用なサービススタックへ移行する方法

エヴァ・ウォンテクニカルライター であり ZimaSpaceの常駐ティンカーでもあります。 生涯のオタクであり、 ホームラボとオープンソースソフトウェアに情熱を持っています。彼女は複雑な技術的概念をわかりやすく、 実践的なガイドに翻訳することを専門としています。エヴァはセルフホスティングは楽しくあるべきで、怖がるものではないと信じています。彼女のチュートリアルを通じて、コミュニティが ハードウェアのセットアップを解明する手助けをしています。初めてのNAS構築からDockerコンテナの習得まで。

まず動作中のHome Assistantの状態を保全し、そのうえで永続データ、補助サービス、ネットワーク経路、起動依存関係、バックアップを明確な役割に分離することで、Home Assistantを単一コンテナから堅牢なサービススタックへ移行できます。目的はコンテナを増やすことではありません。1つのサービス障害によってスマートホーム全体が停止する可能性を下げることです。

移行は段階的に行ってください。新しいスタックが起動し、ローカル制御テストに合格し、ホストの再起動に耐え、バックアップから復元できることを確認するまで、元のコンテナとそのデータには手を加えないでください。堅牢なスタックとは、Composeファイルが最も長いものではなく、障害発生時に動作を把握できるものです。

動作中のコンテナを固定し、すべての依存関係を把握する

構成を変更する前に、Home Assistantの正確なイメージとバージョン、設定パス、環境変数、ネットワークモード、USBデバイスの割り当て、マウントパス、ホストポートを記録します。次に、Home Assistantがコンテナ外で依存しているものをすべて一覧化します。MQTTブローカー、データベース、Zigbee2MQTT、リバースプロキシ、VPN、DNS、証明書、バックアップ、ネットワーク共有などです。これが移行マップになります。

各依存関係を、正 authoritative state、再構築可能なサービス、外部インフラのいずれかに分類します。Home Assistantの設定とデータベースの状態は正 authoritative stateです。取得し直せるコンテナイメージは再構築可能です。DNSとルーティングは外部インフラである場合があります。この分類により、コンテナ定義だけをバックアップし、機能するために必要なデータやサービスを忘れるというよくあるミスを防げます。

永続データを交換可能なコンテナから分離する

状態を保持する各サービスに、所有権とバックアップポリシーを把握した明示的な永続パスまたは名前付きボリュームを割り当てます。Home Assistantの設定、保持される場合のMQTT状態、データベースファイル、証明書、自動化関連のシークレットを、コンテナの書き込みレイヤーだけに保存してはいけません。状態を失わずにイメージとコンテナを交換できるようにします。

ボリュームの復旧には、アプリケーションを考慮した対応も必要です。移植可能なDockerボリュームのバックアップと復元パターンでは、実行時のディレクトリをそのままコピーすることが、移植可能なバックアップと同じではない理由を説明しています。データベースの場合は、書き込み中に取得したファイルコピーが一貫性を保つと決めつけず、データベースに適したバックアップ方法と連携してください。

ヘルスチェック、再起動ポリシー、起動依存関係を意図的に追加する

再起動ポリシーが答えるのは「このプロセスが終了したとき、ランタイムは何をすべきか」です。ヘルスチェックが答えるのは「このサービスは実際に利用できる状態か」です。これは別の問いです。データベースコンテナは起動中でもログをリプレイしている可能性があり、MQTTブローカーもプロセスは存在するものの、Home Assistantが期待する接続経路をまだ受け付けられない場合があります。

意味のある準備完了条件があるサービスにはヘルスチェックを使用し、依存するサービスが本当に必要とする場合にだけ起動順序を追加します。独立した再起動ポリシーとサービスの健全性が異なるシグナルである理由では、自動再起動だけでは準備完了を証明できない理由を説明しています。もう1つの依存サービス向けのCompose準備完了パターンは、固定のスリープタイマーではなく、実際のヘルス状態に基づいて依存サービスの起動を制御したい場合に役立ちます。

ネットワーク、リソース、保守順序で障害範囲を限定する

Home Assistantを応答可能な状態に保つ必要があるときに、メディアスキャン、データベースのマイグレーション、実験用コンテナがCPUを使い切ったり、利用可能なRAMをすべて消費したり、アプリ用SSD全体を占有したりしないようにします。負荷の高い周辺サービスには明確なリソース上限を設定し、可能であれば一時キャッシュを重要な状態データから分離し、Home Assistantの制御経路を安定したローカルネットワーク上に維持します。

更新の順序も分離します。ホスト、コンテナランタイム、Home Assistant、データベース、任意の補助サービスというように、一度に1つのレイヤーだけを変更してください。すべてを1回の保守時間内に更新してスタックが失敗すると、どのレイヤーが問題を引き起こしたのか特定できなくなります。ZimaSpaceのコンピュート、ストレージ、バックアップの役割を分離したHome Assistantトポロジーでは、コンピュート、ストレージ、ネットワーク、復旧に関する、より広範な役割分担を示しています。

再起動と復元のテストに合格してから切り替える

設定のコピーまたは管理された復元を使って、新しいスタックを起動します。ローカルダッシュボードを1つ、ローカル自動化を1つ、ZigbeeまたはThreadの経路を1つ、使用している場合はMQTT、履歴とデータベースへのアクセス、通知、設計に含まれる場合はリモートアクセスをテストします。その後、コンテナだけでなくホスト全体を再起動し、手動操作なしで起動順序とデバイス割り当てが正常に機能することを確認します。

最後に、復旧を実証します。クリーンな一時環境に復元するか、少なくとも状態を保持するコンポーネントを別のテスト用名前空間に復元してください。ワークロードのボリュームが含まれていなければ、管理プレーンのバックアップは誤解を招く可能性があります。管理プレーンのバックアップでワークロードデータが除外される場合がある理由は、スタック定義とアプリケーションデータに別々の復旧対策が必要な理由を示しています。

  1. 動作中の単一コンテナの状態をスナップショットまたはバックアップする。
  2. 依存関係を把握し、状態を保持するコンポーネントと再構築可能なコンポーネントに分類する。
  3. 明示的な永続パスとサービス定義を作成する。
  4. 実際の障害モードを解決する場合にのみ、ヘルス、再起動、リソースのポリシーを追加する。
  5. ローカル制御、無線機器、データベース、リモート経路、完全な再起動、復元をテストする。
  6. 新しいスタックがすべてのテストに合格してから、古いコンテナを廃止する。

堅牢化の到達点は「サービスを増やすこと」ではありません。状態を失わずにHome Assistantを再構築でき、依存関係が既知の順序で復旧し、負荷の高い周辺サービスが制御プレーンを圧迫できず、更新に失敗しても家全体の原因不明の障害に発展する前に切り分けられるスタックです。

NAS&サーバー設定

もっと読む

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.