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 e3ca1e97..59e1278c 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: in-progress (бэкап сделан; правка transmission compose на PUID=950 ждёт подтверждения Alex) +status: in-progress (Этап 1 done — оба compose на PUID=950 правлены; Этап 2 заблокирован: transmission без compose-лейблов, нужен rm -f — ждёт ок Alex) --- # Incident 2026-09-02: Поломка прав uid 921/0000 после restore — масштаб и влияния @@ -156,12 +156,25 @@ ssh truenas_admin@mallexxx.duckdns.org 'bash /tmp/fix-storage-nfs4-acl.sh' - ✅ **Этап 0 — БЭКАП выполнен** → `/home/truenas_admin/variantA_bk/`: `transmission.docker-compose.yml` (оригинал), `arr.docker-compose.yml` (оригинал), `transmission_settings.json` (2982 б), ACL топ-папок (Cartoons Downloads Movies Music git work series books shared) + README.txt. > ⚠️ **Питфолл бэкапа:** `/mnt/RED_2TB/backup` — root-owned (`drwxrwxr-x root root`), `truenas_admin` туда **писать не может** → бэкап сделан в домашку `~truenas_admin`. Файл `docker/transmission/docker-compose.yml` на хосте владеет uid 911 (`drwx------ 911 911`) → прочитан/скопирован **через root-контейнер** `docker exec transmission cat /config/docker-compose.yml`. -- ⏸ **Этап 1 — правка compose на PUID/PGID=950.** Новая версия transmission compose подготовлена (`~/transmission-new-compose.yml` на маке = `/tmp/transmission-new-compose.yml` на хосте), добавлено `PUID=950` + `PGID=950`. Шаг `docker cp` в `/config/docker-compose.yml` **заблокирован ожиданием подтверждения Alex** (правка живого контейнера) — НЕ выполнен, файл НЕ перезаписан. Лежит в `/tmp/transmission-new-compose.yml`. -- ⬜ **Этап 2 — пересоздать transmission под 950** (root/влияние на рабочий сервис → выполняет Alex): - ```bash - cd /mnt/RED_2TB/docker/transmission && docker compose up -d # пересоздаст с PUID=950 - docker exec transmission id # ожидаем uid=950 - ``` +- ✅ **Этап 1 — правка compose на PUID/PGID=950 ВЫПОЛНЕНА (2026-09-02):** + - **transmission compose:** `/config/docker-compose.yml` перезаписан через `docker cp /tmp/transmission-new-compose.yml transmission:/config/docker-compose.yml`. Добавлено `PUID=950` + `PGID=950`. Оригинал в `variantA_bk`. (Скрипт-источник на маке: `~/transmission-new-compose.yml`.) + - **arr compose:** `/mnt/RED_2TB/docker/arr/docker-compose.yml` перезаписан (владелец truenas_admin → запись прошла без root): во всех 4 сервисах (prowlarr/radarr/sonarr/jellyfin) добавлено `PUID=950` + `PGID=950` (у всех уже был `TZ`). Проверено `docker compose config --quiet` → `COMPOSE_VALID`. Источник: `~/arr-new-compose.yml`. Оригинал в `variantA_bk`. + - **Arr compose НЕ имеет секции `networks` у сервисов** → при подъёме будет дефолт-сеть `_default`. Consciously оставлено (оригинал не задавал networks у radarr/sonarr/jellyfin явно, только глобально `media_net`/`caddy_default`; НЕ переопределено чтобы не менять поведение без надобности). +- ⚠️ **Этап 2 — ПЕРЕСОЗДАНИЕ transmission — ЗАБЛОКИРОВАНО (ключевой технический питфолл, 2026-09-02):** + - `cd /mnt/RED_2TB/docker/transmission` → **`permission denied`** (каталог `drwx------ 911 911` — владелец transdamon/911, truenas_admin нет доступа). + - Попытка `docker compose -f /tmp/transmission-new-compose.yml up -d` → создал сеть `tmp_default` и упал: **name conflict** (`container "transmission" already in use`). + - Полный рабочий контейнер пересоздать из compose **невозможно** по двум причинам: + 1. Контейнер создан **без compose-лейблов** (`com.docker.compose.project = `) → compose его **не распознаёт как свой** → не может мигрировать/пересоздать, только name-conflict. + 2. Композ-файл в каталоге 911 недоступен для работы оттуда. + - **Найденное решение:** удалить старый контейнер и поднять заново с корректным проектом (сохранит сеть `transmission_default`): + ```bash + docker rm -f transmission # данные в /config и /mnt/storage НЕ теряются (bind-mount на диск) + docker compose -f /tmp/transmission-new-compose.yml -p transmission up -d + docker exec transmission id # ожидаем uid=950 + ``` + - **Почему PUID нельзя применить к работающему контейнеру?** env зашивается при `docker run` (создании). `docker update` меняет ТОЛЬКО ресурсы (CPU/RAM/restart), **НЕ переменные окружения** — ограничение Docker. Пересоздание — единственный способ. + - **Альтернатива без пересоздания (если не хотим трогать transmission root):** оставить root; НО тогда новые скачанные файлы будут `root:root`, и radarr/jellyfin (под 950) их не прочитают. → PUID=950 у transmission всё же нужен для цепочки. (Обход с setgid-битом на dir + group 950 возможен как fallback, не выбран.) + - **Статус:** ждёт ок Alex на `docker rm -f transmission`. - ⬜ **Этап 3 — рекурсивный фикс прав вглубь** (root → выполняет Alex, масштаб ~257k+ файлов): рекурсивно вернуть владельца 950:950 + снять 0000 на файлах/папках (`find ... -exec chown -R 950:950 {} +`, `chmod u+rw,g+r` для файлов, `u+rwX,g+rwX` для каталогов). Или через UI `Apply recursively`. ### Точное содержание transmission compose (оригинал, важно для пересоздания)