diff --git a/docs/pfi/fleet-conventions.md b/docs/pfi/fleet-conventions.md index 580a9a0..3126494 100644 --- a/docs/pfi/fleet-conventions.md +++ b/docs/pfi/fleet-conventions.md @@ -155,6 +155,19 @@ The setgid bit on directories is load-bearing: it makes every file created afterwards inherit the `docker` group, so the scheme does not decay back into whoever-touched-it-last ownership. +⚠ **A stack dir that is a git checkout needs `safe.directory` for its deploy +user.** git (>= 2.35.2) refuses to operate in a worktree whose top-level dir is +owned by someone else, so moving a checkout to `root:docker` breaks any deploy +that runs `git fetch`/`reset` as a normal user, with `fatal: detected dubious +ownership`. That's what stalled yt-voice-clipper's webhook auto-deploy on irv-ml1 +after the 2026-09-14 normalization, found 2026-09-24 when v0.3.13 would not +land. The fix keeps the convention: as the deploy user, +`git config --global --add safe.directory /opt/docker/compose/` (one +entry per repo; the `/*` wildcard form needs git >= 2.46, and irv-ml1 has +2.39). Swept 2026-09-24: that was the only checkout under a normalized +`/opt/docker/compose` deployed by a non-root user. esh-docker-vm's +`/opt/docker/conf/esphome/` is a checkout but is `root:root` throughout. + ⚠ **A stack lives under `/opt/docker/compose//` or it is invisible.** Every piece of fleet automation walks that path. `talk` sat at `~/talk` until 2026-09-14 and was silently skipped by the docker-ce upgrade's restart loop for