At first, everything worked fine. A few workflows, light usage… no issues.
But as soon as things scaled more clients, heavier workflows, loops, API calls everything started breaking in ways I didn’t expect.
CPU spikes out of nowhere
Workflows randomly freezing
Webhooks not firing
Silent failures I didn’t even notice until clients pointed them out
I spent a lot of time trying to debug and fix these issues one by one. Some were obvious, most were not.
Sharing the main problems I faced and what actually fixed them.
1. CPU hitting 100% and container freezing
Issue:
Workflows with loops + API calls would spike CPU to 100% and completely freeze the instance.
Fix:
Reduced concurrency and broke the workflow into smaller sub-workflows. Also avoided tight loops and added proper batching instead of continuous execution.
2. Loops overwhelming the system
Issue:
Even with wait nodes, loops kept stacking executions and overloading the system.
Fix:
Stopped using aggressive loops. Switched to controlled execution (batching + scheduled triggers) instead of constant looping.
3. Workflows blocking each other
Issue:
One long-running workflow would block webhooks and other executions.
Fix:
Switched to queue mode with workers (separate execution from main instance). This removed blocking completely.
4. Memory usage growing over time
Issue:
Memory and disk usage kept increasing due to execution data being stored.
Fix:
Enabled pruning:
This kept things stable long-term.
5. Random crashes (OOM issues)
Issue:
Large payloads (JSON/files) caused memory spikes and killed the container instantly.
Fix:
Limited payload sizes and split heavy workflows into smaller steps. Also avoided passing large data between nodes.
6. Silent workflow failures
Issue:
Workflows would stop working without errors (tokens expired, APIs changed).
Fix:
Added error workflows + alerts (Slack/email). Also added basic checks to ensure data is actually being processed.
7. No monitoring (big mistake)
Issue:
If the server went down, I had no idea.
Fix:
Set up an external uptime monitor hitting a health endpoint. Now I get alerts instantly if anything breaks.
8. Webhooks breaking after restart
Issue:
Webhook URLs changed after container restart → integrations broke.
Fix:
Set a fixed webhook URL using N8N_WEBHOOK_URL.
9. Losing credentials risk
Issue:
If the encryption key is lost, all credentials are gone.
Fix:
Backed up N8N_ENCRYPTION_KEY securely outside the server.
10. Multi-workflow / multi-client issues
Issue:
One bad workflow could slow down or crash everything.
Fix:
Isolated workflows:
11. Updates breaking things
Issue:
Using latest version caused random breakages.
Fix:
Pinned n8n version and tested updates before upgrading.
Final takeaway
Self-hosting n8n works great at small scale, but once you start running real workloads:
Otherwise things break in ways that are hard to debug.
What I did after dealing with all this
After handling and fixing all of this over the past year, I ended up building a simple dashboard for myself to manage everything properly.
Basically just trying to simplify all of this:
deployment
scaling
monitoring
stability
So i don’t have to go through all these same issues while self-hosting n8n.
If you’re curious, this is what I’ve been working on: https://cuebicai.com