N8n (v1.95.2, Docker) - Workers not processing jobs from Redis queue in queue mode

Hi n8n Community,

I’m facing an issue with my self-hosted n8n setup (v1.95.2, Docker, PostgreSQL, Redis).

Problem Summary: When n8n is in EXECUTIONS_MODE=regular (no queues/workers), it works stably, even with a Telegram trigger. However, when I switch to the recommended EXECUTIONS_MODE=queue (with N8N_RUNNERS_ENABLED=true, N8N_WORKERS_COUNT=1, OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true, and Redis configured), the following happens:

  1. The n8n main process starts correctly, connects to Redis, registers the worker, and debug logs look fine.
  2. Jobs (even a simple Manual TriggerNoOp) are successfully enqueued to Redis (“Enqueued execution…”).
  3. However, the worker does not pick up these jobs from the queue. Debug logs show no indication that the worker started processing.
  4. After some time (30-60 seconds), the enqueued job gets canceled (“Execution cancelled,” “Stopped inactive job”).
  5. The main n8n process itself remains stable and does not crash.

Troubleshooting Done:

  • Server resources (RAM/CPU) appear normal; no OOM Killer activity.
  • Redis is running, accessible, and FLUSHDB has been performed.
  • Permissions for the n8n Docker volume are correct.
  • WEBHOOK_URL and other basic n8n environment variables are configured.
  • The docker-compose.yml configuration for queue mode seems correct as per documentation.

Question: What could be preventing workers from processing jobs from the Redis queue in queue mode on n8n v1.95.2, given that regular mode works fine? Are there any specific configurations or known issues for workers in this version that I might be overlooking?

1 Like

Hey @Alexseyka_Smirnov

Could you share yml plz, also N8N_WORKERS_COUNT isn’t a var that am aware of. Mostly looks okay otherwise you would need to make sure ure worker container starts with n8n worker,

You can check out Ultimate n8n Dev Container (with Debugging, Monitoring & Observability) Dockers

  n8n-worker:
    <<: *shared
    command: worker < MAKE SURE THIS COMMAND IS ON WORKER AND IS SAME NETWORK ALSO. 
    depends_on:
      - n8n

As this has workers also, you can probably copy and paste bits if needed.

Hope this helps,

Samuel

services:
  n8n:
    image: n8nio/n8n:1.95.2 # Current version being tested
    container_name: n8n_app_instance
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      # - N8N_BASIC_AUTH_USER= # MyUser
      # - N8N_BASIC_AUTH_PASSWORD= # MyPassword
      - GENERIC_TIMEZONE=Europe/Berlin # Using Europe/Berlin
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
      - N8N_ENCRYPTION_KEY= # MyVeryLongAndSecureEncryptionKey
      - WEBHOOK_URL=https://n8n.mydomain.su/ # My n8n public URL
      - N8N_SECURE_COOKIE=true
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_LOG_LEVEL=debug

      # Queue & Runner Settings
      - EXECUTIONS_MODE=queue
      - N8N_RUNNERS_ENABLED=true
      - N8N_WORKERS_COUNT=1 # Testing with a single worker
      - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true

      # Redis Settings
      - QUEUE_BULL_REDIS_ENABLE=true
      - QUEUE_BULL_REDIS_HOST=redis_app
      - QUEUE_BULL_REDIS_PORT=6379
      # - QUEUE_BULL_REDIS_PASSWORD=

      # PostgreSQL Settings
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST= # IP_of_DB_Server
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n_db
      - DB_POSTGRESDB_USER=n8n_user
      # - DB_POSTGRESDB_PASSWORD= # MyPGPassword
      - DB_POSTGRESDB_CONNECTION_OPTIONS=?sslmode=disable
    volumes:
      - ./n8n_data_volume_on_host:/home/node/.n8n # Example host path
    networks:
      - app_services_net
    depends_on:
      - redis_app

  redis_app:
    image: redis:alpine
    container_name: redis_for_apps
    restart: always
    volumes:
      - ./redis_app_data_on_host:/data # Example host path
    networks:
      - app_services_net

# ... (other services like huginn, and networks definition) ...


Example debug logs from n8n_app_instance (when a job is enqueued and then canceled):

# --- Normal n8n startup sequence with debug logs ---
# User settings loaded from: /home/node/.n8n/config
# YYYY-MM-DDTHH:mm:ss.SSSZ | info  | Initializing n8n process {"file":"start.js","function":"init"}
# YYYY-MM-DDTHH:mm:ss.SSSZ | debug | Starting main instance in scaling mode {"scopes":["scaling"],"file":"start.js","function":"init"}
# ... (many debug lines showing Redis client connections, Task Broker ready, Runner registered) ...
# YYYY-MM-DDTHH:mm:ss.SSSZ | info  | Version: 1.95.2 {"file":"abstract-server.js","function":"start"}
# Editor is now accessible via: https://n8n.mydomain.su/
# --- End of normal startup ---

# --- When a workflow (e.g., Manual Trigger -> NoOp) is executed ---
# YYYY-MM-DDTHH:mm:ss.SSSZ | debug | Execution added {"executionId":"XX","file":"active-executions.js","function":"add"}
# YYYY-MM-DDTHH:mm:ss.SSSZ | info  | Enqueued execution XX (job YY) {"scopes":["scaling"],"executionId":"XX","jobId":"YY","file":"scaling.service.js","function":"addJob"}

# --- Period of ~30-60 seconds passes. No logs indicating worker picked up job YY ---
# --- Other background debug messages (e.g., from insights, Rudder, waiting-executions query) may appear here ---

# --- Execution gets canceled ---
# YYYY-MM-DDTHH:mm:ss.SSSZ | debug | Execution cancelled {"executionId":"XX","file":"active-executions.js","function":"stopExecution"}
# YYYY-MM-DDTHH:mm:ss.SSSZ | debug | Execution removed {"executionId":"XX","file":"active-executions.js"}
# YYYY-MM-DDTHH:mm:ss.SSSZ | debug | Stopped inactive job {"scopes":["scaling"],"jobId":"YY","executionId":"XX","file":"scaling.service.js","function":"stopJob"}

Where did u find this setup?
I could be mistaken and it can be a new feature. But normally workers are seperate containers with an extra startup command ‘worker’

I found it somewhere on the internet
I don’t know much about it

@Alexseyka_Smirnov Did you create extra node like example yml shared? I don’t see any worker nodes setup, just the env vars for main n8n instacne to know to offload to redis / workers?

Did you want to jump on a call? Feel free to join.

I’d recommend also you check out n8n-hosting/docker-compose at main · n8n-io/n8n-hosting · GitHub this has the offical yml from n8n.

Best regards,

Samuel+

3 Likes

Thank you for your help, but I’m not able to talk right now.

I split the containers exactly as you described in your post, and everything is working.
Telegram is still throwing a webhook error, but I think I can sort it out.

I’m really happy—thanks again!

2 Likes

Nice, no worries, you may need to add domain alot of people use grok for temp urls, I used cloudflare

This may help, have fun :slight_smile:

Samuel

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.