174 lines
7.8 KiB
Markdown
Executable File
174 lines
7.8 KiB
Markdown
Executable File
---
|
||
title: FlareSolverr на TrueNAS Taiga
|
||
created: '2026-09-20'
|
||
updated: '2026-09-29'
|
||
type: tech
|
||
namespace: personal
|
||
tags: [flaresolverr, prowlarr, rutracker, taiga, truenas]
|
||
related:
|
||
- "[[family/how-to/arr-stack-taiga]]"
|
||
---
|
||
|
||
# FlareSolverr на TrueNAS Taiga
|
||
|
||
Рабочая документация FlareSolverr для arr-стека Taiga. Общая эксплуатация стека находится в [[family/how-to/arr-stack-taiga]]. Kraken здесь не описывается.
|
||
|
||
## Рабочая схема
|
||
|
||
```text
|
||
Prowlarr
|
||
└─ tags [proxy, flaresolverr]
|
||
└─ FlareSolverr :8191
|
||
└─ Chrome session prowlarr
|
||
└─ socks5://vless-proxy:1080
|
||
└─ 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
|
||
/mnt/RED_2TB/docker/arr/docker-compose.yml
|
||
/mnt/RED_2TB/docker/arr/flaresolverr-entrypoint.sh
|
||
/mnt/RED_2TB/docker/arr/prowlarr/
|
||
```
|
||
|
||
## Почему нужен entrypoint
|
||
|
||
Одного `PROXY_URL` недостаточно. FlareSolverr применяет proxy при создании browser session. Если session создана до настройки proxy, последующие `request.get` с той же session продолжают работать без proxy.
|
||
|
||
Entrypoint при каждом старте:
|
||
|
||
1. ждёт FlareSolverr `/health`;
|
||
2. удаляет старую session `prowlarr`, если она есть;
|
||
3. создаёт `prowlarr` с `socks5://vless-proxy:1080`;
|
||
4. читает credentials RuTracker из `prowlarr.db` через SQLite URI `mode=ro&immutable=1`;
|
||
5. делает pre-login через 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`.
|
||
|
||
## Compose-настройки
|
||
|
||
Минимально необходимые параметры:
|
||
|
||
```yaml
|
||
environment:
|
||
- LOG_LEVEL=warning
|
||
- BROWSER_TIMEOUT=180000
|
||
- PROXY_URL=socks5://vless-proxy:1080
|
||
- TZ=Asia/Novosibirsk
|
||
shm_size: 1gb
|
||
restart: unless-stopped
|
||
```
|
||
|
||
Entrypoint и Prowlarr config directory подключаются read-only. Не хранить credentials или API keys в compose и Obsidian.
|
||
|
||
В Prowlarr для RuTracker:
|
||
|
||
```text
|
||
proxy tag = [1]
|
||
flaresolverr tag = [2]
|
||
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.
|
||
|
||
## Правильная проверка
|
||
|
||
Проверка session:
|
||
|
||
```bash
|
||
curl -fsS -H 'Content-Type: application/json' \
|
||
-d '{"cmd":"sessions.list"}' http://127.0.0.1:8191/v1
|
||
```
|
||
|
||
Должны быть `status=ok` и `prowlarr`.
|
||
|
||
Проверка login должна смотреть cookies, а не размер HTML:
|
||
|
||
```text
|
||
solution.cookies содержит bb_session
|
||
```
|
||
|
||
Большая HTML-страница может быть страницей ошибки Chromium и не означает login.
|
||
|
||
Функциональная приёмка — реальный search Prowlarr:
|
||
|
||
```bash
|
||
curl -H "X-Api-Key: $PROWLARR_KEY" \
|
||
'http://127.0.0.1:9696/api/v1/search?query=radiohead&type=search&indexerIds=1'
|
||
```
|
||
|
||
`POST /api/v1/indexer/test` не использовать как единственное доказательство: при передаче объекта из API password может быть `********`, что даёт ложный `Auth Failed`.
|
||
|
||
## Диагностика
|
||
|
||
1. `docker compose ps` — контейнеры живы.
|
||
2. `curl /health` — FlareSolverr отвечает.
|
||
3. `sessions.list` — session существует.
|
||
4. Проверить `bb_session` в `solution.cookies`.
|
||
5. Проверить логи `vless-proxy` на `rutracker.org:443`.
|
||
6. Выполнить одиночный реальный search, не `testall`.
|
||
|
||
Параллельный `testall` перегружает один Chrome и создаёт ложные timeout. Challenge может занимать больше минуты, поэтому timeout 60 секунд недостаточен.
|
||
|
||
## Перезапуск
|
||
|
||
```bash
|
||
ssh truenas_admin@mallexxx.duckdns.org \
|
||
'cd /mnt/RED_2TB/docker/arr && docker compose config -q && docker compose up -d --force-recreate flaresolverr'
|
||
```
|
||
|
||
После 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 единственным тестом.
|
||
|
||
## Итоговый рабочий результат
|
||
|
||
На 2026-09-29 после полного рестарта Taiga:
|
||
|
||
- FlareSolverr session `prowlarr` создаётся с proxy и pre-login.
|
||
- Прямой запрос через session получает `bb_session`.
|
||
- После полного restart: RuTracker — 50 результатов без ошибок; Kinozal — 14 результатов без ошибок.
|
||
- Три последовательных proxy-запроса получают один egress-IP.
|
||
- Искусственно удалённая FlareSolverr session автоматически восстановлена и снова logged-in.
|
||
- Ошибки Lidarr/SkyHook не относятся к FlareSolverr; их routing описан в [[family/how-to/arr-stack-taiga]].
|