Self-hosted панель управления VPN на Xray-core — от одного личного сервера до сети нод.
Что это · Где взять сервер · Быстрый старт · Возможности · 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
Спасибо тем, кто регистрируется по этим ссылкам 🙏
Одной командой: скачает релиз, поставит 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.
# скачать последний релиз (замените 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-RUNdocker 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-RUNNote
--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 его выключит.
Один конфиг, один набор учёток: 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.
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. Если вы предоставляете доступ к изменённой версии панели по сети (в т.ч. как сервис), вы обязаны открыть исходный код своих изменений на тех же условиях.