diff --git a/family/how-to/arr-stack-taiga.md b/family/how-to/arr-stack-taiga.md index 3b6e157b..51fa6d6c 100755 --- a/family/how-to/arr-stack-taiga.md +++ b/family/how-to/arr-stack-taiga.md @@ -24,7 +24,11 @@ related: - Lidarr → SkyHook: 10 результатов через VLESS proxy. - Lidarr → Transmission: штатный test проходит. - Prowlarr → RuTracker: реальный search возвращает 50 результатов. +- Prowlarr → Kinozal: реальный search возвращает 14 результатов. - FlareSolverr: health `ok`, session `prowlarr` создаётся с proxy и pre-login. +- 3x-ui egress закреплён: Sweden master → Poland failover → текущий auto-resolve. +- Три последовательных proxy-запроса сохраняют один внешний IP. +- FlareSolverr watcher автоматически восстанавливает session и RuTracker login после потери. Health-warning у Sonarr/Lidarr может показывать старый quarantine индексаторов. Проверять нужно реальным search и `IndexerStatus`, а не одной строкой health. @@ -55,6 +59,18 @@ Compose: 2. FlareSolverr/Chrome → RuTracker идёт через `socks5://vless-proxy:1080`. 3. Локальный Transmission идёт напрямую по `transmission:9091`. +### Sticky egress для трекеров + +Настройки 3x-ui находятся на Taiga в `/mnt/RED_2TB/docker/xray-admin/x-ui.db`. Для пользователя `vless-space` используется цепочка: + +```text +space-master → sub1-sweden-yt +space-failover → sub1-poland-yt +space-auto → sub1-* / leastLoad +``` + +Master и первый failover не должны быть заменены общим `leastLoad`: смена egress-IP между challenge и повторным запросом инвалидирует Cloudflare-cookie. + Lidarr должен иметь: ```text @@ -78,6 +94,8 @@ Entrypoint: При старте он ждёт `/health`, создаёт session `prowlarr` с `socks5://vless-proxy:1080`, читает credentials RuTracker из Prowlarr SQLite в режиме `immutable=1`, выполняет pre-login и запускает основной процесс. В compose важны `PROXY_URL`, `BROWSER_TIMEOUT=180000`, `shm_size: 1gb`, `restart: unless-stopped` и read-only mount каталога Prowlarr. +После старта watcher проверяет egress-IP каждую минуту и login-состояние RuTracker каждые пять минут. При смене IP или потере login он пересоздаёт session и выполняет pre-login заново. + RuTracker должен иметь оба Prowlarr-тега: ```text @@ -128,6 +146,10 @@ curl -H "X-Api-Key: $PROWLARR_KEY" \ `PROXY_URL` применяется при создании Chrome session. После изменения proxy session нужно пересоздать. Entrypoint делает это автоматически при старте FlareSolverr. +### Профиль прокси меняется между запросами + +Симптом: FlareSolverr успешно решает challenge, но Prowlarr получает `Auth Failed` или timeout на следующем запросе. Причина — 3x-ui `leastLoad` выбрал другой профиль и внешний IP изменился. Исправление — pinned master/failover chain и watcher relogin; timeout сам по себе проблему не решает. + ### Prowlarr API маскирует password GET индексатора возвращает `********`. Нельзя использовать такой JSON для pre-login. Рабочий pre-login читает SQLite read-only из отдельного контейнера. diff --git a/personal/tech/flaresolverr-taiga.md b/personal/tech/flaresolverr-taiga.md index e2075a69..413d54b4 100755 --- a/personal/tech/flaresolverr-taiga.md +++ b/personal/tech/flaresolverr-taiga.md @@ -24,6 +24,17 @@ Prowlarr └─ RuTracker ``` +Внешний egress для arr закреплён на маршруте 3x-ui: + +```text +vless-space + └─ space-master: sub1-sweden-yt + └─ space-failover: sub1-poland-yt + └─ space-auto: текущий leastLoad по подписке +``` + +Это важно для Cloudflare: FlareSolverr и последующий запрос Prowlarr должны выходить через один IP. Общий `leastLoad` по всем профилям без pinned master ломает cookie handoff. + Файлы на TrueNAS: ```text @@ -43,7 +54,9 @@ Entrypoint при каждом старте: 3. создаёт `prowlarr` с `socks5://vless-proxy:1080`; 4. читает credentials RuTracker из `prowlarr.db` через SQLite URI `mode=ro&immutable=1`; 5. делает pre-login через FlareSolverr; -6. оставляет основной процесс FlareSolverr работать. +6. оставляет основной процесс FlareSolverr работать; +7. проверяет egress-IP раз в минуту и login-состояние RuTracker раз в пять минут; +8. при смене IP или потере login-состояния пересоздаёт session `prowlarr` и выполняет login заново. SQLite монтируется read-only. Обычный `sqlite3.connect('/prowlarr.db')` на read-only mount может упасть с `unable to open database file`; нужен именно `immutable=1`. @@ -72,6 +85,26 @@ RuTracker tags = [1,2] FlareSolverr requestTimeout = 180 seconds ``` +## 3x-ui: master и failover + +Шаблон находится в базе 3x-ui: + +```text +/mnt/RED_2TB/docker/xray-admin/x-ui.db +``` + +Текущая цепочка: + +```text +space-master selector=[sub1-sweden-yt] fallback=space-failover +space-failover selector=[sub1-poland-yt] fallback=space-auto +space-auto selector=[sub1-] strategy=leastLoad +``` + +Не использовать общий `leastLoad` как первый уровень для RuTracker/Kinozal: он может менять egress между соединениями. `maxRTT` и `tolerance` фильтруют кандидатов, но не делают выбор sticky. + +Перед изменением базы сохранять backup. После изменения проверить сгенерированный `/app/bin/config.json` и выполнить `xray -test`; не редактировать сгенерированный файл напрямую. + Один tag `[2]` не решает DNS-блок Taiga. Один tag `[1]` не решает browser challenge. ## Правильная проверка @@ -122,6 +155,8 @@ ssh truenas_admin@mallexxx.duckdns.org \ После restart session должна восстановиться автоматически. Если она не появилась, смотреть `docker logs flaresolverr`; credentials не выводить в лог. +Автовосстановление можно проверить безопасно: удалить только session `prowlarr` через `sessions.destroy`, дождаться watcher и проверить `request.get` страницы RuTracker с признаком `id="logged-in-username"`. + ## Восстановление quarantine Если Prowlarr показывает старый `IndexerStatus`, сначала сделать backup SQLite. Остановить только Prowlarr, удалить только записи `IndexerStatus`, проверить `PRAGMA quick_check`, запустить и выполнить реальный search. Не удалять `prowlarr.db` и не считать health единственным тестом. @@ -132,5 +167,7 @@ ssh truenas_admin@mallexxx.duckdns.org \ - FlareSolverr session `prowlarr` создаётся с proxy и pre-login. - Прямой запрос через session получает `bb_session`. -- Реальный Prowlarr search RuTracker возвращает результаты. +- После полного restart: RuTracker — 50 результатов без ошибок; Kinozal — 14 результатов без ошибок. +- Три последовательных proxy-запроса получают один egress-IP. +- Искусственно удалённая FlareSolverr session автоматически восстановлена и снова logged-in. - Ошибки Lidarr/SkyHook не относятся к FlareSolverr; их routing описан в [[family/how-to/arr-stack-taiga]].