# 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