feat: produce worker deployment + web producer/collective/branding UI + mobile CSS (wave-2c)

Deployment (t4g2): media-worker gains font-dejavu (drawtext lower-thirds)
and a dedicated produce-worker compose service running src/produce.ts —
claims video_processing_jobs compose|mix by lane, renders assembled/
overlaid/voiced cuts, registers derived library assets. Deliberately its
own process so a remote-lane box needs only Postgres + S3 + ffmpeg.

Web: compose media attachments UI (t2), Producer panel in the video
drawer (t5), collective creation + branding settings + shell branding
(brandweb), mobile CSS (mcss: touch targets, icon sizing, safe areas).
This commit is contained in:
glass beadian 2026-10-14 20:40:49 +00:00
parent 1183d69849
commit d9e8cdf789
18 changed files with 2384 additions and 20 deletions

View file

@ -10,7 +10,9 @@ RUN sh apps/media-worker/scripts/build-helpers.sh /out
FROM node:22-alpine
WORKDIR /app
RUN corepack enable
RUN apk add --no-cache ffmpeg
RUN apk add --no-cache ffmpeg font-dejavu \
&& mkdir -p /usr/share/fonts/truetype/dejavu \
&& ln -sf "$(find /usr/share/fonts -name 'DejaVuSans-Bold.ttf' | head -1)" /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf
COPY pnpm-workspace.yaml package.json tsconfig.base.json ./
COPY apps/media-worker/package.json apps/media-worker/
RUN pnpm install --filter @tactical-media-broadcast-hub/media-worker... --no-frozen-lockfile

View file

@ -163,6 +163,24 @@ services:
redis: { condition: service_healthy }
restart: unless-stopped
# Produce worker (editor v2): claims video_processing_jobs kind compose|mix,
# renders assembled/overlaid/voiced cuts, registers derived library assets.
# Deliberately its own process: a remote-lane box needs only Postgres +
# object storage + ffmpeg (see apps/media-worker/src/produce.ts header).
produce-worker:
build:
context: ../..
dockerfile: infra/media-worker.Dockerfile
command: ["pnpm", "--filter", "@tactical-media-broadcast-hub/media-worker", "exec", "tsx", "src/produce.ts"]
environment:
<<: *appenv
MEDIA_WORKER_LANE: local
MEDIA_SCRATCH_DIR: /var/lib/media-worker/produce
volumes: [mediaworkerstate:/var/lib/media-worker]
depends_on:
postgres: { condition: service_healthy }
restart: unless-stopped
cloudflared:
image: cloudflare/cloudflared:latest
command: ["tunnel", "--no-autoupdate", "run", "--token", "${CLOUDFLARE_TUNNEL_TOKEN:?}"]