Files
AlexChard c9bcae1af4 Обновить README.md
Document safe AdGuard DoH uninstall
2026-08-30 13:53:51 +04:00

188 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/<UTC_TIMESTAMP>/
```
Чужой стек автоматически не усыновляется. Для совместимой установки можно явно указать:
```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.