# FlareSolverr на Тайге + обход блокировок индексеров — план > **Статус: ✅ РАЗВЁРНУТ 2026-09-28. Приёмка Alex НЕ закрыта (ждёт проверки в UI).** > Задача Alex: «Ставь flaresolverr как на Кра́кене, запускай трекеры через прокси контейнер > чтобы обойти блокировки». Связано: [[personal/plans/lidarr-taiga-and-indexer-unblock]], > [[family/projects/media-toolbox-taiga]], [[family/how-to/arr-stack-kraken]], > [[personal/tech/prowlarr-flaresolverr-cloudflare]]. > > **Итог:** `flaresolverr` поднят, обходит и DNS-блок, и Cloudflare. Тест индексеров: > RuTracker ✅ RuTor ✅ Byrutor ✅ Kinozal(M) ✅ | NoNaMe ❌ (нет FS-тега) Kinozal ❌ (гонка). > Оба дефекта закрываемые, см. §«Осталось». ## ФАКТИЧЕСКОЕ СОСТОЯНИЕ (2026-09-28, после деплоя) ### Контейнер `flaresolverr` — ✅ работает `/mnt/RED_2TB/docker/arr/docker-compose.yml` (122 строки), сервис `flaresolverr`: ```yaml flaresolverr: image: ghcr.io/flaresolverr/flaresolverr:latest container_name: flaresolverr restart: unless-stopped environment: - LOG_LEVEL=warning - BROWSER_TIMEOUT=60000 - TZ=Asia/Novosibirsk - PROXY_URL=socks5://vless-proxy:1080 # ← ключ: обход DNS-блока ports: - "8191:8191" networks: - media_net shm_size: 1gb # ← Кра́кен: 64 MB убивал Chrome sysctls: - net.ipv6.conf.all.disable_ipv6=1 ``` Поднят: `cd /mnt/RED_2TB/docker/arr && docker compose up -d flaresolverr` → `Up`, рестартов 0, логи пусты (при `LLOG_LEVEL=warning` это норма — пароли не пишутся). **Swap НЕ трогали** — Хватает RAM (21 GB total). Alex отклонил идею swap: «Памяти мало что-ли?». ### 🔑 ГЛАВНОЕ ОТКРЫТИЕ: FS нужен `PROXY_URL`, иначе он бесполезен на Тайге На Кра́кене DNS-блока нет → FS ходит в трекер напрямую. **На Тайге DNS-блок есть** → FS сам должен ходить через `vless-proxy`. Решается глобальной env **`PROXY_URL`** (НЕ `HTTPS_PROXY`): | Что | Значение | |---|---| | Переменная | **`PROXY_URL`** (проверено по DeepWiki FlareSolverr §4.2) | | Формат | **со схемой обязателен**: `socks5://vless-proxy:1080` | | Приоритет | request > session > global | | Авторизация | не нужна (`PROXY_USERNAME`/`PROXY_PASSWORD` пусты) | ⚠️ Prowlarr обращается к FS с параметром `session`; при наличии сессии request-прокси **игнорируется** → срабатывает именно global `PROXY_URL`. То есть схема A (env) — единственный рабочий вариант, request-прокси через Prowlarr передать нельзя (у Prowlarr-прокси `Socks5` только host/port/user/pass, поля «передать в FS» нет). ### Пруф работы FS (не UI — прямой HTTP) ```bash docker exec prowlarr sh -c 'curl -s --max-time 150 -X POST http://flaresolverr:8191/v1 \ -H "Content-Type: application/json" \ -d "{\"cmd\":\"request.get\",\"url\":\"https://rutracker.org/forum/login.php\",\"maxTimeout\":120000}"' # → {"status": "ok", "message": "Challenge solved!", "solution": {"status": 200, ...}} ``` Результаты прямых тестов: | URL | Ответ FS | |---|---| | `rutracker.org/forum/index.php` | ok / Challenge not detected / 200 | | `rutracker.org/forum/login.php` | ok / **Challenge solved!** / 200 | | `kinozal.me/browse.php` | ok / **Challenge solved!** / 200 | | `nnmclub.to/forum/index.php` | ok / Challenge not detected / 200 | | `sessions.create` | ok / Session created successfully / v3.5.2 | ### Prowlarr: прокси-элемент и теги | Элемент | id | Настройки | tags | |---|---|---|---| | `vless-socks5` (Socks5) | 1 | host `vless-proxy`, port `1080` | `[1]` | | `flaresolverr` (FlareSolverr) | 2 | host `http://flaresolverr:8191/`, **requestTimeout 120** | `[2]` | Теги: `proxy` = id 1, `flaresolverr` = id 2. **Индексерам нужны ОБА тега** — `proxy` (DNS-обход через SOCKS5) **и** `flaresolverr` (CF-челлендж). Навешено: | id | Индексер | tags | |---|---|---| | 1 | RuTracker | **[1, 2]** ✅ | | 5 | Kinozal | **[1, 2]** ✅ | | 6 | Kinozal (M) | **[1, 2]** ✅ | | 2 | RuTor | [1] | | 3 | Byrutor | [1] | | 4 | NoNaMe Club | [1] ⏳ **нужен [1,2]** | ### 🔴 ПИТФОЛЛ: `PUT /api/v1/indexer/N` падает 400 из-за теста FS Prowlarr при PUT **сразу тестирует** индексер. Если FS в этот момент таймаутит (или челлендж не решён), приходит **HTTP 400** с телом: ```json [{"isWarning":false,"propertyName":"","severity":"error", "errorMessage":"Unable to connect to indexer, indexer's server is unavailable. Try again later. HTTP request failed: [500:InternalServerError] [POST] at [http://flaresolverr:8191/v1]"}]} ``` Теги при этом **НЕ применяются** (остаются старые). Обход — **`?forceSave=true`**: ```bash curl -X PUT -H @/tmp/h.txt -H "Content-Type: application/json" \ -d @/tmp/ix1-new.json "http://localhost:9696/api/v1/indexer/1?forceSave=true" # → 202 (сохранил, тест пропущен) ``` ### 🔴 ПИТФОЛЛ: `requestTimeout=60` у FS-прокси МАЛО Дефолт прокси-элемента — 60 с. CF-челлендж на `/forum/login.php` в него не укладывается → `Error solving the challenge. Timeout after 60.0 seconds`, индексер краснеет. **Поднять до 120** (проверено: с 120 челлендж решается). Правка PUT-ом прокси-элемента `/2`. ### 🔴 ПИТФОЛЛ: `testall` параллельный → Chrome захлёбывается `POST /api/v1/indexer/testall` тестирует все 6 индексеров **одновременно**, а Chrome в FS — один. Часть челленджей отваливается по таймауту (ложный «blocked by CloudFlare Protection»). Прямой одиночный вызов того же URL через секунды даёт `Challenge solved!`. **Правило диагностики:** если `testall` показал Cloudflare-блок — перепроверять **одиночным** `request.get` с `maxTimeout=120000`, а не верить `testall`. Это грабля, стоившая времени. ### Результат `testall` (прогон 2026-09-28) ``` 1 RuTracker ✅ isValid=true 2 RuTor ✅ isValid=true 3 Byrutor ✅ isValid=true 6 Kinozal (M) ✅ isValid=true 4 NoNaMe Club ❌ "Unable to access nnmclub.to, blocked by CloudFlare Protection" ← нет FS-тега 5 Kinozal ❌ "Unable to access kinozal.me, blocked by CloudFlare Protection" ← гонка testall ``` ### Осталось (для следующей сессии) 1. **Навесить тег `[1,2]` на NoNaMe (id 4)** — GET → правка → PUT с `?forceSave=true`. 2. **Перепроверить Kinozal (5)** одиночным тестом — по факту FS на `kinozal.me/browse.php` даёт `Challenge solved!`, значит это была гонка testall, а не реальный блок. 3. **ПРИЁМКА ALEX:** https://prowlarr.mallexxx.duckdns.org → Indexers → Test All → зелёные. ### Бэкапы (перед изменениями) | Файл | Путь | |---|---| | compose (до правки) | `~truenas_admin/docker-compose.yml.bak-20260928-flaresolverr` (2313 B) | | индексеры (до тегов) | `~/backup-indexers-20260928-flaresolverr.json` (390701 B, на Mac) | ### Рабочая техника API-вызовов (повтор от грабель) Ключ Prowlarr в **файл** внутри контейнера + `-H @/tmp/h.txt` — иначе кавычки ломаются на уровне ssh/sh, и API отвечает **401** даже с верным ключом: ```bash docker exec prowlarr sh -c 'printf "X-Api-Key: 35c8b3f497114076a6150ea0d9504845" > /tmp/h.txt; \ printf "Content-Type: application/json" > /tmp/ct.txt' docker exec prowlarr sh -c 'curl -s -H @/tmp/h.txt http://localhost:9696/api/v1/indexer' ``` Разбор JSON — **на хосте** (`python3` в контейнере НЕТ у Prowlarr: `sh: python3: not found`). Долгие операции (`testall`) — через `docker exec -d` в фон + файл-маркер `.done`. ## Разведка (2026-09-28, всё проверено на живой машине) ### Что УЖЕ сделано (не переделывать!) Прошлый план (2026-09-26) предполагал два блока. **Блокер №2 (DNS) уже закрыт**, а с ним и большая часть Фазы 0: | Что | Факт 2026-09-28 | |---|---| | `vless-proxy` в `media_net` | ✅ есть, IP `172.16.17.6`, резолвится из prowlarr | | Прокси в Prowlarr | ✅ `vless-socks5` (id=1), Socks5, host `vless-proxy`, port `1080` | | Тег | ✅ `proxy` (id=1); навешен и на прокси, и на **все 6 индексеров** | | Работоспособность прокси | ✅ `rutracker.org` → **301**, `nnmclub.to` → **200**, `kinozal.me` → **200** | | URL индексеров | ✅ Kinozal/Kinozal(M) уже на `kinozal.me` (не мёртвый `.tv`) | | Поиск через Prowlarr | ✅ RuTor 100 + Byrutor 6 на «matrix» | `vless-proxy` **жив** (его outbound был мёртв после удаления VPS qentra.top — переключён). ### Что ОСТАЛОСЬ (суть задачи) Остаточная проблема — **не DNS, а Cloudflare**. Прямой факт: ``` GET https://rutracker.org/forum/login.php через socks5h://vless-proxy:1080 →