LogoSaito Go's Blog
ホームキーワード検索プロフィール
LogoSaito Go's Blog

© 2026 Saito Go's Blog. All rights reserved.

ホームに戻る

AdGaurdHomeをadguardhome-syncで冗長化する

AdGuard HomeDNS
2026/08/09

自宅ネットワークのDNSサーバとしてAdGuardHomeを使っている場合、これが単一障害点になるとメンテナンスや障害時にネットワーク全体が機能停止します。adguardhome-sync を使えば、Origin(プライマリ)の設定をReplica(セカンダリ)に自動同期し、手軽に冗長化できます。本記事ではこの構成の考え方と具体的な設定を解説します。

なぜ冗長化するのか

AdGuardHomeは自宅ネットワークの全DNSクエリを処理する要です。これが落ちるとインターネットが実質使えなくなります。

冗長化が必要になる典型的なケース:

  • サーバメンテナンス: ホスト再起動やアップデート中にDNSが停止する
  • ハードウェア障害: マシンそのものの故障
  • 計画停電・UPS切れ: メイン機が落ちても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側の構成

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側の構成

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番で問題ありません。

adguardhome-syncの動作

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が独自にダウンロードする

CRONの設計

*/1 * * * * で1分間隔がおすすめです。AdGuardHomeの設定変更頻度は高くないため、最長1分の遅延は実用上問題ありません。

より間隔を空けたい場合は */5 * * * *(5分)や 0 * * * *(毎時)でもよいですが、障害復旧時の起動直後だけは RUN_ON_START=true で即時同期されるので最低限の鮮度は保たれます。

運用と注意点

設定変更は必ずOriginで行う

双方向同期ではないため、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 をそのまま使い回せます。

まとめ

  • AdGuardHomeを Origin + Replica の2台構成 で冗長化し、DNSの単一障害点を解消できます
  • adguardhome-sync で1分間隔の一方向レプリケーション。設定変更はOriginでのみ行います
  • FEATURES_* 環境変数で同期する設定項目を柔軟に制御できます
  • Origin障害時もReplicaが最終同期状態でDNSを継続し、計画メンテナンスも安全に実施できます
  • クエリログや統計の実データは同期しません。フィルタ本体は各ノードが独立してダウンロードします

追加のハードウェアは1台だけでよく、クラウドVMやRaspberry Pi、余った古いPCなど手頃なマシンがあればすぐに導入できます。自宅のDNSを冗長化する第一歩としてぜひ試してみてください。

Saito Go

Saito Go

Blog Owner

大手製造業の現場で働きながら趣味でWeb系エンジニアやってます。

当サイトはアフィリエイト広告を使用しています。

目次

なぜ冗長化するのか構成の概要Origin側の構成Replica側の構成adguardhome-syncの動作同期の仕組み同期対象と非同期対象CRONの設計運用と注意点設定変更は必ずOriginで行う同期しない項目の活用障害時の挙動異なるアーキテクチャ間での注意まとめ