From c12771382cffbf5898dceb0ef598d5fe40d4a1bf Mon Sep 17 00:00:00 2001 From: dvolj Date: Wed, 27 May 2026 07:44:30 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aa2a81a..45520b3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,142 @@ -# remna-path-changer +# remnawave-path-rotator -Py3 script for generating and changing path in CDN strategy configs \ No newline at end of file +Скрипт для автоматической ротации 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 \ No newline at end of file