Web control panel and one-command installer for WDTT VPN server
  • Python 57.1%
  • JavaScript 16.6%
  • Shell 14%
  • HTML 6.8%
  • CSS 4.7%
  • Other 0.8%
Find a file
2026-10-02 18:58:22 +08:00
.github/workflows Report native systemd regression diagnostics 2026-10-02 18:53:41 +08:00
tests Use accessible fixture for sandboxed systemd client 2026-10-02 18:55:32 +08:00
wdtt_panel Release 0.13.0: fix administration, routing and server limits 2026-10-02 18:50:47 +08:00
.gitignore Add WDTT control panel and installer 2026-06-15 17:24:04 +08:00
bootstrap.sh Release 0.13.0: fix administration, routing and server limits 2026-10-02 18:50:47 +08:00
HANDOFF_LATEST.md Document verified 0.13.0 release handoff 2026-10-02 18:58:22 +08:00
install.sh Release 0.13.0: fix administration, routing and server limits 2026-10-02 18:50:47 +08:00
README.md Release 0.13.0: fix administration, routing and server limits 2026-10-02 18:50:47 +08:00
SECURITY.md Add WDTT control panel and installer 2026-06-15 17:24:04 +08:00
uninstall.sh Add interactive management and bulk users 2026-06-15 18:31:43 +08:00
update.sh Add interactive management and bulk users 2026-06-15 18:31:43 +08:00

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. При установке и обновлении она автоматически собирает совместимое расширение 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 и проверяет обновления каждые шесть часов. В этих файлах доступны, в частности, 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:

/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 и запускает сервис обратно. Обычно это занимает несколько секунд и разрывает текущие туннели.

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

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.

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

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

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

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:

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 года:

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

  • 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 и пароль панели в открытых каналах.

Проверка

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. После запуска панель проверяет, что главный пароль, пользователи и устройства не исчезли; при любой ошибке прежний бинарник и база возвращаются.