From 64e33a60cefc551a21be1761bdeb6bdbe9849ec7 Mon Sep 17 00:00:00 2001 From: Hermes Date: Tue, 16 Jun 2026 23:00:01 +0600 Subject: [PATCH 1/2] [2026-06-16] kraken: family/how-to/htpc-emulators-setup.md family/how-to/kraken-access.md family/how-to/obsidian-sync.md family/how-to/openmediavault-rpi5.md family/how-to/switch-emulation-rom-infra.md family/how-to/truenas-infrastructure.md family/projects/media-toolbox-kraken.md --- family/how-to/htpc-emulators-setup.md | 2 +- family/how-to/kraken-access.md | 2 +- family/how-to/obsidian-sync.md | 4 ++-- family/how-to/openmediavault-rpi5.md | 6 +++--- family/how-to/switch-emulation-rom-infra.md | 4 ++-- family/how-to/truenas-infrastructure.md | 2 +- family/projects/media-toolbox-kraken.md | 12 ++++++------ 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/family/how-to/htpc-emulators-setup.md b/family/how-to/htpc-emulators-setup.md index f871231a..741be47c 100644 --- a/family/how-to/htpc-emulators-setup.md +++ b/family/how-to/htpc-emulators-setup.md @@ -15,7 +15,7 @@ **Weekly → Кракен HDD** (`Persistent=true`): - `saves-sync-kraken.timer` (weekly) - Скрипт: `~/scripts/backup-saves-to-kraken.sh` -- Назначение: `kraken@192.168.1.14:/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/backups/htpc-saves/` +- Назначение: `kraken@192.168.1.15:/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/backups/htpc-saves/` - ⚠️ Путь назначения **всегда на HDD** (`/srv/dev-disk-by-uuid-.../`), не в `~/` (SSD, маленький) - Транспорт: rsync по LAN (SSH ключ bazzite→kraken авторизован) diff --git a/family/how-to/kraken-access.md b/family/how-to/kraken-access.md index 7861fc0f..34f0653a 100644 --- a/family/how-to/kraken-access.md +++ b/family/how-to/kraken-access.md @@ -36,7 +36,7 @@ ssh -J root@91.207.28.205 kraken@127.0.0.1 -p 2223 Кракен держит постоянный **reverse SSH tunnel** на VPS через autossh: ``` -Кракен (RPi 5, 192.168.1.14) +Кракен (RPi 5, 192.168.1.15) └── autossh → ssh -R 2223:localhost:22 root@91.207.28.205 ↓ VPS (91.207.28.205) diff --git a/family/how-to/obsidian-sync.md b/family/how-to/obsidian-sync.md index 7313ffa1..5d890e96 100644 --- a/family/how-to/obsidian-sync.md +++ b/family/how-to/obsidian-sync.md @@ -94,11 +94,11 @@ mallexxx.duckdns.org:/mnt/RED_2TB/storage/git/obsidian-vault.git ```bash # Проверить последний sync -ssh kraken@192.168.1.14 "tail -5 /tmp/vault-sync.log" +ssh kraken@192.168.1.15 "tail -5 /tmp/vault-sync.log" ssh truenas_admin@mallexxx.duckdns.org "tail -5 /tmp/vault-sync.log" # Запустить sync вручную -ssh kraken@192.168.1.14 "bash ~/scripts/sync-vault.sh" +ssh kraken@192.168.1.15 "bash ~/scripts/sync-vault.sh" ssh truenas_admin@mallexxx.duckdns.org "bash ~/sync-vault.sh" # Посмотреть историю коммитов в bare repo diff --git a/family/how-to/openmediavault-rpi5.md b/family/how-to/openmediavault-rpi5.md index b482340d..859fc56e 100644 --- a/family/how-to/openmediavault-rpi5.md +++ b/family/how-to/openmediavault-rpi5.md @@ -7,7 +7,7 @@ tags: created: '2026-05-11' updated: '2026-05-12' status: hermes-pending -ip: 192.168.1.14 +ip: 192.168.1.15 --- # OpenMediaVault на Raspberry Pi 5 @@ -22,7 +22,7 @@ ip: 192.168.1.14 | 2 — Первый запуск + обновление | ✅ | apt upgrade выполнен | | 3 — Установка OMV | ✅ | OMV 7 установлен | | 4 — Первый вход в веб-интерфейс | ✅ | Пароль сменён | -| 5 — Сеть | ✅ | DHCP static lease `192.168.1.14` (eth0 MAC `2c:cf:67:64:03:f3`); WiFi включён (wlan0, ASUS5, 192.168.1.15, 2026-05-19) | +| 5 — Сеть | ✅ | DHCP static lease `192.168.1.15` (eth0 MAC `2c:cf:67:64:03:f3`); WiFi включён (wlan0, ASUS5, 192.168.1.15, 2026-05-19) | | 6 — USB HDD | ✅ | 12TB Seagate ST12000NT001, EXT4, UUID `49e8f586-3839-4c5d-a1e1-58bfc3579ade`, смонтирован через OMV в `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade` | | 7 — omv-extras + Docker | ✅ | omv-extras 7.0.6, Docker 29.4.3, kraken в группе docker | | 8 — Контейнеры | ✅ | Все через отдельные docker compose, конфиги на HDD (см. ниже) | @@ -137,7 +137,7 @@ network: В роутере (ASUS): добавить static lease в `dhcp_staticlist` через nvram: ```bash ssh -i ~/.ssh/id_rsa admin@192.168.1.1 \ - "nvram set dhcp_staticlist='...<2C:CF:67:64:03:F3>192.168.1.14>kraken>' && nvram commit && service restart_dnsmasq" + "nvram set dhcp_staticlist='...<2C:CF:67:64:03:F3>192.168.1.15>kraken>' && nvram commit && service restart_dnsmasq" ``` Отключить WiFi навсегда (modprobe blacklist): diff --git a/family/how-to/switch-emulation-rom-infra.md b/family/how-to/switch-emulation-rom-infra.md index 942ec91f..8586e54a 100644 --- a/family/how-to/switch-emulation-rom-infra.md +++ b/family/how-to/switch-emulation-rom-infra.md @@ -194,7 +194,7 @@ services: ssh kraken "cd /srv/.../docker/jackett && docker compose up -d" ``` -Web UI: `http://192.168.1.14:9117` +Web UI: `http://192.168.1.15:9117` ### Настройка RuTracker 1. Открыть Jackett Web UI → Add Indexer → поиск "rutracker" @@ -204,7 +204,7 @@ Web UI: `http://192.168.1.14:9117` ### API — как Eagle ищет игру ```bash # Поиск через Jackett Torznab API -curl "http://192.168.1.14:9117/api/v2.0/indexers/rutracker/results/torznab/?apikey=JACKETT_KEY&t=search&q=Donkey+Kong+Tropical+Freeze+Switch&cat=8000" +curl "http://192.168.1.15:9117/api/v2.0/indexers/rutracker/results/torznab/?apikey=***&t=search&q=Donkey+Kong+Tropical+Freeze+Switch&cat=8000" # Возвращает XML/JSON с magnet-ссылками и метаданными ``` diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index 474c55be..7771af24 100644 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -9,7 +9,7 @@ - **Web UI:** http://truenas.mallexxx.duckdns.org - **Portainer:** https://portainer.mallexxx.duckdns.org - **Host (local network):** `192.168.2.197` — ⚠️ ИСПОЛЬЗОВАТЬ `ssh truenas_admin@mallexxx.duckdns.org`. НЕ ИСПОЛЬЗОВАТЬ локальный IP для SSH доступа! - - ⚠️ Eagle (Mac, 192.168.1.x) и Kraken (192.168.1.14) находятся в **другой подсети** + - ⚠️ Eagle (Mac, 192.168.1.x) и Kraken (192.168.1.15) находятся в **другой подсети** - ⚠️ Кра́кен и TrueNAS — **разные сети** (192.168.1.x vs 192.168.2.x). Доступ с Кракена на TrueNAS по локальному IP **не работает** ## Пользователи и группы (ключевые) diff --git a/family/projects/media-toolbox-kraken.md b/family/projects/media-toolbox-kraken.md index ddc59998..6f01fdf9 100644 --- a/family/projects/media-toolbox-kraken.md +++ b/family/projects/media-toolbox-kraken.md @@ -22,7 +22,7 @@ tags: HTPC (Bazzite 192.168.1.86) └── rsync → Kraken HDD /srv/.../media/ -Kraken (RPi 5, 192.168.1.14) +Kraken (RPi 5, 192.168.1.15) ├── /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/media/ │ ├── movies/ ← фильмы (127 папок) │ ├── cartoons/ ← мультфильмы (126 папок) @@ -127,7 +127,7 @@ media-pipeline (~/Developer/media_files_db, ветка kraken-agent) 3. `ProviderSearchStrategy.facts()` теперь эмитит `NFOMetadataFact` с жанрами провайдера (раньше genres терялись, в граф не писались). **После деплоя:** нужно переместить существующие 106 неправильных entries из `library/movies` в `library/cartoons` (отдельный скрипт). Новые sync'и будут класть правильно. -- Настроить библиотеки в Jellyfin (http://192.168.1.14:8096) +- Настроить библиотеки в Jellyfin (http://192.168.1.15:8096) - NFO файлы готовы (716 шт.), Jellyfin должен их подхватить #### 4. 🟢 Hermes cron на Кракене @@ -273,12 +273,12 @@ docker run --rm ... media-pipeline:kraken \ | | | |--|--| | HTPC | `bazzite@192.168.1.86`, Data: `/run/media/bazzite/Data/`, WoL: `B0:6E:BF:60:6D:64` | -| Кракен | `kraken@192.168.1.14`, HDD: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/` | -| Jellyfin | http://192.168.1.14:8096 | -| Transmission | http://192.168.1.14:9091 | +| Кракен | `kraken@192.168.1.15`, HDD: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/` | +| Jellyfin | http://192.168.1.15:8096 | +| Transmission | http://192.168.1.15:9091 | | Исходники | `~/Developer/media_files_db/`, ветка `kraken-agent` | | Docker образ | `media-pipeline:kraken` (arm64, Colima 24GB) | -| kraken | `ssh kraken` → LAN (`192.168.1.14`) или VPN (`10.99.1.2`) через DNS-резолв | +| kraken | `ssh kraken` → LAN (`192.168.1.15`) или VPN (`10.99.1.2`) через DNS-резолв | | docker deploy | `docker save img -o /tmp/img.tar && scp /tmp/img.tar kraken:/tmp/ && ssh kraken "docker load -i /tmp/img.tar && rm /tmp/img.tar"` — `docker save \| ssh` зависает через WireGuard tunnel | | Transmission RPC | Токен: `curl -D /tmp/hdrs ... > /dev/null`, затем `grep X-Transmission-Session-Id /tmp/hdrs \| awk '{print $2}' \| tr -d '\r\n'`. Payload с base64 торрента — писать в файл (`-d @file`), не аргументом (иначе "Argument list too long") | From 8e807900c628bc8d24232e54aafeb0a3d14cf2f4 Mon Sep 17 00:00:00 2001 From: Hermes Date: Wed, 17 Jun 2026 00:00:01 +0600 Subject: [PATCH 2/2] [2026-06-17] kraken: family/how-to/jellyfin-config.md --- family/how-to/jellyfin-config.md | 41 ++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/family/how-to/jellyfin-config.md b/family/how-to/jellyfin-config.md index e8d03731..27a73968 100644 --- a/family/how-to/jellyfin-config.md +++ b/family/how-to/jellyfin-config.md @@ -1,17 +1,24 @@ --- title: Jellyfin Config created: '2026-05-23' -updated: '2026-05-23' +updated: '2026-06-17' type: tech namespace: family -tags: [jellyfin, infra, media, credentials] +tags: + - jellyfin + - infra + - media + - credentials + - api related: - - "[[tech/arr-stack-kraken]]" + - '[[tech/arr-stack-kraken]]' + - '[[tech/router-py]]' --- - # Jellyfin Config **URL:** `http://kraken:8096` +**API Base (внутри контейнера kraken):** `http://kraken:8096/jellyfin/` +(все API эндпоинты под префиксом `/jellyfin`) ## Users @@ -31,3 +38,29 @@ Used by automation scripts (watchlist-sync, media-pipeline agents). - **Before any DB operation:** `docker stop jellyfin` first - Jellyfin runs as a Docker container on Kraken - Config stored in `/opt/jellyfin/config/` (check docker-compose for exact path) + +## API Endpoints (base: `http://kraken:8096/jellyfin/`) + +Авторизация: заголовок `X-MediaBrowser-Token: ` + +| Что | Endpoint | Метод | +|---|---|---| +| Инфо о сервере | `/System/Info` | GET | +| Библиотеки (виртуальные папки) | `/Library/VirtualFolders` | GET | +| Поиск по типу | `/Items?includeItemTypes=Series&recursive=true&searchTerm=...&fields=Path` | GET | +| Удалить item | `/Items/{id}` | DELETE | +| Полный рескан | `/Items/Refresh?Recursive=true&RefreshMode=FullRefresh` | POST (требует Content-Type: application/json) | + +## Библиотеки + +| Название | Путь | Назначение | +|---|---|---| +| Series | `/media/series` | Сериалы (симлинки от router.py из sonarr) | +| Movies | `/media/movies` | Фильмы | +| Cartoon Series | `/media/cartoons-series` | Мультсериалы | +| Cartoons | `/media/cartoons` | Мультфильмы | +| Documentaries | `/media/documentaries` | Документалки | +| Documentary Series | `/media/documentaries-series` | Документальные сериалы | +| Music | | Музыка | + +> **Важно:** Прямые пути sonarr (`/media/series-sonarr/`, `/media/movies-radarr/`) **не должны быть** в библиотеках Jellyfin. Router.py создаёт симлинки из sonarr-папок в `/media/series/` и `/media/movies/`. Если symlink уже есть — дубли не появятся. Если есть старые дубли — удалить orphaned items через `DELETE /Items/{id}`.