142 lines
5.0 KiB
Markdown
142 lines
5.0 KiB
Markdown
# remnawave-path-rotator
|
|
|
|
Скрипт для автоматической ротации xHTTP-пути в панели [Remnawave](https://docs.rw).
|
|
Меняет `path` по расписанию сразу в трёх местах через API панели.
|
|
|
|
## Что меняется
|
|
|
|
| Место | API |
|
|
|---|---|
|
|
| Хост → Переопределения соединений (`path`) | `PATCH /api/hosts` |
|
|
| Хост → xHttp Extra Params (`xHttpExtraParams.path`) | `PATCH /api/hosts` |
|
|
| Профиль → `config.inbounds[].xhttpSettings.path` | `PATCH /api/config-profiles` |
|
|
| Профиль → `inbounds[].rawInbound.xhttpSettings.path` | `PATCH /api/config-profiles` |
|
|
|
|
Все остальные параметры (`mode`, `xPaddingKey`, `xPaddingHeader` и др.) **сохраняются**.
|
|
Профили без xhttp inbound'ов (например, Reality/TCP) автоматически пропускаются.
|
|
|
|
## Требования
|
|
|
|
- Python 3.10+
|
|
- Remnawave с включённым API токеном
|
|
|
|
## Установка
|
|
|
|
```bash
|
|
git clone https://github.com/yourname/remnawave-path-rotator
|
|
cd remnawave-path-rotator
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
`requirements.txt`:
|
|
```
|
|
httpx>=0.27.0
|
|
apscheduler>=3.10.0
|
|
```
|
|
|
|
## Настройка
|
|
|
|
Все параметры задаются через переменные окружения:
|
|
|
|
| Переменная | Описание | По умолчанию |
|
|
|---|---|---|
|
|
| `RW_PANEL_URL` | URL панели Remnawave | — |
|
|
| `RW_API_TOKEN` | API токен (Settings → API Tokens) | — |
|
|
| `RW_AUTH_COOKIE` | Куки TinyAuth/сессии (`name=value`) | — |
|
|
| `RW_HOST_UUIDS` | UUID хостов через запятую (пусто = все) | все |
|
|
| `RW_PROFILE_UUIDS` | UUID профилей через запятую (пусто = все) | все |
|
|
| `RW_CRON_HOUR` | Часы для APScheduler (cron-синтаксис) | `*/6` |
|
|
| `RW_CRON_MINUTE` | Минуты для APScheduler | `0` |
|
|
|
|
### Получение API токена
|
|
|
|
Панель → **Settings → API Tokens → Create Token**. Скопируй значение `ey...`.
|
|
|
|
### Получение куки TinyAuth
|
|
|
|
Если панель защищена TinyAuth — открой DevTools (F12) → **Application → Cookies**, найди куку и скопируй `name=value`.
|
|
|
|
## Запуск
|
|
|
|
### Однократно (для проверки)
|
|
|
|
```bash
|
|
export RW_PANEL_URL="https://your-panel.example.com"
|
|
export RW_API_TOKEN="eyJhbGci..."
|
|
export RW_AUTH_COOKIE="session=abc123"
|
|
|
|
python3 patch.py --once
|
|
```
|
|
|
|
### По расписанию (встроенный scheduler)
|
|
|
|
```bash
|
|
python3 patch.py
|
|
```
|
|
|
|
Запустит ротацию сразу при старте, затем повторяет по расписанию (`*/6 * * * *` по умолчанию — каждые 6 часов).
|
|
|
|
### Через системный cron
|
|
|
|
Если предпочитаешь cron без постоянно запущенного процесса:
|
|
|
|
```bash
|
|
crontab -e
|
|
```
|
|
|
|
```
|
|
0 */6 * * * cd /opt/remnawave-path-rotator && \
|
|
RW_PANEL_URL=https://... \
|
|
RW_API_TOKEN=eyJ... \
|
|
RW_AUTH_COOKIE=name=value \
|
|
python3 patch.py --once >> /var/log/rw_rotator.log 2>&1
|
|
```
|
|
|
|
### Через .env файл
|
|
|
|
```bash
|
|
# .env
|
|
RW_PANEL_URL=https://your-panel.example.com
|
|
RW_API_TOKEN=eyJhbGci...
|
|
RW_AUTH_COOKIE=session=abc123
|
|
# RW_HOST_UUIDS=uuid1,uuid2 # опционально
|
|
# RW_PROFILE_UUIDS=uuid3 # опционально
|
|
# RW_CRON_HOUR=*/4 # опционально
|
|
```
|
|
|
|
```bash
|
|
set -a && source .env && set +a
|
|
python3 patch.py --once
|
|
```
|
|
|
|
## Пример вывода
|
|
|
|
```
|
|
2026-05-27 10:30:20 [INFO] ═══ Начало ротации путей ═══
|
|
2026-05-27 10:30:20 [INFO] Новый путь: /cdn/relay/sync
|
|
2026-05-27 10:30:21 [INFO] Получено хостов: 2
|
|
2026-05-27 10:30:21 [INFO] ✓ Хост [🇸🇪 AVR Швеция 1] → /cdn/relay/sync
|
|
2026-05-27 10:30:21 [INFO] ✓ Хост [🇩🇪 AVR Германия] → /cdn/relay/sync
|
|
2026-05-27 10:30:21 [INFO] Получено профилей: 3
|
|
2026-05-27 10:30:22 [INFO] ✓ Профиль [se cdn] → /cdn/relay/sync
|
|
2026-05-27 10:30:22 [INFO] ✓ Профиль [fi cdn] → /cdn/relay/sync
|
|
2026-05-27 10:30:22 [INFO] · Профиль [StealConfig] — xhttp inbound'ов нет, пропуск
|
|
2026-05-27 10:30:22 [INFO] ═══ Ротация завершена успешно (ошибок: 0) ═══
|
|
```
|
|
|
|
## Генератор пути
|
|
|
|
Путь собирается из случайных слов технического словаря (~70 слов: `api`, `cdn`, `relay`, `sync`, `grpc`, `mesh` и др.). Количество сегментов — случайное от 2 до 5. Пример результатов:
|
|
|
|
```
|
|
/cdn/relay/sync
|
|
/grpc/auth/v2
|
|
/media/fetch/node/pipe
|
|
/proxy/stream
|
|
```
|
|
|
|
Словарь и длину можно изменить прямо в скрипте (`WORD_POOL`, `PATH_MIN_SEGMENTS`, `PATH_MAX_SEGMENTS`).
|
|
|
|
## Лицензия
|
|
|
|
MIT |