AdGuard DoH Installer
Безопасный повторяемый установщик AdGuard Home + Caddy для VPS.
Он разворачивает:
- публичный DNS-over-HTTPS на
https://dns.example.com/dns-query; - отдельную HTTPS-панель на нейтральном домене вроде
https://node.example.com; - нейтральную статическую заглушку на корне DoH-домена;
- автоматические сертификаты Let's Encrypt;
- Cloudflare и Google DoH как основные upstream, несколько обычных DNS только как bootstrap/fallback;
- Docker Compose-стек с лимитами памяти и автоматическим перезапуском.
Прямой порт AdGuard 3000 публикуется только на 127.0.0.1. Установщик не меняет VPN, маршруты, UFW/iptables и SSH.
Быстрая установка
Шаг 1. Придумайте два поддомена
Нужны не два новых платных домена, а два бесплатных поддомена внутри уже приобретённого домена:
dns— адрес, который затем указывается в роутере как DoH;node— HTTPS-адрес панели управления AdGuard Home.
Например, для домена chardwork.ru получатся:
https://dns.chardwork.ru/dns-query — адрес DNS-over-HTTPS
https://node.chardwork.ru — панель управления
Имена можно выбрать другие, например resolver и control. Они должны быть
разными.
dns.chardwork.ruиnode.chardwork.ruуже используются действующим сервером. Для проверки установщика на другом VPS используйте, например,dns2.chardwork.ruиnode2.chardwork.ru. Одно имя нельзя одновременно направить на два разных VPS обычной A-записью.
Шаг 2. Создайте записи в Beget
- Узнайте публичный IPv4 нового VPS в панели хостинга или командой
curl -4 https://api.ipify.orgна самом VPS. - Откройте Beget → Домены и поддомены → выберите нужный домен → DNS / Управление DNS-записями.
- Добавьте две записи типа
A. Для тестового VPS с адресом203.0.113.10заполнение выглядит так:
| Тип | Имя/хост в форме Beget | Значение/IP | TTL |
|---|---|---|---|
A |
dns2 |
203.0.113.10 |
300 или по умолчанию |
A |
node2 |
203.0.113.10 |
300 или по умолчанию |
В поле имени обычно вводится только dns2 или node2: Beget сам добавляет
.chardwork.ru. Если интерфейс показывает поле полного имени, укажите
dns2.chardwork.ru и node2.chardwork.ru.
Не создавайте CNAME и не добавляйте http://, https://, порт или путь
/dns-query в DNS-запись. Там должны быть только имя и IPv4.
Проверьте записи с компьютера:
Resolve-DnsName dns2.chardwork.ru -Type A
Resolve-DnsName node2.chardwork.ru -Type A
Или с Linux/VPS:
getent ahostsv4 dns2.chardwork.ru
getent ahostsv4 node2.chardwork.ru
Оба имени должны вернуть IP нового VPS. Распространение записей обычно занимает несколько минут, иногда дольше из-за DNS-кэша.
Шаг 3. Запустите установщик
Подключитесь к новому VPS по SSH и выполните:
curl -fsSL https://git.chardb.ru/VPS/adguard-doh-installer/raw/branch/main/install.sh | sudo bash
На вопросы скрипта для приведённого примера ответьте:
DoH domain: dns2.chardwork.ru
Admin domain: node2.chardwork.ru
Затем задайте пароль администратора. Пароль не попадает в историю shell. Если оставить его пустым, будет создан случайный пароль и показан один раз.
Скрипт не входит в Beget и не создаёт DNS-записи сам: он только проверяет, что вы заранее направили оба имени на этот VPS. Это сделано намеренно, чтобы установщик не требовал API-ключ от аккаунта регистратора.
Неинтерактивный запуск:
curl -fsSL https://git.chardb.ru/VPS/adguard-doh-installer/raw/branch/main/install.sh | \
sudo bash -s -- --doh-domain dns2.chardwork.ru --admin-domain node2.chardwork.ru
Безопасное поведение
Перед изменениями скрипт:
- проверяет синтаксис доменов;
- проверяет их A-записи и публичный IP VPS;
- обнаруживает уже работающий AdGuard Home;
- проверяет занятость TCP-портов
80,443,3000и UDP-порта443; - отказывается захватывать чужой Nginx/Caddy/Apache;
- не принимает непустую чужую директорию без явного
--adopt-existing; - сохраняет резервные копии управляемых файлов при повторном запуске;
- сохраняет существующий
AdGuardHome.yaml, пользователей, клиентов и правила при обновлении; - проверяет Compose до запуска и HTTPS после запуска.
Проверить новый VPS без внесения изменений:
curl -fsSL https://git.chardb.ru/VPS/adguard-doh-installer/raw/branch/main/install.sh | \
sudo bash -s -- --check --doh-domain dns.example.com --admin-domain node.example.com
Если DNS-записи ещё распространяются, можно установить с --allow-dns-mismatch. Caddy будет повторять выпуск сертификата автоматически.
Повторный запуск и обновление
Повторите ту же команду. Для стека, созданного этим установщиком, данные AdGuard и пароль сохраняются. Перед обновлением создаётся каталог:
/opt/stacks/adguard-doh/backups/<UTC_TIMESTAMP>/
Чужой стек автоматически не усыновляется. Для совместимой установки можно явно указать:
sudo bash install.sh --adopt-existing --stack-dir /opt/stacks/adguard-doh \
--doh-domain dns.example.com --admin-domain node.example.com
Удаление
Остановить и удалить контейнеры и внутреннюю Docker-сеть этого стека:
sudo bash install.sh --uninstall
Настройки, данные и резервные копии сохраняются в /opt/stacks/adguard-doh, поэтому установку можно восстановить. Общий Docker и другие стеки команда не затрагивает.
Проверка DNS во время установки по-прежнему выполняется, но публичный IP VPS в сообщениях установщика не печатается.
Проверка
sudo bash verify.sh
Ожидается:
- админка: HTTP
302или200; /dns-queryбез DNS-пакета: HTTP400;- заглушка: HTTP
200; - порт
3000: только127.0.0.1:3000.
Требования и ограничения
- Debian/Ubuntu для автоматической установки Docker;
- root/sudo;
- свободные TCP
80,443,3000и UDP443; - домены с A-записями на VPS;
- существующий reverse proxy намеренно не перенастраивается автоматически.
Если на VPS уже занят 80/443, установщик завершится до изменений. Это безопаснее автоматического удаления или перенастройки чужого сервиса.
Заглушка
Исходник находится в templates/cover/index.html. Установщик кладёт автономную копию в site/index.html. На /dns-query заглушка не влияет.
Лицензия
MIT.