Synchronize Athena operating modes with live deployment

This commit is contained in:
Mikei386
2026-09-13 18:50:34 +02:00
parent 9fe51390f6
commit 040a2df48b
5 changed files with 1349 additions and 198 deletions
+43 -141
View File
@@ -50,11 +50,6 @@ services:
- /tmp:size=16m,mode=1777
volumes:
- "${WIREGUARD_CONFIG_FILE:-/etc/mike-ai/wireguard/fritz-athena.conf}:/run/secrets/fritz-athena.conf:ro"
# Namespace-sharing services cannot publish ports themselves. The owner
# must keep these bindings so a gateway recreation cannot hide their UIs.
ports:
- "8099:8099"
- "9443:9443"
networks:
frontend:
ipv4_address: 172.30.10.254
@@ -237,89 +232,6 @@ services:
- --spec-draft-p-min
- "0.05"
# Beta 1 keeps the complete GSQ-RCO text model and KV cache on the RTX 5080.
# Only the multimodal projector runs on the RTX 3060. The measured hard
# boundary is 196608 tokens; 192K deliberately retains runtime headroom.
llama-beta1:
<<: *llama-common
container_name: mike-ai-llama-beta1
labels:
com.mike-ai.llama-profile: beta1
environment:
NVIDIA_VISIBLE_DEVICES: ${BETA1_GPU_DEVICES:-0,1}
NVIDIA_DRIVER_CAPABILITIES: compute,utility
MTMD_BACKEND_DEVICE: CUDA1
command:
- --model
- "/models/${BETA1_MODEL_FILE:?BETA1_MODEL_FILE is required}"
- --mmproj
- "/models/${VISION_PROJECTOR_FILE:?VISION_PROJECTOR_FILE is required}"
- --mmproj-offload
- --mmproj-device
- CUDA1
- --alias
- qwen-beta-1
- --ctx-size
- "${BETA1_CONTEXT:-192000}"
- --flash-attn
- "on"
- --cache-type-k
- q4_0
- --cache-type-v
- q4_0
- --cache-prompt
- --cache-ram
- "${LLAMA_CACHE_RAM_MIB:-32768}"
- --threads
- "${LLAMA_THREADS:-6}"
- --threads-batch
- "${LLAMA_THREADS_BATCH:-6}"
- --batch-size
- "${BETA1_BATCH_SIZE:-2048}"
- --ubatch-size
- "${BETA1_UBATCH_SIZE:-128}"
- --parallel
- "${BETA1_PARALLEL_SLOTS:-1}"
- --kv-unified
- --jinja
- --reasoning
- auto
- --reasoning-preserve
- --host
- 0.0.0.0
- --port
- "8080"
- --metrics
- --fit
- "off"
- --n-gpu-layers
- all
- --load-mode
- none
- --no-ui
- --temperature
- "1.0"
- --top-p
- "0.95"
- --top-k
- "20"
- --device
- CUDA0
- --main-gpu
- "0"
- --split-mode
- none
- --spec-type
- draft-mtp
- --spec-draft-n-max
- "3"
- --spec-draft-type-k
- f16
- --spec-draft-type-v
- f16
- --spec-draft-p-min
- "0.05"
llama-large:
<<: *llama-common
container_name: mike-ai-llama-large
@@ -575,8 +487,17 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
environment:
CONTROLLER_TOKEN: "${CONTROLLER_TOKEN:?CONTROLLER_TOKEN is required}"
ALLOWED_PROFILES: fast,medium,beta1,large,ultra,uncensored
ALLOWED_PROFILES: fast,medium,large,ultra,uncensored
IMAGE_WORKER: image
RESTORE_WORKER: restore
TTS_WORKER: qwen3
MUSIC_WORKER: acestep
YUE2_WORKER: yue2
SEPARATOR_WORKER: bs-roformer
VOICE_WORKER: vevo2
VOICE_CHANGE_WORKER: xvc
APPLIO_WORKER: applio
TRELLIS_WORKER: trellis2-q8
networks: [control]
security_opt: ["no-new-privileges:true"]
healthcheck:
@@ -612,6 +533,8 @@ services:
PROFILE_CONTROL_TOKEN: "${CONTROLLER_TOKEN:?CONTROLLER_TOKEN is required}"
SWITCH_TIMEOUT: "600"
REQUEST_TIMEOUT: "600"
YUE2_START_TIMEOUT: "600"
TRELLIS_START_TIMEOUT: "900"
# Last-resort guard for every OpenAI-compatible client. Without a
# request limit llama.cpp uses n_predict=-1 and a reasoning loop can
# consume the complete context before yielding visible output.
@@ -621,19 +544,21 @@ services:
IMAGE_DIR: /data/images
IMAGE_WORKER_URL: http://image-worker:8086
IMAGE_WORKER_TOKEN: "${CONTROLLER_TOKEN:?CONTROLLER_TOKEN is required}"
IMAGE_MODEL_NAME: FLUX.2-klein-4B
IMAGE_MODEL_NAME: FLUX.2-klein-9B-fp8-beta
CHAT_IMAGE_ALLOW_REMOTE_URLS: "false"
ENABLE_IMAGE_GENERATION: "true"
ENABLE_TTS: "true"
# Stable OpenAI compatibility names remain piper/alloy because an
# existing Open WebUI database persists those values. The gateway maps
# alloy to XTTS speaker Annmarie Nele and automatically falls back to
# Piper if XTTS is unavailable, busy or returns an error.
# The gateway keeps text normalization, output conversion and native
# PCM streaming in one stable API in front of Qwen3-TTS.
TTS_WORKER_URL: http://tts-gateway:8085
TTS_MODEL: piper
TTS_MODEL: qwen3-tts
TTS_VOICES: alloy
TTS_DEFAULT_VOICE: alloy
ENABLE_STT: "true"
ENABLE_MUSIC_MODE: "true"
MUSIC_START_TIMEOUT: "600"
VOICE_CHANGE_START_TIMEOUT: "600"
APPLIO_START_TIMEOUT: "900"
STT_WORKER_URL: http://whisper:8084
STT_TIMEOUT: "300"
networks: [frontend, control, inference]
@@ -655,8 +580,6 @@ services:
condition: service_healthy
profile-controller:
condition: service_healthy
piper:
condition: service_healthy
tts-gateway:
condition: service_healthy
whisper:
@@ -680,13 +603,15 @@ services:
read_only: true
tmpfs: ["/tmp:size=1g,mode=1777"]
volumes:
- "${FLUX_MODEL_DIR:-/data/models/FLUX.2-klein-4B}:/models/FLUX.2-klein-4B:ro"
- "${FLUX_COMPONENT_DIR:-/data/models/FLUX.2-klein-9B-components}:/models/components:ro"
- "${FLUX_TRANSFORMER_DIR:-/data/models/FLUX.2-klein-9B-fp8}:/models/fp8:ro"
- router-images:/data/images
environment:
NVIDIA_VISIBLE_DEVICES: ${IMAGE_GPU_DEVICES:-1}
NVIDIA_VISIBLE_DEVICES: all
NVIDIA_DRIVER_CAPABILITIES: compute,utility
WORKER_TOKEN: "${CONTROLLER_TOKEN:?CONTROLLER_TOKEN is required}"
FLUX_MODEL_DIR: /models/FLUX.2-klein-4B
FLUX_COMPONENT_DIR: /models/components
FLUX_TRANSFORMER_FILE: /models/fp8/flux-2-klein-9b-fp8.safetensors
IMAGE_DIR: /data/images
networks: [inference]
security_opt: ["no-new-privileges:true"]
@@ -697,41 +622,12 @@ services:
timeout: 3s
retries: 12
piper:
build:
context: platform/docker/piper
args:
PIPER_TTS_VERSION: ${PIPER_TTS_VERSION:-1.6.0}
image: mike-ai/piper:local
container_name: mike-ai-piper
restart: unless-stopped
read_only: true
tmpfs:
- /tmp:size=256m,mode=1777
volumes:
- piper-data:/data
environment:
PIPER_DATA_DIR: /data
PIPER_VOICE: ${PIPER_VOICE:-de_DE-thorsten-high}
PIPER_VOICE_ALIAS: alloy
PIPER_HOST: 0.0.0.0
PIPER_PORT: "8085"
PIPER_MAX_TEXT_CHARS: "8000"
networks: [frontend]
security_opt: ["no-new-privileges:true"]
cap_drop: [ALL]
cap_add: [CHOWN, SETUID, SETGID]
healthcheck:
test: [CMD, curl, -fsS, "http://127.0.0.1:8085/status"]
interval: 10s
timeout: 5s
retries: 30
start_period: 120s
qwen3-tts:
image: ${QWEN3_TTS_IMAGE:-ghcr.io/malaiwah/qwen3-tts-server:latest@sha256:b363a01d08b1bbecbfc3ca6f585368fae2cfdc591f9ecca6643738369f9a9d98}
container_name: mike-ai-qwen3-tts
restart: unless-stopped
labels:
com.mike-ai.tts-worker: qwen3
deploy:
resources:
reservations:
@@ -783,17 +679,12 @@ services:
QWEN_TTS_VOICE: serena
QWEN_TTS_LANGUAGE: German
QWEN_TTS_TIMEOUT: "120"
PIPER_URL: http://piper:8085
TTS_VOICE_ALIAS: alloy
TTS_DEFAULT_LANGUAGE: de
# Mixed-language clip stitching caused long pauses and unintelligible
# transitions. Keep full sentences in one stable German voice.
TTS_CODE_SWITCH_ENABLED: "false"
PIPER_TIMEOUT: "120"
networks: [frontend]
depends_on:
piper:
condition: service_healthy
security_opt: ["no-new-privileges:true"]
cap_drop: [ALL]
healthcheck:
@@ -843,7 +734,7 @@ services:
image: mike-ai/llama-dashboard:local
container_name: mike-ai-llama-dashboard
restart: unless-stopped
network_mode: "service:wireguard-gateway"
networks: [frontend]
gpus: all
read_only: true
tmpfs:
@@ -852,15 +743,26 @@ services:
- /proc:/host/proc:ro
- /data:/host/data:ro
- /data/models:/host/models:ro
- /data/emergency-backups:/backups:ro
- /data/llama-dashboard:/var/lib/llama-dashboard
environment:
DASHBOARD_HOST: 0.0.0.0
DASHBOARD_PORT: "8099"
ROUTER_URL: http://router:8081
ROUTER_API_KEY: "${ROUTER_API_KEY:?ROUTER_API_KEY is required}"
MUSIC_COMMUNITY_UI_URL: "${MUSIC_COMMUNITY_UI_URL:-http://192.168.1.212:7861/}"
MUSIC_ORIGINAL_UI_URL: "${MUSIC_ORIGINAL_UI_URL:-http://192.168.1.212:7862/}"
SEPARATOR_UI_URL: "${SEPARATOR_UI_URL:-http://192.168.1.212:8007/}"
VOICE_UI_URL: "${VOICE_UI_URL:-http://192.168.1.212:8008/}"
VOICE_CHANGE_UI_URL: "${VOICE_CHANGE_UI_URL:-http://192.168.1.212:8009/}"
APPLIO_UI_URL: "${APPLIO_UI_URL:-http://192.168.1.212:8011/}"
MIKES_APPLIO_UI_URL: "${MIKES_APPLIO_UI_URL:-http://192.168.1.212:8012/}"
TRELLIS_UI_URL: "${TRELLIS_UI_URL:-http://192.168.1.212:8013/}"
YUE2_UI_URL: "${YUE2_UI_URL:-http://192.168.1.212:8014/}"
HOST_PROC: /host/proc
HOST_DATA: /host/data
HOST_MODELS: /host/models
DASHBOARD_BACKUP_DIR: /backups
DASHBOARD_HISTORY_DB: /var/lib/llama-dashboard/history.sqlite3
DASHBOARD_HISTORY_INTERVAL: "15"
DASHBOARD_DETAIL_RETENTION_DAYS: "21"
@@ -884,7 +786,7 @@ services:
image: ${PORTAINER_IMAGE:-portainer/portainer-ce@sha256:511f3f06c96fe3b993ebeaafde311c1959cae73a7ef825dba6397d51b450dffa}
container_name: mike-ai-portainer
restart: unless-stopped
network_mode: "service:wireguard-gateway"
networks: [frontend]
command: [--no-setup-token]
volumes:
- /var/run/docker.sock:/var/run/docker.sock
@@ -908,8 +810,9 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /data/docker-backups:/archive
- /etc/mike-ai:/backup/etc-mike-ai:ro
- /opt/mike-ai/stack:/backup/stack:ro
- piper-data:/backup/volumes/piper-data:ro
# Include every deployed specialist UI/worker source tree, not just the
# core checkout. Images themselves remain reproducible and are rebuilt.
- /opt/mike-ai:/backup/opt-mike-ai:ro
- router-state:/backup/volumes/router-state:ro
- router-images:/backup/volumes/router-images:ro
- portainer-data:/backup/volumes/portainer-data:ro
@@ -936,7 +839,6 @@ networks:
name: mike-ai-tools-egress
volumes:
piper-data:
whisper-data:
router-state:
router-images: