AlexChard f4d70011e8 Обновить install.sh
Add safe stack uninstall and redact public IP
2026-08-30 13:53:49 +04:00
2026-08-29 19:16:00 +04:00
2026-08-30 13:53:49 +04:00
2026-08-29 19:16:00 +04:00
2026-08-29 19:16:00 +04:00

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

  1. Узнайте публичный IPv4 нового VPS в панели хостинга или командой curl -4 https://api.ipify.org на самом VPS.
  2. Откройте Beget → Домены и поддомены → выберите нужный домен → DNS / Управление DNS-записями.
  3. Добавьте две записи типа 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

Безопасное поведение

Перед изменениями скрипт:

  1. проверяет синтаксис доменов;
  2. проверяет их A-записи и публичный IP VPS;
  3. обнаруживает уже работающий AdGuard Home;
  4. проверяет занятость TCP-портов 80, 443, 3000 и UDP-порта 443;
  5. отказывается захватывать чужой Nginx/Caddy/Apache;
  6. не принимает непустую чужую директорию без явного --adopt-existing;
  7. сохраняет резервные копии управляемых файлов при повторном запуске;
  8. сохраняет существующий AdGuardHome.yaml, пользователей, клиентов и правила при обновлении;
  9. проверяет 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

Проверка

sudo bash verify.sh

Ожидается:

  • админка: HTTP 302 или 200;
  • /dns-query без DNS-пакета: HTTP 400;
  • заглушка: HTTP 200;
  • порт 3000: только 127.0.0.1:3000.

Требования и ограничения

  • Debian/Ubuntu для автоматической установки Docker;
  • root/sudo;
  • свободные TCP 80, 443, 3000 и UDP 443;
  • домены с A-записями на VPS;
  • существующий reverse proxy намеренно не перенастраивается автоматически.

Если на VPS уже занят 80/443, установщик завершится до изменений. Это безопаснее автоматического удаления или перенастройки чужого сервиса.

Заглушка

Исходник находится в templates/cover/index.html. Установщик кладёт автономную копию в site/index.html. На /dns-query заглушка не влияет.

Лицензия

MIT.

S
Description
Idempotent AdGuard Home DoH + HTTPS admin installer for VPS
Readme MIT
65 KiB
Languages
Shell 92.5%
HTML 7.5%