Hi everyone, I have a problem with the JS Task Runner.
Describe the problem/error/question In n8n 2.0.3 with N8N_RUNNERS_MODE=external, the internal “JS Task Runner” still spawns and intercepts tasks. The external runner (n8nio/runners:2.0.3) registers successfully but never receives task offers. n8n logs show both runners registering:
Registered runner “launcher-javascript” (external) ✓
Registered runner “JS Task Runner” (internal) ← should not spawn
External runner logs show it waiting indefinitely:
Waiting for launcher’s task offer to be accepted…
Runner process exited on idle timeout
Code Nodes timeout after 60 seconds in production workflows (triggered via webhook/schedule), but work fine in test mode.
**What is the error message (if any)?**
Task request timed out after 60 seconds
Your Code node task was not matched to a runner within the timeout period.
**Setup verification (all correct):**
- Auth tokens match between n8n and runner ✓
- Broker listening on 0.0.0.0:5679 ✓
- External runner reaches broker (healthz returns {"status":"ok"}) ✓
- External runner registers successfully ✓
**Workaround:**
Setting `EXECUTIONS_MODE=regular` instead of `queue` makes Code Nodes work.
**Question:**
Is there a way to prevent the internal JS Task Runner from spawning when external mode is configured? Or is this a known bug?
**Information on your n8n setup**
- n8n version: 2.0.3
- Database: PostgreSQL
- n8n EXECUTIONS_PROCESS setting: queue (regular as workaround)
- Running n8n via: Docker (n8nio/n8n:latest with custom Dockerfile)
- Operating system: Ubuntu 24.04
Related: GitHub Issue #22798
Does anyone have a similar problem, or is there a solution for this?
I’m afraid that with my quick fix, only the internal runner will now be used, which is no longer supposed to be the case.
Thanks!