I kept running into the same thing when self-hosting n8n: everything works fine until a burst of production webhooks hits the main process and the editor becomes unusable. Splitting the webhook processor out fixed it, but I couldn’t find a single reference setup that put all the pieces together, so I built one and documented it.
What it does:
- Main, workers and webhook processor as separate services
- Caddy routing /webhook/, /webhook-waiting/, /form/* and /form-waiting/* to the dedicated processor, everything else to main
- Postgres + Redis with maxmemory-policy noeviction (the default policy silently drops Bull jobs under memory pressure)
- Pinned n8n version, execution pruning on by default
- A check script that verifies the encryption key is identical across main, worker and webhook — that mismatch produced the most confusing failures I ran into
I deliberately broke it to see how it behaves: killed workers mid-execution, flooded the queue, cut Redis.
Docs are in Spanish, since that’s the gap I was trying to fill. The configuration itself is language-agnostic.
Happy to hear where this is wrong — particularly around scaling workers and webhook processor replicas.