Files
obsidian-vault/personal/plans/flaresolverr-taiga-deploy.md
T

11 KiB
Raw Blame History

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
  → <title>Just a moment...</title> + 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 ЗАКРЫТ (2026-09-28). Схема A работает. У FlareSolverr глобальный прокси задаётся переменной PROXY_URL (НЕ HTTPS_PROXY), формат со схемой обязателен: socks5://vless-proxy:1080. Приоритет: request > session > global. ⚠️ Важно: Prowlarr обращается к FS с параметром session, а при наличии сессии request-прокси игнорируется → сработает именно global (PROXY_URL). Проверено по DeepWiki FlareSolverr §4.2. PROXY_USERNAME/PROXY_PASSWORD не нужны — vless-proxy без авторизации.

ПЛАН

Фаза 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-<ts>). Бэкап самого compose отдаёт сам: /tmp не годится (чистится).
  2. Проверить схему проксирования FS (открытый вопрос №1) — до правки compose.
  3. Добавить сервис в /mnt/RED_2TB/docker/arr/docker-compose.yml:
    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):
    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 — проверка поиска

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 отсутствует. Составлен план. Ничего не изменено.