diff --git a/family/projects/media-toolbox-taiga.md b/family/projects/media-toolbox-taiga.md index e32be368..ed718659 100755 --- a/family/projects/media-toolbox-taiga.md +++ b/family/projects/media-toolbox-taiga.md @@ -316,7 +316,13 @@ docker exec prowlarr sh -c 'printf "X-Api-Key: 35c8b3f497114076a6150ea0d9504845" > | 6 | Kinozal (M) | ❌ `blocked by CloudFlare Protection` | > > RuTracker: `GET /forum/index.php` → **200**, `POST /forum/login.php` → **403 Cloudflare JS-challenge**. -> Остаточная проблема — Cloudflare, НЕ DNS. Решение — FlareSolverr (не установлен, ждём решение Alex). +> Остаточная проблема — Cloudflare, НЕ DNS. +> ✅ **РЕШЕНО 2026-09-28: FlareSolverr развёрнут.** Прокси-элемент `flaresolverr` (id=2, host +> `http://flaresolverr:8191/`, `requestTimeout=120`), теги `[1,2]` на RuTracker/Kinozal/Kinozal(M). +> FS ходит через `vless-proxy` через env **`PROXY_URL=socks5://vless-proxy:1080`**. +> Пруф: `rutracker.org/forum/login.php` → `Challenge solved!` 200. Полный разбор — +> [[personal/plans/flaresolverr-taiga-deploy]]. +> ⏳ **Осталось:** тег FS на NoNaMe (id 4); перепроверить Kinozal (5) одиночным тестом. > > 🔴 **Важно для RuTracker/Kinozal: `kinozal.tv` МЁРТВ** (NXDOMAIN даже на выходной стороне прокси) — > использовать `kinozal.me` (через прокси → 200). @@ -325,12 +331,12 @@ docker exec prowlarr sh -c 'printf "X-Api-Key: 35c8b3f497114076a6150ea0d9504845" | id | Имя | Примечание | |-----|-----|-----------| -| 1 | RuTracker | через прокси; ⚠️ Cloudflare-челлендж на логине | +| 1 | RuTracker | через прокси **+ FlareSolverr**; ✅ работает (2026-09-28) | | 2 | RuTor | через прокси; ✅ работает | | 3 | Byrutor | через прокси; ✅ работает; `enableRss: false` | -| 4 | NoNaMe Club | через прокси; ✅ работает | -| 5 | Kinozal | через прокси; ⚠️ Cloudflare Protection; URL должен быть `kinozal.me` | -| 6 | Kinozal (M) | через прокси; ⚠️ Cloudflare Protection; магнет, без grab limit — предпочтительный | +| 4 | NoNaMe Club | через прокси; ✅ работает (FS-тег не навешен — не требуется) | +| 5 | Kinozal | через прокси **+ FlareSolverr**; ✅ `Challenge solved!` на `kinozal.me/browse.php` | +| 6 | Kinozal (M) | через прокси **+ FlareSolverr**; ✅ из 6/6 ключевое — `isValid=true` | `preferMagnetUrl: true` для всех → нет дневного лимита на .torrent. diff --git a/personal/plans/flaresolverr-taiga-deploy.md b/personal/plans/flaresolverr-taiga-deploy.md index f463c385..9498b595 100755 --- a/personal/plans/flaresolverr-taiga-deploy.md +++ b/personal/plans/flaresolverr-taiga-deploy.md @@ -1,10 +1,171 @@ # FlareSolverr на Тайге + обход блокировок индексеров — план -> **Статус: ПЛАН СОСТАВЛЕН, ЖДЁТ «GO» АЛЕКСА. НИЧЕГО НЕ ИЗМЕНЕНО.** -> Поставлено 2026-09-28: «Ставь flaresolverr как на Кра́кене, запускай трекеры через прокси -> контейнер чтобы обойти блокировки». Связано: [[personal/plans/lidarr-taiga-and-indexer-unblock]], +> **Статус: ✅ РАЗВЁРНУТ 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, всё проверено на живой машине) diff --git a/personal/plans/lidarr-taiga-and-indexer-unblock.md b/personal/plans/lidarr-taiga-and-indexer-unblock.md index 847750ee..8cc1b84a 100755 --- a/personal/plans/lidarr-taiga-and-indexer-unblock.md +++ b/personal/plans/lidarr-taiga-and-indexer-unblock.md @@ -22,7 +22,10 @@ related: --- # Lidarr на Тайге + разблокировка индексеров — план -> **Статус: ПЛАН СОСТАВЛЕН, ЖДЁТ ОТВЕТОВ АЛЕКСА на 2 вопроса. НИЧЕГО НЕ ТРОНУТО.** +> **Статус Фазы 0: ✅ ЗАКРЫТА 2026-09-28.** DNS-блок обойдён через `vless-proxy` (SOCKS5), +> Cloudflare — через **FlareSolverr** (развёрнут 2026-09-28). Остаток: тег FS на NoNaMe, +> проверка Kinozal. Полный разбор — [[personal/plans/flaresolverr-taiga-deploy]]. +> Lidarr уже развёрнут (см. [[family/plans/lidarr-taiga-deploy]] §2026-09-28). > Задача поставлена 2026-09-26: «поставить lidarr в дополнение к sonarr/prowlarr, настроить на музыку, > синк с jellyfin, проверка что весь стек живой». > Разведка выполнена, найдены 2 блокера, план ниже. diff --git a/personal/tech/prowlarr-flaresolverr-cloudflare.md b/personal/tech/prowlarr-flaresolverr-cloudflare.md index 9a7c1f33..c4289c21 100755 --- a/personal/tech/prowlarr-flaresolverr-cloudflare.md +++ b/personal/tech/prowlarr-flaresolverr-cloudflare.md @@ -299,3 +299,48 @@ kinozal.tv / nnmclub.to даже с 8.8.8.8), которого на Кра́ке - Живой разбор: [[family/how-to/arr-stack-kraken]] — секции про починку индексера 2026-09-20 - Слой PidTor/кэш: [[personal/tech/lampac-torrserver]] §«2026-09-24» - Каталог/конфиг lampac: [[personal/tech/lampac-deployment]] + +## 🔵 2026-09-28: перенос схемы на Тайгу — FlareSolverr ЗА DNS-блоком + +Развёрнут FlareSolverr на **Тайге** ([[personal/plans/flaresolverr-taiga-deploy]]) — там +к Cloudflare добавляется **DNS-фильтр провайдера** (NXDOMAIN на трекеры). Это меняет схему: + +``` +Kraken: Prowlarr → FlareSolverr → трекер (DNS-блока нет, прямой выход) +Taiga: Prowlarr → FlareSolverr → vless-proxy → трекер (FS сам должен ходить через прокси) +``` + +🔑 **Ключевая деталь, которой нет в схеме Кра́кена:** FlareSolverr сам должен ходить через +прокси, иначе получит NXDOMAIN и не поможет вообще. Задаётся **глобальной env `PROXY_URL`** +(НЕ `HTTPS_PROXY`/`HTTP_PROXY` — их FS не читает): + +```yaml + flaresolverr: + environment: + - PROXY_URL=socks5://vless-proxy:1080 # ← схема обязательна; socks5h не нужен, FS резолвит сам + - LOG_LEVEL=warning + shm_size: 1gb +``` + +Приоритет прокси у FS: `request` > `session` > `global`. Prowlarr зовёт FS с `session` → +request-прокси игнорируется, срабатывает именно global. Передать прокси из Prowlarr нельзя +(у Socks5-элемента только host/port/user/pass). + +### Дополнительные питфоллы, найденные на Тайге + +1. 🔴 **`requestTimeout` у FS-прокси в Prowlarr по умолчанию 60 с — МАЛО.** CF-челлендж на + `/forum/login.php` не укладывается → `Error solving the challenge. Timeout after 60.0 seconds`. + **Ставить 120.** Правка: PUT `/api/v1/indexerproxy/2` с `fields[requestTimeout].value=120`. +2. 🔴 **`PUT /api/v1/indexer/N` возвращает 400, если тест FS в этот момент не прошёл** — Prowlarr + валидирует сразу при сохранении. Тело: `Unable to connect to indexer ... [500:InternalServerError] + [POST] at [http://flaresolverr:8191/v1]`. **Теги при этом НЕ применяются.** Обход — + **`?forceSave=true`** → 202. Иначе будет казаться, что тег «не навешивается». +3. 🔴 **`POST /api/v1/indexer/testall` идёт ПАРАЛЛЕЛЬНО, а Chrome в FS один** → часть челленджей + отваливается, индексер показывает ложный `blocked by CloudFlare Protection`. **Проверять + одиночным `request.get` с `maxTimeout=120000`**, а не верить `testall`. +4. ⚠️ **Индексеру могут понадобиться ДВА тега** — `proxy` (DNS-обход) **и** `flaresolverr` + (CF-челлендж). Один прокси не решает оба блока. На Кра́кене достаточно одного (только CF). +5. ⚠️ **Ключ API в файл + `-H @/tmp/h.txt`** внутри контейнера. Прямая передача `-H "X-Api-Key: $K"` + через вложенный `ssh`+`sh -c` ломается на кавычках → **401** при верном ключе. +6. ⚠️ `python3` в контейнере Prowlarr **нет** — JSON разбирать на хосте. Долгие вызовы — + `docker exec -d` в фон + файл-маркер `.done`.