[2026-09-02] eagle: family/documents/vault-sync/2026-09-02-restore-privilege-scope.md family/how-to/arr-stack-taiga.md personal/tech/truenas-nfs4-acl-and-arrmultiuser.md
This commit is contained in:
@@ -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 ищет файл по `<download-dir>/<имя-торрента>`, там пусто → 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`. Данные при этом НЕ трогаются.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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`.
|
||||
|
||||
|
||||
@@ -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 <net> <container>` is LOST on recreate → declare `<net>` 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`.
|
||||
|
||||
Reference in New Issue
Block a user