Текущая версия: 0.2.5
Центральная web-панель для нескольких самостоятельных WDTT Control Panel. Она показывает узлы и пользователей из последних снимков, ставит строго ограниченные команды в очередь и получает результаты от исходящих агентов на узлах.
Панель управляет пользовательской частью WDTT/WireGuard: пользователями, их метками, устройствами, сроками доступа, трафиком и состоянием online.
- русскоязычная web-панель: обзор, узлы, пользователи и журнал команд;
- одноразовые гранты регистрации, временные учётные данные агента, ротация и мгновенный отзыв;
- версия протокола, heartbeat и
last_seen; - типизированные команды
user.create,user.update,user.delete,user.read,node.snapshot.readдля реальной модели WDTT: пароль, VK-хеши, порты, метка, срок и доступ; - снимки пользователей: метки, устройства, срок, трафик и online по данным агента;
- статусы выполнения команд и идемпотентность;
- атомарное JSON-хранилище состояния с правами
0600для первой установки; - публичные HTTPS-точки Nginx: случайный URL с Basic Auth для оператора и отдельный случайный URL только для исходящих агентов.
Поддерживаются Debian/Ubuntu и Fedora/RHEL-подобные системы. Команда открывает интерактивное меню установки, аналогичное WDTT Control Panel. Меню и все вопросы читаются непосредственно из терминала, поэтому команда корректно работает и при запуске через curl | sudo bash:
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-fleet-manager/main/bootstrap.sh | sudo bashУстановщик спросит домен или публичный IPv4, логин и пароль панели, HTTPS-порт (по умолчанию 8444) и сам создаст случайный URL. Он устанавливает Nginx, Node.js 22, systemd-сервис и пытается выпустить сертификат Let's Encrypt. Если публичный сертификат временно недоступен, создаётся self-signed сертификат.
Панель открывается извне по адресу, который покажет установщик: https://ваш-хост:8444/случайный-путь/. Сам процесс Node.js остаётся внутренним за Nginx; это не ограничивает внешний доступ, а не даёт обойти HTTPS и аутентификацию.
Неинтерактивный пример:
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-fleet-manager/main/bootstrap.sh | \
sudo bash -s -- install --domain fleet.example.com --user admin \
--password 'Длинный-Случайный-Пароль' --non-interactiveДля Let's Encrypt у домена должна быть A/AAAA-запись на сервер, а TCP-порт 80 — доступен из интернета. Установщик открывает порты 80 и HTTPS-порт, когда обнаруживает активный UFW или firewalld.
После установки доступно циклическое меню:
sudo wdtt-fleetВ нём есть только относящиеся к Fleet Manager действия:
- обновление из GitHub;
- откат к сохранённому GitHub-тегу;
- состояние и перезапуск сервиса;
- журнал systemd;
- сведения и обновление TLS-сертификата;
- смена пароля web-панели и случайного URL;
- удаление только Fleet Manager.
Удобные команды:
sudo wdtt-fleet-status
sudo wdtt-fleet-update
sudo wdtt-fleet-uninstall
sudo bash /opt/wdtt-fleet-manager/install.sh rollback --version v0.1.0Обновление и удаление также можно запустить без локального wrapper:
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-fleet-manager/main/update.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/lebrit/wdtt-fleet-manager/main/uninstall.sh | sudo bashУстановщик не устанавливает, не обновляет и не меняет WDTT, Xray, WARP, WireGuard или их конфигурацию. Это граница безопасности проекта, а не недостающая функция.
- Войдите в web-панель по выданному адресу.
- В разделе Узлы скопируйте постоянный адрес агента из карточки «Подключение WDTT Control Panel», затем создайте одноразовый грант. Передайте оба значения по защищённому каналу в
wdtt-control-panelверсии0.10.12или новее. - Агент регистрируется с публичным fingerprint, отправляет heartbeat и снимки пользователей, затем забирает только адресованные ему команды.
- В разделах Пользователи и Команды отображаются последние снимки и результат выполнения.
Совместимый исходящий агент встроен в wdtt-control-panel начиная с версии 0.10.12. На узле откройте вкладку Fleet, вставьте адрес агента и одноразовый грант из раздела Узлы, затем включите агент. Новый агент подключится сам: входящие административные порты на узле не нужны.
- Nginx публикует только два случайных пути: защищённый Basic Auth путь оператора и отдельный путь протокола агентов. Все остальные пути получают
404. - Внутренний процесс доверяет заголовку оператора лишь на
127.0.0.1за конфигурацией Nginx, которую создаёт установщик. Не публикуйте его порт напрямую. - Пароль хранится только как bcrypt-хеш Nginx в
/etc/nginx/wdtt-fleet-manager.htpasswd; конфигурация панели остаётся закрыта от web-процесса. Состояние содержит хеши временных токенов агентов, а не их исходные значения. - JSON-хранилище — практичный старт для одного центра, но не замена PostgreSQL, журналу аудита и резервному копированию в production.
- Агентская аутентификация использует одноразовый грант и временный узловой Bearer-токен. mTLS остаётся рекомендуемым следующим уровнем защиты для развёртываний с повышенными требованиями.
Подробнее: архитектура и контракт интеграции WDTT.
Нужен Node.js 22 или новее:
npm test
npm run checkСценарии установки проверяются в Linux:
bash -n bootstrap.sh install.sh update.sh uninstall.sh