From e904f0949b498a97b1726dfbbc06af3bc7f45709 Mon Sep 17 00:00:00 2001 From: Martin Porwoll Date: Sat, 14 Feb 2026 17:46:54 +0000 Subject: [PATCH] fix(queue): resolve queue-worker crash-loop via Redis auth and PM2 config Redis requires authentication but IORedis connections were not passing a password, causing immediate NOAUTH failures and a PM2 crash-loop (1900+ restarts). Additionally, the PM2 config used `npx` as the script entry which caused instability. - Add REDIS_PASSWORD support to queue-service.ts and redis.ts - Change PM2 script from npx wrapper to direct tsx CLI entry point - Add explicit exec_mode: 'fork' to prevent cluster mode issues Co-Authored-By: Claude Opus 4.6 --- ecosystem.config.cjs | 5 +++-- src/lib/queue/queue-service.ts | 1 + src/lib/redis.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs index 2632222..bd07dbb 100644 --- a/ecosystem.config.cjs +++ b/ecosystem.config.cjs @@ -25,8 +25,9 @@ module.exports = { { name: 'queue-worker', cwd: '/home/payload/payload-cms', - script: 'npx', - args: 'tsx scripts/run-queue-worker.ts', + script: 'node_modules/tsx/dist/cli.mjs', + args: 'scripts/run-queue-worker.ts', + exec_mode: 'fork', env: { NODE_ENV: 'production', // Credentials werden via dotenv aus .env geladen (siehe run-queue-worker.ts) diff --git a/src/lib/queue/queue-service.ts b/src/lib/queue/queue-service.ts index 35513de..ac0d9b9 100644 --- a/src/lib/queue/queue-service.ts +++ b/src/lib/queue/queue-service.ts @@ -36,6 +36,7 @@ export function getQueueRedisConnection(): IORedis { host, port, db: QUEUE_REDIS_DB, + password: process.env.REDIS_PASSWORD || undefined, maxRetriesPerRequest: null, // BullMQ requirement enableReadyCheck: false, }) diff --git a/src/lib/redis.ts b/src/lib/redis.ts index 3f19d9f..06d1de5 100644 --- a/src/lib/redis.ts +++ b/src/lib/redis.ts @@ -16,6 +16,7 @@ function createRedisClient(): Redis { host: REDIS_HOST, port: REDIS_PORT, db: REDIS_DB, + password: process.env.REDIS_PASSWORD || undefined, maxRetriesPerRequest: 3, retryStrategy: (times) => { if (times > 3) {