[2026-09-26] eagle: family/documents/vault-sync/2026-09-26-syncthing-clone-root-objects-acl-confusion.md family/how-to/vault-git-sync.md personal/plans/balda-mm-phase4-agents.md personal/tech/docker_colima_setup.md personal/tech/macos-docker-virtiofs-mount-limits.md personal/tech/truenas-nfs4-acl-and-arrmultiuser.md
This commit is contained in:
1 parent
8efe5c8970
commit
f482778257
6 files changed
+330
-25
No files matched your search
@@ -111,10 +111,21 @@ cat /tmp/colima.err
|
||||
|
||||
## 10. Docker usage
|
||||
|
||||
🔴 **Команда — `docker-compose`, а НЕ `docker compose`.** В homebrew-установке compose
|
||||
приезжает отдельным бинарём, не плагином, поэтому `docker compose …` падает с
|
||||
`docker: unknown command: docker compose` (выглядит как сломанный Docker — не сломан).
|
||||
Проверено 2026-09-26: CLI 29.4.1, compose 5.1.3.
|
||||
|
||||
``` bash
|
||||
docker-compose up -d # ✅
|
||||
docker-compose config # валидация (флага --quiet у этой версии НЕТ)
|
||||
docker compose up -d # ❌ unknown command
|
||||
```
|
||||
|
||||
Start containers:
|
||||
|
||||
``` bash
|
||||
docker compose up -d
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
Check running containers:
|
||||
@@ -123,6 +134,9 @@ Check running containers:
|
||||
docker ps
|
||||
```
|
||||
|
||||
Подробнее про границы проброса путей в контейнер (virtiofs) и билдер arm64builder:
|
||||
[[tech/macos-docker-virtiofs-mount-limits]].
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
## Behavior
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
# macOS Docker Desktop — что НЕ проезжает в контейнер (virtiofs)
|
||||
|
||||
> Создан 2026-09-26. Статус: **проверено живыми тестами** (alpine:3.20, linux/arm64,
|
||||
> Docker Desktop на macOS 26.6.1, Apple Silicon).
|
||||
> **Colima** на macOS 26.6.1, Apple Silicon; `colima start --cpu 8 --memory 24 --disk 100`).
|
||||
> Тема: границы проброса путей из мира macOS в контейнер.
|
||||
> Все выводы получены прогонами, не по памяти. Команды воспроизведения — в §5.
|
||||
> Все выводы получены прогонами, не по памяти. Команды воспроизведения — в §6.
|
||||
|
||||
---
|
||||
|
||||
## 0. Главный вывод одной строкой
|
||||
|
||||
На macOS Docker Desktop отдаёт контейнеру файлы **не через Linux `mount`**, а через
|
||||
На macOS рантайм контейнеров (Colima, Docker Desktop) отдаёт контейнеру файлы
|
||||
**не через Linux `mount`**, а через
|
||||
**virtiofs** — демон, который строит маппинг путей **в момент старта контейнера**
|
||||
и знает только пути **мира macOS**, известные ему на старте.
|
||||
|
||||
@@ -160,6 +161,55 @@ ln /tmp/a /tmp/b # → Operation not permitt
|
||||
|
||||
---
|
||||
|
||||
## 8. ⚠️ Реализация на macOS: `docker-compose`, а не `docker compose`
|
||||
|
||||
Проверено 2026-09-26 на этой машине (Docker CLI 29.4.1, macOS 26.6.1, Apple Silicon).
|
||||
Compose здесь — **отдельный бинарь**, не подкоманда `docker`:
|
||||
|
||||
| Что | Значение |
|
||||
|---|---|
|
||||
| CLI | `/opt/homebrew/bin/docker` (v29.4.1) |
|
||||
| buildx | плагин, симлинк в `~/.docker/cli-plugins/docker-buildx` |
|
||||
| compose | `/opt/homebrew/bin/docker-compose` (**v5.1.3**), симлинк в `/opt/homebrew/lib/docker/cli-plugins/` |
|
||||
|
||||
```bash
|
||||
docker compose config # → docker: unknown command: docker compose
|
||||
docker compose config --quiet # → unknown flag: --quiet
|
||||
docker-compose config # ✅ работает
|
||||
docker-compose config --services
|
||||
```
|
||||
|
||||
📌 **Всегда `docker-compose` (с дефисом) в этом окружении.** Сообщение об ошибке
|
||||
выглядит как «docker не знает такой команды», а не «compose не установлен» — легко
|
||||
принять за сломанный Docker.
|
||||
|
||||
⚠️ Дефолтный билдер (`default` → `/var/run/docker.sock`) в статусе **`error`**.
|
||||
Для arm64-сборок использовать именованный билдер:
|
||||
```bash
|
||||
docker buildx build --builder arm64builder --platform linux/arm64 \
|
||||
--provenance=false --load -t <tag> .
|
||||
```
|
||||
|
||||
### Порядок файлов при генерации override
|
||||
|
||||
`compose.override.yaml` подхватывается compose **автоматически**, но если он ссылается на
|
||||
несуществующий путь на хосте, `up` падает на монтировании. Поэтому порядок строго такой:
|
||||
|
||||
```
|
||||
1. .env ← env_file, иначе up падает сразу
|
||||
2. agents-mounts.yaml ← манифест (можно пустой: mounts: [])
|
||||
3. tools/render-mounts.py ← → compose.override.yaml
|
||||
4. docker-compose up -d
|
||||
```
|
||||
|
||||
### Ловушка: `deploy.resources.limits` в не-swarm compose
|
||||
|
||||
Секция `deploy.resources.limits.memory` **молча игнорируется** запуском через
|
||||
`docker-compose up` (это формат swarm). Лимит создаёт ложное ощущение защиты —
|
||||
что-то ограничивать нужно иначе (cgroups напрямую или `mem_limit`, зависят от версии).
|
||||
|
||||
---
|
||||
|
||||
## Связанные заметки
|
||||
- [[personal/plans/balda-mm-phase4-agents]] — применение этих выводов (Фаза 4)
|
||||
- [[personal/projects/balda/balda-mm-delegation-plan]] — общий план проекта
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: TrueNAS NFS4 ACL repair + cross-container media PUID
|
||||
created: 2026-09-02
|
||||
updated: 2026-09-23
|
||||
updated: 2026-09-26
|
||||
type: tech
|
||||
namespace: personal
|
||||
tags: [truenas, nfs4, acl, midclt, arr, radarr, sonarr, jellyfin, transmission, docker, git]
|
||||
@@ -10,6 +10,7 @@ related:
|
||||
- "[[arr-stack-taiga]]"
|
||||
- "[[watchlist-disk-overflow-fix]]"
|
||||
- "[[2026-09-21-bare-repo-push-permission-denied]]"
|
||||
- "[[2026-09-26-syncthing-clone-root-objects-acl-confusion]]"
|
||||
---
|
||||
|
||||
# TrueNAS NFS4 ACL repair + cross-container media PUID
|
||||
@@ -33,6 +34,18 @@ Any "permission denied" / file not readable / git `loose object ... corrupt` / e
|
||||
## Core facts
|
||||
- TrueNAS SCALE uses **NFSv4 ACL**, not plain POSIX. `ls -la` shows a POSIX mask that can mislead.
|
||||
- Read real ACL: `midclt call filesystem.getacl <path>`; write: `midclt call filesystem.setacl`.
|
||||
- 🔴 **`getfacl` (POSIX view) HIDES the absence of a custom ACL — use `nfs4xdr_getfacl`** (2026-09-26).
|
||||
`getfacl` prints `user::rwx / group::rwx / other::---` whether or not named ACEs exist.
|
||||
`nfs4xdr_getfacl <path>` prints `trivial_acl: true` (only `owner@`/`group@`/`everyone@`) — the
|
||||
definitive "no custom ACL here". Start every permission diagnosis with it, not `getfacl`.
|
||||
- 🔴 **"We already fixed this with ACL" ≠ "the ACL is set on THIS path"** (2026-09-26). A recursive
|
||||
group ACL had been applied to `/mnt/RED_2TB/Edu` and was remembered as "done" — but the failing
|
||||
path was a **different** folder with `trivial_acl: true` (never touched). Verify by fact on the
|
||||
target object before repeating or ruling out a fix. Find past sessions:
|
||||
`sqlite3 ~/.hermes/hermes-whale/state.db "SELECT session_id, substr(content,1,300) FROM messages WHERE content LIKE '%setfacl%' ORDER BY id DESC LIMIT 40;"`
|
||||
- 🔴 **A one-off `chown` is symptom-treatment** (2026-09-26). If a **root** process keeps writing
|
||||
into the folder, root-owned files/objects reappear on the very next run. Permanent fixes only:
|
||||
`ACL` + inherit, OR run the writer **not as root** (`user: "950:950"` in compose).
|
||||
- **`truenas_admin` is FULL_ADMIN in midclt** → can chown/setacl without passwordless root.
|
||||
- Web UI ACL editing only works on zfs **datasets**, not arbitrary subdirs under one dataset → use midclt/CLI.
|
||||
- Post-restore a tree may be owned by wrong uid (e.g. 921 `transmission`) with files `mode 0000`.
|
||||
|
||||
Reference in new issue
Block a user