# 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` получатся: ```text 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. Проверьте записи с компьютера: ```powershell Resolve-DnsName dns2.chardwork.ru -Type A Resolve-DnsName node2.chardwork.ru -Type A ``` Или с Linux/VPS: ```bash getent ahostsv4 dns2.chardwork.ru getent ahostsv4 node2.chardwork.ru ``` Оба имени должны вернуть IP нового VPS. Распространение записей обычно занимает несколько минут, иногда дольше из-за DNS-кэша. ### Шаг 3. Запустите установщик Подключитесь к новому VPS по SSH и выполните: ```bash curl -fsSL https://git.chardb.ru/VPS/adguard-doh-installer/raw/branch/main/install.sh | sudo bash ``` На вопросы скрипта для приведённого примера ответьте: ```text DoH domain: dns2.chardwork.ru Admin domain: node2.chardwork.ru ``` Затем задайте пароль администратора. Пароль не попадает в историю shell. Если оставить его пустым, будет создан случайный пароль и показан один раз. Скрипт не входит в Beget и не создаёт DNS-записи сам: он только проверяет, что вы заранее направили оба имени на этот VPS. Это сделано намеренно, чтобы установщик не требовал API-ключ от аккаунта регистратора. Неинтерактивный запуск: ```bash 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 без внесения изменений: ```bash 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 и пароль сохраняются. Перед обновлением создаётся каталог: ```text /opt/stacks/adguard-doh/backups// ``` Чужой стек автоматически не усыновляется. Для совместимой установки можно явно указать: ```bash sudo bash install.sh --adopt-existing --stack-dir /opt/stacks/adguard-doh \ --doh-domain dns.example.com --admin-domain node.example.com ``` ## Удаление Остановить и удалить контейнеры и внутреннюю Docker-сеть этого стека: ```bash sudo bash install.sh --uninstall ``` Настройки, данные и резервные копии сохраняются в `/opt/stacks/adguard-doh`, поэтому установку можно восстановить. Общий Docker и другие стеки команда не затрагивает. Проверка DNS во время установки по-прежнему выполняется, но публичный IP VPS в сообщениях установщика не печатается. ## Проверка ```bash 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.