From f0dd54cb4b170826c28525738246f8354c53eb21 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 28 Sep 2026 10:44:10 +0600 Subject: [PATCH] [2026-09-28] eagle: family/projects/media-toolbox-taiga.md personal/plans/flaresolverr-taiga-deploy.md personal/plans/lidarr-taiga-and-indexer-unblock.md personal/tech/prowlarr-flaresolverr-cloudflare.md --- family/projects/media-toolbox-taiga.md | 58 ++++++- personal/plans/flaresolverr-taiga-deploy.md | 156 ++++++++++++++++++ .../plans/lidarr-taiga-and-indexer-unblock.md | 7 + .../tech/prowlarr-flaresolverr-cloudflare.md | 35 +++- 4 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 personal/plans/flaresolverr-taiga-deploy.md diff --git a/family/projects/media-toolbox-taiga.md b/family/projects/media-toolbox-taiga.md index 7c85bdbf..e32be368 100755 --- a/family/projects/media-toolbox-taiga.md +++ b/family/projects/media-toolbox-taiga.md @@ -12,12 +12,23 @@ tags: - media - lidarr - dns + - flaresolverr + - cloudflare created: '2026-05-20' -updated: '2026-09-27' +updated: '2026-09-28' status: deployed --- # *arr Stack на Тайге — Setup & Config +> 🔴 **STATE 2026-09-28 (вечер): FlareSolverr — ПЛАН СОСТАВЛЕН, ждёт «go». НЕ УСТАНОВЛЕН.** +> Разведка подтвердила: **DNS-блокер УЖЕ ЗАКРЫТ** (прокси-маршрут настроен 2026-09-26, +> `vless-proxy` → 301/200 на трекеры, поиск RuTor 100 + Byrutor 6). Остаточная проблема — +> **Cloudflare JS-челлендж** на RuTracker / Kinozal / Kinozal (M); `IndexerStatus` карантин +> id 1/5/6. Решение — FlareSolverr. Compose `arr` **не менялся**. +> 🔴 Ключевое отличие от Кра́кена: у Тайги есть DNS-блок → **FlareSolverr сам должен ходить +> через `vless-proxy`**. Плюс два риска CrashChrome: `ShmSize=64MB` и **`Swap=0`** (`/proc/swaps` пуст). +> План, команды и открытые вопросы — [[personal/plans/flaresolverr-taiga-deploy]]. + > ✅ **STATE 2026-09-28: LIDARR РАЗВЁРНУТ — 7-й сервис стека, music-менеджер.** > Live: **`https://lidarr.mallexxx.duckdns.org`** → HTTP 200, TLS Let's Encrypt, **health ЧИСТЫЙ**. > Контейнер `lidarr` **v3.1.0.4875-ls42**, порт 8686, uid 950, `media_net` + `caddy_default`. @@ -245,6 +256,42 @@ nslookup google.com 192.168.2.2 # → OK Прокси для обхода описан в §«Prowlarr — прокси». **✅ 2026-09-26: прокси-маршрут починен** — 3 из 6 индексеров работают. Полный разбор — [[family/plans/lidarr-taiga-deploy]] Фаза 0. +### ✅ Перепроверено 2026-09-28 (важно: часть «блокеров» закрыта) + +| Проверка | Результат | +|---|---| +| `vless-proxy` в `media_net` | ✅ `172.16.17.6`, `getent hosts vless-proxy` из prowlarr OK | +| `curl -x socks5h://vless-proxy:1080 https://rutracker.org/` | ✅ **301** | +| `… https://nnmclub.to/` | ✅ **200** | +| `… https://kinozal.me/` | ✅ **200** | +| `… https://kinozal.tv/` | ❌ **000** (домен мёртв — подтверждено) | +| `GET /api/v1/indexerproxy` | `vless-socks5` id=1, Socks5, host `vless-proxy`, port 1080, tags=[1] | +| `GET /api/v1/tag` | `proxy` id=1 (таблица Tags **не пуста** — поправка к записи 2026-09-26) | +| `GET /api/v1/indexer` | все 6 `enable=true`, **tags=[1]** у всех | +| `GET /api/v1/search?query=matrix` | RuTor **100**, Byrutor **6** | +| `GET /api/v1/indexerstatus` | карантин: id **1, 5, 6** (`disabledTill` +24 ч); 2/3/4 чисты | +| `proxy-api` из `lidarr` | curl с `-x socks5h://vless-proxy:1080` | +| `docker ps -a` grep flare | **NONE** — FlareSolverr отсутствует | + +🔴 **Итог: остаточная проблема — ТОЛЬКО Cloudflare**, DNS-блок снят прокси-маршрутом. +`GET rutracker.org/forum/login.php` через прокси → `Just a moment...` +(+`challenges.cloudflare.com`) = JS-челлендж, который Prowlarr сам не проходит. +Решение — FlareSolverr → [[personal/plans/flaresolverr-taiga-deploy]]. + +🔴 **`429 TooManyRequests` от Prowlarr = карантин, не rate-limit.** Снимается +`POST /api/v1/indexer/testall`, НЕ ожиданием. Проверять `GET /api/v1/indexerstatus`. + +⚠️ **Питфолл API на Тайге (проверено 2026-09-28):** передача `X-Api-Key` через вложенный +`docker exec … sh -c 'curl -H "X-Api-Key: …"'` съедает кавычки → **401 Unauthorized**, +хотя ключ верный. 🔴 **Рабочий приём — файл-заголовок:** +```bash +docker exec prowlarr sh -c 'printf "X-Api-Key: 35c8b3f497114076a6150ea0d9504845" > /tmp/h.txt; \ + curl -s -H @/tmp/h.txt http://localhost:9696/api/v1/indexer' +``` +Внутри контейнера `python3` НЕТ (только `curl` есть в linuxserver-образах) — JSON разбирать +хостовым `python3` через файл: `docker exec … > /tmp/ix.json` → `python3 -c "…"`. +Также `wget` из busybox не умеет `-H` с кавычками — предпочитать `curl -H @file`. + ## Prowlarr — прокси для заблокированных индексеров `vless-proxy` доступен в `media_net` как `vless-proxy` (SOCKS5 **1080**, HTTP **1081**). @@ -356,6 +403,12 @@ ssh truenas_admin@mallexxx.duckdns.org "python3 /mnt/RED_2TB/docker/arr/media-pi ## История +- **2026-09-28 (вечер)** — разведка под задачу «поставить FlareSolverr как на Кра́кене, + пустить трекеры через прокси». Подтверждено, что **DNS-блокер уже закрыт** (прокси-маршрут + от 2026-09-26: rutracker 301 / nnmclub 200 / kinozal.me 200; поиск RuTor 100 + Byrutor 6). + Остаточная проблема — **Cloudflare JS-челлендж** на RuTracker/Kinozal/Kinozal(M) (карантин + `IndexerStatus` id 1/5/6). FlareSolverr отсутствует. План — [[personal/plans/flaresolverr-taiga-deploy]]. + **Ничего не изменено.** - **2026-05-20** — первоначальный деплой - **2026-09-26** — разведка под задачу «Lidarr + музыка + синк с Jellyfin». Стек жив, но **индексеры не работают с дня деплоя** (DNS-фильтр провайдера: NXDOMAIN на rutracker.org / @@ -365,7 +418,8 @@ ssh truenas_admin@mallexxx.duckdns.org "python3 /mnt/RED_2TB/docker/arr/media-pi ## Связанные заметки -- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ **активный план 2026-09-26:** Lidarr на Тайге + разблокировка индексеров (DNS-фильтр провайдера) +- [[personal/plans/flaresolverr-taiga-deploy]] — 🔴 **АКТИВНЫЙ ПЛАН 2026-09-28:** FlareSolverr на Тайге (обход Cloudflare на RuTracker/Kinozal) + снятие карантина индексера +- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ **план 2026-09-26:** Lidarr на Тайге + разблокировка индексеров (DNS-фильтр — ✅ закрыт 2026-09-28) - [[personal/tech/music-tags-repair-truenas]] — ремонт 7906 битых тегов (блокирует Music-библиотеку) - [[family/how-to/jellyfin-config]] — живой инстанс Jellyfin на Тайге - [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] — NFSv4 ACL и uid 950 diff --git a/personal/plans/flaresolverr-taiga-deploy.md b/personal/plans/flaresolverr-taiga-deploy.md new file mode 100644 index 00000000..18ab9593 --- /dev/null +++ b/personal/plans/flaresolverr-taiga-deploy.md @@ -0,0 +1,156 @@ +# FlareSolverr на Тайге + обход блокировок индексеров — план + +> **Статус: ПЛАН СОСТАВЛЕН, ЖДЁТ «GO» АЛЕКСА. НИЧЕГО НЕ ИЗМЕНЕНО.** +> Поставлено 2026-09-28: «Ставь flaresolverr как на Кра́кене, запускай трекеры через прокси +> контейнер чтобы обойти блокировки». Связано: [[personal/plans/lidarr-taiga-and-indexer-unblock]], +> [[family/projects/media-toolbox-taiga]], [[family/how-to/arr-stack-kraken]], +> [[personal/tech/prowlarr-flaresolverr-cloudflare]]. + +## Разведка (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 + → Just a moment... + challenges.cloudflare.com ← JS-челлендж +``` + +`IndexerStatus` (без снятия): карантин до `2026-09-29T02:25Z` у id **1 (RuTracker)**, **5 (Kinozal)**, +**6 (Kinozal M)**. `initialFailure = 2026-05-20` (день деплоя). + +**FlareSolverr на Тайге ОТСУТСТВУЕТ** (`docker ps -a | grep flare` → пусто). + +### Риски, которые надо закрыть ЗАРАНЕЕ (грабли Кра́кена) + +Из [[personal/tech/prowlarr-flaresolverr-cloudflare]] §2026-09-24 — там FlareSolverr ушёл +в **crash-loop**, Chrome не поднимался под chromedriver. Две причины хоста: + +| Условие | Кра́кен (сломано) | Тайга (сейчас) | Действие | +|---|---|---|---| +| `/dev/shm` | 64 MB → Chrome падал | **64 MB** (`ShmSize=67108864`) | 🔴 задать `shm_size: 1gb` | +| swap | `/proc/swaps` пуст → пик старта убивал | **`/proc/swaps` пуст, Swap=0** | 🔴 поднять swap или принять риск | +| RAM | мало | 21 GB total, **5.6 GB available** | ✅ хватает | +| IPv6 | `::1 localhost` ломал | проверить | добавить `disable_ipv6=1` (как на Кра́кене, там не помогло, но безвредно) | + +🔴 **Главное отличие от Кра́кена:** на Кра́кене FlareSolverr **проксирует через себя** и лезет +в трекер напрямую — но у Кра́кена нет DNS-блока. На Тайге **DNS-блок есть**, значит +**FlareSolverr сам должен ходить через `vless-proxy`** (иначе он получит NXDOMAIN и не поможет). +Это ключевой архитектурный пункт: у контейнера `flaresolverr` должен быть настроен upstream-прокси +на `vless-proxy:1080`. + +Проверить, поддерживает ли образ env `HTTPS_PROXY`/`SOCKS_PROXY` — у FlareSolverr есть +`PROXY`-настройки через переменные окружения и/или поле в `request.get`. Если env не работает — +передавать `proxy: {url: "socks5://vless-proxy:1080"}` в теле запроса от Prowlarr (Prowlarr +умеет это в настройках прокси-элемента? проверить — у Socks5-прокси в Prowlarr есть только +host/port/username/password, поля «передать в FS» нет). + +> ⚠️ **Открытый техвопрос №1 (блокирует выбор схемы):** как FlareSolverr узнает про `vless-proxy`. +> Вариант A — env `HTTPS_PROXY`/`HTTP_PROXY`. Вариант B — `?proxy=` в конфиге FS. +> Если ни то, ни другое — трекеры через FS всё равно получат NXDOMAIN, и схема не заработает. +> **Проверить ДО деплоя** (документация образа FlareSolverr v3.x). + +## ПЛАН + +### Фаза 0 — внешняя блокировка: ✅ ЗАКРЫТА (проверено выше) + +Ничего делать не нужно. Осталось только снять карантин (Фаза 2). + +### Фаза 1 — FlareSolverr контейнер + +1. **Бэкап** `/mnt/RED_2TB/docker/arr/docker-compose.yml` → `~truenas_admin/` + (`cp docker-compose.yml ~truenas_admin/docker-compose.yml.bak-`). + Бэкап **самого compose** отдаёт сам: `/tmp` не годится (чистится). +2. Проверить схему проксирования FS (открытый вопрос №1) — **до** правки compose. +3. Добавить сервис в `/mnt/RED_2TB/docker/arr/docker-compose.yml`: + ```yaml + flaresolverr: + image: ghcr.io/flaresolverr/flaresolverr:latest + container_name: flaresolverr + restart: unless-stopped + environment: + - LOG_LEVEL=warning # ← НЕ info: info пишет пароли трекеров в plaintext + - BROWSER_TIMEOUT=60000 + - TZ=Asia/Novosibirsk + # + прокси-переменные для обхода DNS (если схема A): + # - HTTP_PROXY=socks5h://vless-proxy:1080 + # - HTTPS_PROXY=socks5h://vless-proxy:1080 + ports: + - "8191:8191" + networks: + - media_net + shm_size: 1gb # ← Кра́кен: 64 MB убивал Chrome + sysctls: + - net.ipv6.conf.all.disable_ipv6=1 + ``` + ⚠️ `shm_size` и `sysctls` — **в блок сервиса**, не в `environment`. +4. Поднять из правильной папки: + `cd /mnt/RED_2TB/docker/arr && docker compose up -d flaresolverr` + (не через временную копию compose — name-conflict, грабля Кра́кена). +5. **Проверка живого FS** (не UI, а HTTP): + ```bash + docker exec prowlarr sh -c 'curl -s -X POST http://flaresolverr:8191/v1 \ + -H "Content-Type: application/json" \ + -d "{\"cmd\":\"request.get\",\"url\":\"https://rutracker.org/forum/index.php\",\"maxTimeout\":60000}"' + # ожидается: {"status":"ok", ... "solution":{...}} — НЕ "Challenge detected" в ответе + ``` + ⚠️ Первый старт Chrome ~20-60 с. `docker logs flaresolverr` должен показать + `Challenge solved!`, а НЕ `session not created: cannot connect to chrome`. + +**ПРИЁМКА ALEX:** `docker logs --tail 30 flaresolverr` → есть `Challenge solved!`. + +### Фаза 2 — прокси-элемент в Prowlarr + снятие карантина + +1. Добавить/обновить прокси в Prowlarr: Settings → Indexers → Add Proxy → **FlareSolverr**, + host `http://flaresolverr:8191`, tag `flaresolverr`. (`vless-socks5` остаётся отдельным + прокси для DNS-обхода; один индексер может иметь **оба** тега — проверить.) +2. Навесить тег `flaresolverr` на RuTracker(1), Kinozal(5), Kinozal(M)(6) — **тем же способом + через API**, что и `proxy` (GET → jq `.tags=[…]` → PUT). 🔴 Без одинакового тега на прокси + И индексере прокси молча не применяется. +3. Сбросить карантин: `POST /api/v1/indexer/testall`. +4. **ПРИЁМКА ALEX:** https://prowlarr.mallexxx.duckdns.org → Indexers → Test All → зелёные. + +### Фаза 3 — проверка поиска + +```bash +docker exec prowlarr sh -c 'printf "X-Api-Key: 35c8b3f497114076a6150ea0d9504845" > /tmp/h.txt' +docker exec prowlarr sh -c 'curl -s -G -H @/tmp/h.txt --data-urlencode "query=matrix" \ + --data-urlencode "type=search" http://localhost:9696/api/v1/search' | \ + python3 -c "import json,sys,collections; d=json.load(sys.stdin); \ + print(collections.Counter(x['indexer'] for x in d))" +``` +Ожидается: появляются RuTracker + Kinozal с ненулевым счётом. + +**ПРИЁМКА ALEX:** поиск в UI Prowlarr по конкретному фильму → результат от RuTracker/Kinozal. + +## Вопросы к Алексу + +1. **Схема проксирования FlareSolverr** (открытый вопрос №1 выше): проверить env-переменные + или `proxy` в теле запроса — сделаю сам, не требует решения. Решение не нужно, если вариант A сработает. +2. **Swap на Тайге (Swap=0).** На Кра́кене именно мёртвый swap + 64 MB `/dev/shm` убили Chrome. + Варианты: (A) поднять `/var/swap` на Тайге (как на Кра́кене) — надёжнее; (B) рискнуть с одним + `shm_size: 1gb` и посмотреть. **Рекомендую A+C:** поднять swap И дать shm 1gb. + ⚠️ Трогать swap — системное изменение, согласовать. + +## История + +- **2026-09-28** — разведка. Обнаружено: DNS-блокер УЖЕ закрыт (прокси настроен 2026-09-26), + остаточная проблема — Cloudflare на RuTracker/Kinozal. FlareSolverr отсутствует. Составлен план. + Ничего не изменено. diff --git a/personal/plans/lidarr-taiga-and-indexer-unblock.md b/personal/plans/lidarr-taiga-and-indexer-unblock.md index 323d5016..847750ee 100755 --- a/personal/plans/lidarr-taiga-and-indexer-unblock.md +++ b/personal/plans/lidarr-taiga-and-indexer-unblock.md @@ -232,6 +232,13 @@ RemotePathMappingCheck error ### Фаза 0 — внешняя блокировка (БЛОКЕР для всего остального) +> ✅ **ЗАКРЫТА 2026-09-28 — НЕ ВЫПОЛНЯТЬ ПОВТОРНО.** `vless-proxy` подключён к `media_net` +> (persistent, `172.16.17.6`), прокси `vless-socks5` (id=1) создан, тег `proxy` (id=1) навешен +> на все 6 индексеров. Проверено вживую: `rutracker.org` → 301, `nnmclub.to` → 200, +> `kinozal.me` → 200; поиск RuTor 100 + Byrutor 6. **Остаточная проблема — Cloudflare** +> (RuTracker/Kinozal/Kinozal M, карантин id 1/5/6), решается FlareSolverr. +> Текущий активный план: [[personal/plans/flaresolverr-taiga-deploy]]. + 1. Подключить `vless-proxy` к `media_net`: `docker network connect media_net vless-proxy` (runtime) + добавить сеть в compose `/mnt/RED_2TB/docker/vless-proxy/docker-compose.yml` (иначе потеряется при пересоздании). diff --git a/personal/tech/prowlarr-flaresolverr-cloudflare.md b/personal/tech/prowlarr-flaresolverr-cloudflare.md index 8b066ec0..9a7c1f33 100755 --- a/personal/tech/prowlarr-flaresolverr-cloudflare.md +++ b/personal/tech/prowlarr-flaresolverr-cloudflare.md @@ -1,13 +1,15 @@ --- title: Prowlarr FlareSolverr — Cloudflare-обход и починка индексеров created: '2026-09-20' -updated: '2026-09-24' +updated: '2026-09-28' type: tech namespace: personal -tags: [prowlarr, flaresolverr, cloudflare, rutracker, kinozal, torrent, arr, kraken, infra] +tags: ["prowlarr", "flaresolverr", "cloudflare", "rutracker", "kinozal", "torrent", "arr", "kraken", "taiga", "infra"] related: - "[[family/how-to/arr-stack-kraken]]" - "[[personal/projects/media-pipeline-pitfalls]]" + - "[[personal/plans/flaresolverr-taiga-deploy]]" + - "[[family/projects/media-toolbox-taiga]]" --- # Prowlarr + FlareSolverr — обход Cloudflare @@ -262,6 +264,35 @@ grep -E "^(SwapTotal|SwapFree)" /proc/meminfo 5. ⚠️ **`sudo` на Кра́кене требует TTY** — `ssh -t kraken '…'`. Без `-t`: `sudo: a password is required`. +## Применение на Тайге (2026-09-28) — ключевое отличие от Кра́кена + +Тот же FlareSolverr ставится на Тайгу, но схема **не копия один-в-один**: +[[personal/plans/flaresolverr-taiga-deploy]]. + +🔴 **На Тайге есть DNS-блок провайдера** (NXDOMAIN на rutracker.org / rutor.info / +kinozal.tv / nnmclub.to даже с 8.8.8.8), которого на Кра́кене НЕТ. Поэтому: + +- На Кра́кене FlareSolverr лезет в трекер **напрямую** — и упирается только в Cloudflare. +- На Тайге так нельзя: **FS сам получит NXDOMAIN**. Прокси-маршрут уже есть + (`vless-proxy` в `media_net`, SOCKS5 `vless-proxy:1080`; `rutracker.org` → 301 через него), + но **прокси-элемент `vless-socks5` в Prowlarr FS НЕ покрывает** — он применяется к запросам + *самого Prowlarr*. Нужно, чтобы **Chrome внутри FS тоже ходил через `vless-proxy`** + (env `HTTP_PROXY`/`HTTPS_PROXY` образа либо `proxy` в теле `request.get`). + ⏳ Схему проверить до деплоя. + +🔴 **Оба грабля-условия воспроизведены на Тайге** (там Chrome тоже упадёт): + +| Условие | Факт на Тайге 2026-09-28 | +|---|---| +| `/dev/shm` | **64 MB** (`ShmSize=67108864`) → задать `shm_size: 1gb` | +| swap | **`/proc/swaps` ПУСТ, `Swap: 0`** → Chrome не получит память на пике старта | +| RAM | 21 GB total / 5.6 GB available — ✅ хватает | +| IPv6 | проверить; на Кра́кене `disable_ipv6=1` не помог, но безвреден | + +⚠️ **Наблюдение (Тайга):** `curl` через SOCKS5 к `kinozal.tv` → `000`, к `kinozal.me` → `200`. +То есть `.tv` мёртв как домен, а не «заблокирован». Урок общий: **`000` = домен/соединение, +`403`/`Just a moment` = Cloudflare** — не смешивать диагнозы. + ## Источники - Скилл: `torrent-agent-pipeline` (§ Питфоллы), `lampac-kraken-deploy`