From 26f3a27eee18187bba85cb5268fcbb31e6f29a75 Mon Sep 17 00:00:00 2001 From: glass beadian Date: Wed, 14 Oct 2026 22:19:59 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20produce=20worker=20boot=20=E2=80=94=20sc?= =?UTF-8?q?ratch=20dir=20bootstrap=20+=20api=20ffprobe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The produce worker crashed its claim cycle at the scratch mkdtemp (ENOENT: the parent dir never existed on a fresh volume) — bootstrap MEDIA_SCRATCH_DIR recursively at startup. The api image lacked ffprobe entirely, so every upload's probe job failed — install ffmpeg in the api runtime image. --- apps/media-worker/src/produce.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/media-worker/src/produce.ts b/apps/media-worker/src/produce.ts index aa3b053..94ab253 100644 --- a/apps/media-worker/src/produce.ts +++ b/apps/media-worker/src/produce.ts @@ -12,6 +12,7 @@ * Everything else is env parity with the API's storage (S3_ENDPOINT/S3_ACCESS_KEY/ * S3_SECRET_KEY/S3_BUCKET/S3_KEK) and DATABASE_URL for the job tables. */ +import { mkdirSync } from "node:fs"; import pino from "pino"; import { Pool as PgPool } from "pg"; import { laneFromEnv, resolveProduceFont } from "./env"; @@ -24,12 +25,14 @@ const logger = pino({ level: process.env.LOG_LEVEL ?? "info" }); export async function startProduceWorker(): Promise<{ runner: ProduceRunner; pool: PgPool }> { const lane = laneFromEnv(process.env.MEDIA_WORKER_LANE); const fontFile = resolveProduceFont(process.env.MEDIA_PRODUCE_FONT); + const scratchRoot = process.env.MEDIA_SCRATCH_DIR ?? "/var/tmp/media-worker/produce"; + mkdirSync(scratchRoot, { recursive: true }); const pool = new PgPool({ connectionString: process.env.DATABASE_URL }); const runner = new ProduceRunner({ jobs: new PostgresProduceJobStore(pool), storage: new WorkerS3Storage(workerStorageConfigFromEnv()), fontFile, - scratchRoot: process.env.MEDIA_SCRATCH_DIR ?? "/var/tmp/media-worker/produce", + scratchRoot, lane, redactor: { redact: () => "[produce stderr redacted]" }, onStderr: (message) => logger.warn({ message }, "ffmpeg stderr"),