diff --git a/family/documents/vault-sync/2026-09-02-restore-privilege-scope.md b/family/documents/vault-sync/2026-09-02-restore-privilege-scope.md index 5e322876..e447379b 100644 --- a/family/documents/vault-sync/2026-09-02-restore-privilege-scope.md +++ b/family/documents/vault-sync/2026-09-02-restore-privilege-scope.md @@ -2,7 +2,7 @@ tags: [truenas, restore, incident, git, media, arr, permission] created: 2026-09-02 updated: 2026-09-02 -status: resolved (Git-sync на маке ПОЧИНЕН 2026-09-02: NFS4 ACL DENY сняты полным dacl-заменой через filesystem.setacl; push ИДЁТ; ahead=0 behind=0). Arr-стек ПОДНЯТ и работает 2026-09-02 (prowlarr/radarr/sonarr/jellyfin Up, все под uid 950; transmission также PUID/PGID=950; сети media_net+transmission_default персистентны в compose). ⚠️ Осталось (см. §6): jellyfin-транскодинг падает FFmpeg code 243 — конфиг /docker/arr/jellyfin вглубь 911:911, фикс `chown -R 950:950 .../jellyfin`+recreate (root, не выполнен); transmission 255 торрентов "no data found" — данные в Movies не в download-dir (ждёт решения). Плюс остаточные: скрытые файлы корня storage + несвязанный library-app restart-loop +status: fully resolved 2026-09-02 — Git-sync (NFS4 ACL DENY сняты полной dacl-заменой, push ОК, ahead=0/behind=0), Arr-стек ПОЛНОСТЬЮ рабочий (prowlarr/radarr/sonarr/jellyfin/transmission Up, все uid 950, сети персистентны в compose). ✅ §6a jellyfin-траversed-фикс: root `chown 950:950 + chmod 750 /mnt/RED_2TB/storage` (был 921:921, блокировал traverse → FFmpeg 243) — проигрывание работает. ✅ §6b transmission: `docker restart` → 254/255 чисты. Незначительные остатки: торрент #1 требует Verify в UI; скрытые файлы корня storage; несвязанный library-app restart-loop --- # Incident 2026-09-02: Поломка прав uid 921/0000 после restore — масштаб и влияния @@ -276,33 +276,30 @@ services: ``` (в compose НЕ было PUID/PGID → контейнер root; transmission монтирует `storage` → `/mnt/storage`, download-dir `/mnt/storage/Downloads`) -## 6. ⚠️ Пост-запуск arr-стека: 2 НЕРЕШЁННЫХ блокатора (диагноз 2026-09-02, конец сессии) +## 6. Пост-запуск arr-стека: 2 блокера — ОБА РЕШЕНЫ (2026-09-02, конец сессии) -После успешного запуска стека (все контейнеры Up под 950) выявлены два REFAIL, требующих root-фикса. **Оба — артефакты того же restore-инцидента (владелец глубин конфигов/данных остался 911), НЕ перепутать с багом прав на `storage/`.** +После успешного запуска стека (все контейнеры Up под 950) выявлены два REFAIL. **Общий скрытый корень обоих + случайно та же причина, что у jellyfin-транскодинга:** **сам корень `/mnt/RED_2TB/storage` (верх датасета) остался `921:921`**, ACL `owner@/group@ ALLOW` но `everyone@ EXECUTE=False` → uid 950 (jellyfin/transmission как не-owner group truenas_admin...) фактически **не мог traverse вглубь** `/storage/Movies/...`, ХОТЯ ACL самих файлов/каталогов были корректными (`trivial:true`, owner@ READ/EXEC, 950:950). Это даёт клинический кейс «ACL файла чистый, владелец 950, но чтение = Permission denied». -### ⚠️ 6a. Jellyfin: FFmpeg exited with code 243 → фильмы не проигрываются -**Симптом:** веб-интерфейс jellyfin (Setup завершён, `StartupWizardCompleted:true`, библиотеки видят `/storage/Movies`, одиночные файлы читаются под 950). Но при проигрывании ПОПЫТКА транскодинга падает: -``` -FFmpeg exited with code 243 -ffmpeg -i file:"/storage/Movies/Snatch.x264/Snatch....mkv" -f hls -hls_segment_filename "/config/cache/transcodes/....%d.mp4" -→ jellyfin не может писать в transcode-файл -``` -**Корень:** конфиг jellyfin `/mnt/RED_2TB/docker/arr/jellyfin` — при restore вглубь `/config/data`, `/config/metadata`, `/config/cache` остались **владельца 911:911** (jellyfin работает под uid 950). Например `data/data/jellyfin.db` и 11 441 файл под `data/` — владелец `911`. Jellyfin/ffmpeg под 950 не могут писать в `/config/cache/transcodes` → код 243. (Только jellyfin пострадал: у radarr/sonarr/prowlarr весь config уже `abc`=950.) -**Фикс (ROOT — НЕ выполнен Alex, ожидает команды):** +### ✅ 6a. Jellyfin: FFmpeg exit 243 при проигрывании — РЕШЕНО +**Симптом:** веб-UI jellyfin (Setup завершён, `StartupWizardCompleted:true`) открылся, библиотеки видят `/storage/Movies`, но проигрывание падало `FFmpeg exited with code 243` (на чтении входа `/storage/Movies/Snatch.x264/...`, НЕ на записи transcode — transcodes/`/config/cache` уже стали 950 после первого chown). +**Двойной корень:** (1) конфиг jellyfin вглубь `/config/data` был 911:911 (11 441 файл; jellyfin под 950) → первый `chown -R 950:950 /mnt/RED_2TB/docker/arr/jellyfin` открыл UI (этот chown Alex уже выполнил ранее); (2) НО даже после него чтение файла `/storage/Movies/Snatch.x264/...` из uid 950 давало **`Permission denied`** при чистом ACL файла+каталога. Причина — **корень `/mnt/RED_2TB/storage` остался 921:921 и блокировал traverse** (см. выше). +**Фикс ЖЕЛЕЗНО (root, Alex выполнил — заработало):** ```bash -chown -R 950:950 /mnt/RED_2TB/docker/arr/jellyfin -cd /mnt/RED_2TB/docker/arr && docker compose up -d --force-recreate jellyfin -# проверка: jellyfin должен транскодить/проигрывать без FFmpeg code 243 +chown 950:950 /mnt/RED_2TB/storage +chmod 750 /mnt/RED_2TB/storage # rwxr-x--- → owner u950 / group(g950=truenas_admin) r-x → traverse для jellyfin ``` -> Безопасно: chown меняет только владение, даннятые БД/метаданные не трогает. +> linuxserver контейнеры (jellyfin/transmission) под PUID/PGID=950 имеют gid=950 → члены `truenas_admin`. После chmod 750 group r-x открывает traverse. Результат: jellyfin проигрывает (direct play / transcod по необходимости). **Отключение транскодинга** (если не нужен): Dashboard → Playback → снять галку «Allow media playback that requires transcoding» (тогда только Direct Play); транскодиг включается лишь когда клиент не поддерживает исходный кодек. UI на `jellyfin.mallexxx.duckdns.org`. -### ⚠️ 6b. Transmission: 255 торрентов "no data found" — данные перемещены в Movies, не в download-dir -**Симптом:** transmission-UI (порт 9091) открывается, но все (255) торренты показывают **No Data Found**. -**Корень (НЕ проблема прав):** transmission download-dir = `/mnt/storage/Downloads`. 255 resume-торрентов + 255 .torrent на месте (в `/docker/transmission`), daemon работает под 950, путь `/mnt/storage/Downloads` доступен, диск есть (78%). **Но сам download-dir пуст от медиа**: `find Downloads *.mkv/*.avi/*.mp4/*.iso` → **count 0**; внутри только `.nfo`, NSP-игры Switch (DK/Mario), переводы. Фильмы/контент физически **переехали в `/storage/Movies`** (257k файлов). transmission ищет файл по `/<имя-торрента>`, там пусто → No Data Found. Это состояние после импорта/миграции (торренты завершены, контент в библиотеке) — НЕ поломка прав. RPC недоступен извне: `403 Forbidden` на loopback и `401` при неправильных creds; whitelist = `172.16.*.*`. -**Требует решения Alex**, что сделать с 255 orphan-seed передач: -- либо удалить их из transmission (если сидирование не нужно), -- либо указать transmission актуальное расположение (файлы в Movies), -- НЕ нужно «чинить права» — их там уже нет проблемы. +### ✅ 6b. Transmission: 255 торрентов "no data found" — РЕШЕНО `docker restart` +**Симптом:** transmission-UI (9091) открывался, но все 255 торрентов показывали **`error 3: No Data Found`**. +**Уточнённый диагноз (проверено RPC изнутри, whitelist `172.16.*.*`):** downloadDir у каждого торрента УЖЕ корректно указывал не на Downloads, а на **`/mnt/storage/Movies`** (или `/storage/documentaries`), и файлы там физически ЕСТЬ (164 single `.mkv` прямо в Movies; `Thursday.1998_BDRip_cw.mkv` 3.1G и т.д.), владелец 950 `-rw-r-----`, читаются под uid 950 (`docker exec -u 950` → READ_OK). **НЕ** проблема download-dir и НЕ права — файл доступен демону. `torrent-verify` поодиночке НЕ снимал ошибку. +**Настоящий корень:** ошибка `No Data Found` была **закеширована при старте**, когда транзит через корень `/storage` был ещё заблокирован (до `chmod 750` на корень). transmission не перевалидировал данные после разблокировки traverse. +**Фикс (НЕ root):** простая перезагрузка демона заново валидирует все торренты при доступном traverse: +```bash +docker restart transmission +``` +**Результат:** **254 из 255 торрентов СРАЗУ чисты** (было 0). Остался только id=1 (`Thursday.1998_BDRip_cw.mkv`) — ранее ему крутили `torrent-verify`, но он всё ещё `error 3`; добить: в Web UI transmission на торренте → **Verify Local Data**, либо ещё один verify. +> Вывод для будущего: «No Data Found» у всех торрентов в transmission после пересоздания/миграции данных чаще всего = **старт демона при недоступном traverse к данным**. Решение — починить traverse (root каталога/путь) и `docker restart`. Данные при этом НЕ трогаются. --- diff --git a/family/how-to/arr-stack-taiga.md b/family/how-to/arr-stack-taiga.md index ead613d1..5ab79d77 100644 --- a/family/how-to/arr-stack-taiga.md +++ b/family/how-to/arr-stack-taiga.md @@ -15,9 +15,9 @@ Secondary arr stack on Taiga (TrueNAS), added 2026-05-20. > **STATE 2026-09-02 (end-of-session):** Стек **ПОДНЯТ И РАБОТАЕТ** ✅. `docker compose up -d` в `/mnt/RED_2TB/docker/arr` создал и запустил `prowlarr`, `radarr`, `sonarr`, `jellyfin` (все в проекте `arr`, процессы под **uid 950** — PUID/PGID=950 применён). Сеть `media_net` воссоздана (`docker network create media_net`), transmission подключён к `media_net`. **Персистентность сетей:** в `docker/transmission/docker-compose.yml` добавлена networks секция `media_net` + `transmission_default` (external) — transmission сам находится в обеих сетях при любом пересоздании. > -> **⚠️ Два НЕРЕШЁННЫХ пост-запуска блокатора (2026-09-02 конец):** -> 1. **Jellyfin не проигрывает** — транскодинг падает `FFmpeg exited with code 243`, т.к. в конфиге `/mnt/RED_2TB/docker/arr/jellyfin` вглубь `/config/data`, `/config/cache`, `/config/metadata` остались владельца **911:911** (11,441 файлов), а jellyfin работает под 950 → не пишет transcodes. Фикс (root): `chown -R 950:950 /mnt/RED_2TB/docker/arr/jellyfin && cd /mnt/RED_2TB/docker/arr && docker compose up -d --force-recreate jellyfin`. -> 2. **Transmission 255 торрентов "no data found"** — данные скачаны в `/storage/Movies`, а download-dir у transmission `/mnt/storage/Downloads` (там медиа нет). Это не ошибка прав; ждёт решения (удалить orphan seed или направить на актуальное расположение). +> **✅ Два пост-запуска блокатора — ОБА РЕШЕНЫ (2026-09-02 конец):** +> 1. **Jellyfin не проигрывал (FFmpeg 243)** — переход решён двумя фиксами: (а) `chown -R 950:950 /mnt/RED_2TB/docker/arr/jellyfin` (конфиг вглубь был 911:911) открыл UI; (б) главный скрытый корень — корень `/mnt/RED_2TB/storage` остался `921:921`, ACL `everyone@ EXECUTE=False` → uid 950 не мог traverse в `/storage/Movies/...`. Фикс (root): `chown 950:950 /mnt/RED_2TB/storage && chmod 750 /mnt/RED_2TB/storage`. После этого jellyfin проигрывает. Транскодинг откл.: Dashboard→Playback→убрать «Allow …transcoding». +> 2. **Transmission 255 торрентов "no data found"** — downloadDir УЖЕ корректно указывал на `/storage/Movies`, файлы были и читались под 950; ошибка была закеширована от старта при блокированном traverse. Фикс (НЕ root): `docker restart transmission` → **254/255 чисты** сразу. Остался торрент #1 — Verify в UI. > > **Почему стек изначально не запускался — медиа-права были сломаны** (тот же restore-инцидент uid 921/0000): `/mnt/RED_2TB/storage/{Movies,Cartoons,Downloads,Music,series,shared}` были `d---------`/`drwx------`, owner `transmission` (uid 921). radarr/sonarr монтируют `/storage` (rw), jellyfin `:ro` — со сломанными правами не прочитали бы библиотеку. ✅ **Права медиа ИСПРАВЛЕНЫ** (2026-09-02) до `950:950 drwxrwx---`; контейнеры arr/jellyfin затем подняты и запущены. Полный контекст и команды: `family/documents/vault-sync/2026-09-02-restore-privilege-scope.md`. diff --git a/personal/tech/truenas-nfs4-acl-and-arrmultiuser.md b/personal/tech/truenas-nfs4-acl-and-arrmultiuser.md index 69aa841e..abba86b1 100644 --- a/personal/tech/truenas-nfs4-acl-and-arrmultiuser.md +++ b/personal/tech/truenas-nfs4-acl-and-arrmultiuser.md @@ -50,6 +50,23 @@ Goal: all containers run under ONE uid (950) so transmission→radarr/sonarr→j - Simple datasets: recursive POSIX `chown -R 950:950` + `chmod` under root SUFFICE (ACLs were trivial). Use midclt/ACL only when non-trivial ACEs present (check `filesystem.getacl` → `trivial:true`). - Bare git repo with `owner@ DENY` on objects → full dacl replacement recursively (perms JSON like above). +### GOTCHA 3 — root dataset traverse (Permission denied despite clean file ACL) +After chown-ing all leaf dirs/files to 950, if a service still gets `Permission denied` reading `/storage/Movies/...` (or jellyfin FFmpeg exit 243), check the **root of the dataset** `/mnt/RED_2TB/storage` itself. In the restore it stayed `921:921` with `owner@/group@ ALLOW` but `everyone@ EXECUTE=False`. uid 950 (not owner, not in gid-921-group) falls under `everyone@` → **cannot traverse past the root** into the tree, even though every nested ACL is clean. Fix (root): +```bash +chown 950:950 /mnt/RED_2TB/storage +chmod 750 /mnt/RED_2TB/storage # rwxr-x---: gid 950 = truenas_admin (containers' group) gets r-x traverse +``` +Kernel needs EXEC (traverse) on EVERY path component. Diagnostic via `setpriv --reuid=950 ... ls` shows `Permission denied` on a dir whose `getacl` looks clean → suspect root/parent traverse. `stat` via root shows clean 770 but uid 950 can't ls. + +### GOTCHA 4 — transmission "all torrents No Data Found" after data migration +If every transmission torrent shows `error 3: No Data Found` right after a container recreate/pool migration: +- Check: `docker exec -u` fine to read? downloadDir & files present? If files ARE there and readable as uid 950, the error is likely **stale from daemon startup while traverse was blocked** (see GOTCHA 3). +- `torrent-verify` on a single torrent does NOT clear it. Fix is trivial & non-destructive: +```bash +docker restart transmission +``` +On restart the daemon re-validates → torrents clear (e.g. **254/255 instantly**). Leftover #1 → Verify Local Data in Web UI. + ## Docker network persistency (per-service compose) - `docker network connect ` is LOST on recreate → declare `` in the service's compose `networks:`. - Caddy must co-own a network with its reverse-proxy target. transmission Web UI works because caddy is ALSO in `transmission_default`; radarr↔transmission works because both in `media_net`.