Files
esh-pfi-infrastructure/stacks/asset-engine/compose.yaml
T
vh 569e1af9ca feat(homepage): split AI fleet into role-based groups on a dedicated AI tab
Move the ~22-service flat "AI Systems" group off the Main tab into a new
four-tab layout (Main / AI / Infrastructure / Toolchain). The AI tab sorts
the inference fleet by function into seven groups:

  AI - Inference        gen, char-rp, char-rp-reasoning, Granite summarizer
  AI - Eval & Retrieval Selene, Skywork Reward, Qwen3 rerank/embed, image-bench
  AI - Gateways & Chat  LiteLLM, Asset Engine, Gateway Chat, Open WebUI, ...
  AI - Speech (TTS)     Chatterbox Fast, Kokoro, mOrpheus
  AI - Audio Tools      Parakeet ASR, YT Voice Clipper
  AI - Image & Media    ComfyUI, Arbo
  AI - Dormant          stopped rollback seats + retired auditions

Relabel each stack's homepage.group so canonical stacks/ matches the live
containers on ana-ml2, ana-docker, and irv-ml1. Dormant stacks were refreshed
with `docker compose up --no-start` so they carry the new label while staying
stopped (compose-start rollback preserved). settings.yaml drives tab/order/
columns; services.yaml and README updated to the new scheme.
2026-07-14 20:05:50 -07:00

61 lines
2.7 KiB
YAML

# asset-engine — control plane over PFI's inference fleet.
#
# FastAPI + HTMX/Shoelace UI. Reads the catalog at services.yaml (baked
# into the image at build time, drift-checked in CI against the copy
# at docs/asset-engine/services.yaml in this repo), routes requests to
# inference hosts (irv-ml1 over WG by default), persists Assets to a
# local SQLite WAL DB, stores generated blobs content-addressed under
# runtime/outputs/.
#
# Image is built on the host from the asset-engine git repo by the
# deploy playbook (`playbooks/deploy-asset-engine.yaml`), which clones
# into /opt/docker/build/asset-engine and runs `docker build -t
# asset-engine:local .` before installing this compose and bringing
# it up. No registry.
#
# Internal tooling — accessed directly on host:port over the LAN, does
# NOT traverse Traefik. State persists under /opt/docker/conf/asset-engine/
# {db,outputs,ssh} on the host — db/outputs are separate bind-mounts so
# outputs/ can move to a bigger volume later without touching DB state;
# ssh/ holds the dedicated keypair used to orchestrate irv-ml1 services.
#
# All tunables live in .env — edit that, not this file.
services:
asset-engine:
image: ${ASSET_ENGINE_IMAGE}
container_name: asset-engine
restart: unless-stopped
ports:
- "${ASSET_ENGINE_BIND:-0.0.0.0}:${ASSET_ENGINE_PORT}:8000"
environment:
# App always listens on 8000 internally; host port is the only knob.
- RUNTIME_DIR=/app/runtime
- DB_URL=sqlite:////app/runtime/db/asset_engine.db
- INFERENCE_HOST=${INFERENCE_HOST:-10.100.79.3}
# OIDC seam is empty in v1; populated in v2 when forward-auth lands.
- OIDC_ISSUER=${OIDC_ISSUER:-}
- OIDC_CLIENT_ID=${OIDC_CLIENT_ID:-}
- OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET:-}
# Orchestration SSH paths inside the container.
- SSH_KEY_PATH=/app/runtime/ssh/id_ed25519
- SSH_KNOWN_HOSTS=/app/runtime/ssh/known_hosts
volumes:
- ${ASSET_ENGINE_DB_DIR}:/app/runtime/db
- ${ASSET_ENGINE_OUTPUTS_DIR}:/app/runtime/outputs
# Dedicated SSH key for orchestrating irv-ml1 services (up/down).
# Read-only; key is generated on the host, never crosses the network.
- ${ASSET_ENGINE_SSH_DIR}:/app/runtime/ssh:ro
healthcheck:
test: ["CMD-SHELL", "python -c 'import urllib.request,sys; r=urllib.request.urlopen(\"http://127.0.0.1:8000/health\",timeout=3); sys.exit(0 if r.status==200 else 1)' || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
labels:
- homepage.group=AI - Gateways & Chat
- homepage.name=Asset Engine
- homepage.icon=mdi-tools
- homepage.description=Control plane over the PFI inference fleet
- homepage.href=http://10.250.50.70:${ASSET_ENGINE_PORT}