Docker n8b - Node worker did not execute the queue work,

Hi, im running a n8n using docker,

when i try to run a test workflow using webhook, only test url is working but when i try to use prod url, the execution stuck in queue

Hello syafiq

Hope you are well!

Check: Is the workflow active in the N8N UI?

Confirm: Is the WEBHOOK_URL environment variable set correctly in your Docker setup with the public URL of your N8N? If so, did you restart the container and reactivate the workflow?

Test Connectivity: Use a tool like curl or Postman from an external machine to send a simple POST request to the production URL of the webhook.

Best regards!

yeah, the workflow is active, and i test the webhook using postman

i already try to reactivate the container but yet the issue still the same

the flow only execute when im using staging url.

btw im using ngix as proxy to handle https, is this can be the issue?

Is it generating any error?
If so, send a printout of the error.
Are you using MCP?

so far there is no error from logs

the site work perfectly except when workflow that using the webhook,

can i share the compose file with you?

I apologize for the time away.
I am available to be of assistance and would be happy to receive the composition file!

If you still need help

compose file

services:
  redis:
    image: redis:latest
    container_name: n8n-redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    restart: always
    environment:
      REDIS_PASSWORD: ""

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    volumes:
     - n8n_data:/home/node/.n8n
    restart: always
    depends_on:
      - redis
    environment:
      EXECUTIONS_MODE: queue
      QUEUE_BULL_REDIS_HOST: redis
      QUEUE_BULL_REDIS_PORT: 6379
      QUEUE_BULL_REDIS_PASSWORD: ""
      N8N_HOST: mydomain.com
      N8N_PORT: 5678
      WEBHOOK_URL: https://mydomain.com
      N8N_PROTOCOL: https
      EXECUTIONS_PROCESS: 5
      N8N_DISABLE_PRODUCTION_MAIN_PROCESS: false
      N8N_RUNNERS_ENABLED: true
      N8N_CONCURRENCY_PRODUCTION_LIMIT: 20

  n8n-worker-1:
    image: n8nio/n8n:latest
    container_name: n8n-worker-1
    restart: always
    depends_on:
      - redis
    environment:
      EXECUTIONS_MODE: queue
      QUEUE_BULL_REDIS_HOST: redis
      QUEUE_BULL_REDIS_PORT: 6379
      QUEUE_BULL_REDIS_PASSWORD: ""
      N8N_HOST: mydomain.com
      N8N_PROTOCOL: https
      EXECUTIONS_PROCESS: 5
      N8N_DISABLE_PRODUCTION_MAIN_PROCESS: true
      N8N_RUNNERS_ENABLED: true
      N8N_CONCURRENCY_PRODUCTION_LIMIT: 20

  n8n-worker-2:
    image: n8nio/n8n:latest
    container_name: n8n-worker-2
    restart: always
    depends_on:
      - redis
    environment:
      EXECUTIONS_MODE: queue
      QUEUE_BULL_REDIS_HOST: redis
      QUEUE_BULL_REDIS_PORT: 6379
      QUEUE_BULL_REDIS_PASSWORD: ""
      N8N_HOST: mydomain.com
      N8N_PROTOCOL: https
      EXECUTIONS_PROCESS: 5
      N8N_DISABLE_PRODUCTION_MAIN_PROCESS: true
      N8N_RUNNERS_ENABLED: true
      N8N_CONCURRENCY_PRODUCTION_LIMIT: 20

  nginx:
    image: nginx:latest
    container_name: n8n-nginx-proxy
    ports:
      - "80:80" # HTTP port - Cloudflare will connect to this on your server's IP
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf # Mount Nginx config
    restart: always
    depends_on:
      - n8n
      - n8n-worker-1
      - n8n-worker-2
      
volumes:
  redis_data:
  n8n_data:

ngix.conf

upstream n8n_backend {
    server n8n:5678;
}

server {
    listen 80; 
    server_name mydomain.com;

    location / {
        proxy_pass http://n8n_backend; # Proxy to n8n service (HTTP backend)
        #proxy_pass http://n8n-app:5678;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; # Important for Cloudflare - tells n8n it's HTTPS

        # WebSocket Proxying - IMPORTANT!
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Hi,

I might be wrong but it would surprise me if queue mode would work without an external database (postgresql).

The reason the test would work is that it is run on the main with the SQLite DB. There is something like offload manual workloads from main (,need to lookup the real name) and it will surely fail as well

Another point : you need to set the encryption key so it remain constant and can be used by main and worker

Reg
J.