DEV Community

Cover image for Лёгкая панель для управления личным VPN-сервером на Xray
Dmitry
Dmitry

Posted on

Лёгкая панель для управления личным VPN-сервером на Xray

У большинства self-hosted VPN-панелей одна и та же боль: Docker-стек, внешняя БД, реверс-прокси и куча конфигов, которые надо связать между собой, прежде чем хоть что-то заработает. Мне хотелось наоборот — что-то, что можно закинуть на свежий VPS и поднять меньше чем за минуту.

Так появилась РосПанель: self-hosted панель для администрирования личного VPN-сервера на Xray-core, который поставляется одним статическим бинарником. React-фронтенд вшит через go:embed, база — встроенный SQLite, отдельного веб-сервера нет. Поставил, открыл, добавил юзера.

Главная идея: один бинарник, ничего лишнего

Цель, которая определила всё остальное, — радикальная простота. В отличие от Marzban и 3x-ui, у РосПанели нет Docker-обвязки, нет внешней БД и нет отдельного веб-сервера, который надо настраивать.

Всё живёт в одном исполняемом файле:

  • Веб-интерфейс собирается в web/dist и вшивается в Go-бинарник на этапе сборки.
  • Состояние хранится в SQLite (чистый Go-драйвер modernc, то есть без CGO).
  • Конфиг Xray всегда генерируется из базы и применяется супервизором — SQLite это единственный источник правды, а не JSON, который правят руками. В итоге деплой — это просто положить бинарник и systemd-юнит. Никакой оркестрации, ничего не надо держать в синхроне.

Что она на самом деле делает

РосПанель — это панель управления (control plane), а не VPN-клиент. Она настраивает и обслуживает ваш собственный сервер: генерирует конфиг Xray, выдаёт ссылки на подписки и показывает статистику.

Протоколы из коробки — один конфиг Xray, один набор учёток:

  • VLESS-Vision (TCP/443 + uTLS-fingerprint)
  • Trojan-WS (через fallback на 443)
  • Hysteria2 (UDP с port-hopping)
  • VLESS-gRPC-REALITY (отдельный порт, маскировка под чужой TLS) Маскировка — панель спрятана за секретным путём. Любой другой путь отдаёт сайт-заглушку (11 готовых шаблонов), так что сервер неотличим от обычного хостинга. Без знания /<secret>/ форму логина не найти.

TLS, который просто работает — ACME через Let's Encrypt или ZeroSSL, авто-продление и self-signed fallback, пока не выпустится настоящий сертификат.

Маршрутизация и выходы — категории block / direct / proxy / WARP / Opera с настраиваемым приоритетом, geosite/geoip-пресеты с авто-загрузкой баз, Cloudflare WARP (WireGuard) как выход по правилам, Opera VPN как бесплатный региональный выход и пул прокси с health-check через Observatory.

Пользователи и статистика — лимиты трафика и срок действия с авто-отключением, авто-сброс по дням/неделям/месяцам/годам, учёт трафика через Xray Stats API, онлайн-статус и дашборд в реальном времени (CPU / RAM / swap / диск / сеть / VPN-трафик / аптайм).

Подписки — base64-список плюс страница с QR-кодами, deep-links и кнопками импорта в популярные клиенты.

Эксплуатация — бэкап/восстановление и сброс к заводским настройкам из дашборда и из CLI, логи приложения с ротацией и просмотрщиком прямо в панели, брутфорс-защита (бан по iptables за перебор на SOCKS/HTTP-инбаунде) и самообновление прямо из GitHub Releases.

Стек

Go 1.26 · Xray-core · SQLite (modernc, без CGO) · React + Vite + Tailwind
Enter fullscreen mode Exit fullscreen mode

Внутренняя структура разбита по зонам ответственности — типизированный генератор конфига Xray и супервизор, ACME-менеджер, роутер заглушки, port-hopping на nftables для Hysteria2, хелперы WARP и Opera, пул прокси, сборщики ссылок и подписок и сервисный слой, который сводит желаемое состояние (квоты, TLS, роутинг) с тем, что Xray реально крутит.

Попробовать

Одна команда скачает последний релиз, поставит systemd-сервис, запустит его и напечатает логин:

curl -Ls https://raw.githubusercontent.com/AppsGanin/rospanel/main/install.sh | sudo bash
Enter fullscreen mode Exit fullscreen mode

Скрипт спросит домен (запросит TLS-сертификат через ACME) — или можно оставить пустым и работать по IP. Xray, geo-базы и сертификат подтянутся автоматически. Поддерживаются linux/amd64 и linux/arm64 — скрипт сам выберет нужный бинарь.

Есть также вариант с Docker-образом (ghcr.io/appsganin/rospanel:latest), если так удобнее.

При первом входе мастер настройки принудительно потребует сменить пароль и предложит заменить путь панели на случайный секрет — после этого корневой URL всегда отдаёт только заглушку.

Про назначение

РосПанель создана для образовательных и исследовательских целей: изучения того, как работают сетевые протоколы, TLS и прокси-технологии, проведения CTF-лаб, авторизованного пентеста и управления собственной инфраструктурой. Механизмы маскировки существуют для изучения этих техник и проверки устойчивости сервисов в рамках санкционированного тестирования. Ответственность за соблюдение законов своей юрисдикции несёт оператор сервера.

Open source

Лицензия — AGPL-3.0, проект полностью открыт. Релизы автоматизированы через release-please на основе Conventional Commits: публикуются и бинарник, и Docker-образ в GHCR.

Если панель окажется полезной — ⭐ на GitHub реально помогает, а PR и issue очень приветствуются.

👉 Репозиторий: https://github.com/AppsGanin/rospanel

Top comments (0)