Files
esh-pfi-infrastructure/stacks/augaman
vh c26f7c94e4 feat(augaman): deploy v0.1.1 on esh-ml1:8040 (face recognition for Cicada)
Mirror pfi/augaman deploy/compose.yaml as stacks/augaman, with an .env.example and
a README carrying the biometric backup gate. The image is built on esh-ml1 from a
git archive of the release tag, because the box holds no gitea credentials.

Serving on CUDA and visible in nvidia-smi. The gallery backup is not wired yet
(esh-ml1 has no restic), so only public-domain fixtures may be enrolled.
The on-box gpu test fails its batch-vs-single tolerance 3/3; reported to
augaman-dev, who owns the contract.
2026-09-26 23:50:44 -07:00
..

augaman

The fleet's face-recognition service for Cicada (enroll, recognize, verify), on esh-ml1 (CT 110 on esh-pve, RTX 2000E Ada). buffalo_l (SCRFD detector + ArcFace w600k_r50) on ONNX Runtime CUDA. Code and the canonical compose live in gitea pfi/augaman (owner: augaman-dev); compose.yaml here is a verbatim mirror of that repo's deploy/compose.yaml at the deployed tag. Change it there first, then re-mirror it here.

URL http://10.0.50.80:8040 (/health is unauthenticated; everything else needs the bearer token)
Token secret get augaman/api-token (vault is the source of truth)
Image augaman:<version>, built locally on esh-ml1 (below)
State named volume augaman_gallery (SQLite, local disk; the app refuses NFS)
VRAM ~1.5 GB by design (embed batches capped at 16)

⚠ Biometric data: backup gate

The gallery holds face embeddings and crops of household members. esh-ml1 is outside vzdump, so the gallery reaches backup only through the app's backup CLI, which writes gallery.db (mode 0600) into BACKUP_DIR = /var/lib/restic/stage/augaman (owned 10001:10001, mode 0700).

Operator ruling: until a scheduled backup ships that file off-box AND one restore has been verified (the restored copy reports the same identities), only public-domain test fixtures may be enrolled. No household faces.

Backup status: NOT WIRED as of the first deploy (2026-09-26). esh-ml1 has no restic yet.

docker exec augaman python -m augaman.gallery.backup --db /data/gallery.db --dest /backup/gallery.db
# one JSON line + exit 0, or "backup failed: ..." + exit 1

Building

The image is built on esh-ml1 from the release tag's content. esh-ml1 has no gitea credentials, so the source is shipped as a git archive:

# from nh3-dev, in a pfi/augaman checkout
git archive --format=tar vX.Y.Z | ssh esh-ml1 'sudo mkdir -p /opt/docker/src/augaman-vX.Y.Z && sudo tar -x -C /opt/docker/src/augaman-vX.Y.Z && sudo chown -R infra-ops:infra-ops /opt/docker/src'
# on esh-ml1
cd /opt/docker/src/augaman-vX.Y.Z && docker build -t augaman:X.Y.Z .

The build fetches the two pinned models and SHA-256-checks them; a mismatch fails the build. v0.1.0 built in under 2 minutes cold; first deployed version is v0.1.1 (tightly-cropped-face detector fix).

⚠ Disk: the build took the rootfs from 66% to 80% (image ~5 GB plus build cache). Beszel alerts at 85%. After a rebuild, remove the old image and run docker builder prune once the new version is verified.

Startup is fail-closed on CUDA

The service refuses to serve unless CUDA really runs every convolution (profiled warmup, ORT CPU fallback disabled). /health reports backend cuda only then. Allow up to 180 s (start_period). The real GPU confirmation is the augaman process showing up in nvidia-smi on the host.