brainstate

lebrit/wdtt-control-panel · source

Snapshot 0 · 2026-11-04T12:47:28Z · Python ·

Content fingerprint80356627f61727429a2311d6ef7b63918f12bd1a64922b7c2715c8cef829b4f1

GitHub description at capture

Web control panel and one-command installer for WDTT VPN server

README at capture

# WDTT Control Panel

**Текущая версия: 0.13.0**

### Исправления 0.13.0

- Административные операции выполняет root-helper через локальный сокет systemd (0660, root:wdtt-panel). Web-служба сохраняет NoNewPrivileges и ProtectSystem=strict. Telegram, очистка и запись unit-файлов работают независимо от её ограничений.
- GeoFiles до 128 МиБ; Xray скачивает их потоково и сохраняет атомарно.
- Подсеть WG определяется по интерфейсу wdtt0; стандартная сеть qWDTT — 10.66.0.0/16. Старое значение 10.66.66.0/24 исправляется при загрузке настроек. После обновления сохраните настройки шлюза/каскада для применения исправленных правил.
- Кнопка «Сохранить срок journal» задаёт MaxRetentionSec для всех журналов systemd сервера. «Оценить» и «Очистить» остаются отдельными операциями.
- Установщик проверяет свободное место и inode до изменения файлов; для сборки WDTT требуется не менее 2 ГиБ.
- HTTP-запросы вне секретного пути получают 404, ACME и персональные ссылки продолжают работать.
- Расширение v10 поднимает предел паролей до 65023, по размеру адресного пула WDTT. Это не гарантия одновременных подключений: вместимость зависит от ресурсов сервера. Без успешно установленного расширения сохраняется предел 10; массовое создание ограничено 100 пользователями за запрос.
- Во вкладке Xray доступны создание, копирование и удаление VLESS + TLS профилей для sing-box и других VLESS-клиентов. Нужны установленный Xray, Managed-режим и доверенный сертификат панели. Внешний firewall провайдера должен разрешать выбранный TCP-порт (по умолчанию 8444).

Отдельная web-панель для [SpaceNeuroX/proxy-turn-vk-android](https://github.com/SpaceNeuroX/proxy-turn-vk-android). При установке и обновлении она автоматически собирает совместимое расширение WDTT с резервной копией прежнего бинарника; по умолчанию используется серверная часть релиза `v1.4.3` с совместимым TUN fallback для WireGuard и RAW. Метки Telegram, сроки, квоты и учёт трафика всех пользователей сохраняются при обновлении. Если сборка временно не удалась или проверка базы выявила потерю данных, прежний бинарник и база автоматически восстанавливаются.

## Возможности

- создание, изменение, деактивация и удаление WDTT-пользователей; расширение v10 увеличивает предел до 65023;
- авто-создание пользователя по одной метке: пароль генерируется, срок один календарный месяц, 35 ГиБ трафика, VK-хеш берется из библиотеки;
- календарные сроки и пресеты на 1, 2, 3, 6 и 12 месяцев, основной и дополнительный пакеты трафика, безопасное продление и повторная активация;
- персональная HTTPS-страница пользователя с остатком трафика, сроком и готовой подпиской qWDTT без раскрытия адреса административной панели;
- массовое создание пользователей с автоматическими паролями и назначением VK-хешей всем или по кругу;
- библиотека VK-хешей с импортом и экспортом JSON для переноса между серверами и панелями;
- срок действия, бессрочный доступ, до четырех VK-хешей и отдельные порты;
- просмотр привязанного устройства, внутреннего IP, подключения пользователя и администратора с мягким статусом недавней активности;
- накопительная статистика трафика пользователей для Android-клиента: текущий счётчик WDTT, сегодня и всё время с момента обновления панели;
- генерация совместимых `wdtt://` ссылок;
- dashboard: соединения, NAT, uptime, трафик, CPU, RAM, диск, пользователи и устройства;
- журнал `wdtt.service` с фильтрацией;
- полная диагностика журналов WDTT, Xray/WARP, каскада, панели, Nginx и установщика: выбор источника, до 5000 строк и выгрузка в файл;
- безопасная очистка журналов и системного мусора: журналы служб, systemd journal с хранением последних дней, кэш пакетов Ubuntu/Linux и failed-units без удаления пользователей, backup, сертификатов и настроек; недоступные read-only логи пропускаются без остановки всей очистки, а результат показывает сколько было, освобождено и осталось;
- start/stop/restart WDTT, состояние службы, IP forwarding и бинарника;
- автоматические резервные копии `passwords.json` перед каждым изменением;
- полные и пользовательские backup с загрузкой на компьютер, восстановлением, удалением и расписанием автоматических копий;
- восстановление резервной копии и журнал действий администратора;
- случайный URL панели вместо стандартного пути;
- автоматический HTTPS для домена и публичного IPv4;
- автоматическое продление Let's Encrypt и self-signed сертификатов;
- интерактивное меню установки, обновления, отката к сохранённым тегам GitHub, статуса, сертификатов и удаления;
- быстрые команды обновления и удаления из GitHub;
- отображение текущей и новой версии с обновлением прямо из web-панели;
- настройка Telegram-бота WDTT при установке и из web-панели: Bot Token, Admin ID, включение/отключение и тестовое сообщение;
- мобильный `/api/v1` для Android-клиента: password login, bearer-токены, обзор, пользователи, логи и сервисные действия;
- qWDTT-подписка `/api/v1/qwdtt/subscription` для экспорта профилей пользователей в совместимый HTTPS JSON;
- отдельный Xray Core с управляемой и полной Raw JSON-конфигурацией без изменения исходного WDTT;
- компактная настройка Xray без JSON: VLESS‑маршруты и правила открываются в отдельных окнах; есть редактирование, порядок приоритета и готовые наборы WARP для AI, видео, соцсетей и музыки;
- свёрнутый экспертный редактор входящих, нестандартных исходящих и JSON‑правил Xray с шаблонами VLESS, VMess, Trojan, Shadowsocks, SOCKS, HTTP и WireGuard;
- стандартные GeoIP/GeoSite и собственные GeoFiles из HTTPS-источников;
- ручное и автоматическое обновление GeoFiles через systemd-таймер;
- российские GeoFiles из `runetfreedom/russia-v2ray-rules-dat`: `geosite:ru-blocked` и `geoip:ru-blocked` для маршрутизации заблокированных в РФ ресурсов;
- автоматический Cloudflare WARP: установка `wgcf`, создание, перезапуск и пересоздание профиля с добавлением WireGuard-исходящего в Xray;
- прозрачный каскад RU → EU: трафик сети WDTT перехватывается Xray, а категории российских блокировок направляются в указанный EU-VLESS;
- установка на пустой сервер или поверх уже развернутого WDTT.

## GeoFiles, WARP и каскад RU → EU

По умолчанию панель получает `geoip.dat` и `geosite.dat` по HTTPS из [runetfreedom/russia-v2ray-rules-dat](https://github.com/runetfreedom/russia-v2ray-rules-dat) и проверяет обновления каждые шесть часов. В этих файлах доступны, в частности, `geoip:ru-blocked`, `geoip:ru-blocked-community`, `geoip:re-filter`, `geosite:ru-blocked`, `geosite:ru-blocked-all` и категории из domain-list-community. Для обычного каскада используйте `ru-blocked`: более широкий `ru-blocked-all` содержит сотни тысяч доменов и может давать лишнюю маршрутизацию.

Вкладка **Xray** позволяет установить `wgcf`, создать Cloudflare WARP-профиль и автоматически добавить исходящий `warp` в Managed-конфигурацию Xray. WARP использует встроенный userspace‑TUN Xray и не создаёт системный интерфейс или маршруты хоста. Кнопка **Пинг WARP** запускает изолированную временную проверку через этот профиль, показывает задержку, IP выхода и подтверждение Cloudflare `warp=on`; при ошибке TLS пробует альтернативный адрес Trace и HTTP-проверку. WARP остаётся обычным исходящим: его можно выбрать в правилах маршрутизации Xray.

На сервере, где WDTT уже расположен в нужной стране, включите **«Направлять трафик WDTT в Xray»**. Защищённый TPROXY-шлюз передаёт в Xray трафик заданной подсети WDTT, оставляя все сайты прямыми по умолчанию и применяя WARP/VLESS только к созданным правилам. Тогда журнал доменов и маршрутов показывает реальный домен и выбранный исходящий; журнал ошибок Xray помогает увидеть причину сбоя. Этот шлюз не включают одновременно с RU → EU каскадом: каскад использует свой шлюз.

Каскад RU → EU требует установленный и включённый Xray в Managed-режиме. Укажите VLESS-ссылку EU-сервера, проверьте определённую подсеть WDTT (стандартно `10.66.0.0/16`) и включите каскад. Панель загрузит GeoFiles, добавит защищённый TPROXY-маршрут и направит `geosite:ru-blocked`, `geoip:ru-blocked`, а также заданные вручную домены и IP/CIDR через EU-VLESS; весь остальной трафик, включая обычные российские сайты, остаётся прямым через RU-сервер. В каскад попадает только трафик из указанной подсети WDTT, а его внутренний порт закрывается для внешних подключений.

## Совместимость

Панель работает с форматом базы актуального WDTT:

```text
/etc/wdtt/passwords.json
/etc/wdtt/server.log
systemd: wdtt.service
binary: /usr/local/bin/wdtt-server
```

WDTT не предоставляет административный API и не перечитывает `passwords.json` на лету. Поэтому панель применяет изменения безопасной транзакцией: останавливает `wdtt.service`, создает backup, атомарно заменяет JSON и запускает сервис обратно. Обычно это занимает несколько секунд и разрывает текущие туннели.

## Быстрая установка

```bash
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-control-panel/main/bootstrap.sh | sudo bash
```

Откроется циклическое интерактивное меню установки, обновления, отката к сохранённым тегам GitHub, статуса, сертификатов и удаления. В мастере установки можно:

1. Указать домен, публичный IPv4 или включить автоматическое определение IPv4.
2. Задать логин, пароль, HTTPS-порт и секретный URL-путь.
3. Использовать уже установленный WDTT либо установить официальный WDTT на пустой сервер.
4. Получить Let's Encrypt сертификат или автоматически создать self-signed сертификат.
5. При желании сразу включить Telegram-бота WDTT через Bot Token и Admin ID.

Для автоматизации тот же скрипт принимает `install`, `update`, `rollback`, `status`, `renew-cert`, `change-password`, `uninstall` и параметры `--domain`, `--ip`, `--user`, `--password`, `--email`, `--https-port`, `--path`, `--wdtt`, `--wdtt-password`, `--telegram-token`, `--telegram-admin-id`, `--version`, `--non-interactive`.

Пример автоматической установки с доменом:

```bash
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-control-panel/main/bootstrap.sh | \
  sudo bash -s -- install --domain panel.example.com \
  --password 'Long-Random-Panel-Password' --non-interactive
```

Команды обслуживания:

```bash
sudo wdtt-panel
sudo wdtt-panel-status
sudo wdtt-panel-update
sudo wdtt-panel-uninstall
sudo bash /opt/wdtt-panel/install.sh renew-cert
sudo wdtt-panel change-password
sudo wdtt-panel rollback --version v0.10.3
```

Те же операции доступны через главное интерактивное меню. Обновление скачивает свежую версию с GitHub и сохраняет адрес, логин, пароль, случайный путь, сертификаты, аудит и резервные копии.

Одноразовые команды без установленного локального wrapper:

```bash
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-control-panel/main/update.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-control-panel/main/uninstall.sh | sudo bash
```

Удаление затрагивает только панель. WDTT, его пользователи и серверный бинарник не изменяются. Резервные копии остаются в `/var/lib/wdtt-panel-private/backups`.

## Сертификаты

- Для домена используется Certbot и HTTP-01; A/AAAA запись должна указывать на сервер, TCP 80 должен быть доступен.
- Перед запросом и продлением сертификата установщик автоматически открывает TCP 80 в UFW, firewalld или iptables. Если сертификат не получен, причина сохраняется в `/var/log/wdtt-panel-install.log`.
- Если другой virtual host перехватывает ACME webroot, установщик на время останавливает Nginx и повторяет запрос в standalone-режиме Certbot, затем запускает Nginx обратно.
- Для IPv4 используется Certbot 5.4+ и короткоживущий профиль Let's Encrypt.
- Проверка и продление сертификата выполняются systemd-таймером каждые 12 часов.
- Если публичный сертификат получить нельзя, установщик создает self-signed сертификат. Таймер повторно пытается получить доверенный сертификат, а self-signed автоматически заменяет до истечения срока.
- HSTS включается только после получения Let's Encrypt. При self-signed сертификате браузер показывает предупреждение, пока сертификат не добавлен в доверенные, но не закрепляет его для домена.

Let's Encrypt объявил публичную доступность IP-сертификатов 15 января 2026 года и поддержку в Certbot 5.4+ 11 марта 2026 года:

- https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability
- https://letsencrypt.org/2026/03/11/shorter-certs-certbot

## Безопасность

- web-процесс запускается от отдельного пользователя `wdtt-panel` и слушает только `127.0.0.1:8787`;
- Nginx публикует только случайный путь, остальные URL возвращают `404`;
- пароли панели хранятся как PBKDF2-HMAC-SHA256 с 600 000 итераций;
- cookie имеет `Secure`, `HttpOnly`, `SameSite=Strict`; изменяющие запросы защищены CSRF;
- root-доступ отделен в `/usr/local/sbin/wdtt-panel-admin`; sudo разрешает только этот helper без аргументов;
- helper принимает JSON через stdin и поддерживает только фиксированный список операций;
- каждое изменение базы предваряется резервной копией.

Путь не заменяет аутентификацию, но уменьшает шум автоматических сканеров. Не публикуйте URL и пароль панели в открытых каналах.

## Проверка

```bash
python3 -m unittest discover -s tests -v
python3 -m compileall -q wdtt_panel
bash -n bootstrap.sh install.sh update.sh uninstall.sh
```

## Ограничения исходного WDTT

- Исходный qWDTT ограничен 10 паролями; панель поднимает предел только вместе с успешно проверенным расширением v10.
- Счетчики пользователя находятся в памяти и записываются в JSON только при некоторых операциях самого WDTT. Панель показывает сохраненные значения; незаписанная часть может потеряться при перезапуске.
- Изменение главного пароля не реализовано: WDTT получает его из `ExecStart -password`, а затем переписывает значение в JSON при каждом старте. Для ротации главного пароля нужен осознанный повторный деплой или изменение unit-файла.
- При установке и обновлении панели совместимое серверное расширение WDTT собирается отдельно от Android-приложения. Перед заменой бинарника сохраняются текущий `wdtt-server` и `/etc/wdtt/passwords.json`. После запуска панель проверяет, что главный пароль, пользователи и устройства не исчезли; при любой ошибке прежний бинарник и база возвращаются.