Files
infra-docker-configs/servers/unraid/tail2-pose-server/DEPLOYMENT.md
T

1.9 KiB

Tail 2 pose server

GPU-only, receive-only NDI inference service. It never saves frames/crops and has no PTZ, shell, upload, cloud, identity, or action-classification API.

  • API: http://192.168.50.100:18120
  • Token: /mnt/user/appdata/tail2-pose-server/secrets/api-token (mode 0600)
  • Source: TAIL 2_1621D2 (OBSBOT) / 192.168.50.207
  • Coordinate contract: unmodified NDI buffer, no horizontal flip
  • Default backend: RTMLib 0.0.15, official YOLOX-m HumanArt+COCO 640x640 and RTMPose-m Body17 256x192, ONNX Runtime GPU with CUDA EP first.
  • Alternatives: openmmlab, rtmlib_wholebody (DWPose-m 133), and rtmlib_rtmw_l. The original RTMDet-tiny + RTMW-m OpenMMLab path remains available as the baseline.
  • NDI binding: cyndilib 0.1.1 and its distributed NDI runtime. NDI's redistributable license applies; do not redistribute the image outside this private deployment without reviewing that license.

Rotate the integration token after onboarding clients:

umask 077
printf 'tail2_%s' "$(head -c 48 /dev/urandom | base64 | tr -d '\n=/+')" > /mnt/user/appdata/tail2-pose-server/secrets/api-token
docker compose restart tail2-pose-server

Current acceptance status

The RTMLib optimization passes the offline inference target. Body17 1/2/4-person p50 is 19.405/24.543/34.781 ms and p95 is 19.734/25.727/36.191 ms. DWPose-m WholeBody 1/2/4-person p50 is 19.905/26.193/37.770 ms and p95 is 20.237/27.489/39.592 ms. All cases used 100 warmups and 300 measured iterations with real 1/2/4-person detector results.

Live acceptance is currently blocked externally: the camera IP responds, but the NDI finder repeatedly reports last_sources=[]. Re-run the live WebSocket and 30-minute soak acceptance after TAIL 2_1621D2 (OBSBOT) resumes broadcasting.

The one-shot validation services are profile-gated and do not run during normal Arcane lifecycle:

docker compose --profile validation up validate
docker compose --profile validation up soak