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 <noreply@anthropic.com>
This commit is contained in:
Martin Porwoll 2026-02-14 17:46:54 +00:00
parent ed07e15670
commit e904f0949b
3 changed files with 5 additions and 2 deletions

View file

@ -25,8 +25,9 @@ module.exports = {
{ {
name: 'queue-worker', name: 'queue-worker',
cwd: '/home/payload/payload-cms', cwd: '/home/payload/payload-cms',
script: 'npx', script: 'node_modules/tsx/dist/cli.mjs',
args: 'tsx scripts/run-queue-worker.ts', args: 'scripts/run-queue-worker.ts',
exec_mode: 'fork',
env: { env: {
NODE_ENV: 'production', NODE_ENV: 'production',
// Credentials werden via dotenv aus .env geladen (siehe run-queue-worker.ts) // Credentials werden via dotenv aus .env geladen (siehe run-queue-worker.ts)

View file

@ -36,6 +36,7 @@ export function getQueueRedisConnection(): IORedis {
host, host,
port, port,
db: QUEUE_REDIS_DB, db: QUEUE_REDIS_DB,
password: process.env.REDIS_PASSWORD || undefined,
maxRetriesPerRequest: null, // BullMQ requirement maxRetriesPerRequest: null, // BullMQ requirement
enableReadyCheck: false, enableReadyCheck: false,
}) })

View file

@ -16,6 +16,7 @@ function createRedisClient(): Redis {
host: REDIS_HOST, host: REDIS_HOST,
port: REDIS_PORT, port: REDIS_PORT,
db: REDIS_DB, db: REDIS_DB,
password: process.env.REDIS_PASSWORD || undefined,
maxRetriesPerRequest: 3, maxRetriesPerRequest: 3,
retryStrategy: (times) => { retryStrategy: (times) => {
if (times > 3) { if (times > 3) {