自宅ネットワークのDNSサーバとしてAdGuardHomeを使っている場合、これが単一障害点になるとメンテナンスや障害時にネットワーク全体が機能停止します。adguardhome-sync を使えば、Origin(プライマリ)の設定をReplica(セカンダリ)に自動同期し、手軽に冗長化できます。本記事ではこの構成の考え方と具体的な設定を解説します。
AdGuardHomeは自宅ネットワークの全DNSクエリを処理する要です。これが落ちるとインターネットが実質使えなくなります。
冗長化が必要になる典型的なケース:
物理的に独立した2台のマシンでAdGuardHomeを動かすことで、これらのリスクに対処できます。
adguardhome-syncは Origin → Replica の一方向レプリケーション を行うツールです。Originで設定を変更すると、自動でReplicaに反映されます。
┌──────────┐ 設定同期 (1分毎) ┌──────────┐
│ Origin │◄───────────────│ Replica │
│ (Primary) │ adguardhome-sync │ (Secondary) │
└────┬─────┘ └────┬─────┘
│ DNS │ DNS
▼ ▼
┌──────────────────────────────────────┐
│ クライアント │
│ プライマリDNS: <OriginのIP> │
│ セカンダリDNS: <ReplicaのIP> │
└──────────────────────────────────────┘
重要なのは、設定だけを同期してDNSの実データ(クエリログや統計)はReplica側が独自に持つという点です。syncの役割はあくまで「どのフィルタを使うか」「どのDNSリライトを適用するか」といった設定情報のレプリケーションです。
Originは通常のAdGuardHomeをDockerで起動するだけです。特別な設定は不要です。
# compose.yml (Origin)
services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
volumes:
- ./data:/opt/adguardhome/work
- ./config:/opt/adguardhome/conf
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp" # Web UI + API(syncの接続先)
adguardhome-syncはOriginのWeb API(デフォルトではポート80)に HTTPリクエストを送って設定を取得します。そのため OriginのAPIにReplicaから疎通できること が唯一の前提条件になります。
Replica側ではAdGuardHome本体に加え、adguardhome-syncコンテナを起動します。
# compose.yml (Replica)
services:
adguardhome:
image: adguard/adguardhome:latest
container_name: adguardhome
restart: unless-stopped
volumes:
- ./data:/opt/adguardhome/work
- ./config:/opt/adguardhome/conf
ports:
- 53:53/tcp
- 53:53/udp
- 8081:80/tcp # Web UIをOriginと別ポートにしてもよい
adguardhome-sync:
image: ghcr.io/bakito/adguardhome-sync:latest
container_name: adguardhome-sync
restart: unless-stopped
environment:
- ORIGIN_URL=http://<OriginのIP>:80
- ORIGIN_USERNAME=${ORIGIN_USER}
- ORIGIN_PASSWORD=${ORIGIN_PASS}
- REPLICA_URL=http://adguardhome:80
- REPLICA_USERNAME=${REPLICA_USER}
- REPLICA_PASSWORD=${REPLICA_PASS}
- CRON=*/1 * * * *
- RUN_ON_START=true
- FEATURES_GENERAL=true
- FEATURES_FILTERS=true
- FEATURES_REWRITES=true
- FEATURES_CLIENTS=true
- FEATURES_STATS_CONFIG=true
depends_on:
- adguardhome
# .env
ORIGIN_USER=admin
ORIGIN_PASS=your-password
REPLICA_USER=admin
REPLICA_PASS=your-password
ORIGIN_URL と REPLICA_URL はそれぞれのAdGuardHome Web APIのエンドポイントです。同一ホストで動作させる場合はポートを分ける必要がありますが、別ホストであればデフォルトの80番で問題ありません。
bakito/adguardhome-sync はGo製のツールで、OriginのAdGuardHome API (/control/) から設定JSONを取得し、Replicaに書き込みます。双方向ではなく 一方向のレプリケーション であり、ReplicaからOriginに設定が逆流することはありません。
CRONのタイミングで以下を実行:
GET http://<Origin>/control/... ← Originから設定を取得
│
▼ 差分比較
│
PUT http://<Replica>/control/... ← Replicaに設定を反映
各FEATURES項目は独立したAPIコールとして処理されます。OriginへのGETに失敗しても、Replicaの既存設定は変更されず維持されます。つまり Originが落ちていてもReplicaは最終同期状態でDNSを継続します。
環境変数 FEATURES_* で同期する項目を制御します。
| 環境変数 | 同期する設定 |
|---|---|
FEATURES_GENERAL |
上流DNS、キャッシュ、レート制限、ログ設定 |
FEATURES_FILTERS |
ブロックリスト、ホワイトリスト、カスタムフィルタルール |
FEATURES_REWRITES |
DNSリライト(ローカルドメインの名前解決) |
FEATURES_CLIENTS |
クライアントごとの個別フィルタ・タグ設定 |
FEATURES_STATS_CONFIG |
統計・クエリログの保持期間 |
同期しないもの:
| 項目 | 理由 |
|---|---|
| クエリログの実データ | サイズが大きく、Replica側で独自に蓄積すればよい |
| 統計の実データ | 同上 |
| TLS証明書 | Replicaごとに異なる証明書が必要な場合がある |
| サービス設定(DHCP等) | 通常は単一ホストでのみ有効にすべき設定 |
| フィルタファイルの実体 | syncが同期するのは「どのフィルタを使うか」のみ。フィルタ本体は各AdGuardHomeが独自にダウンロードする |
*/1 * * * * で1分間隔がおすすめです。AdGuardHomeの設定変更頻度は高くないため、最長1分の遅延は実用上問題ありません。
より間隔を空けたい場合は */5 * * * *(5分)や 0 * * * *(毎時)でもよいですが、障害復旧時の起動直後だけは RUN_ON_START=true で即時同期されるので最低限の鮮度は保たれます。
双方向同期ではないため、Replica側で設定を変更しても次の同期でOriginの内容に上書きされます。運用ルールとして 「設定変更はOriginのWeb UIからだけ行う」 を徹底するだけで問題ありません。
FEATURES_* を個別に無効化することで、ホスト固有の設定を持たせられます。
# 例: Replica側だけログ保持期間を短くしたい場合
FEATURES_STATS_CONFIG=false
この状態でReplicaのWeb UIから個別に統計設定を変更すれば、その設定は上書きされず維持されます。
| 障害パターン | 影響 | 復旧 |
|---|---|---|
| Origin停止 | ReplicaがDNSを継続。syncはエラーになるが設定は維持 | Origin復旧後、次回cronで自動再開 |
| Replica停止 | OriginのみでDNS継続。単一障害点に戻る | Replica復旧後、RUN_ON_START で即時同期 |
| ネットワーク分断 | 両者が独立してDNS運用 | 分断解消後、syncが自動再開 |
| Originの設定破損 | Replicaには影響しない | Replicaの設定をOriginに手動復元する必要あり |
x86_64とARM(Raspberry Piなど)の混在環境では、Dockerイメージはマルチアーキテクチャ対応のものを使用します。adguard/adguardhome も bakito/adguardhome-sync も公式にマルチアーキテクチャ対応しているため、同じ compose.yml をそのまま使い回せます。
FEATURES_* 環境変数で同期する設定項目を柔軟に制御できます追加のハードウェアは1台だけでよく、クラウドVMやRaspberry Pi、余った古いPCなど手頃なマシンがあればすぐに導入できます。自宅のDNSを冗長化する第一歩としてぜひ試してみてください。