AdGuard Home в Docker Compose: готовый файл
Pi-hole долго был дефолтным выбором для блокировки рекламы на уровне DNS, но у него есть ограничения: шифрование апстрим-запросов (DoH/DoT) требует отдельного cloudflared или stubby сбоку, а правила фильтрации не всегда гибкие. AdGuard Home решает обе проблемы из коробки — и разворачивается на VPS через Docker Compose за пять минут, если под рукой есть рабочий файл. Ниже — конфигурация, которую можно скопировать и запустить, плюс разбор настроек, которые обычно упускают в первый день.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Чем AdGuard Home отличается от Pi-hole
Формально обе системы делают одно и то же: перехватывают DNS-запросы, сверяют домен со списками блокировки и либо резолвят его как обычно, либо возвращают 0.0.0.0 / NXDOMAIN. Разница — в деталях реализации.
| Pi-hole | AdGuard Home | |
|---|---|---|
| DNS-over-HTTPS / DNS-over-TLS клиент к апстриму | нет, нужен cloudflared отдельным контейнером | встроен |
| DNS-over-HTTPS / DoT / DoQ сервер для клиентов | нет из коробки | встроен |
| Веб-интерфейс | php-based, легче по ресурсам | Go-бинарник, чуть тяжелее, но быстрее откликается |
| Регулярные выражения в правилах | ограниченно | полноценные regex-фильтры |
| Родительский контроль / категории | плагины | встроено (safe search, блокировка по категориям) |
| Клиентские профили (разные правила для разных устройств) | через группы | через клиентов с тегами |
Если вам нужен именно минимальный блокировщик рекламы и не критично шифрование до апстрима — Pi-hole по-прежнему рабочий вариант, у нас есть отдельная статья про установку Pi-hole на VPS. Но если хочется закрыть DNS-запросы от провайдера шифрованием и не городить второй контейнер — AdGuard Home закрывает это одной сущностью.
Готовый docker-compose.yml
Структура каталогов на сервере:
/opt/adguardhome/
├── work/ # база данных, статистика, логи
├── conf/ # конфигурация, списки фильтров
└── docker-compose.yml
Создаём каталоги и файл:
mkdir -p /opt/adguardhome/{work,conf}
cd /opt/adguardhome
nano docker-compose.yml
Сам файл:
services:
adguardhome:
image: adguard/adguardhome:latest
container_name: adguardhome
restart: unless-stopped
volumes:
- ./work:/opt/adguardhome/work
- ./conf:/opt/adguardhome/conf
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp" # DHCP, если планируете использовать
- "68:68/tcp"
- "68:68/udp"
- "80:80/tcp" # веб-интерфейс без TLS (можно закрыть позже)
- "443:443/tcp" # HTTPS-интерфейс / DoH
- "443:443/udp" # DoQ (DNS-over-QUIC)
- "853:853/tcp" # DNS-over-TLS
- "3000:3000/tcp" # первичная настройка (порт установки)
cap_add:
- NET_ADMIN
Пара нюансов, которые ломают запуск на свежем сервере:
- Порт 53 почти наверняка занят
systemd-resolved. Проверьте:sudo ss -tulpn | grep :53. Если занят — либо отключитеsystemd-resolved(sudo systemctl disable --now systemd-resolved, затем прописатьnameserver 127.0.0.1в/etc/resolv.confвручную или черезresolvconf), либо оставьте только Docker-порты 53 и настройте резолвинг самой ОС через другой путь. - Порты 80/443 конфликтуют, если на сервере уже висит Caddy или nginx как реверс-прокси для других сервисов. В этом случае веб-интерфейс AdGuard Home лучше пробросить на нестандартный порт, например
8080:80, и не открывать наружу вовсе — только через WireGuard-туннель. cap_add: NET_ADMINнужен для корректной работы DHCP-функций; если DHCP не нужен, эту строку и связанные порты 67/68 можно убрать.
Запуск:
docker compose up -d
Первичная настройка идёт через порт 3000: http://<IP-сервера>:3000. После завершения мастера установки AdGuard Home сам переключается на порты 80/443 и порт 3000 больше не слушает — это ожидаемое поведение, а не баг.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНастройка после первого запуска
Мастер установки спросит:
- Интерфейс для веб-панели и DNS-сервера — оставляйте
0.0.0.0, чтобы слушать все интерфейсы контейнера. - Логин и пароль администратора — задайте сразу сложный пароль, интерфейс без дополнительной защиты будет виден на 80/443.
- DNS upstream по умолчанию — здесь стоит сразу заменить дефолтные серверы на DoH/DoT (см. следующий раздел), а не оставлять обычный UDP на 53.
После установки первым делом идите в Настройки → DNS-серверы и проверьте раздел Access Settings: по умолчанию AdGuard Home слушает на всех интерфейсах без ограничения по IP. Если сервер смотрит в интернет напрямую, а не только в приватную сеть, ограничьте Allowed clients подсетью вашего VPN — иначе сервер превращается в открытый DNS-резолвер, которым может воспользоваться кто угодно (классический вектор для DNS-амплификации).
Если DNS должен обслуживать не только локальную сеть, а устройства, подключённые через VPN, посмотрите статью про настройку WireGuard на Ubuntu 24.04 — связка WireGuard + AdGuard Home как единый DNS для всех устройств в туннеле работает без дополнительных костылей: просто укажите IP контейнера как DNS в конфиге клиента.
DNS-over-HTTPS и DNS-over-TLS: включаем шифрование апстрима
Главное преимущество AdGuard Home перед связкой Pi-hole + cloudflared — упростить именно эту часть. В разделе Настройки → DNS-серверы → Upstream DNS servers можно сразу указать зашифрованные апстримы вместо обычного plaintext DNS:
# DNS-over-HTTPS
https://dns.cloudflare.com/dns-query
https://dns.google/dns-query
# DNS-over-TLS
tls://1.1.1.1
tls://8.8.8.8
# DNS-over-QUIC
quic://dns.adguard-dns.com:853
AdGuard Home сам определяет протокол по префиксу URL — никаких дополнительных контейнеров не нужно. Это закрывает канал между сервером и апстрим-резолвером от простого перехвата на сетевом уровне (провайдер, промежуточный роутер), хотя сам факт того, что вы обращаетесь к конкретному DoH-серверу, всё ещё виден по SNI, если не используется дополнительное шифрование транспорта.
Отдельно включите DNS-over-HTTPS для клиентов (не путать с апстримом) в разделе Encryption Settings, если хотите, чтобы устройства сами подключались к вашему AdGuard Home по HTTPS, а не обычным DNS-портом 53 — это защищает от подмены DNS на уровне локальной сети или Wi-Fi точки. Для этого нужен валидный TLS-сертификат на домен, который смотрит на ваш сервер; проще всего выпустить его через Caddy с автоматическим SSL или Let's Encrypt и указать пути к сертификату и ключу прямо в настройках AdGuard Home.
Гибкие правила фильтрации: списки, регулярки, клиенты
Список фильтров задаётся в разделе Фильтры → Списки DNS-блокировок. Из коробки включён AdGuard DNS filter, но полезно добавить ещё несколько:
https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt # AdGuard Base
https://adguardteam.github.io/HostlistsRegistry/assets/filter_2.txt # AdAway
https://adguardteam.github.io/HostlistsRegistry/assets/filter_59.txt # Anti-tracking
Собственные правила пишутся в разделе Кастомные правила фильтрации. Синтаксис совместим с форматом uBlock Origin/AdBlock Plus и поддерживает regex:
||doubleclick.net^
||*.ads.example.com^
/^banner[0-9]+\.example\.net$/
@@||analytics.example.com^$important # разрешить конкретный домен вопреки блокировкам выше
Отличие от Pi-hole здесь принципиальное: Pi-hole в базовой конфигурации работает по точному совпадению домена или wildcard через отдельный список regex.list, а в AdGuard Home regex-правила — часть общего синтаксиса фильтров без переключения между режимами.
Клиентские профили (Клиенты → Добавить клиента) позволяют выдавать разные наборы правил разным устройствам по IP или MAC-адресу — например, отключить блокировку соцсетей для рабочего ноутбука, но оставить жёсткую фильтрацию для остальной сети. Это удобно, если на одном сервере DNS обслуживает и домашнюю сеть через VPN, и тестовый стенд, где фильтры мешают.
Резервное копирование и обновление
Вся конфигурация и статистика лежат в примонтированных каталогах ./work и ./conf — контейнер можно пересоздавать без потери данных, если volumes не трогать. Для бэкапа достаточно архивировать оба каталога:
cd /opt/adguardhome
tar czf adguardhome-backup-$(date +%F).tar.gz work conf
Если на сервере уже используется контейнерное бэкап-решение, конфигурацию AdGuard Home можно включить в общий пайплайн — например, через restic в Docker Compose, направив его на тот же каталог /opt/adguardhome.
Обновление образа — стандартная процедура для Compose:
docker compose pull
docker compose up -d
Перед крупным обновлением (смена мажорной версии) стоит проверить changelog на GitHub-репозитории проекта — AdGuard Home развивается активно, и изредка меняется формат конфигурационного файла AdGuardHome.yaml; сам он при обновлении обычно мигрируется автоматически, но резервная копия перед апдейтом дешевле, чем разбор проблем после.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
AdGuard Home можно поставить рядом с Pi-hole на одном сервере?
Технически да, если развести порты (53 занять сможет только один сервис одновременно), но практического смысла мало — это дублирующие друг друга инструменты. Выбирайте один.
Нужен ли отдельный сервер для AdGuard Home, или хватит ресурсов на общем VPS с другими сервисами?
Сам сервис лёгкий — 512 МБ RAM и 1 vCPU достаточно с запасом даже при паре тысяч запросов в час; можно держать в одном Docker Compose стеке с другими контейнерами.
Работает ли DHCP-функция AdGuard Home внутри Docker, или нужен network_mode: host?
С обычным bridge-сетевым режимом и cap_add: NET_ADMIN из примера выше DHCP обычно работает, но на некоторых конфигурациях сети надёжнее переключить сервис на network_mode: host, если DHCP не отвечает клиентам — тогда порты в docker-compose.yml указывать не нужно, они и так все проброшены.
Что делать, если после запуска AdGuard Home перестал резолвиться сам сервер (например, apt перестал видеть репозитории)?
Скорее всего, DNS сервера не переключены на 127.0.0.1 или IP контейнера в /etc/resolv.conf /systemd-resolved, а порт 53 при этом уже занят Docker — проверьте sudo ss -tulpn | grep :53 и убедитесь, что резолвер ОС смотрит именно на AdGuard Home.
Можно ли ограничить доступ к веб-панели по IP?
Да, через Access Settings → Allowed clients для DNS-запросов и через реверс-прокси (Caddy/nginx) с ограничением по IP или базовой аутентификацией — для самой веб-панели.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →