URGENT: All executions stuck in "Queued" (Queue Mode + Redis) - Stack Review Request

I am facing a critical issue where all executions (Webhooks and Triggers) remain stuck in “Queued” or “Starting soon” status. Nothing is being executed since 3 days ago.
Context & Troubleshooting: Last week, I had stability issues where triggers would queue while webhooks worked (or vice versa). I was advised to remove EXECUTIONS_MODE=queue, but that caused inconsistent behavior. To fix it, I enabled EXECUTIONS_MODE=queue and added a Redis container. This configuration worked perfectly for a week.
Current Situation: Since 3 days ago, without changing any configuration in my Portainer Stack, all executions stopped processing. They sit in the queue indefinitely (some for >64 hours). I suspect the Workers are disconnected or not picking up jobs from Redis.Describe the problem/error/question

My Docker Compose / Stack Configuration:

version: “3.8”

services:

## --------------------------- ORION --------------------------- ##

n8n_editor:

image: n8nio/n8n:latest

command: start

networks:

  - VpsNet

depends_on:

  - redis

environment:

  - DB_TYPE=postgresdb

  - DB_POSTGRESDB_DATABASE=n8n_queue

  - DB_POSTGRESDB_HOST=postgres

  - DB_POSTGRESDB_PORT=5432

  - DB_POSTGRESDB_USER=postgres

  - DB_POSTGRESDB_PASSWORD=\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

  - N8N_ENCRYPTION_KEY=\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

  - N8N_HOST=ssn8n.\*\*\*\*\*\*\*.com

  - N8N_EDITOR_BASE_URL=https://ssn8n.\*\*\*\*\*\*\*..com/

  - WEBHOOK_URL=https://sswebhook.\*\*\*\*\*\*\*..com/

  - N8N_PROTOCOL=https

  - NODE_ENV=production

  - EXECUTIONS_MODE=queue

  - N8N_REINSTALL_MISSING_PACKAGES=true

  - N8N_COMMUNITY_PACKAGES_ENABLED=true

  - N8N_NODE_PATH=/home/node/.n8n/nodes

  - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true

  - N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true

  - N8N_SMTP_SENDER=team@\*\*\*\*\*\*\*..com

  - N8N_SMTP_USER=team@\*\*\*\*\*\*\*..com

  - N8N_SMTP_PASS=\*\*\*\*\*\*\*.

  - N8N_SMTP_HOST=smtp.gmail.com

  - N8N_SMTP_PORT=465

  - N8N_SMTP_SSL=false

  - QUEUE_BULL_REDIS_HOST=redis

  - QUEUE_BULL_REDIS_PORT=6379

  - QUEUE_BULL_REDIS_DB=2

  - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash

  - N8N_RUNNERS_ENABLED=true

  - EXECUTIONS_DATA_PRUNE=true

  - EXECUTIONS_DATA_MAX_AGE=336

  - GENERIC_TIMEZONE=Europe/Madrid

  - TZ=Europe/Madrid

deploy:

  mode: replicated

  replicas: 1

  placement:

    constraints:

      - node.role == manager

  resources:

    limits:

      cpus: "2"

      memory: 2048M

  labels:

    - traefik.enable=true

    - traefik.http.routers.n8n_editor.rule=Host(\`ssn8n.\*\*\*\*\*\*\*..com\`)

    - traefik.http.routers.n8n_editor.entrypoints=websecure

    - traefik.http.routers.n8n_editor.priority=1

    - traefik.http.routers.n8n_editor.tls.certresolver=letsencryptresolver

    - traefik.http.routers.n8n_editor.service=n8n_editor

    - traefik.http.services.n8n_editor.loadbalancer.server.port=5678

    - traefik.http.services.n8n_editor.loadbalancer.passHostHeader=1

## --------------------------- ORION --------------------------- ##

n8n_webhook:

image: n8nio/n8n:latest

command: webhook

networks:

  - VpsNet

depends_on:

  - redis

environment:

  - DB_TYPE=postgresdb

  - DB_POSTGRESDB_DATABASE=n8n_queue

  - DB_POSTGRESDB_HOST=postgres

  - DB_POSTGRESDB_PORT=5432

  - DB_POSTGRESDB_USER=postgres

  - DB_POSTGRESDB_PASSWORD=\*\*\*\*\*\*\*

  - N8N_ENCRYPTION_KEY=\*\*\*\*\*\*\*

  - N8N_HOST=ssn8n.\*\*\*\*\*\*\*..com

  - N8N_EDITOR_BASE_URL=https://ssn8n.\*\*\*\*\*\*\*..com/

  - WEBHOOK_URL=https://sswebhook.\*\*\*\*\*\*\*..com/

  - N8N_PROTOCOL=https

  - NODE_ENV=production

  - EXECUTIONS_MODE=queue

  - N8N_REINSTALL_MISSING_PACKAGES=true

  - N8N_COMMUNITY_PACKAGES_ENABLED=true

  - N8N_NODE_PATH=/home/node/.n8n/nodes

  - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true

  - [email protected]

  - [email protected]

  - N8N_SMTP_PASS=\*\*\*\*\*\*\*.

  - N8N_SMTP_HOST=smtp.gmail.com

  - N8N_SMTP_PORT=465

  - N8N_SMTP_SSL=false

  - QUEUE_BULL_REDIS_HOST=redis

  - QUEUE_BULL_REDIS_PORT=6379

  - QUEUE_BULL_REDIS_DB=2

  - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash

  - N8N_RUNNERS_ENABLED=true

  - EXECUTIONS_DATA_PRUNE=true

  - EXECUTIONS_DATA_MAX_AGE=336

  - GENERIC_TIMEZONE=Europe/Madrid

  - TZ=Europe/Madrid

deploy:

  mode: replicated

  replicas: 1

  placement:

    constraints:

      - node.role == manager

  resources:

    limits:

      cpus: "2"

      memory: 4096M

  labels:

    - traefik.enable=true

    - traefik.http.routers.n8n_webhook.rule=(Host(\`sswebhook.\*\*\*\*\*\*\*..com\`))

    - traefik.http.routers.n8n_webhook.entrypoints=websecure

    - traefik.http.routers.n8n_webhook.priority=1

    - traefik.http.routers.n8n_webhook.tls.certresolver=letsencryptresolver

    - traefik.http.routers.n8n_webhook.service=n8n_webhook

    - traefik.http.services.n8n_webhook.loadbalancer.server.port=5678

    - traefik.http.services.n8n_webhook.loadbalancer.passHostHeader=1

## --------------------------- ORION --------------------------- ##

n8n_worker:

image: n8nio/n8n:latest

command: worker --concurrency=10

networks:

  - VpsNet

depends_on:

  - redis

environment:

  - DB_TYPE=postgresdb

  - DB_POSTGRESDB_DATABASE=n8n_queue

  - DB_POSTGRESDB_HOST=postgres

  - DB_POSTGRESDB_PORT=5432

  - DB_POSTGRESDB_USER=postgres

  - DB_POSTGRESDB_PASSWORD=\*\*\*\*\*\*\*

  - N8N_ENCRYPTION_KEY=\*\*\*\*\*\*\*

  - N8N_HOST=ssn8n.\*\*\*\*\*\*\*..com

  - N8N_EDITOR_BASE_URL=https://ssn8n.\*\*\*\*\*\*\*..com/

  - WEBHOOK_URL=https://ssn8n.\*\*\*\*\*\*\*..com/

  - N8N_PROTOCOL=https

  - NODE_ENV=production

  - EXECUTIONS_MODE=queue

  - N8N_REINSTALL_MISSING_PACKAGES=true

  - N8N_COMMUNITY_PACKAGES_ENABLED=true

  - N8N_NODE_PATH=/home/node/.n8n/nodes

  - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true

  - [email protected]

  - [email protected]

  - N8N_SMTP_PASS=\*\*\*\*\*\*\*.

  - N8N_SMTP_HOST=smtp.gmail.com

  - N8N_SMTP_PORT=465

  - N8N_SMTP_SSL=false

  - QUEUE_BULL_REDIS_HOST=redis

  - QUEUE_BULL_REDIS_PORT=6379

  - QUEUE_BULL_REDIS_DB=2

  - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash

  - N8N_RUNNERS_ENABLED=true

  - EXECUTIONS_DATA_PRUNE=true

  - EXECUTIONS_DATA_MAX_AGE=336

  - GENERIC_TIMEZONE=Europe/Madrid

  - TZ=Europe/Madrid

deploy:

  mode: replicated

  replicas: 1

  placement:

    constraints:

      - node.role == manager

  resources:

    limits:

      cpus: "2"

      memory: 4096M

## --------------------------- ORION --------------------------- ##

redis:

image: redis:latest

networks:

  - VpsNet

restart: always

volumes:

  - redis_data:/data

## --------------------------- ORION --------------------------- ##

networks:

VpsNet:

external: true

name: VpsNet

volumes:

redis_data: {}

What is the error message (if any)?

No specific error log in the UI, but the execution list shows status “Queued” or “Starting soon” indefinitely. (See attached screenshots).

Please share your workflow

It happens with ALL workflows (simple manual triggers, cron jobs, and webhooks). None of them start.

Share the output returned by the last node

N/A (The execution never actually starts).

Information on your n8n setup

Maybe for testing purposes, to see if the env variable is read at the start, but actually is a requirement if you use workers.

N8n offers some nice endpoints to check for activity of workers.

Set

QUEUE_HEALTH_CHECK_ACTIVE=true

and the worker server will have an endpoint to see if is up and running.

Check here the docs related to this matter:

Environment variables at first sight, without trying your setup looks good.

P.S outside context, use as well RabbitMQ for concurrency but at workflows level, not Redis for instance.

i have a similar issue and noticed that in my redis queue i have processes that appear with :lock suffix which means workers are still on them, even though they are not in the active queue and don’t show as running in the n8n UI
The worker is still alive somewhere because the TTL of the lock keeps renewing but it is basically like a ghost worker, the only way i found to fix it is to restart the docker image and workers and then the new workers will pick up the jobs from the queue. Does that happen to you too?
I’ve been running executions manually and noticed that it seems to happen when stopping an execution manually (in the stop button inside the workflow or the ‘stop’ button in the executions list)

** Happens when running with OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true