Skip to content

Commit 6aa1b45

Browse files
authored
feat: multi-node fleet, payment provider registry, flexible self-registration
Multi-node management (SSH install, per-server config, egress backends, geo, logs), a pluggable payment-provider registry with 8 new RUB/crypto providers, and flexible self-registration with a moderation queue. Release-As: 1.0.0
1 parent dc6c598 commit 6aa1b45

105 files changed

Lines changed: 13020 additions & 1455 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
Под капотом один процесс [Xray-core](https://github.com/XTLS/Xray-core), который сразу
2828
поднимает несколько протоколов, а панель даёт удобный веб-интерфейс: пользователи,
2929
подписки, тарифы и приём платежей, маршрутизация, статистика, бэкапы, брендинг и
30-
тема — без правки конфигов руками.
30+
тема — без правки конфигов руками. А когда одного сервера мало — та же панель
31+
разрастается в **сеть серверов**: добавляете ноды, и пользователи едут на все сразу.
3132

3233
Панель **самодостаточна**: это **один статический бинарник**, которому не нужны Docker, внешняя БД, отдельный веб-сервер и обвязка
3334
из сторонних скриптов и ботов. Домен тоже не обязателен — сертификат выпустится и
@@ -39,12 +40,16 @@
3940
впереди. Нет домена — сертификат выпускается прямо на IP-адрес сервера.
4041
- **Xray сам** — проверенная версия ядра скачивается при первом запуске и
4142
зафиксирована, так что обновление Xray не может внезапно сломать панель.
42-
- **Тарифы и приём оплаты**ЮКасса и CryptoBot: клиент выбирает тариф и платит,
43-
доступ включается сам.
43+
- **Тарифы и приём оплаты**несколько платёжных провайдеров (карты, СБП,
44+
крипта): клиент выбирает тариф и платит, доступ включается сам.
4445
- **Команда и следы** — несколько администраторов с ролями, журнал всего, что
4546
происходило с пользователем, и отдельный журнал действий над самой панелью.
4647
- **Маскировка** — панель живёт за секретным путём, любой другой адрес отдаёт
4748
сайт-заглушку.
49+
- **Сеть серверов из одной панели** — добавляете ноду одной командой (или установкой
50+
по SSH прямо из панели), и пользователи с лимитами тут же раскатываются на все
51+
сервера, а подписка клиента отдаёт по локации на каждый. Ноды сами ходят к панели
52+
(исходящий HTTPS), поэтому переезд панели их не отвязывает.
4853
- **Без обрыва связи** — пользователи добавляются и удаляются в работающем Xray на
4954
лету: активные подключения остальных не рвутся.
5055
- **Без знания Xray** — конфиг ядра всегда генерируется из состояния панели, JSON
@@ -184,18 +189,41 @@ socks5/http-апстримов и свои правила: зона `.ru` ухо
184189
другой. Внутри полосы — балансировка по живым (Observatory); полоса без живых прокси
185190
пропускается.
186191

192+
#### 🌐 Сеть серверов (мультинода)
193+
194+
Одна панель управляет **множеством VPN-серверов**: локальный сервер («мастер») плюс
195+
любое число удалённых **нод**. Добавить сервер — прямо в UI: создаёте ноду и либо
196+
копируете **одну команду** для чистого Ubuntu, либо панель **сама заходит по SSH** и
197+
ставит агента, показывая лог установки вживую. Через минуту нода — онлайн, и на неё
198+
уже разъехались пользователи.
199+
200+
Связь построена наоборот, чем обычно: **нода сама стучится к панели** (исходящий
201+
HTTPS long-poll с bearer-токеном). Панели не нужен ни входящий доступ к нодам, ни
202+
белый IP, ни VPN между ними, а **переезд самой панели** (с сохранением домена)
203+
не требует на нодах вообще ничего. Пользователи, лимиты и тарифы **раскатываются на
204+
все включённые ноды автоматически**, подписка клиента отдаёт по записи на каждый
205+
сервер (имя сервера — в названии узла), а учёт трафика и устройств собирается со всех
206+
серверов в **общие** лимиты пользователя: сжёг квоту на одной ноде — отключился на
207+
всех.
208+
209+
**Каждый сервер настраивается независимо** из своей карточки: протоколы, транспорт
210+
подключений, маршрутизация и выходы (полосы / WARP / Opera), DNS, ключи REALITY,
211+
домен и TLS-сертификат, geo-базы и сайт-заглушка. Нода — это **тот же бинарник** в
212+
режиме ноды: переиспользует ACME, port-hopping, заглушку и супервизор Xray. Конфиг
213+
ноде **генерирует панель**, а локальный `xray -test` с откатом на ноде страхует от
214+
несовместимости версий. Обновляются ноды из UI (по одной или все сразу,
215+
последовательно) — панель сверяет SHA256 и рестартит агента.
216+
187217
#### 💳 Тарифы и оплата (опционально)
188218

189219
**Тарифные планы**: цена, срок, лимиты трафика и устройств. Цена 0 — бесплатный
190220
тариф: не истекает, а квота обнуляется каждый срок. Есть **пробный период**,
191221
**бесплатный тариф-фоллбэк** для истёкших, продление, отмена и перенос всех
192222
пользователей с выводимого тарифа.
193223

194-
**Приём платежей**: **ЮКасса** (карты) и **CryptoBot** (крипта в Telegram) —
195-
клиент выбирает тариф в боте или на странице подписки, платит, тариф **включается
196-
сам**. Подтверждение идёт двумя путями — мгновенный вебхук (с проверкой подписи) и
197-
поллинг как страховка, если вебхук не дошёл; обработка идемпотентна. Без
198-
провайдеров работает ручной режим: админ подтверждает оплату сам.
224+
**Приём платежей**: несколько провайдеров на выбор — **ЮКасса**,
225+
**PayPalych**, **RioPay**, **RollyPay**, **SeverPay**, **Platega**, **PayPear**, **AuraPay** (карты, СБП, ₽), **CryptoBot** и **Heleket** (крипта, счёт в рублях). У каждого можно задать своё название для кнопки оплаты. Клиент выбирает тариф в боте или на странице подписки, платит, тариф **включается сам**. Каждый провайдер настраивается на странице «Оплата» (включить, ввести ключи, скопировать URL вебхука в кабинет провайдера) — список провайдеров расширяется, добавление нового не требует правок в UI. Подтверждение идёт двумя путями — мгновенный вебхук (подпись провайдера проверяется, а провайдеры без подписи перепроверяются повторным запросом к их API) и поллинг как страховка, если
226+
вебхук не дошёл; обработка идемпотентна, сумма сверяется с заказом. Без провайдеров работает ручной режим: админ подтверждает оплату сам.
199227

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

@@ -281,6 +309,21 @@ rospanel help полная справка
281309
Деструктивные команды (`reset`, `restore`, `host`, `uninstall`) спрашивают
282310
подтверждение; флаг `-y` его пропускает.
283311

312+
### Режим ноды
313+
314+
Тот же бинарник умеет работать как управляемая панелью нода. Команду `install`
315+
подставляет диалог «Добавить ноду» в панели — руками её обычно набирать не нужно.
316+
317+
```text
318+
rospanel node install --join '<url>' присоединиться к панели и поставить сервис (root)
319+
rospanel node run агент ноды (точка входа systemd)
320+
rospanel node set-panel <url> переключить ноду на новый адрес панели
321+
rospanel node status локальный статус ноды
322+
rospanel node uninstall [-y] снять сервис ноды (данные сохраняются)
323+
```
324+
325+
`--join` берётся из диалога добавления ноды; токен в нём одноразовый и живёт 24 часа.
326+
284327
---
285328

286329
## 🧱 Архитектура
@@ -289,7 +332,7 @@ rospanel help полная справка
289332
и применяется супервизором. Веб-панель встроена в бинарник.
290333

291334
```
292-
cmd/rospanel/ запуск сервера + CLI (main / service / cli)
335+
cmd/rospanel/ запуск сервера + CLI + режим ноды (main / service / cli / node)
293336
internal/
294337
model/ доменные типы (User, Settings, RoutingConfig, …)
295338
store/ SQLite + миграции
@@ -308,6 +351,9 @@ internal/
308351
proxyproto/ PROXY-протокол листенер (реальный IP клиента)
309352
logbuf/ кольцевой лог-буфер + ротация в файл
310353
link/ sub/ сборка ссылок и подписок
354+
nodeapi/ протокол синка панель↔нода (join / sync)
355+
nodeagent/ агент режима ноды (петля синка, применение конфига)
356+
provision/ установка ноды по SSH из панели (стрим лога в UI)
311357
backup/ tar.gz снапшоты
312358
updater/ обновление из GitHub
313359
sysstat/ netinfo/ метрики хоста + определение публичного IP

cmd/rospanel/cli.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ func printUsage(w io.Writer) {
3939
restart Перезапустить сервис (systemctl restart).
4040
status Показать статус сервиса (systemctl status).
4141
update [-y] Обновиться до последнего релиза с GitHub и перезапуститься.
42+
node <под> Режим ноды: install --join '<url>', run, set-panel, status,
43+
uninstall (см. rospanel node help).
4244
backup [файл] Создать бэкап .tar.gz (БД + сертификаты + конфиг Xray).
4345
Без аргумента имя файла — с текущей датой/временем.
4446
restore [-y] <файл>

cmd/rospanel/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ func main() {
8080
runService(os.Args[1])
8181
case "update":
8282
runUpdate(os.Args[2:])
83+
case "node":
84+
runNode(os.Args[2:])
8385
case "reset":
8486
runReset(os.Args[2:])
8587
case "version", "--version", "-v":

0 commit comments

Comments
 (0)