No description
  • JavaScript 89.2%
  • CSS 7.6%
  • HTML 1.7%
  • Shell 1.5%
Find a file
2026-10-07 18:24:49 +05:00
frontend Creds result screen with full passwords+qwdtt links, per-user exits, gateway default 2026-10-07 18:24:49 +05:00
.gitignore qwdtt-panel: React frontend (dark), deploy script, docs 2026-10-07 15:54:17 +05:00
deploy.sh UI: strict pin, groups, bulk add, anytls/tuic, confirms, layout; local deploy; README 2026-10-07 17:36:21 +05:00
README.md UI: strict pin, groups, bulk add, anytls/tuic, confirms, layout; local deploy; README 2026-10-07 17:36:21 +05:00

qwdtt-panel

Веб-панель управления VPN-сервером qWDTT/WDTT: пользователи, выходы, маршруты, журналы, система.

Основано на WDTT-SERVER — https://rpi4b.tailb2d7b7.ts.net/EtoNeYa/WDTT-SERVER (монолитный форк qWDTT + панель; ядро — SpaceNeuroX/proxy-turn-vk-android, панель — форк lebrit/wdtt-control-panel). Бэкенд панели не тронут — переписан только веб-интерфейс: React + Tailwind, тёмная спокойная тема.

Возможности

  • Обзор — состояние сервиса, метрики CPU/RAM/диск, график активности 24ч, диагностика, сертификат
  • Пользователи — CRUD, поиск/сортировка, массовые действия, продление, трафик, копирование qwdtt:// ссылок, выбор выхода в интернет и жёсткий пин прямо в строке
  • Выходы — ключи-ссылки (vless/vmess/trojan/ss/hy2/tuic/socks/http/anytls, можно пачкой), WARP conf, AmneziaWG conf, группы выходов, шлюз WDTT→выходы, RAW-порт ядра, маршруты по юзерам с авто-фейловером
  • Журналы — все службы, фильтры, скачивание
  • Система — сервис, очистка, автоочистка, Telegram-бот, сертификат, обновления, бэкапы, аудит

Как это устроено

Бэкенд панели отдаёт только два статических файла — static/app.js и static/app.css. Сборка Vite настроена ровно под них (vite.config.js), поэтому деплой — это замена двух файлов и рестарт wdtt-panel. Шаблон index.html и API менять не надо: BASE-путь и CSRF читаются из <meta>-тегов.

frontend/
  vite.config.js   — сборка строго в app.js + app.css (бэкенд отдаёт только эти 2 имени!)
  index.html       — только для `npm run dev`
  login.html       — шаблон страницы входа (кладётся в templates/login.html на сервере)
  src/api.js       — cookie-сессия + CSRF, envelope {ok,result}
  src/components.jsx — Modal (нативный <dialog>), кнопки, графики SVG
  src/pages/       — Dashboard, Users, Warp, Logs, System
  harness.mjs      — headless-тест рендера диалогов
deploy.sh          — сборка + заливка поверх панели

Разработка

cd frontend
npm install
npm run dev        # dev-сервер на :5174; /api проксируй на свою панель
npm run build      # dist/app.js + dist/app.css
npm run test-render # headless-проверка диалогов (ловит краши рендера)

Деплой

Репозиторий можно держать где угодно — хоть на том же сервере, хоть на своём компе:

# репозиторий лежит на сервере с панелью:
./deploy.sh

# репозиторий на своём компе, панель на сервере:
./deploy.sh user@server

Скрипт собирает фронт, бэкапит текущие app.js/app.css в /root/wdtt-react-backup/, кладёт новые в статику панели и рестартует wdtt-panel. Для удалённого деплоя нужен SSH-доступ с ключом.

Откат:

cp /root/wdtt-react-backup/app.js.<дата> /opt/wdtt-panel/wdtt_panel/static/app.js
systemctl restart wdtt-panel

Шаблон страницы входа (frontend/login.html) деплоится отдельно:

cp frontend/login.html /opt/wdtt-panel/wdtt_panel/templates/login.html
systemctl restart wdtt-panel

Важно:

  • Обновление панели штатным panel.update (git reset --hard) сотрёт кастомный фронт и шаблон логина — после обновления прогнать деплой заново.
  • Панель слушает 127.0.0.1:8787, наружу — через nginx. Пути и порты — из установки WDTT-SERVER.

Связанные компоненты (ставятся отдельно, в репозиторий не входят)

  • sb-sidecar — менеджер sing-box (выходы, шлюз, RAW-порт, группы). Живёт в /opt/singbox, API — /sb/ через nginx (нужен location-proxy, см. ниже).
location ^~ /sb/ {
    proxy_pass http://127.0.0.1:8899;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_read_timeout 30s;
}

Лицензии и авторы