Skip to content

AppsGanin/rospanel

Repository files navigation

РосПанель

РосПанель

Self-hosted панель управления VPN на Xray-core — от одного личного сервера до сети нод.

Release Go Xray-core React Platform Deploy

Что это · Где взять сервер · Быстрый старт · Возможности · CLI · Архитектура · Дисклеймер · Разработка · Поддержать


Что это

РосПанель — self-hosted панель управления VPN на Xray-core. Один процесс поднимает сразу несколько протоколов, а панель даёт веб-интерфейс: пользователи, подписки, тарифы и приём оплаты, маршрутизация, статистика, бэкапы, брендинг — без правки конфигов руками. Когда одного сервера мало, та же панель разрастается в сеть серверов: добавляете ноды — пользователи едут на все сразу.

Самодостаточна: один статический бинарник — ни nginx, ни certbot, ни сторонних скриптов. TLS панель выпускает себе сама через ACME, а домен не обязателен: сертификат встанет и на голый IP. Панель открывается по своему адресу сразу после установки — без DNS, без reverse-proxy и без SSH-туннелей. Конфиг Xray генерируется из состояния панели (JSON руками не трогаете), пользователи добавляются и удаляются на лету без обрыва чужих подключений, а при повреждении БД панель сама поднимается из последнего бэкапа.

Note

Это панель управления (control plane), а не VPN-клиент. Она настраивает и обслуживает ваш собственный сервер. Назначение — образовательное и исследовательское (см. Дисклеймер).


🖥️ Где взять сервер

Панели хватит самого дешёвого VPS: 1 vCPU, 1 ГБ RAM, любой Linux — этого достаточно и для панели, и для Xray на десятки пользователей.

Если ещё не выбрали хостинг — зарегистрируйтесь по ссылкам ниже. Это бесплатный для вас способ поддержать проект: цена та же, а часть от аренды идёт на развитие панели.

VDSina · Aeza · NetGrid · Serv.host · u1Host · Waicore

Спасибо тем, кто регистрируется по этим ссылкам 🙏


🚀 Быстрый старт

Вариант 1 — установочный скрипт (рекомендуется)

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

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

Домен не обязателен. Скрипт спросит про него: есть домен — введите, нет — нажмите Enter, и панель поднимется на IP сервера. Сертификат Let's Encrypt она получит в обоих случаях: он выдаётся и на IP-адрес, никаких предупреждений в браузере не будет.

Домен можно задать заранее, тогда вопроса не будет: curl -Ls … | sudo ROSPANEL_HOST=vpn.example.com bash.

Вариант 2 — бинарник + systemd вручную

# скачать последний релиз (замените amd64 на arm64 для ARM-серверов)
curl -fsSL -o rospanel \
  https://github.com/AppsGanin/rospanel/releases/latest/download/rospanel-linux-amd64
chmod +x rospanel

# установить как сервис (копирует бинарь в /usr/local/bin, пишет systemd-юнит, стартует)
sudo ./rospanel install
#   сразу с доменом:  sudo ROSPANEL_HOST=vpn.example.com ./rospanel install

# логин и секретный путь печатаются ОДИН раз:
journalctl -u rospanel | grep -A6 FIRST-RUN

Вариант 3 — Docker

docker run -d --name rospanel \
  --network host \
  --cap-add NET_ADMIN \
  -v rospanel-data:/data \
  ghcr.io/appsganin/rospanel:latest

docker logs rospanel | grep -A6 FIRST-RUN

Note

--network host нужен, чтобы Xray слушал 443/TCP, 80/TCP и UDP-порты Hysteria2 напрямую; NET_ADMIN — чтобы панель могла править правила фаервола: port-hopping и лимиты соединений (nftables), бан за перебор (iptables).

🔑 Вход по умолчанию

Поле Значение
Логин admin
Пароль admin
Путь панели /rospanel/

Сразу после установки панель доступна по адресу https://<домен-или-IP>/rospanel/. Точная ссылка дублируется в логе (journalctl -u rospanel | grep -A6 FIRST-RUN или docker logs rospanel | grep -A6 FIRST-RUN).

При первом входе мастер настройки принудительно потребует сменить пароль и предложит сменить путь панели на случайный секрет — дефолтные admin/admin и /rospanel/ работают только до этого шага.

Important

После смены панель доступна только по секретному пути — корень отдаёт страницу-обманку. Без знания /<secret>/ форму логина не найти.

🌐 Добавить ноду

Нода — это чистый Ubuntu-сервер с тем же бинарником в режиме ноды: конфиг ей генерирует панель, отдельно настраивать нечего. Заводится всё из UI: Сервера → Добавить ноду, где нужно указать название и домен-или-IP ноды. Дальше — два способа на выбор.

Способ 1 — команда установки. Панель покажет готовую однострочную команду; выполните её на сервере ноды от root:

curl -Ls https://raw.githubusercontent.com/AppsGanin/rospanel/main/install.sh \
  | sudo bash -s -- --join 'https://<панель>/<node-api-path>/v1/join#<токен>'

Копируйте команду целиком из диалога — и адрес, и токен в ней подставляются автоматически. Токен показывается один раз и живёт 24 часа; <node-api-path> — отдельный неугадываемый сегмент для синка нод (не путь панели и не путь REST API: смена любого из них не отвяжет ноды). Если панель работает на голом IP (сертификат не от публичного CA), панель сама добавит в команду --insecure.

Способ 2 — установка по SSH. Вкладка «Установить по SSH» в том же диалоге: панель сама зайдёт на сервер (адрес, порт, пользователь + пароль или приватный ключ PEM), зальёт свой бинарник и поставит агента — лог установки идёт вживую. Версия ноды гарантированно совпадёт с версией панели. Данные SSH нигде не сохраняются.

Через несколько секунд после установки нода появится в списке как онлайн: она сама стучится к панели исходящим HTTPS, поэтому входящий доступ к ней панели не нужен и пробрасывать ничего не требуется.

systemctl status rospanel-node        # сервис ноды
journalctl -u rospanel-node -f        # лог агента
rospanel node status                  # локальный статус

Note

Один сервер — либо панель, либо нода: они делят 443-й порт. Если на машине уже стоит сервис панели, node install его выключит.


✨ Возможности

🔐 Протоколы, маскировка, TLS

Один конфиг, один набор учёток: VLESS-Vision (TCP/443 + uTLS), Trojan-WS (fallback на 443), Hysteria2 (UDP + port-hopping), VLESS-gRPC-REALITY (маскировка под чужой TLS). Панель спрятана за секретным путём, любой другой путь отдаёт сайт-заглушку (11 шаблонов). TLS из коробки — ACME (Let's Encrypt / ZeroSSL) с авто-продлением; сертификат можно выпустить и на голый IP, без домена и DNS.

👤 Пользователи

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

📲 Подписки

/<путь>/<токен> — base64-список плюс страница с QR, deep-links и импортом в популярные клиенты (авто-роутинг-заголовки Happ / INCY / Mihomo), со своими названиями узлов. Ссылку можно сбросить (ротация токена) без смены UUID и паролей. Объявление внутри клиента (Happ, v2RayTun) — короткий текст прямо в приложении.

🧭 Маршрутизация и выходы

Категории block / direct / WARP / Opera с приоритетом, пресеты geosite/geoip с авто-загрузкой баз, выход через Cloudflare WARP (WireGuard) и бесплатный Opera VPN с выбором региона. Полосы прокси — независимые выходы, у каждого свои socks5/http-апстримы и правила по зонам с балансировкой по живым (Observatory).

🌐 Сеть серверов (мультинода)

Одна панель управляет мастером и любым числом удалённых нод. Сервер добавляется из UI: копируете одну команду для чистого Ubuntu или даёте панели зайти по SSH и поставить агента — лог установки идёт вживую. Нода сама стучится к панели (исходящий HTTPS long-poll), поэтому панели не нужен доступ к нодам, а её переезд ноды не отвязывает. Пользователи, лимиты и тарифы раскатываются на все ноды; трафик и устройства считаются в общие лимиты, а статистика и карточка юзера показывают, сколько трафика прошло через каждый сервер.

Каждый сервер настраивается отдельно (протоколы, выходы, DNS, ключи REALITY, домен и TLS, geo-базы, заглушка). Нода — тот же бинарник в режиме ноды: конфиг ей генерирует панель, локальный xray -test с откатом страхует от несовместимости версий, обновление идёт из UI со сверкой SHA256.

💳 Тарифы и оплата (опционально)

Планы: цена, срок, лимиты трафика и устройств; цена 0 — бесплатный тариф. Есть пробный период, бесплатный тариф-фоллбэк для истёкших, продление и перенос пользователей. Приём платежей — провайдеры на выбор: ЮКасса, PayPalych, RioPay, RollyPay, SeverPay, Platega, PayPear, AuraPay (карты, СБП, ₽), CryptoBot и Heleket (крипта). Клиент платит в боте или на странице подписки — тариф включается сам. Подтверждает вебхук (подпись проверяется), поллинг страхует, если вебхук не дошёл; обработка идемпотентна, сумма сверяется с заказом. Без провайдеров оплату подтверждает админ.

Warning

Провайдеры оплаты пока не проверены на боевых аккаунтах. Если вы подключили какой-то из них — пожалуйста, сообщите в issue, работает он или нет (какой провайдер, что получилось, что сломалось). Это поможет отметить проверенные провайдеры и починить остальные.

👥 Доступ, роли и аудит

Роли: владелец (может всё, один и неудаляем), администратор (без списка админов), оператор (юзеры, статистика, журнал). Права проверяются на сервере на каждом запросе; новому админу выдаётся временный пароль со сменой при первом входе. Журнал пользователя — что с ним делали и кто (админ, API-ключ, бот, сам юзер, система), переживает его удаление. Журнал панели (виден владельцу) — входы и неудачные попытки с IP, изменения настроек, бэкапы; пишется только успешное действие, тела запросов — никогда. Оба журнала хранятся 90 дней.

🤖 Интеграции

Админ-бот в Telegram: управление юзерами, тарифы, QR-подписка, бэкапы по расписанию, уведомления о событиях (регистрации, истечения, сбой Xray, оплаты, сертификат).

Клиентский бот: саморегистрация, личное меню с подпиской и статистикой, покупка тарифа — и личные уведомления самому пользователю: подписка заканчивается, трафик на исходе, оплата прошла.

Бот поддержки — третий бот: человек пишет ему в личку, а переписка попадает в вашу форум-группу, по теме на каждого; отвечаете прямо оттуда, и ответ уходит ему в бот.

Рассылки — девять срезов аудитории (все, с аккаунтом и без, активные, истёкшие, у кого скоро закончится, кто давно не заходил, кто ни разу не подключался) с картинкой и кнопкой. Доставка идёт по таблице получателей, поэтому прерванная рассылка продолжается, а не начинается заново, и никто не получает сообщение дважды.

REST API с именованными ключами (Authorization: Bearer), OpenAPI из кода и Swagger UI; вебхуки шлют подписанные HMAC-SHA256 события с ретраями. Подробнее — docs/api.md.

🎨 Брендинг и тема

Своё название и логотип вместо «РосПанели» — в панели и на странице подписки. Акцентный цвет перекрашивает весь интерфейс, а тёмная тема сама подстраивает текст, статусы и графики.

🧰 Эксплуатация и безопасность

Диагностика одной кнопкой: процесс Xray, применение конфига, срок TLS, место на диске, свежесть geo-баз, состояние выходов — каждая проверка с подсказкой. Отдельная проверка подключения коннектится к каждому протоколу как настоящий клиент и убеждается, что трафик проходит наружу, — ловит рассинхрон учёток, TLS или ALPN раньше пользователя. Бэкап / восстановление и сброс — из панели и CLI.

Обновление одной командой: панель сверяет SHA256, прогоняет бинарь вхолостую, снимает бэкап и только потом подменяет себя, храня прошлую версию рядом. Xray-ядро зафиксировано, упавшее супервизор поднимает сам.

Секреты в БД зашифрованы (AES-GCM). Токены сессий и API-ключи хранятся только хэшами — даже с доступом к таблице чужую сессию не подставить. Подтверждение оплаты и управление админами требуют повторного пароля. Исходящие запросы защищены от SSRF, перебор на инбаундах банится iptables, а число соединений с одного IP ограничено nftables.


🛠️ CLI

rospanel                     запустить панель (обычно через systemd)
rospanel install             установить systemd-сервис и запустить (root)
rospanel uninstall [-y]      снять сервис (данные сохраняются)
rospanel start|stop|restart  управление сервисом
rospanel status              статус сервиса
rospanel update [-y]         обновиться до последнего релиза с GitHub
rospanel backup [файл]       снапшот .tar.gz (БД + ключ шифрования + сертификаты + конфиг Xray)
rospanel restore [-y] <файл> восстановить из снапшота (применится при старте)
rospanel host [-y] [домен|IP] показать/сменить адрес (перевыпуск TLS)
rospanel path                показать URL панели и проверить secrets.key / БД
rospanel reset [-y]          сброс к заводским настройкам (стирает БД)
rospanel version             версия
rospanel help                полная справка

Деструктивные команды (reset, restore, host, uninstall) спрашивают подтверждение; флаг -y его пропускает.

Режим ноды

Тот же бинарник умеет работать как управляемая панелью нода. Команду install подставляет диалог «Добавить ноду» в панели — руками её обычно набирать не нужно.

rospanel node install --join '<url>'   присоединиться к панели и поставить сервис (root)
rospanel node run                       агент ноды (точка входа systemd)
rospanel node set-panel <url>           переключить ноду на новый адрес панели
rospanel node status                    локальный статус ноды
rospanel node uninstall [-y]            снять сервис ноды (данные сохраняются)

--join берётся из диалога добавления ноды; токен в нём одноразовый и живёт 24 часа. Как завести ноду от начала до конца — 🌐 Добавить ноду.


🧱 Архитектура

Единственный источник правды — SQLite; конфиг Xray всегда генерируется из неё и применяется супервизором. Веб-панель встроена в бинарник.

Стек: Go 1.26 · Xray-core · SQLite (modernc, без CGO) · React + Vite + Tailwind.


⚠️ Дисклеймер

Программное обеспечение предоставляется «как есть» (as is), без каких-либо гарантий.

Назначение проекта — образовательное и исследовательское: изучение сетевых протоколов, TLS и прокси-технологий, CTF и лабораторные работы по сетевой безопасности, авторизованное тестирование на проникновение и управление собственной инфраструктурой. Проект не предназначен для обхода законных ограничений или иных противоправных действий; механизмы маскировки служат для изучения технологий и проверки устойчивости сервисов в рамках санкционированного тестирования.

Ответственность за установку, настройку, эксплуатацию и соблюдение законов своей юрисдикции несёт оператор сервера. Авторы и контрибьюторы не отвечают за использование проекта третьими лицами.


🧑‍💻 Разработка

# фронтенд (после изменений в web/)
npm --prefix web install
npm --prefix web run build      # → web/dist (вшивается в бинарник)

# бинарник
go build -o rospanel ./cmd/rospanel
./rospanel

Полезные переменные окружения (все опциональны): ROSPANEL_DATA (каталог данных), ROSPANEL_ADMIN_ADDR (loopback-адрес панели, по умолчанию 127.0.0.1:8080), XRAY_BIN, ROSPANEL_HOST, ROSPANEL_ACME_EMAIL.

Защита от флуда (nftables-лимиты на публичных TCP-портах, см. «Эксплуатация») тоже настраивается через окружение — пригодится, если за одним IP сидит целый офис или CGNAT-оператор и клиенты упираются в дефолты:

Переменная Что делает
ROSPANEL_CONNLIMIT=off Полностью выключает лимиты (правила nftables сносятся)
ROSPANEL_CONNLIMIT_MAX Максимум одновременных TCP-соединений с одного IP
ROSPANEL_CONNLIMIT_RATE Максимум новых соединений с одного IP в секунду

Текущее состояние защиты видно в Дашборд → Управление → Диагностика: если nftables не установлен или панель работает не от root, правила молча не применятся — диагностика об этом скажет.

PR и issue приветствуются. Коммиты — в стиле Conventional Commits: на их основе release-please собирает релиз и публикует бинарь + Docker-образ в GHCR.


💝 Поддержать проект

РосПанель развивается в свободное время и распространяется бесплатно. Если панель оказалась полезной — проще всего поддержать через DonationAlerts или Boosty (картой РФ, разово или регулярно). Спасибо! 🙏

Криптой

USDT. Выберите сеть и внимательно скопируйте адрес — сеть отправителя и получателя должны совпадать. Отправляйте только USDT и только в указанной сети: перевод по неверной сети невозвратен. Дешевле всего комиссия в TRON (TRC20) и TON.

Сеть Токен Адрес
TRC20 (Tron) USDT TJwyrPVEZVZ1YrcmDiZTyFjLo3Q2DmEGzs
ERC20 (Ethereum) USDT 0xf9d663146ce902da91911b214c71cc73a5269d1d
Solana USDT 2qAZRTbaUMTfYuZbD1dCYHjkYgxkw4dUYE9XY3JhC2Cs
TON USDT UQDoat731MLYuIw8ayL3Vhhw7zTBbLvRaQFmDvab--CNNI7e

Bybit. Если у вас тоже Bybit — переводом по UID 136462734: мгновенно и без комиссии.

Нет возможности поддержать деньгами? Тоже можно помочь — арендуйте серверы по реферальным ссылкам из раздела Где взять сервер. Вам это ничего не стоит, а проекту помогает.


📄 Лицензия

GNU Affero General Public License v3.0 (AGPL-3.0).

Проект свободен для использования, изменения и self-hosting. Если вы предоставляете доступ к изменённой версии панели по сети (в т.ч. как сервис), вы обязаны открыть исходный код своих изменений на тех же условиях.