Files
vh 5a2770f0f7 docs/pfi/docker-stack: replace static model table with pointer to live config
Same anti-pattern as the deleted model-list.md — a hardcoded snapshot
of mutable config that's guaranteed to drift. Replaced the 15-row
table with a one-liner pointing at stacks/llama-swap/conf/config.yaml
(the canonical source) and the live /v1/models HTTP endpoint. Found
via /tend-docs.
2026-04-29 17:03:13 -07:00

12 KiB

PFI-ANA Docker Stack

Overview

PFI-ANA (the Colo) runs Docker services managed through Dockge, a compose-aware Docker management UI. All services that require inbound HTTP/HTTPS routing join a shared external Docker network called traefik-net, allowing Traefik to act as a reverse proxy and handle TLS termination and routing.

Conventions

Network

Network Docker Name Purpose
Traefik network traefik-net Shared external network. Services join as tnet so Traefik can discover them.

Every compose file that needs to be reachable through Traefik must include:

networks:
  tnet:
    name: traefik-net
    external: true

And the service must list tnet under its networks key.

Storage Paths (Host)

Host Path Purpose
/opt/docker/compose/<service>/ Per-service compose files (managed by Dockge)
/opt/docker/conf/<service>/ Per-service configuration files (bind-mounted into containers)
/tank/ Large / persistent data storage (e.g., AI models, generated images, voice data)

GPU Support

Services requiring GPU access use the NVIDIA Container Toolkit:

runtime: nvidia

or the more explicit device reservation:

deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          count: all
          capabilities: [gpu]

Homepage Dashboard Labels

Several services include Docker labels for Homepage (a dashboard UI). The convention is:

labels:
  - homepage.group=<Group Name>
  - homepage.name=<Display Name>
  - homepage.icon=<icon identifier>
  - homepage.description=<brief description>
  - homepage.href=http://<host>:<port>

All services reference the VM 102 host IP 10.250.50.70 (PFI-ANA_DOCKER).

Compose File Location

Dockge expects compose files under /opt/docker/compose/ on the Docker host. The live compose files are version-controlled in this project under configs/pfi-ana/docker/compose/. Configuration files that containers bind-mount live under configs/pfi-ana/docker/conf/.


Live Services Index

Service Host Port Container Port GPU Homepage Group Status Compose File Config File
Dockge 5001 5001 No PFI-ANA Live compose/dockge/compose.yaml
llama-swap 9292 8080 Yes (CUDA) Live compose/llama-swap/compose.yaml conf/llama-swap/config.yaml
ComfyUI 8188 8188 Yes (all caps) AI Systems Live compose/comfyui/compose.yaml
VibeVoice 8745 8745 Yes (gpu) AI Systems Live compose/vibevoice/compose.yaml
Parakeet STT 8300 8000 Yes (gpu) AI Systems Live compose/parakeet/compose.yaml
ChromaDB 8000 8000 No AI Systems Live compose/chromadb/compose.yaml /opt/docker/conf/chromadb/auth_token

All paths relative to configs/pfi-ana/docker/.


Service Details

1. Dockge — Docker Compose Management UI

  • Image: louislam/dockge:latest
  • Port: 5001 → 5001
  • Restart policy: unless-stopped
  • Homepage group: PFI-ANA
  • Compose file: compose/dockge/compose.yaml

Volumes:

Host / Volume Container Purpose
/var/run/docker.sock /var/run/docker.sock Docker socket for managing containers
dockge_data (named volume) /app/data Dockge application data
/opt/docker/compose /opt/docker/compose Compose stack directory

Environment:

  • DOCKGE_STACKS_DIR=/opt/docker/compose — tells Dockge where to find/manage compose stacks

Notes: Dockge is the management interface for all other compose stacks on this host. It has full Docker daemon access via the socket mount.


2. llama-swap — Multi-Model LLM Gateway

  • Image: ghcr.io/mostlygeek/llama-swap:cuda
  • Port: 9292 → 8080
  • Runtime: nvidia (CUDA)
  • Compose file: compose/llama-swap/compose.yaml
  • Config file: conf/llama-swap/config.yaml
  • Interactive: stdin_open: true, tty: true (required by llama-swap)

Volumes:

Host Path Container Path Purpose
/opt/docker/conf/llama-swap/config.yaml /app/config.yaml llama-swap configuration (models, groups, params)
/tank/aimodels/llm /models LLM model files (GGUF format)

Configured Models: the live list (with quants, context, TTLs, group memberships) is in stacks/llama-swap/conf/config.yaml. Don't mirror the table here — it drifted last time and immediately went stale. Live HTTP listing: curl http://10.250.50.54:9292/v1/models.

Model Groups:

Group Swap Exclusive Persistent Members
high-reasoning false false qwen3.5-35-a3b, qwen3.5-35-a3b-code, gemma4-31b-dense
utility false false embeddinggemma-300M, bge-reranker-v2-m3-0.6B

Global Settings:

  • healthCheckTimeout: 1200 seconds (20 minutes) — long timeout for large models
  • logLevel: info
  • metricsMaxInMemory: 1000

3. ComfyUI — Image Generation UI

  • Image: mmartial/comfyui-nvidia-docker:ubuntu24_cuda13.0-latest
  • Port: 8188 → 8188
  • Runtime: nvidia with full device reservation (gpu, compute, utility capabilities)
  • Restart policy: unless-stopped
  • Homepage group: AI Systems
  • Compose file: compose/comfyui/compose.yaml

Volumes:

Host Path Container Path Purpose
/tank/comfy/run /comfy/mnt ComfyUI workspace / output directory
/tank/aimodels/img/comfy /basedir Image models and ComfyUI base directory

Environment:

Variable Value Purpose
WANTED_UID 1001 Run as user ID 1001
WANTED_GID 1002 Run as group ID 1002
BASE_DIRECTORY /basedir ComfyUI base directory path
SECURITY_LEVEL weak Relaxed security (private network)
NVIDIA_VISIBLE_DEVICES all Expose all GPUs
NVIDIA_DRIVER_CAPABILITIES all Enable all GPU capabilities

Notes: Runs with user-mapped permissions (UID 1001 / GID 1002). The basedir points to the image model storage on /tank.


4. VibeVoice — Voice/Audio AI Service

  • Image: eworkerinc/vibevoice:latest
  • Container name: vibevoice
  • Port: 8745 → 8745
  • GPU: Yes (all devices, gpu capability)
  • Restart policy: unless-stopped
  • Homepage group: AI Systems
  • Compose file: compose/vibevoice/compose.yaml

Volumes:

Host Path Container Path Purpose
/tank/vibevoice/hf /root/.cache/huggingface HuggingFace model cache
/tank/vibevoice/voices /app/voices Voice data / presets
/tank/vibevoice/state /var/lib/eworker Application state persistence

Environment:

Variable Value Purpose
ENABLE_1_5B true Enable 1.5B parameter voice model
ENABLE_LARGE true Enable large voice model
AUTH_REQUIRED true Require authentication
CORS_ENABLED true Enable CORS headers
ALLOWED_ORIGINS * Allow all origins (development/private network)

5. Parakeet STT — Speech-to-Text Service

  • Image: parakeet-stt (locally built)
  • Port: 8300 → 8000
  • GPU: Yes (all devices, gpu capability)
  • Restart policy: unless-stopped
  • Homepage group: AI Systems
  • Compose file: compose/parakeet/compose.yaml
  • Env file: .env (not tracked in project — likely contains API keys or model config)

Volumes:

Volume Container Path Purpose
parakeet_cache (named volume) /root/.cache Model download cache

Notes: Uses a locally-built image (no registry prefix). The .env file is referenced but not stored in the project — it likely contains environment-specific configuration on the Docker host.


6. ChromaDB — Vector Database

  • Image: chromadb/chroma:latest
  • Container name: chromadb
  • Port: 8000 → 8000
  • GPU: No
  • Restart policy: unless-stopped
  • Homepage group: AI Systems
  • Compose file: compose/chromadb/compose.yaml

Volumes:

Host Path Container Path Mode Purpose
/opt/docker/conf/chromadb /conf read-only Config directory (contains auth_token)
/tank/chromadb /data read-write Persistent vector data

Environment:

Variable Value Purpose
CHROMA_SERVER_AUTHN_CREDENTIALS_FILE /conf/auth_token Path to auth token file inside container
CHROMA_SERVER_AUTHN_PROVIDER chromadb.server.auth.token.TokenAuthenticationServerProvider Enable token-based authentication
IS_PERSISTENT TRUE Enable persistent storage
PERSIST_DIRECTORY /data Where vector data is stored inside container
ANONYMIZED_TELEMETRY FALSE Disable telemetry

Health Check:

Setting Value
Test curl -f http://localhost:8000/api/v1/health
Interval 30s
Timeout 10s
Retries 3
Start period 40s

Authentication: Token-based. The auth token is stored at /opt/docker/conf/chromadb/auth_token on the host (mode 600), generated with openssl rand -hex 32. Clients must supply this token to access the API.

Notes: CPU-only service (no GPU). Token is generated once at deploy with openssl rand -hex 32 into /opt/docker/conf/chromadb/auth_token (mode 600); clients pass it via the chromadb client Settings(chroma_client_auth_provider="...TokenAuthClientProvider", chroma_client_auth_credentials="...").


Infrastructure Summary

┌──────────────────────────────────────────────────────────────┐
│                    PFI-ANA (10.250.50.70)               │
│                   Docker Host (PFI-ANA_DOCKER)          │
│                                                         │
│  ┌──────────┐    Manages all compose stacks              │
│  │  Dockge  │◄─── /opt/docker/compose/*                  │
│  │  :5001   │    /var/run/docker.sock                    │
│  └──────────┘                                           │
│                                                         │
│  ┌──────────────────┐   GPU via passthrough          │
│  │  llama-swap  :9292 (CUDA, multi-model gateway)   │   │
│  │  ├── 15 models (chat, code, embedding, reranker) │   │
│  │  ├── 2 groups (high-reasoning, utility)          │   │
│  │  └── Models from /tank/aimodels/llm              │   │
│  └──────────────────┘   GPU via passthrough          │
│                                                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  GPU via      │
│  │  ComfyUI     │  │  VibeVoice   │  │  Parakeet    │  passthrough  │
│  │  :8188       │  │  :8745       │  │  :8300       │              │
│  │  (GPU, img)  │  │  (GPU, voice)│  │  (GPU, STT)  │              │
│  └──────────┘  └──────────┘  └──────────┘              │
│                                                         │
│  ┌──────────┐                                       │
│  │  ChromaDB    │  Token auth, persistent vectors        │
│  │  :8000       │  /tank/chromadb (data)                 │
│  │  (CPU only)  │  /opt/docker/conf/chromadb (config)    │
│  └──────────┘                                       │
│                                                         │
│   ── All services on traefik-net (external) ──         │
│   ── /tank/* = persistent large data storage ──        │
│   ── /opt/docker/* = config + compose files ──        │
└──────────────────────────────────────────────────────────────┘

Port Allocation

Port Service Protocol
5001 Dockge HTTP
8000 ChromaDB HTTP
8188 ComfyUI HTTP
8300 Parakeet STT HTTP (→ container 8000)
8745 VibeVoice HTTP
9292 llama-swap HTTP (→ container 8080)