[2026-09-02] eagle: family/documents/vault-sync/2026-09-02-restore-privilege-scope.md
This commit is contained in:
@@ -77,26 +77,57 @@ d--------- transmission transmission storage/shared
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Общий план (НЕ выполнен — требует подтверждения + бэкап ACL, единый по всем каталогам)
|
## Общий план (ИСПРАВЛЕН — НЕ выполнен, требует подтверждения)
|
||||||
|
|
||||||
|
> ⚠️ **2026-09-02 УТОЧНЕНО: `/mnt/RED_2TB/storage` — единый ZFS dataset `RED_2TB/storage` с `acltype=nfsv4`. НЕ ПОСIX.** Ранее планировалось `chown -R`/`chmod -R` — это **НЕВЕРНО** для TrueNAS SCALE с NFSv4 ACL. Права управляются **только** через `midclt call filesystem.setacl` (эквивалент TrueNAS UI → Datasets → `RED_2TB/storage` → Edit ACL → Apply recursively). `truenas_admin` = FULL_ADMIN в midclt → **root/sudo для setacl НЕ нужен** (проверено: `midclt call auth.me` → roles `FULL_ADMIN`).
|
||||||
|
|
||||||
|
### Диагноз по NFS4 ACL (что именно сломано)
|
||||||
|
|
||||||
|
Реальные ACL через `midclt call filesystem.getacl` у `storage`, `git`, `Downloads`, `Movies`, `Cartoons` **структурно ИДЕНТИЧНЫ рабочему `obsidian`**, но:
|
||||||
|
1. владелец **uid/gid = 921** (`transmission`) вместо правильного **950** (`truenas_admin`);
|
||||||
|
2. у записи `owner@` **обнулены `READ_DATA / WRITE_DATA / EXECUTE / APPEND_DATA / DELETE_CHILD`** (все в `false`) → POSIX-маска `d---------`.
|
||||||
|
|
||||||
|
Рабочий эталон (`obsidian`): uid/gid **950:950**, `owner@` полный, `group@` rwX (без WRITE_ATTRS/ACL/OWNER), `everyone@` — только attrs.
|
||||||
|
|
||||||
|
### Проверенная сигнатура midclt
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Бэкап текущих ACL всех затронутых
|
# Filesystem-методы существуют (40, подтверждены 2026-09-02):
|
||||||
getfacl -R /mnt/RED_2TB/storage > /mnt/RED_2TB/backup/_acl_storage_$(date +%F).facl
|
# filesystem.getacl / filesystem.setacl / filesystem.chown / filesystem.setperm
|
||||||
|
# setacl(schema): {path, uid, gid, dacl, nfs41_flags, acltype, options}
|
||||||
# 2а. bare git repo (восстановить git-sync на маке)
|
# options: {stripacl:bool, recursive:bool, traverse:bool, canonicalize:bool(default true),
|
||||||
sudo chown -R 950:950 /mnt/RED_2TB/storage/git
|
# validate_effective_acl:bool(default true)}
|
||||||
sudo chmod -R u+rwX,g+rwX /mnt/RED_2TB/storage/git
|
# dacl: массив ACE {tag: owner@|group@|everyone@|USER|GROUP, id, type: ALLOW|DENY, perms, flags}
|
||||||
# → на маке: bash ~/scripts/sync-vault.sh (55 коммитов уедут)
|
|
||||||
|
|
||||||
# 2б. медиа-папки (чтобы arr/jellyfin заработал)
|
|
||||||
sudo chown -R 950:950 /mnt/RED_2TB/storage/{Movies,Cartoons,Downloads,Music,series,shared,...}
|
|
||||||
sudo chmod -R u+rwX,g+rwX /mnt/RED_2TB/storage/{Movies,Cartoons,Downloads,Music,series,shared,...}
|
|
||||||
|
|
||||||
# 3. Запуск arr-стека
|
|
||||||
cd /mnt/RED_2TB/docker/arr && docker compose up -d
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> ⚠️ Перед выполнением сверить фактического владельца/права у каждого пути и какие uid-сервисы должны читать. Не менять вслепую — сначала уточнить exact mount/service scopes.
|
### Применение (скрипт готов на маке: `~/fix-storage-nfs4-acl.sh`)
|
||||||
|
|
||||||
|
Скрипт делает 3 этапа; применяется через `filesystem.setacl` с uid/gid + dacl + options.recursive/traverse:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# скопировать на TrueNAS и запустить (sudo не нужен):
|
||||||
|
scp ~/fix-storage-nfs4-acl.sh truenas_admin@mallexxx.duckdns.org:/tmp/
|
||||||
|
ssh truenas_admin@mallexxx.duckdns.org 'bash /tmp/fix-storage-nfs4-acl.sh'
|
||||||
|
```
|
||||||
|
|
||||||
|
Внутри:
|
||||||
|
1. **Бэкап ACL** каждой папки → `/mnt/RED_2TB/backup/facl_fix_<дата>/<name>.acl.json` (откат — применить сохранённые через `filesystem.setacl`).
|
||||||
|
2. **Применение** к каждой папке списка (`Cartoons Downloads Edu Movies Music ada3s1 art books cartoons-series documentaries documentaries-series git nas photo_dedup_test seafile series shared singularity sonarr work`):
|
||||||
|
```bash
|
||||||
|
midclt call filesystem.setacl <path> \
|
||||||
|
'{"uid":950,"gid":950,"dacl":[<эталон-ACE obsidian>],"options":{"recursive":true,"traverse":true,"stripacl":false}}'
|
||||||
|
```
|
||||||
|
3. **Verify**: все каталоги → uid 950; тест `git --git-dir=<base>/git/obsidian-vault.git log`.
|
||||||
|
|
||||||
|
> `obsidian` / `obsidian-syncthing` в список **НЕ включены** — уже рабочие 950:950.
|
||||||
|
|
||||||
|
### После фикса прав
|
||||||
|
- **На маке**: `bash ~/scripts/sync-vault.sh` → 55 коммитов уедут в bare repo (launchd возобновит нормальную работу; см. раздел 1).
|
||||||
|
- **Arr-стек**: `cd /mnt/RED_2TB/docker/arr && docker compose up -d` → проверить `docker compose ps`.
|
||||||
|
|
||||||
|
### Открытые вопросы перед запуском (подтверждение Alex)
|
||||||
|
- Transmission-контейнер работает **как root** (`docker exec transmission id` → uid 0), поэтому права медиа для него некритичны; но данные Transmission (downloadDir `/mnt/storage/Downloads`) док описывал под `transdamon`/911. Решено ставить единообразно **950** (нужно для git/arr/serving). Если нужен и доступ transdamon/911 — добавить явный ACE `GROUP` на 911.
|
||||||
|
- Альтернатива владельцу 950 — общая группа `nas_users` (3000, члены: truenas_admin, transmission, nas и др.). Эталон obsidian = 950.
|
||||||
|
|
||||||
## Связанные заметки
|
## Связанные заметки
|
||||||
- [[2026-08-31-syncthing-truenas-incident]] — вызвавший инцидент + фикс syncthing
|
- [[2026-08-31-syncthing-truenas-incident]] — вызвавший инцидент + фикс syncthing
|
||||||
|
|||||||
Reference in New Issue
Block a user