From 486e3c27e4c429d4eac27d40a94d969298c66949 Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Thu, 21 May 2026 18:51:11 -0400 Subject: [PATCH] fix(decklink): mount /dev/blackmagic in sidecar + remote node routing via node-agent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two bugs fixed: 1. SDI capture sidecar never had /dev/blackmagic bound — ffmpeg opened the decklink input inside a container with no device nodes, so frame=0. Fix: local spawns now push '/dev/blackmagic:/dev/blackmagic' onto Binds when source_type='sdi'. 2. recorders.js always spawned sidecars against the local Docker socket (zampp1), even when a recorder's node_id pointed at zampp2 (where the card is). Fix: resolveNodeTarget() looks up the recorder's cluster node; if it's a different hostname the sidecar is spawned via a new POST /sidecar/start endpoint on the remote node-agent. node-agent gains three new routes (all talk to the local Docker socket): POST /sidecar/start — create + start container (host network, privileged, /dev/blackmagic bind for sdi) DELETE /sidecar/:id — stop + remove GET /sidecar/:id/status — inspect + poll capture service docker-compose.worker.yml: add /var/run/docker.sock and LIVE_DIR to node-agent so it can spawn sidecars, and document build-capture prerequisite.: docker-compose.worker.yml --- docker-compose.worker.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docker-compose.worker.yml b/docker-compose.worker.yml index 74d9b7e..26d5508 100644 --- a/docker-compose.worker.yml +++ b/docker-compose.worker.yml @@ -17,6 +17,7 @@ # REDIS_URL, DATABASE_URL, S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY, S3_SECRET_KEY # BMD_DEVICE_0 DeckLink device path (default: /dev/blackmagic/dv0) # BMD_DEVICE_1 DeckLink device path (default: /dev/blackmagic/dv1) +# LIVE_DIR Host path for HLS live segments (default: /mnt/NVME/MAM/wild-dragon-live) # # Profiles: # (default) node-agent only — cluster visibility + hardware heartbeat @@ -25,6 +26,11 @@ # # To enable GPU transcoding, also apply docker-compose.gpu.yml: # docker compose -f docker-compose.worker.yml -f docker-compose.gpu.yml --profile worker up -d +# +# NOTE: The node-agent mounts /var/run/docker.sock to spawn on-demand SDI +# capture sidecars when the primary mam-api routes a recorder to this node. +# Build the capture image before first use: +# docker compose -f docker-compose.worker.yml build capture services: @@ -45,10 +51,12 @@ services: GPU_COUNT: ${GPU_COUNT:--1} BMD_COUNT: ${BMD_COUNT:--1} BMD_MODEL: ${BMD_MODEL:-} + LIVE_DIR: ${LIVE_DIR:-/mnt/NVME/MAM/wild-dragon-live} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /dev:/dev:ro devices: - /dev/blackmagic:/dev/blackmagic - volumes: - - /dev:/dev:ro worker: build: ./services/worker