- JavaScript 89.2%
- CSS 7.6%
- HTML 1.7%
- Shell 1.5%
| frontend | ||
| .gitignore | ||
| deploy.sh | ||
| README.md | ||
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;
}
Лицензии и авторы
- Фронт (этот репозиторий): MIT.
- Ядро qWDTT: GNU GPL v3, SpaceNeuroX (https://github.com/SpaceNeuroX/proxy-turn-vk-android).
- Панель WDTT-SERVER: форк EtoNeYa/a9fm, панель — форк lebrit/wdtt-control-panel.