176 lines
8.4 KiB
Markdown
176 lines
8.4 KiB
Markdown
# 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
|
||
```
|
||
|
||
## Проверка
|
||
|
||
```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.
|