From d505a488ac1d2d820ef61a0fa6280975234b156d Mon Sep 17 00:00:00 2001 From: Zac Date: Sat, 30 May 2026 13:18:16 +0000 Subject: [PATCH] build(playout): compose wiring + .env knobs - Add /mnt/NVME/MAM/wild-dragon-media:/media to mam-api (rw) and worker-p4 (rw); web-ui (ro, for serving HLS preview segments). - worker-p4 WORKER_QUEUES gains 'playout-stage' so master-tier nodes pick up the loudnorm stage jobs (they already have ffmpeg + the media mount). - New build-only 'playout' service with profile ["build-only"] so `docker compose --profile build-only build playout` produces the wild-dragon-playout:latest image without compose trying to up it as a long-running service. mam-api spawns these on demand. - mam-api env adds PLAYOUT_IMAGE + PLAYOUT_AMCP_BASE_PORT (5250 default). - .env.example: PLAYOUT_IMAGE, PLAYOUT_AMCP_BASE_PORT. --- .env.example | 7 +++++++ docker-compose.yml | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 79f3be1..493f47f 100644 --- a/.env.example +++ b/.env.example @@ -63,3 +63,10 @@ GOOGLE_ALLOWED_DOMAIN= # Note: if a Google-linked account also has TOTP enabled, sign-in still requires # the authenticator code (Google is treated as the first factor). Accounts without # TOTP complete sign-in in one Google step. + +# Playout / Master Control (MCR) +# Image tag the mam-api spawns when a channel starts. Build with: +# docker compose --profile build-only build playout +PLAYOUT_IMAGE=wild-dragon-playout:latest +# Base AMCP port — each channel binds to BASE + channel_id (in CasparCG terms). +PLAYOUT_AMCP_BASE_PORT=5250 diff --git a/docker-compose.yml b/docker-compose.yml index fce5ffb..3e66986 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,6 +40,7 @@ services: - /var/run/docker.sock:/var/run/docker.sock - /mnt/NVME/MAM/wild-dragon-live:/live - /mnt/NVME/MAM/wild-dragon-growing:/growing + - /mnt/NVME/MAM/wild-dragon-media:/media - /mnt/NVME/MAM/sdk:/sdk - /dev/shm:/dev/shm - /run/dbus:/run/dbus @@ -61,6 +62,8 @@ services: NODE_IP: ${NODE_IP} NODE_HOSTNAME: ${NODE_HOSTNAME:-} CAPTURE_TOKEN: ${CAPTURE_TOKEN} + PLAYOUT_IMAGE: ${PLAYOUT_IMAGE:-wild-dragon-playout:latest} + PLAYOUT_AMCP_BASE_PORT: ${PLAYOUT_AMCP_BASE_PORT:-5250} deploy: resources: reservations: @@ -120,14 +123,16 @@ services: # after the capability-routing split, so import jobs sat unprocessed and # assets stayed `ingesting` forever. import is concurrency-1 + network- # bound, so one consumer (this heavy/primary worker) is sufficient. - WORKER_QUEUES: proxy,conform,trim,import + WORKER_QUEUES: proxy,conform,trim,import,playout-stage RUN_PROMOTION: "true" PROXY_CONCURRENCY: "2" + PLAYOUT_MEDIA_DIR: /media NVIDIA_VISIBLE_DEVICES: GPU-79afca3e-2ab2-a6ea-1c44-706c1f0a26d6 WORKER_LABEL: "zampp1 / Tesla P4" NVIDIA_DRIVER_CAPABILITIES: video,compute,utility volumes: - /mnt/NVME/MAM/wild-dragon-growing:/growing + - /mnt/NVME/MAM/wild-dragon-media:/media networks: - wild-dragon @@ -176,12 +181,22 @@ services: - "${PORT_WEB_UI:-7434}:80" volumes: - /mnt/NVME/MAM/wild-dragon-live:/live + - /mnt/NVME/MAM/wild-dragon-media:/media:ro - /dev/shm:/dev/shm - /run/dbus:/run/dbus - /run/systemd:/run/systemd networks: - wild-dragon + # Build-only: the CasparCG sidecar image. mam-api spawns these on-demand per + # channel (one container per playout channel), so this service is never up'd — + # it exists so `docker compose build playout` produces the image the API tags + # via PLAYOUT_IMAGE. Profile excludes it from default `up`. + playout: + profiles: ["build-only"] + build: ./services/playout + image: wild-dragon-playout:latest + volumes: postgres_data: redis_data: