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.
62 lines
2.8 KiB
Markdown
62 lines
2.8 KiB
Markdown
# 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.
|
|
|
|
```bash
|
|
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`:
|
|
|
|
```bash
|
|
# 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.
|