[2026-09-23] eagle: family/how-to/kraken-network.md family/projects/watchlist-automation.md personal/plans/lampac-watched-to-watchlist.md
This commit is contained in:
1 parent
eff4dd9c9d
commit
2806307c50
3 files changed
+188
-18
No files matched your search
@@ -177,9 +177,20 @@ KP-ID (`kinopoisk.ru/film/`, 68 штук в `.md`) в цепочке **не уч
|
||||
Почему так, а не «писать в Jellyfin»: Jellyfin не источник просмотров и не имеет
|
||||
файлов для большинства позиций. Единственный честный источник — Lampa.
|
||||
|
||||
**Статус на конец сессии:** план готов, код **не написан**. Разведка закрыта
|
||||
(цепочка проверена, одна живая запись прогнана — матч дал 0, потому что фильм
|
||||
вне вотчлиста; это ожидаемо, не баг).
|
||||
**Статус на конец сессии 2026-09-23:**
|
||||
- ✅ Разведка закрыта, цепочка матча проверена живой записью.
|
||||
- ✅ План написан, исправлен по фактам (порог, хостовый путь БД, `.14`/`.15`).
|
||||
- ✅ Закоммичены висевшие незакоммиченными фиксы сирот (`ffe7974`).
|
||||
- ❌ **Код `sync_from_lampac.py` НЕ написан.**
|
||||
- ⏳ Блокер: точный порог `percent` требует **живого досмотра** в Lampa
|
||||
(см. §7) — без него шаг 6 не закрыть.
|
||||
- ⏳ Не сделано: бэкап (шаг 1), `.env` (шаг 4), крон (шаг 5), доки (шаг 7).
|
||||
|
||||
**Порядок следующей сессии:** шаг 8 (прогнать `/tmp/probe_match.py`, убедиться
|
||||
что матч находит хоть одну позицию) → шаг 1 (бэкап) → шаг 2 (код) →
|
||||
шаг 3 (dry-run на копии) → шаги 4-7.
|
||||
⚠️ Шаг 8 стоит ПЕРВЫМ не случайно: если матч даёт 0 совпадений, писать код
|
||||
бессмысленно — сначала чинить матч.
|
||||
|
||||
---
|
||||
|
||||
@@ -190,8 +201,8 @@ KP-ID (`kinopoisk.ru/film/`, 68 штук в `.md`) в цепочке **не уч
|
||||
2. **Новый файл** `watchlist_sync/sync_from_lampac.py`:
|
||||
- читает БД по пути из env `LAMPAC_TIMECODE_DB` (default
|
||||
`/lampac/database/TimeCode.sql`; хост-путь подставить в `.env`);
|
||||
- отбирает `deleted = 0` **И** `percent > 0` **И** `watched_at > 0`
|
||||
(см. 1.4 — «просмотрено» = `watched_at`, не `percent`);
|
||||
- отбирает `deleted = 0` **И** `percent >= ПОРОГ`
|
||||
(см. 1.4 — критерий пересмотрен: **по `percent`, НЕ по `watched_at`**);
|
||||
- `identity` → `tmdb_id`; форматы `movie-674`, `674_movie`, `tv-1851-s1e2`;
|
||||
на этапе 1 только фильмы, `tv-*` пропускать;
|
||||
- `position`/`duration`/`percent` выводить в лог для отладки — по ним видно,
|
||||
@@ -305,19 +316,26 @@ Vault git чистый. Записано в [[family/projects/watchlist-automati
|
||||
в `~/logs/` (`watchlist-catalog.log`, `watchlist-cleanup.log`). Фикс (перенести
|
||||
в `~/logs/`) предложен, ждёт команды Alex.
|
||||
|
||||
### 8.3 ✅ Уточнено: `192.168.1.15` НЕ мёртвый — это тот же Кра́кен
|
||||
### 8.3 ✅ Уточнено: `.14` = провод, `.15` = WiFi. Оба — один Кра́кен
|
||||
|
||||
🔴 **Изменено 2026-09-23 (поздняя правка). Предыдущая версия этого раздела
|
||||
утверждала «`.15` мёртвый» — ЭТО НЕВЕРНО, ошибка снятия одного таймаута за факт.**
|
||||
|
||||
**Alex уточнил:** `192.168.1.15` — **WiFi** (`wlan0`), `192.168.1.14` — **провод**
|
||||
(`eth0`). Ходим по `.14`. Термин «мёртвый» был моим ложным выводом.
|
||||
|
||||
Проверено:
|
||||
```
|
||||
$ ping -c 2 192.168.1.15 → 0% loss, 5.5 ms avg
|
||||
$ ssh kraken@192.168.1.15 → hostname = kraken
|
||||
hostname -I = 192.168.1.14 192.168.1.15 10.99.1.2 172.21.0.1 …
|
||||
$ ssh kraken@192.168.1.14 → ALIVE_14
|
||||
|
||||
на Кра́кене:
|
||||
eth0 UP 192.168.1.14/24 metric 100 ← основной, default route
|
||||
wlan0 UP 192.168.1.15/24 metric 600
|
||||
```
|
||||
Кра́кен **имеет оба адреса**, оба живые, это одна и та же машина.
|
||||
Оба варианта работают: `ssh kraken` (→ `.15`) и `ssh kraken@192.168.1.14`.
|
||||
Кра́кен **имеет оба адреса**, это одна и та же машина.
|
||||
|
||||
**Настоящая причина обрывов** — не адрес, а **перегрузка sshd**:
|
||||
первые подключения падали при `load average: 4.69` (после ребута поднимались
|
||||
@@ -325,16 +343,86 @@ $ ssh kraken@192.168.1.15 → hostname = kraken
|
||||
`Connection timed out during banner exchange`. Лечится повтором и короткими
|
||||
командами, а не сменой адреса.
|
||||
|
||||
⚠️ **Дополнительный источник обрывов (подтверждён 2026-09-23):** ЛЮБАЯ команда
|
||||
с `sudo` через SSH требует `< /dev/null`, иначе соединение рвётся. См.
|
||||
`family/how-to/truenas-infrastructure.md` / skill `home-network-config`.
|
||||
|
||||
**Обход, который реально помогает:**
|
||||
- короткие `ssh`-команды, тяжёлое — файлом-скриптом;
|
||||
- не собирать `ssh` + тяжёлый `jq` в одну строку (180 KB json = обрыв);
|
||||
- `ssh kraken` штатно работает, `192.168.1.14` — равноценный явный путь.
|
||||
- `sudo` всегда с `< /dev/null`.
|
||||
|
||||
⚠️ **WG-туннель до Кра́кена не поднят:** интерфейса с `10.99.0.2` на Mac нет,
|
||||
`nc 10.99.1.2 22` → FAIL. Proxy-команда в `~/.ssh/config` уходит в ветку
|
||||
`nc kraken 22`. Само по себе это не ломает (Кра́кен доступен по LAN),
|
||||
но объясняет, почему прокси не используется.
|
||||
|
||||
### 8.3.1 🔴 DNS-имя `kraken` на роутере указывало на WiFi `.15` — ИСПРАВЛЕНО
|
||||
|
||||
**Симптом:** `ssh kraken` (по имени) шёл на `.15` — то есть на WiFi-интерфейс.
|
||||
Когда он оказывался DOWN, `ssh kraken` переставал работать вовсе.
|
||||
|
||||
**Причина — ДВА конфликтующих источника имени на роутере ASUS RT-AC68U:**
|
||||
|
||||
```
|
||||
$ nvram get dhcp_staticlist
|
||||
<12:42:0C:E6:31:0F>192.168.1.51>orangepizero>
|
||||
<B0:6E:BF:60:6D:64>192.168.1.86>htpc>
|
||||
<84:25:19:74:A6:B3>192.168.1.80>>samsung_printer
|
||||
<54:77:87:CE:FB:B3>192.168.1.75>lgtv>
|
||||
<2C:CF:67:64:03:F3>192.168.1.14>kraken> ← eth0, ИМЯ kraken
|
||||
<2C:CF:67:64:03:F4>192.168.1.15>kraken> ← wlan0, ИМЯ kraken (дубль!)
|
||||
|
||||
$ cat /jffs/configs/dnsmasq.conf.add
|
||||
address=/kraken/192.168.1.15 ← жёстко на WiFi
|
||||
```
|
||||
Оба интерфейса несли **одно имя** `kraken`, плюс статический `address=` на `.15`.
|
||||
|
||||
🔴 **Ключевой питфолл: живая DHCP-лиза ПЕРЕБИВАЕТ `address=`.** Активная лиза
|
||||
wlan0 с именем `kraken` (`/var/lib/misc/dnsmasq.leases`) приоритетнее статической
|
||||
записи. Удаление строки лизы не помогает — dnsmasq перезаписывает её из nvram
|
||||
при рестарте, а клиент при DHCP-запросе сам представляется `kraken` (hostname
|
||||
хоста один на оба интерфейса).
|
||||
|
||||
**Что сделано на роутере (2026-09-23):**
|
||||
```bash
|
||||
# 1. Бэкапы
|
||||
nvram get dhcp_staticlist > /jffs/dhcp_staticlist.bak.20260923-214309
|
||||
cp /jffs/configs/dnsmasq.conf.add /jffs/configs/dnsmasq.conf.add.bak.20260923-214309
|
||||
cp /var/lib/misc/dnsmasq.leases /jffs/dnsmasq.leases.bak.<ts>
|
||||
|
||||
# 2. Убрано дублирующее имя у wlan0-лиза (ip остался)
|
||||
nvram set dhcp_staticlist="…<2C:CF:67:64:03:F3>192.168.1.14>kraken><2C:CF:67:64:03:F4>192.168.1.15>>"
|
||||
nvram commit
|
||||
|
||||
# 3. Статический address переведён на провод
|
||||
# /jffs/configs/dnsmasq.conf.add:
|
||||
address=/kraken/192.168.1.14 ← было .15
|
||||
service restart_dnsmasq
|
||||
```
|
||||
|
||||
**Результат:** активный `/etc/dnsmasq.conf:46` = `address=/kraken/192.168.1.14`
|
||||
✅. Но `dig +short kraken @192.168.1.1` **всё ещё отдаёт `.15`** — живая лиза
|
||||
wlan0 с именем `kraken` держится, пока аренда не истечёт / роутер не
|
||||
перезагрузится. **Правки в nvram применятся после перезагрузки роутера.**
|
||||
|
||||
⚠️ **Перезагрузку роутера НЕ делал** — ждёт решения Alex (роутер уйдёт из сети
|
||||
на 1-2 мин, WiFi в доме пропадёт). Сейчас это не мешает: `wlan0` снова UP,
|
||||
`.15` отвечает, `ssh kraken` работает.
|
||||
|
||||
⚠️ **`netplan` на Кра́кене НЕ правился.** Идея была убрать отправку hostname
|
||||
у `wlan0` (`dhcp4-overrides: send-hostname: false`) в `/etc/netplan/30-wlan0.yaml`,
|
||||
но правку отменили — риск потери доступа перевесил. Файл нетронут.
|
||||
|
||||
**Проверка:**
|
||||
```bash
|
||||
dig +short kraken @192.168.1.1 # сейчас .15, после ребута роутера → .14
|
||||
ssh kraken 'echo OK' # работает через .15 (WiFi)
|
||||
ssh kraken@192.168.1.14 'echo OK' # работает через провод
|
||||
```
|
||||
Бэкапы на роутере: `/jffs/dhcp_staticlist.bak.20260923-214309`,
|
||||
`/jffs/configs/dnsmasq.conf.add.bak.20260923-214309`.
|
||||
|
||||
### 8.4 🔴 `TimeCode.sql` НЕ на хосте — только внутри контейнера, и НЕ на volume
|
||||
|
||||
🔴 **Критично для реализации. Предыдущая версия плана называла хостовый путь
|
||||
@@ -379,7 +467,7 @@ compose, **без пересоздания контейнера без разр
|
||||
`_mark_watched` в `sync_up.py` **уже содержит** фикс эмодзи-префикса (`_PREFIX`
|
||||
поглощает эмодзи с обеих сторон `⬇️`) — переиспользуется без правок.
|
||||
|
||||
### 8.5 Внешний TMDB API с Кра́кена недоступен
|
||||
### 8.6 Внешний TMDB API с Кра́кена недоступен
|
||||
|
||||
`curl https://api.themoviedb.org/3/movie/...` без ключа → `Invalid API key`.
|
||||
Ключ живёт в `$WS/.env` (`TMDB_KEY`), прямой вызов из шелла не проходит.
|
||||
|
||||
Reference in new issue
Block a user