From f1c948f1d2ad952db67ba576993ab09dbc84c4e2 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Wed, 2 Sep 2026 10:50:03 +0600 Subject: [PATCH] [2026-09-02] eagle: family/documents/vault-sync/2026-08-31-syncthing-truenas-incident.md family/documents/vault-sync/2026-09-02-restore-privilege-scope.md family/how-to/arr-stack-taiga.md family/how-to/syncthing-truenas-android.md family/how-to/vault-git-sync.md --- .../2026-08-31-syncthing-truenas-incident.md | 29 ++++- .../2026-09-02-restore-privilege-scope.md | 107 ++++++++++++++++++ family/how-to/arr-stack-taiga.md | 6 +- family/how-to/syncthing-truenas-android.md | 12 +- family/how-to/vault-git-sync.md | 6 +- 5 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 family/documents/vault-sync/2026-09-02-restore-privilege-scope.md diff --git a/family/documents/vault-sync/2026-08-31-syncthing-truenas-incident.md b/family/documents/vault-sync/2026-08-31-syncthing-truenas-incident.md index aa672386..b37cefff 100644 --- a/family/documents/vault-sync/2026-08-31-syncthing-truenas-incident.md +++ b/family/documents/vault-sync/2026-08-31-syncthing-truenas-incident.md @@ -1,11 +1,13 @@ --- tags: [syncthing, truenas, debug, incident] created: 2026-08-31 -status: diagnosed +status: resolved-syncthing (see 2026-09-02 for cascade) --- # Incident: Syncthing не синкается с TrueNAS (после restore) +> **UPDATE 2026-09-02:** Syncthing-фикс подтверждён рабочим (см. ниже «Резолюция 2026-09-02»). НО выяснилось, что та же поломка прав ред 921/0000 поразила и `storage/git/` (bare repo obsidian → git-sync на маке стоит, ahead 55) и все медиа-папки (`storage/{Movies,Cartoons,Downloads,Music,series,shared}`) → arr/jellyfin-стек на TrueNAS неработоспособен. См. `family/documents/vault-sync/2026-09-02-restore-privilege-scope.md`. + **Дата диагностики:** 2026-08-31 **Симптом:** "Syncthing не конектится к TrueNAS; TrueNAS не в нашей сети, доступен через внешний адрес". В UI папка не синкается / процентов нет. @@ -53,6 +55,31 @@ getent passwd 921 → transmission:x:921:921 3. Рестарт контейнера: `docker compose -f /mnt/RED_2TB/docker/syncthing/docker-compose.yml restart` 4. Дождаться `Completed scan`, проверить статус папки через REST. +## Резолюция 2026-09-02 (Syncthing — подтверждено рабочим) + +**Факт (проверка read-only с хоста TrueNAS):** синхронизация obsidian починена и работает. + +Критически важная деталь диагностики 31-08: **в compose-файле контейнера mount указывает на ДРУГУЮ папку, не ту, что в оригинальной доке:** + +```yaml +volumes: + - /mnt/RED_2TB/storage/obsidian-syncthing:/var/syncthing/obsidian-vault # актуальный mount +``` + +(в `family/how-to/syncthing-truenas-android.md` и исходном compose стоит `/storage/obsidian` без `-syncthing` — УСТАРЕЛО). + +**Какие папки есть и рабочая ли состояния:** +``` +/mnt/RED_2TB/storage/obsidian drwxrwx--- truenas_admin (950) Jul 23 +/mnt/RED_2TB/storage/obsidian-syncthing drwxrwx--- truenas_admin (950) Aug 31 ← рабочий mount +/mnt/RED_2TB/storage/obsidian/.stfolder → НЕТ (не нужен, это не sync target) +/mnt/RED_2TB/storage/obsidian-syncthing/.stfolder → ЕСТЬ (маркер syncthing, uid 950) +``` + +Права обеих папок починены на `950:950 truenas_admin` (были `d--------- 921:921`). `.stfolder` есть в `obsidian-syncthing` — это активная sync-копия vault. Папка после фикса в `Completed scan`, телефон подтянул зависшие файлы. + +**Итог:** рабочий mount в compose — `obsidian-syncthing`, никакой rename папки не требуется. Док `syncthing-truenas-android.md` требует обновления своего `volumes:` блока до `obsidian-syncthing`. + ## Затрагиваемые файлы (лог телефона) - `family/how-to/truenas-access.md` - `family/how-to/truenas-sata-ports-and-zfs-pools.md` 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 new file mode 100644 index 00000000..c7343d0d --- /dev/null +++ b/family/documents/vault-sync/2026-09-02-restore-privilege-scope.md @@ -0,0 +1,107 @@ +--- +tags: [truenas, restore, incident, git, media, arr, permission] +created: 2026-09-02 +status: diagnosed +--- + +# Incident 2026-09-02: Поломка прав uid 921/0000 после restore — масштаб и влияния + +**Сводный инцидент-документ.** Родитель: `2026-08-31-syncthing-truenas-incident.md` (Syncthing). Здесь документируем подтверждённый масштаб той же поломки прав и её воздействие на git-sync (мак/Eagle) и медиа/arr-стек на TrueNAS. + +**Корень (общий для всех):** после восстановления из бэкапа `/mnt/RED_2TB/storage/*` стал принадлежать **uid 921 = `transmission`** с правами `----------`/`d---------` (0000), вместо `truenas_admin` (950). Контейнеры, пользователи и git, работающие под другими uid, теряют доступ. + +--- + +## 1. Git-sync obsidian на маке (Eagle) — СТОИТ (ahead 55) + +**Симптом на `~/obsidian`:** +``` +git status → ## main...nas/main [ahead 55] +git fetch/push → fatal: '/mnt/RED_2TB/storage/git/obsidian-vault.git' does not appear to be a git repository +``` + +**Причина (read-only проверка TrueNAS):** +``` +/mnt/RED_2TB/storage/git d--------- 4 921 921 +/mnt/RED_2TB/storage/git/obsidian-vault.git (permission denied — вложено в storage/git) +``` +Папка `storage/git/` (внутри — bare repo `obsidian-vault.git`) с правами 0000 / owner 921. Git на маке (SSH-ключ жив, `CONN_OK` ✅) не может открыть bare repo → fetch/push падают → локальные 55 коммитов не уходят. + +**Важно про механизм cron — НЕ Hermes cron, а launchd:** +- Агент: `~/Library/LaunchAgents/com.sync-vault.plist` +- Программа: `/Users/admin/scripts/sync-vault.sh`, `StartInterval = 300` сек (5 мин) +- Состояние: **активен** (`launchctl list` → `com.sync-vault`), `runs = 3762`, `last exit code = 0` +- `sync-vault-lib.sh` **умышленно глушит** недоступность remote: если `git fetch` падает → логирует и `exit 0`. Поэтому launchd показывает exit code 0 при фактически сломанном sync (`ahead 55`). Это **не** сбой cron — это корректное поведение скрипта, скрывающее dead remote. +- Системный crontab на маке пуст (`crontab -l` нет), `/etc/crontab` нет. Запуск — только через launchd `${LABEL}`. + +**Связанные доки:** `family/how-to/vault-git-sync.md`, `family/how-to/obsidian-sync.md`. + +--- + +## 2. Медиа-папки TrueNAS — сломаны (uid 921, d---------/drwx------) + +Read-only проверка `ls -ld /mnt/RED_2TB/storage/`: +``` +d--------- transmission transmission storage/Cartoons +d--------- transmission transmission storage/Downloads +d--------- transmission transmission storage/Movies +d--------- transmission transmission storage/Music +drwx------ transmission transmission storage/series +d--------- transmission transmission storage/shared +``` +(отображается как `transmission` = uid 921 — тот же, что и в инциденте; права 0000/700 сломаны для внешних сервисов.) `Movies-Radarr`, `Series-Sonarr` — не существуют (старая схема, на TrueNAS актуальны только `storage/`-медиа). + +Медиа-папки починки не проходили (в отличие от `obsidian`/`obsidian-syncthing`). + +--- + +## 3. Arr/Jellyfin-стек на TrueNAS — выключен + не сможет работать из-за прав + +**Факты:** +- В `docker ps -a` НЕТ ни radarr/sonarr/prowlarr/jellyfin контейнеров (ни запущенных, ни остановленных). Стек не пересоздавался после проблемного периода. +- Composes живут в `/mnt/RED_2TB/docker/arr/`: `docker-compose.yml` (prowlarr/radarr/sonarr/jellyfin), подпапки `prowlarr/ radarr/ sonarr/ jellyfin/ media-pipeline/`. +- `docker/arr/docker-compose.yml` монтирует `/mnt/RED_2TB/storage` в radarr/sonarr (rw) и jellyfin (`:ro`). При сломанных правах медиа-папок контейнеры не смогут читать/импортировать → пустая библиотека. +- **Работает только `transmission`** (Up 8 days), его compose отдельный: `/mnt/RED_2TB/docker/transmission/`. config владелец `transdamon`/911. RPC `transmission-remote` вернул `403 Forbidden` — auth вкл., статус торрентов извне без токена не читается. + +**Чтобы запустить стек:** восстановить права медиа-папок `storage/` (150 и выше 950/нужный сервисный uid, rwX) → `cd /mnt/RED_2TB/docker/arr && docker compose up -d`. + +**Дексо стек** — разделение ролей (см. `family/how-to/arr-stack-taiga.md`): +- Taiga (TrueNAS) = acquisition (transmission качает, arr добавляет) +- Kraken = serving (jellyfin на план-сервире). Jellyfin на TrueNAS — acquisition-side media storage, не primary serving. + +--- + +## 4. Несвязанные находки (не трогала диагностика, для контекста) + +- Контейнер `library-app` (`library`) в restart-loop: `FileNotFoundError: '/library/flibusta_fb2_local.inpx'` — это приложение полки книг Flibusta, монтирует `/mnt/RED_2TB/storage/Downloads/fb2.Flibusta.Net → /library`; INPX-файла на пути нет. Не связано с поломкой прав; ручной фикс только по запросу. + +--- + +## Общий план (НЕ выполнен — требует подтверждения + бэкап ACL, единый по всем каталогам) + +```bash +# 1. Бэкап текущих ACL всех затронутых +getfacl -R /mnt/RED_2TB/storage > /mnt/RED_2TB/backup/_acl_storage_$(date +%F).facl + +# 2а. bare git repo (восстановить git-sync на маке) +sudo chown -R 950:950 /mnt/RED_2TB/storage/git +sudo chmod -R u+rwX,g+rwX /mnt/RED_2TB/storage/git +# → на маке: 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. + +## Связанные заметки +- [[2026-08-31-syncthing-truenas-incident]] — вызвавший инцидент + фикс syncthing +- [[arr-stack-taiga]] — acquisition-стек на TrueNAS +- [[arr-stack-kraken]] — serving-стек (Kraken) +- [[vault-git-sync]] — git-sync алгоритм и скрипты +- [[obsidian-sync]] — общая схема Eagle↔Taiga↔Kraken +- [[syncthing-truenas-android]] — syncthing схема (требует обновления volumes → `obsidian-syncthing`) diff --git a/family/how-to/arr-stack-taiga.md b/family/how-to/arr-stack-taiga.md index 8064641a..959165d0 100644 --- a/family/how-to/arr-stack-taiga.md +++ b/family/how-to/arr-stack-taiga.md @@ -1,7 +1,7 @@ --- title: Arr Stack — Taiga created: '2026-05-23' -updated: '2026-05-23' +updated: '2026-09-02' type: tech namespace: family tags: [arr, taiga, infra, media, pitfalls] @@ -13,6 +13,10 @@ related: Secondary arr stack on Taiga (TrueNAS), added 2026-05-20. +> **STATE 2026-09-02:** Стек **выключен** — в `docker ps -a` нет ни radarr/sonarr/prowlarr/jellyfin контейнеров (стек не пересоздавался). Compose-структура живёт в `/mnt/RED_2TB/docker/arr/` (`docker-compose.yml` + подпапки `prowlarr/ radarr/ sonarr/ jellyfin/ media-pipeline/`). Работает только `transmission` (отдельный compose `/mnt/RED_2TB/docker/transmission/`). +> +> **Почему не запускается просто так — медиа-права сломаны** (тот же 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` — со сломанными правами не прочитают библиотеку. Фикс + запуск: см. `family/documents/vault-sync/2026-09-02-restore-privilege-scope.md`. + ## Notes from Setup (2026-05-20) - Config and pitfalls recorded during initial Taiga arr stack deployment diff --git a/family/how-to/syncthing-truenas-android.md b/family/how-to/syncthing-truenas-android.md index 61631142..b1292f5c 100644 --- a/family/how-to/syncthing-truenas-android.md +++ b/family/how-to/syncthing-truenas-android.md @@ -9,12 +9,16 @@ Android (Syncthing app) │ P2P sync (QUIC/TCP :22000) ▼ TrueNAS (syncthing контейнер) - /var/syncthing/obsidian-vault → /mnt/RED_2TB/storage/obsidian + /var/syncthing/obsidian-vault → /mnt/RED_2TB/storage/obsidian-syncthing │ ├── Obsidian vault (полная копия на TrueNAS) └── Eagle (Mac) — продолжает через git, Syncthing не участвует ``` +> ⚠️ **2026-09-02 уточнение:** фактический mount в compose — `/mnt/RED_2TB/storage/obsidian-syncthing` (НЕ `/storage/obsidian`). Есть две отдельные папки: +> - `/storage/obsidian` — архивная/рабочая копия vault (старый mount в доке; `.stfolder` отсутствует) — НЕ является sync target. +> - `/storage/obsidian-syncthing` — **активная sync-копия** (`.stfolder` присутствует, uid 950) — это то, что реально монтируется контейнером. По ней и идёт телефонная синхронизация. В блоке `volumes:` ниже именно она. + ## Доступ - **Web UI:** https://syncthing.mallexxx.duckdns.org @@ -42,7 +46,7 @@ services: - TZ=Asia/Novosibirsk volumes: - /mnt/RED_2TB/docker/syncthing/config:/var/syncthing/config - - /mnt/RED_2TB/storage/obsidian:/var/syncthing/obsidian-vault + - /mnt/RED_2TB/storage/obsidian-syncthing:/var/syncthing/obsidian-vault ports: - "22000:22000/tcp" - "22000:22000/udp" @@ -55,7 +59,9 @@ networks: external: true ``` -**UID 950** = `truenas_admin` — имеет `FULL_CONTROL` ACL на `/mnt/RED_2TB/storage/obsidian`. +**UID 950** = `truenas_admin` — имеет `FULL_CONTROL` ACL на `/mnt/RED_2TB/storage/obsidian-syncthing` (и на `/storage/obsidian`). + +> **Питфол (после restore 2026-08-31):** после восстановления из бэкапа и syncthing-папка (`obsidian-syncthing`), и многие `/storage/*` стали `uid 921` (`transmission`) с правами 0000 → syncthing-папка уходит в `error: stat .stfolder: permission denied` → телефонная синхронизация стоит. Фикс: вернуть `950:950` + `u+rwX,g+rwX` (см. `family/documents/vault-sync/2026-08-31-syncthing-truenas-incident.md`). Эта же поломка затрагивает `git/` и медиа-папки (см. `2026-09-02-restore-privilege-scope.md`). ## Caddy diff --git a/family/how-to/vault-git-sync.md b/family/how-to/vault-git-sync.md index 340a7822..20af0bfe 100644 --- a/family/how-to/vault-git-sync.md +++ b/family/how-to/vault-git-sync.md @@ -1,6 +1,6 @@ --- title: Vault Git Sync — Architecture & Scripts -updated: '2026-06-20' +updated: '2026-09-02' type: tech tags: - vault @@ -12,6 +12,10 @@ tags: # Vault Git Sync +> **STATE 2026-09-02:** Eagle (мой `~/obsidian`) — git-sync **СТОИТ**: `main...nas/main [ahead 55]`. Причина — поломка прав после restore: `/mnt/RED_2TB/storage/git` (bare repo `obsidian-vault.git`) → `d--------- 921 921` (uid 921 = transmission). SSH к TrueNAS живой, но `git fetch`: `fatal: ... does not appear to be a git repository`. Fix: `chown 950:950` + `chmod u+rwX,g+rwX` на `storage/git`, затем `bash ~/scripts/sync-vault.sh`. Подробно: `family/documents/vault-sync/2026-09-02-restore-privilege-scope.md`. + +> **Триггер cron на маке (Eagle) — это launchd, НЕ Hermes cron:** `~/Library/LaunchAgents/com.sync-vault.plist` → `/Users/admin/scripts/sync-vault.sh`, `StartInterval=300` (5 мин). Скрипт `sync-vault-lib.sh` намеренно глушит dead remote (`git fetch` fail → `exit 0`), поэтому launchd показывает `last exit code = 0` даже при фактически стоящем sync. Системный crontab на маке пуст. + Obsidian vault is a bare git repo on TrueNAS: `/mnt/RED_2TB/storage/git/obsidian-vault.git` Also mirrored in Gitea: `https://git.mallexxx.duckdns.org/git_admin/obsidian-vault`