Files
obsidian-vault/personal/tech/lampac-torrserver.md
T

428 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TorrServer на Кра́кене — диагностика
**Дата:** 2026-09-22 · **ОБНОВЛЕНО 2026-09-22 (вечер): подтверждено Alex в UI**
**Вывод:** ✅ **TorrServer исправен. ЗАДАЧА ЗАКРЫТА.** «Торренты» пусто было по причине
🔴 **`redapi` указывал на локальный lampac**, чей JacRed отдаёт формат БЕЗ
поля `info` → PidTor падал на `torrent.info.sizeName` → NPE → 500 → кэшировался
как 503. **ИСПРАВЛЕНО**: `redapi` возвращён на `http://jac.red`.
**Приёмка Alex:** «Во! теперь появились торренты. запустил F1..» — ✅ видно в UI.
Диагноз и фикс — [[family/how-to/lampac-torrents]].
**Связано:** [[personal/tech/lampac-deployment]], [[family/how-to/lampac-torrents]],
[[personal/plans/lampac-disable-1xbet-ads]], [[personal/plans/watchlist-tmdb-missing-marker]]
---
## ✅ Статус закрытия (2026-09-22 вечер)
| Пункт | Статус |
|---|---|
| PidTor 500/503 | ✅ исправлено, `redapi=http://jac.red` |
| Приёмка в UI | ✅ Alex запустил F1 в плеере |
| Тестовая раздача `probe` | ✅ убрана сама (сброс при рестарте) |
| `min_sid` | ✅ `min_sid: 3` убран → сток `15` |
| Минус год у «Волшебный участок: Фильм» | ✅ ЗАКРЫТО — оставлено пусто (данных нет в TMDB, фильм в производстве) |
| Документация | ✅ саммари → [[family/how-to/lampac-torrents]], план снесён |
### Итог задачи (2026-09-22)
Задача про торренты **закрыта полностью**. Единственный дефект был внесён мной
(переключение `redapi` на локальный JacRed) и откачен. Разбор → саммари-док
`family/how-to/lampac-torrents.md`; детальный план `personal/plans/lampac-pidtor-503-fix.md`
снесён по требованию Alex, 8 ссылок на него перебиты.
**Онлайн НЕ гасим** — Alex запретил ([[personal/plans/lampac-disable-1xbet-ads]] не применён).
---
## Вопрос Alex
> «по просмотру: у меня есть определенные сомнения что через torrserver идут,
> там только пункт "смотреть онлайн" работает и он добавляет вотермарк и рекламу
> 1xbet - это точно с торрентов? потому что если пункт "торренты" выбрать
> при просмотре - то там пусто.»
## Ответ: сомнения Alex верны по рекламе. Но TorrServer исправен.
### Реклама 1xbet — НЕ от TorrServer
| Пункт UI | Механизм | Источник потока | Реклама |
|---|---|---|---|
| **«Торренты»** | `PidTor` → `JacRed` → magnet → `TorrServer` | P2P-раздача | **НЕТ** |
| **«Смотреть онлайн»** | `Online` + `OnlineRUS` (20 балансеров) | чужой CDN сайта | **ЕСТЬ (1xbet)** |
TorrServer не вставляет рекламу. Баннеры рисует плеер-обёртка онлайн-источника.
## 🔴 Все проверки — сырьём, не догадкой
### 1. TorrServer жив и качает
```bash
# изнутри контейнера (снаружи порт 9085 закрыт!)
docker exec lampac sh -c 'curl -s http://127.0.0.1:9085/echo'
# -> MatriX.135
```
✅ **Раздача добавилась и пошла качаться** (тест магнитом Big Buck Bunny):
```json
{"title":"probe","name":"Big Buck Bunny","hash":"dd8255ec...","stat":3,
"stat_string":"Torrent working","total_peers":343,"active_peers":7,
"connected_seeders":5,"bytes_written":6918,"bytes_read":49072,
"torrent_size":276445467}
```
⚠️ Тестовая раздача **удалена** после проверки:
`POST /ts/torrents {"action":"rem","hash":"..."}` → HTTP 200.
### 2. JacRed находит раздачи
```bash
curl -s "http://127.0.0.1:9118/api/v1.0/torrents?search=Матрица"
# HTTP 200, 74 КБ
```
Трекеры в выдаче: `kinozal`, `torrentby`, `rutor`, `rutracker`.
Магниты на месте: `magnet:?xt=urn:btih:3A44F276AA59110B5765458EA013863CFD5BFBFA`
### 3. PidTor выдаёт торренты в UI
```bash
curl -s "http://127.0.0.1:9118/lite/pidtor?title=Матрица&year=1999"
# HTTP 200, 8435 байт, 12 раздач
```
Ответ содержит рабочий торрент:
`/lite/pidtor/s61065ea115b7cc3e8db9fb5ab1f6f327f08bd1c9?tr=...`
В `/lite/events` PidTor присутствует как источник: `"name":"Pid<s>T</s>or"`.
### 4. `jac.red` резолвится
```
getent hosts jac.red -> 144.31.3.10
curl http://jac.red -> HTTP 200
```
### 5. 🔴 НО: часть фильмов отдаёт 503 ИЗ КЭША
Массовая проверка 12 позиций каталога дала **11 × HTTP 503**, 1 × HTTP 200.
При этом JacRed по тем же фильмам отдаёт раздачи:
```
F1 (2025) -> /api/v2.0/indexers/all/results -> 200, 72 раздачи (sid=203,26,18…)
Гамнет (2025) -> 200, 14 раздач (max sid=79, 6 проходят min_sid=15)
А /lite/pidtor?title=F1 -> 503 с заголовком X-Invoke-Cache: HIT
```
**`X-Invoke-Cache: HIT` + время ответа 0.0016s = ответ из памяти, запроса к
JacRed НЕ было.** Один раз источник отказал → lampac закэшировал 503 на ~40 мин.
🔴 **Диагностический признак: смотреть заголовки, не только код.**
503 ≠ «раздач нет» (тогда был бы 200 с пустым списком). 503 = отказ источника,
закэшированный процессом. Сброс — `docker restart lampac`.
## 🔴 Роли в цепочке: поиск НАРУЖУ, качание локально
```
Lampa → lampac PidTor → jac.red (ПОИСК раздач — ЧУЖОЙ хост 144.31.3.10)
→ magnet → TorrServer Кра́кена (КАЧАЕТ, локально)
→ поток /lite/pidtor/s<id>
```
⚠️ Поиск раздач **не локален** — `PidTor.redapi = "http://jac.red"`. TorrServer
только качает то, что нашёл чужой сервер. Не путать эти роли при диагностике.
### 🔴🔴 Локальный JacRed — НЕ альтернатива. Он ломает PidTor
**Проверено 2026-09-22 (стоило полной поломки):** переключение
`redapi` на `http://127.0.0.1:9118` (локальный JacRed lampac) роняет **ВСЕ**
фильмы в HTTP 500.
```
НАШ JacRed отдаёт поля: Tracker, Details, Title, Size, PublishDate,
Category, Seeders, Peers, MagnetUri
^^^ поля "info" НЕТ
jac.red отдаёт ещё: info{quality, voices[], sizeName, name, originalname,
relased}, ffprobe, languages, CategoryDesc
PidTor/Controller.cs:97:
string mediainfo = torrent.info.sizeName ?? string.Empty;
^^^^^^^^^^^^^^ info == null -> NullReferenceException -> 500
```
Локальный JacRed быстрее (0.12s против 0.35s), но **несовместим по формату**.
`redapi` обязан оставаться `http://jac.red`. Подробно:
[[family/how-to/lampac-torrents]]
## 🔴 `min_sid: 15` — второй фильтр, режущий выдачу
Реальные сиды по свежим фильмам: **1–37**. Порог 15 отсекает большинство:
```
Гамнет: из 14 раздач проходят только 6
F1: отсекаются раздачи с sid=1, 4, 7 (рабочие)
```
Понижение `min_sid` — решение Alex (низкий sid = медленнее качает).
Варианты: `1` (показывать всё) · `3..5` (компромисс) · оставить `15`.
## 🔴 Маршруты — главный питфолл разбора
TorrServer **НЕ доступен по порту 9085 напрямую** — lampac проксирует его
под префиксом **`/ts/`** на порт **9118**:
```
http://127.0.0.1:9118/ts/echo -> MatriX.135 (кто ты)
http://127.0.0.1:9118/ts/{*suffix} -> прокси на TorrServer API
http://127.0.0.1:9118/ts/stream -> воспроизведение
http://127.0.0.1:9118/ts/playlist -> плейлист
http://127.0.0.1:9118/ts/download/ -> скачивание
```
Проверять **только изнутри контейнера** (`docker exec lampac`) — снаружи
порт 9085 даёт `Connection refused`.
### Метод запроса ВАЖЕН
```
POST /ts/torrents -d '{"action":"list"}' -> 200, [] ✅ ТОЛЬКО ТАК
POST /ts/torrents с телом [] -> 400
POST /ts/torrents без тела -> 400
POST /ts/torrents с телом {} -> 400
GET /ts/torrents -> 404 (метода нет)
GET /ts/torrents/list -> 404
GET /ts/settings -> 403 (нужна авторизация ts:tspass)
```
**400 вместо 404 = маршрут существует.** Это ключевой признак при диагностике.
🔴 **Проверено 2026-09-22:** список раздач отдаёт ТОЛЬКО `-d '{"action":"list"}'`
с заголовком `Content-Type: application/json`. Пустое тело, `[]` и `{}` → 400.
Верный вызов:
```bash
ssh kraken "curl -s -m 15 -X POST http://127.0.0.1:9118/ts/torrents \
-H 'Content-Type: application/json' -d '{\"action\":\"list\"}'"
```
### Удаление раздачи
```bash
ssh kraken "curl -s -X POST http://127.0.0.1:9118/ts/torrents \
-H 'Content-Type: application/json' \
-d '{\"action\":\"rem\",\"hash\":\"<hash>\"}'"
```
⚠️ **Раздачи живут в памяти процесса TorrServer.** `docker restart lampac`
их выгружает — тестовая раздача `probe` (Big Buck Bunny), добавленная
2026-09-22, после рестарта исчезла сама, список вернулся пустым. Убирать
вручную не потребовалось.
## 🔴 Конфиг: где что лежит
### `current.conf` (эффективный, слитый из base.conf + init.conf)
```json
"TorrServer": {
"releases": "MatriX.135",
"tsport": 9085,
"defaultPasswd": "ts",
"limit_map": [{ "pattern": "^/ts/", "map": { "limit": 50, "second": 1 } }]
},
"JacRed": {
"typesearch": "webapi",
"disableJackett": true,
"webApiHost": "http://ns3bg91xvuqfvq9h.cfhttp.top",
"Red": { "trackers": ["rutracker","rutor","kinozal","nnmclub",
"megapeer","bitru","toloka","lostfilm","baibako","torrentby",
"hdrezka","selezen","animelayer","anilibria","anifilm"] }
},
"PidTor": {
"enable": true,
"enabled": false,
"redapi": "http://jac.red",
"min_sid": 15,
"torrs": null, ← README: без этого список ПУСТОЙ
"auth_torrs": null ← ...но фактически /lite/pidtor работает
}
```
⚠️ **Расхождение с README PidTor:** README говорит «пункт появляется только
если заданы `torrs`/`auth_torrs`, иначе список пустой». Фактически при `null`
`/lite/pidtor` отдал 8435 байт с рабочей раздачей. README устарел для этой
сборки (`MatriX.135`).
### API JacRed
```
GET /api/v1.0/conf -> {"apikey":true}
GET /api/v1.0/torrents?search=... -> список раздач
GET /api/v2.0/indexers/{status}/results?Query= -> JacRed/Jackett-формат
```
⚠️ `/jacred`, `/jacred/api` → **404**. Не те пути.
### Секция `TorrServer.settings.json` (data/ts/)
```json
{"BitTorr": {"CacheSize": 100663296, "ConnectionsLimit": 25,
"DisableDHT": false, "DisablePEX": false, "DisableTCP": false,
"EnableIPv6": false, "PreloadCache": 0, "ReaderReadAHead": 83,
"TorrentDisconnectTimeout": 180, "TorrentsSavePath": "",
"UseDisk": false, "RetrackersMode": 1}}
```
## Питфоллы сессии
1. 🔴 **`/media/movies-radarr` — два разных каталога.** Снаружи `/media/movies-radarr`
это SD-пустышка (0 файлов). Реальный путь Radarr = монтируется ИЗ ДРУГОГО
диска: `/srv/dev-disk-by-uuid-49e8f586-…/media/movies-radarr` (17 каталогов).
Отдельный диск от lampac (`6194539b`). Проверять `docker inspect` маунты,
а не `find` по наружному пути.
2. 🔴 **`setsid nohup` НЕ спасает от ssh-обрыва.** Прогон генератора дважды
умирал (`client_loop: send disconnect: Broken pipe`). Рабочее решение —
`systemd-run --user --unit=<name> --scope <script>`: отвязывает от сессии.
3. 🔴 **`strings` в контейнере не даёт маршрутов TS** — пустой вывод. Смотреть
`README.md` модуля и **пробовать запросы** (404 vs 400), а не парсить бинарник.
4. 🔴 **`vast.js` и `modification.js` — НЕ источники рекламы.** VASTPlayer
не подключён в `sisi/index.html`; `modification.js` (22 КБ) даёт 0 совпадений
на `1xbet|vast|adTag`, домены только `w3.org`. Реклама от онлайн-источников.
## Итог: что реально делает «Смотреть онлайн» vs «Торренты»
```
«Смотреть онлайн» = 20 источников из /lite/events. Из них ТОРРЕНТНЫЙ — РОВНО ОДИН:
Pid<s>T</s>or http://127.0.0.1:9118/lite/pidtor balanser=pidtor
Остальные 19 — онлайн-балансеры (чужой CDN, реклама 1xbet):
Filmix · pizdatoehd · Kinobase · Phantom · Kinogo · AniDub · LeProduction ·
VeoVeo · Collaps · HDVB · Rutube · VK Видео · Kinoteatr.kg · Vibix ·
Kinotochka · Eneyida · UaKino · UAFilm · Geosaitebi
```
**Отдельного пункта «Торренты» в `/lite/events` НЕТ** — это не источник, а
интерфейс выбора раздачи внутри PidTor. Путь в UI:
карточка → «Смотреть онлайн» → **PidTor** → список раздач → выбор качества.
```bash
# проверка количества раздач на фильме из терминала
ssh kraken 'curl -s "http://127.0.0.1:9118/lite/pidtor?title=Матрица&year=1999" \
| grep -c data-json=' # -> 12
# пакетная проверка позиций каталога
python3 /tmp/probe_pidtor_batch.py
```
### Если пусто — порядок проверки (по реальной причине, 2026-09-22)
0. **СНАЧАЛА проверить `redapi`:**
`docker exec lampac sh -c 'grep -o "\"redapi\": \"[^\"]*\"" /lampac/current.conf'`
→ должно быть `http://jac.red`. Если `127.0.0.1:9118` — PidTor отдаст 500 (см. выше)
1. `curl -i "…/lite/pidtor?title=<название>&year=<год>"` — **смотреть заголовки**:
`X-Invoke-Cache: HIT` → это кэш, лечение `docker restart lampac`
2. **500** → реальная ошибка (чаще всего `info`-несовместимость источника)
3. **503** → источник отказал, кэш держит ~45 мин (`extend: 2700`)
4. **200, но 0 раздач** → реально нет раздач у трекеров
5. `min_sid: 15` (сток) — сиды < 15 отсекаются (свежие фильмы часто 1–37)
### 🔴 Порядок сброса кэша (если 503 застрял)
Кэш переживает `docker restart` — он на диске:
```bash
H=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac
docker stop lampac
cp -r "$H/cache/fdb" /tmp/fdb-backup-$(date +%Y%m%d-%H%M%S)/ # бэкап обязателен
rm -rf "$H/cache/fdb"; mkdir -p "$H/cache/fdb"
docker start lampac
```
⚠️ После чистки 503 сменится на **500** — это признак, что кэш больше не маскирует
настоящую причину. Дальше искать причину 500 (пункт 2 выше), а не радоваться.
---
## 🔴 «Волшебный участок: Фильм» — `year: null`. НЕ БАГ, данных нет в источнике
**Дата разбора:** 2026-09-22 · **Статус:** ✅ **ЗАКРЫТО. Оставлено пусто (решение Alex).**
### Сырьё
`watchlist.json` (единственная позиция без года из 376):
```json
{
"name": "Волшебный участок: Фильм",
"original": "Волшебный участок: Фильм",
"year": null, <- год отсутствует
"rating": 0.0,
"image": "", <- 🔴 постера ТОЖЕ нет
"href": "https://www.themoviedb.org/movie/1272100"
}
```
### Что реально отдаёт TMDB по ID 1272100
```bash
curl "https://api.themoviedb.org/3/movie/1272100?api_key=$TMDB_KEY&language=ru-RU"
```
```
ru-RU: title='Волшебный участок: Фильм' original_title='Волшебный участок: Фильм'
en-US: title='The Magic District. The Movie'
release_date = '' <- ПУСТО
status = 'In Production' <- 🔴 ФИЛЬМ ЕЩЁ НЕ ВЫШЕЛ
poster_path = None / poster=False <- постера нет
runtime = 0 imdb_id = None vote_average = 0.0
```
TMDB поиск по названию подтверждает: ровно один результат, `id=1272100`.
### Вывод: генератор работает правильно
`release_date` пуст **у самого TMDB**, потому что фильм в производстве.
Генератор честно пишет `null`. Это не дефект `tmdb_details()`.
Кинопоиск как fallback **не подходит**: запрос
`kinopoiskapiunofficial.tech/api/v2.1/films/search-by-keyword?keyword=Волшебный участок`
вернул **HTTP 400 Bad Request** (баг API на `:keyword`-маршруте). Плюс
КП-карточки фильма может ещё не существовать — сериал есть, фильм в производстве.
### Решение: НЕ ВЫДУМЫВАТЬ год
| Вариант | Оценка |
|---|---|
| **Оставить `null` (рекомендовано)** | ✅ не выдумываем данные; когда фильм выйдет — TMDB отдаст `release_date`, генератор подхватит сам |
| Заполнить год вручную | ❌ премьера неизвестна → выдуманный год хуже пустоты |
| Год из КП как fallback | ❌ КП отдаёт 400; ~30-40 мин работы, риск сломать резолв |
**Косметическая опция (если Alex захочет, ~15 мин):** выводить `"скоро"`
вместо пустого года при `status == "In Production"`.
**Правило «фильм есть → добавлять» соблюдено:** позиция в каталоге, карточка
откроется, торренты найдутся когда фильм выйдет.
**Решение Alex (2026-09-22):** «Ок, закрывай задачу» — оставлено как есть,
косметику `"скоро"` не делаем. Вопрос закрыт.
### Питфолл: где лежат ключи TMDB/KP
```
🔴 .env в $H/lampac/ НЕТ — ключи в $H/watchlist-sync/.env
(TMDB_KEY, KP_KEY). Генератор читает через load_env() — 5 мест поиска.
```
### Питфолл: пути на Кра́кене
```
🔴 HDD lampac = /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f
НЕ ...6194539b-ec7d-4b5e-9cb2-2a4e0b0a3a1a (этот UUID не существует)
watchlist.json = $H/lampac/wwwroot/watchlist.json (376 записей)
боевой .md = $H/obsidian/family/documents/movies-watchlist.md
скрипты = $H/lampac/scripts/{gen_watchlist.py,mark_missing.py}
```
⚠️ `find /srv -name watchlist.json` — единственный надёжный способ уточнить путь;
UUID в памяти/доках может быть устаревшим или обрезанным.