n8n System Requirements: 5 Real Tests and Where It Crashes
Tested by M. Aziz, backend engineer at Selfhost.dev · n8n 2.40.7 (Node.js 26.7.0 in the image) on Selfhost.dev servers in Falkenstein, Germany
Ask five sources what server n8n needs and you get five answers: 1 vCPU or 2, 1 GB or 8. So we measured it. n8n system requirements are set by memory, not CPU. n8n 2.40.7 idled at 394 MiB with its task runner, and its main process ran every test workflow inside a 1 GB memory limit. At 512 MB, five Code nodes running at once crashed it in a loop.
You’ll leave with a server size, the point where n8n breaks, and the setting that wastes the most RAM. Every number comes from five test workflows run on Selfhost.dev servers.
Table of Contents
Key Facts
- Idle RAM: n8n 2.40.7 uses 394 MiB on SQLite and 391 MiB on Postgres, plus 4 MiB for its task runner.
- Minimum memory requirement: A 1 GB limit on n8n’s main process ran every test workflow, with the task runner unlimited. At 512 MB, five parallel Code runs caused a crash loop due to JavaScript heap out of memory.
- 4 GB server performance: A 2 vCPU / 4 GB server peaked at 2.2 GiB with five parallel Code runs and successfully handled all 1,201 requests during a one-minute test at 20 requests per second.
- CPU scaling: Increasing CPU from 2 to 4 vCPU nearly doubled light-workflow throughput, from 10.9 to 20.8 runs per second. Increasing from 4 to 8 vCPU added only 4%.
- Binary data configuration: Setting
N8N_DEFAULT_BINARY_DATA_MODE=defaultmade a 50 MB file workflow use 75% more RAM and run four times slower.
n8n system requirements at a glance
n8n’s system requirements come down to three sizes: 1 GB for n8n’s main process, 2 vCPU / 4 GB for small production, and 4 vCPU / 8 GB for heavy work.
| Setup | vCPU | RAM | Disk | Database |
|---|---|---|---|---|
| Smallest tested n8n main | 2 1 not tested | 1 GB for n8n main Plus up to ~0.5 GB for the task runner during Code runs, plus the OS | ~1.6 GB for unpacked images Plus execution data | SQLite |
| Small production | 2 | 4 GB server | ~0.3 GB/month per 1,000 light runs a day | SQLite |
| Heavy Code nodes, files, bursts | 4 | 8 GB server | ~54 GB/month per 1,000 Code-heavy runs a day Unless you prune | Postgres |
On a 2 vCPU / 4 GB server, the one-click template passed every test. The whole server peaked at 2.2 GiB with five parallel Code runs, and at 1.74 GiB during a 1-minute run at 20 light requests a second.
n8n’s hosting requirements go beyond size: our n8n hosting providers compared at 4 GB show which set up HTTPS and webhooks for you.
What most n8n requirements guides get wrong
Four figures that n8n requirements guides repeat (100 MB idle, Node.js 16, a 2 GB minimum and 1 vCPU to start) don’t match our tests on n8n 2.40.7.
| What guides repeat | What we measured on n8n 2.40.7 |
|---|---|
| Idle RAM “~100 MB” | 394 MiB for n8n main Plus 4 MiB for the task runner |
| “Node.js 16 or higher” | The Docker image ships Node.js 26.7.0 An npm install needs Node.js 24 or newer |
| “2 GB of RAM” as the minimum | n8n main ran every workflow in a 2 GB limit But the OS, platform and idle n8n already used 1.47 GiB of a 4 GB server |
| “1 vCPU to start” | Not measured at 1 vCPU At 2 vCPU, n8n handled half the light-webhook burst that 4 vCPU did |
Does n8n publish official system requirements?
No. n8n’s docs give no hardware minimum for self-hosting. Its only sizing table is on the OEM prerequisites page, which says the figures “are an example based on n8n Cloud and are for illustrative purposes only”.
The 100 MB figure comes from the same page: “an n8n Cloud instance at idle requires ~100MB”. That describes n8n Cloud, not a self-hosted n8n 2.x with its task runner.
n8n’s performance docs report up to 220 executions a second on one 4 GB instance, for a two-node workflow (Webhook Trigger and Edit Fields) on Postgres. Our light workflow, W1, also makes an outbound HTTP call on every run, and topped out near 21 a second. n8n’s own scalability benchmark measured 16.2 requests a second in single mode. Throughput depends on what the workflow does, so treat any single number, ours included, as specific to its workflow.
How we measured
We ran n8n 2.40.7 (n8nio/n8n:2.40.7 + n8nio/runners:2.40.7, Node.js 26.7.0 inside the image) with the same settings as the Selfhost.dev’s one-click n8n template: SQLite, an external task runner, N8N_RUNNERS_MAX_CONCURRENCY=5. Postgres runs used postgres:16-alpine.
Three terms below: n8n main is the main n8n container, the task runner is the container that runs Code nodes, and the whole server is everything on the box. Memory is shown in binary units (MiB, GiB) as measured; server sizes and disk are in GB.
| Server | vCPU | RAM | Location | Used for |
|---|---|---|---|---|
| 16 GB server | 8 Shared | 16 GB | Falkenstein Germany | Every workload, the memory floor (container limits), the CPU tests |
| 8 GB server | 4 Shared | 8 GB | Falkenstein Germany | The one-click template; W5 |
| 4 GB server | 2 Shared | 4 GB | Falkenstein Germany | The one-click template |
- RAM and CPU: read from each container’s cgroup v2 counters every second (memory.current, memory.peak, cpu.stat), for n8n main, the task runner and Postgres separately. Platform containers (the reverse proxy and deploy agent) are left out.
- Load: k6 v0.43.1 from a separate machine in India.
- Clean starts: each workload’s RAM peak comes from a fresh instance, because n8n keeps memory between runs.
Limits of these tests:
- Results are for n8n 2.40.7; other versions may differ.
- All vCPUs were shared, not dedicated.
- 2 GB, 1 GB, 512, 384 and 256 MB are container memory limits (mem_limit, swap off) on the 16 GB server, not real servers. In those tests only n8n main was limited; the task runner was not.
- 1 vCPU, and real 1 GB and 2 GB servers, were not tested.
- Response times include about 150 ms of network from India. RAM and CPU are not affected.
- W5 used one free cloud model; other models and tools may use more.
The five test workflows (exported JSON and the load script are in [REPO LINK: add before publishing, see DRAFT NOTES]):
| Workflow | Nodes, in order | What it stresses |
|---|---|---|
| W1Light glue |
Webhook
→
HTTP Request (1 KB JSON)
→
Set
|
A typical glue workflow |
| W2Code-heavy |
Webhook
→
Code (10,000 items of 1 KB)
→
Code
→
Code
|
The task runner where Code nodes run |
| W3Big JSON |
Webhook
→
HTTP Request (20 MB JSON)
→
Set
|
n8n main’s memory |
| W4Large file |
Webhook
→
HTTP Request (50 MB file)
→
2 pass-through nodes
→
Set
|
Binary data handling how n8n stores files |
| W5AI agent |
Webhook
→
AI Agent
→
free cloud model (OpenRouter)
|
An agent waiting on a cloud model |
W5 used OpenRouter’s free nvidia/nemotron-3.5-lightning:free model through n8n’s OpenAI credential with a custom base URL, on the 4 vCPU / 8 GB server. Its run time (median 7.4 s) is the model provider’s, not n8n’s.
How much RAM does n8n need?
n8n’s RAM requirements start at about 400 MiB idle and reach 1.7 GiB for the heaviest single workflow we ran. Size for your heaviest workflow’s peak, not the idle number.
n8n memory usage at idle
Sampled for 3 minutes on a fresh instance, n8n 2.40.7 idled at 394 MiB on SQLite and 391 MiB on Postgres, plus 121 MiB for Postgres itself. The task runner sat at 4 MiB: it only starts runner processes when a Code node runs. During startup (database migrations), n8n main briefly peaked at about 720 MiB.
RAM per workload

Files and large payloads drive memory up; workflow count barely does. Each workflow ran 10 times, one at a time, on a fresh instance (16 GB server, no limits):
| Workflow | n8n main peak (MiB) | Task runner peak (MiB) | Median run time |
|---|---|---|---|
| W1 Light glue | 408 | 4 | 0.22 s |
| W2 Code-heavy Code, 10,000 items | 624 | 371 | 0.95 s |
| W3 Big JSON 20 MB JSON | 749 | 3 | 0.96 s |
| W4 Large file, kept in memory 50 MB file, binary data in memory (set explicitly) | 1,663 | 7 | 1.97 s |
| W4 Large file, filesystem mode 50 MB file, n8n 2.x default | 949 | 4 | 0.51 s |
| W5 AI agent cloud model, 8 GB server | 544 | 6 | 7.36 s mostly the model |
- A light workflow adds about 20 MB over idle. A 20 MB JSON response adds about 360 MB, roughly 18 times its size.
- One 50 MB file adds about 560 MB in n8n 2.x’s default filesystem mode, and 1.3 GB if binary data is kept in memory.
- An AI Agent run with a cloud model added about 160 MiB to n8n main and averaged 5% CPU: n8n mostly waits for the model. Five agents in parallel peaked at 467 MiB, with all 20 runs successful.
n8n does not hand memory back after heavy runs. After a sequence of the runs above, n8n main sat at 1.6 GiB when idle, up from 394 MiB fresh. If your n8n’s memory climbs after big workflows and stays there, ours did too.
Binary data mode
Where n8n keeps files decides a file workflow’s RAM. When N8N_DEFAULT_BINARY_DATA_MODE is unset, n8n 2.40.7 stores binary data on the filesystem (in the database in queue mode, as the binary data config in n8n’s source shows). Older guides and setups still set it to default, which keeps files in memory.
For W4, in-memory mode cost 75% more RAM (1,663 vs 949 MiB) and made runs four times slower (1.97 vs 0.51 s median). With 5 runs in parallel, filesystem mode handled 3.65 runs/s against 0.58. n8n 2.40.7 logs that in-memory default mode will be removed in a future version, so if your setup sets it, remove the variable.
Concurrent runs
More parallel Code runs cost more memory but stopped adding speed after five. W2 (Code nodes over 10,000 items) with more runs in parallel:
| Parallel runs | n8n main peak (MiB) | Task runner peak (MiB) | Throughput |
|---|---|---|---|
| 1 run | 624 | 371 | 0.80 runs/s |
| 5 runs the task runner’s limit in the template | 935 | 502 | 1.86 runs/s |
| 20 runs extra runs wait their turn | 1,540 | 768 | 1.74 runs/s |
n8n accepts more executions than its task runner works on at once; with the template’s cap of 5, extra executions wait their turn. At 20 parallel runs, n8n main and the runner together used about 2.3 GiB. Throughput stopped growing after 5 because the template caps the task runner at 5 concurrent tasks (N8N_RUNNERS_MAX_CONCURRENCY=5); the extra runs only queued, and the median run took 10.9 s. The 20-run row followed earlier runs on the same instance, so its peaks include some retained memory.
On our 4 GB test server, the OS, the platform and idle n8n took 1.47 GiB, which leaves about 2.5 GB for your heaviest workflow’s peak. That 2 vCPU / 4 GB server is $0.02 an hour in our EU locations, and the n8n template adds nothing to the bill. Price a 2 vCPU / 4 GB n8n server, no signup
n8n minimum requirements: finding the memory floor

n8n 2.40.7 needs 1 GB for its main process to survive parallel Code runs, and about 384 MB for light workflows and single file runs in its default binary mode. We limited the n8n main container to each size (task runner unlimited, swap off) and ran the same workflows. The task runner used up to 502 MiB during five parallel Code runs, so budget for it on top:
| n8n main memory limit | 2 GB | 1 GB | 512 MB | 384 MB | 256 MB |
|---|---|---|---|---|---|
| Starts? | yes | yes | yes | yes | no |
| Light W1, 5 req/s | ok 448 MiB | ok 416 MiB | ok 412 MiB | ok 345 MiB | not run |
| Code × 5 parallel W2 | ok 631 MiB | ok 641 MiB | crashed | crashed | not run |
| 20 MB JSON W3 | ok 660 MiB | ok 534 MiB | failed crash loop * | failed crash loop * | not run |
| 50 MB file W4, n8n 2.x default | ok 533 MiB | ok 568 MiB | ok 433 MiB | ok 384 MiB, at the limit | not run |
| 50 MB file W4, in memory | ok 1,124 MiB | ok 1,024 MiB, at the limit, slower | failed crash loop * | failed crash loop * | not run |
* n8n was still crash-looping from the Code test (W2) before it, so these workflows were never tested on their own at 512 MB and 384 MB. Only n8n main was limited; the task runner was not.
At 1 GB the 50 MB file pushed n8n main exactly to 1,024 MiB. It finished, but runs took 3.3 to 5.8 s instead of 2.3 s at 2 GB as the kernel reclaimed memory.
The “n8n 2.x default” column leaves N8N_DEFAULT_BINARY_DATA_MODE unset, so files go to the filesystem; each limit ran on a fresh instance with only W4, three runs each. In that mode a 50 MB file ran even at 384 MB (median 0.44 s), with n8n main pinned at the limit.
The “in memory” column sets the mode to default. Its 512 and 384 MB rows failed because n8n was still crash-looping from the W2 run before, so the file itself was never tested there. The W3 rows at 512 and 384 MB failed the same way.
JavaScript heap out of memory: the exact errors
At 512 MB and 384 MB, five parallel Code runs killed n8n main with:
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
Every request in that run failed. n8n then restarted, logged Last session crashed, reached n8n ready, and ran out of heap again about 20 seconds later:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
It was still crash-looping minutes later, so the next workflows failed instantly. Back with enough memory, its executions list showed the in-flight runs as Crashed (5 of 5 when we reproduced it). Runs still waiting never started and left no record.
At 256 MB n8n never became ready. The first boot ran all database migrations, then the process was killed with no error line. It restarted 22 times in 7 minutes, each time logging only Last session crashed and Initializing n8n process.
A kill from the kernel leaves no log, so a box that is simply too small looks like a silent restart loop.
Node heap limit
Node sizes its JavaScript heap from the container: in the 512 MB container the heap filled at about 247 of 258 MB, roughly half the limit. You can set it yourself with NODE_OPTIONS=--max-old-space-size=<MB>. In a 1 GB container:
| Heap limit | W3 × 5 parallel | W4 × 5 parallel |
|---|---|---|
| 256 MB | failed 14 of 15 failed, heap out of memory, crash loop | failed all failed |
| 768 MB | ok all 15 ok, peak 865 MiB | failed all failed, killed with no error line |
Heap limit set with NODE_OPTIONS=--max-old-space-size, in a 1 GB container. W3 = 20 MB JSON; W4 = 50 MB file, with binary data kept in memory.
The W4 column ran with binary data in memory (default mode); n8n 2.x’s default filesystem mode was not tested under a heap limit.
A heap limit set too low crashes n8n with plenty of RAM free: n8n died at 585 MiB with 440 MB of the container unused. Raising it fixes heap crashes, but a heap close to the container size only moves the crash: the kernel kills the process instead, without the heap out of memory line. Raise the server’s RAM and the heap limit together.
Does n8n need more CPU?
For a single n8n instance, 4 vCPU handled nearly twice as many light webhook runs as 2 vCPU in our tests, and 8 vCPU added only 4% more. We limited n8n main and the task runner to 2, 4 and 8 vCPU on the same server. On fresh instances we ran two loads: a burst of light webhooks (W1 at 50 requests/s for 1 minute) and Code-heavy work (W2, 10 runs in parallel, 60 in total).
| vCPU | Handled under a 50/s overload | Median wait in the burst | n8n main peak RAM | Code-heavy throughput |
|---|---|---|---|---|
| 2 vCPU | 10.9 runs/s | 42 s | 3.4 GiB | 1.54 runs/s |
| 4 vCPU | 20.8 runs/s about 2x the 2 vCPU result | 21 s | 2.5 GiB | 1.60 runs/s |
| 8 vCPU | 21.7 runs/s +4% over 4 vCPU | 20 s | 2.6 GiB | 1.72 runs/s |
Overload test: light webhooks (W1, which makes an outbound HTTP call on every run) at 50 requests a second for 1 minute. Code-heavy: W2, 10 runs in parallel, 60 in total. n8n main and the task runner were limited to each vCPU count on the same server; fresh instance each run.
These are overload numbers. When 50 requests arrive every second, requests start piling up faster than n8n can process them. That backlog slows the system down. Below that limit, a server performs better.
At a steady 20 light requests per second, both server sizes handled the workload without dropping requests:
- 2 vCPU / 4 GB: Answered all 1,201 requests in one minute, with a median response time of 248 ms and a p95 of 1.4 s.
- 4 vCPU / 8 GB: Also answered all 1,201 requests, with a median of 187 ms and a p95 of 299 ms.
Adding CPU cores helps, but only up to a point. For light workflows, moving from 2 to 4 vCPU doubled what n8n could handle. Going from 4 to 8 vCPU added just 4%.
In the 8 vCPU burst, n8n main averaged 330% CPU usage. Workflows run on a single Node.js event loop, but garbage collection, I/O and database operations can use other cores. That’s why adding a second pair of cores still helps, even though workflow execution itself runs on one event loop.
Code-heavy workloads behaved differently. Throughput barely changed as we added CPU because the task runner never used more than about 1.8 cores. The template caps it at five concurrent tasks, which limits how much additional CPU it can use.
CPU starvation can also turn into a memory problem. During the 2 vCPU overload test, waiting requests piled up and pushed n8n main’s memory usage from 402 MiB to 3.4 GiB. We did not run that burst on a 4 GB server, but 3.4 GiB is already more than the memory available after accounting for the OS and platform.
When does adding more CPU stop helping? With W1, which makes an outbound HTTP call on every run, one instance topped out at around 21 runs per second on 4 cores. Beyond that point, adding more cores won’t solve the bottleneck. That’s when queue mode becomes relevant.
Disk: how fast n8n’s database grows
What a workflow carries decides disk growth: a light run adds about 10 KB to the SQLite database, and a 50 MB file run adds 50 MB. Growth per execution, with n8n’s default of saving successful executions:
| Workflow | Runs measured | SQLite growth per run | With successful runs not saved |
|---|---|---|---|
| W1 Light glue | 1,000 | 9.6 KB | 9.6 KB |
| W2 Code-heavy Code, 10,000 items | 100 | 1.8 MB | 10 KB |
| W3 Big JSON 20 MB JSON | 10 | 5.8 MB | not measured |
| W4 Large file, kept in memory 50 MB file, binary data in memory | 10 | 73 MB | not measured |
| W4 Large file, filesystem mode 50 MB file, filesystem binary mode | 10 | 50 MB binary files on disk | not measured |
“Successful runs not saved” means EXECUTIONS_DATA_SAVE_ON_SUCCESS=none. By default n8n saves every successful execution.
At 1,000 light runs a day, expect about 0.3 GB a month on SQLite without pruning; at 1,000 Code-heavy runs a day like W2, about 54 GB a month.
Not saving successful executions cut W2’s growth from 1.8 MB to 10 KB per run and made it 30% faster (2.41 vs 1.86 runs/s). For light workflows it changed nothing: the roughly 10 KB per run is written either way.
With saving off, n8n still writes each execution when it starts and soft-deletes it when it succeeds, and adds 4 rows per run to its insights_raw table. The pruning job removes the soft-deleted rows later.
With binary data kept in memory, a 50 MB file costs 73 MB per saved execution, about 1.4 times its size, because it is stored inside the execution record.
Pruning
n8n prunes old executions by default: EXECUTIONS_DATA_PRUNE=true, EXECUTIONS_DATA_MAX_AGE=336 (hours, 14 days), EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000 (the defaults in n8n 2.40.7’s source). Soft-deleted executions are purged after a further buffer, EXECUTIONS_DATA_HARD_DELETE_BUFFER=1 (hour).
That cap matters for Code-heavy work: 10,000 saved runs at 1.8 MB each is about 18 GB. With pruning off, the same workload fills a 40 GB disk in under a month, and SQLite stops with the SQLITE_FULL error.
Whether a SQLite file shrinks after pruning without a vacuum (DB_SQLITE_VACUUM_ON_STARTUP) was not measured. n8n’s guide to managing execution data says SQLite reuses freed space rather than releasing it, unless you vacuum.
Images and logs
The amd64 images are about 540 MiB to download: n8nio/n8n:2.40.7 254 MiB and n8nio/runners:2.40.7 177 MiB compressed, plus 110 MiB for postgres:16-alpine if you use it. Unpacked they take about 1.6 GB on disk (1.03 GB, 535 MB and 288 MB, measured on arm64). Log growth was not measured.
n8n SQLite vs Postgres: what changes in resources
Postgres costs 120 to 300 MiB of extra RAM and saves disk on heavy workflows; n8n main used the same memory on both.
| Measure | SQLite | Postgres 16 |
|---|---|---|
| n8n main, idle | 394 MiB | 391 MiB |
| Database’s own RAM | inside n8n no separate database process | 121 MiB idle 309 MiB peak |
| Light runs W1 × 1,000, 10 parallel | 20.8 runs/s | 23.4 runs/s |
| Disk per Code-heavy run W2 × 100 | 1.8 MB | 0.76 MB |
Postgres stored Code-heavy execution data in less than half the space SQLite used, possibly because it compresses large rows.
Light runs behaved differently. Postgres disk usage grew in steps as it allocated new write-ahead log (WAL) files. That makes per-run growth figures below a few MB unreliable.
We also tested SQLite under load. It did not return a database is locked error in any run, including tests with 20 parallel executions.
When should you switch to Postgres?
Switch when you need queue mode (which requires Postgres), when execution data grows to several GB, or when you want to take backups without stopping n8n. If you run both on the same server, budget about 300 MiB of RAM for Postgres.
Setting up Postgres for n8n means running a second container, creating a database user, and configuring environment variables before the first boot. Our n8n with Postgres template handles that setup on the same server.
See n8n with its own Postgres 16 database, connected before first boot
Already decided? Deploy it with the $5 welcome credit, no card required
n8n software requirements
n8n 2.40.7 needs Docker with Compose, or Node.js 24+ for an npm install:
- Docker image: n8nio/n8n:2.40.7 ships Node.js 26.7.0. The “Node.js 16 or higher” figure in some guides is long out of date.
- Task runner: a second image, n8nio/runners:2.40.7, runs Code nodes in a separate container (see n8n’s task runners guide). n8n 2.40.7 logs that N8N_RUNNERS_ENABLED is no longer needed.
- Node.js for an npm install: Node.js 24 or newer (n8n 2.40.7’s package.json says “node”: “>=24.0.0”).
- Docker / Compose: Docker Engine 28.5.2 with the Compose plugin 5.6.1 on the Selfhost.dev servers we tested.
- OS: Ubuntu 24.04 LTS with kernel 6.8.0 (the Selfhost.dev server image).
- CPU architecture: both n8n images are published for amd64 and arm64.
n8n hardware requirements by workload
n8n’s server requirements follow the workload: 2 vCPU / 4 GB covers most single-instance setups, and 4 vCPU / 8 GB suits bursts of traffic or many parallel Code runs. Each row points to a measurement above. The server rows were checked with the one-click template, where the platform, OS and n8n together used 1.47 GiB at idle.
| Workload | Server | Disk | Database | Why (measured) |
|---|---|---|---|---|
| Personal a few scheduled workflows | 2 vCPU / 4 GB | 40 GB ~0.3 GB/month per 1,000 light runs a day | SQLite | n8n idles at about 390 MiB a light run adds about 20 MB |
| Small team webhooks all day | 2 vCPU / 4 GB | 40 GB ~10 KB per light run, keep pruning on | SQLite | a 1-minute run at 20 light requests/s: all 1,201 answered, p95 1.4 s whole server peaked at 1.74 GiB during that light run |
| Small team, fast responses under load | 4 vCPU / 8 GB | 80 GB keep pruning on | SQLite | the same 20 requests/s at p95 299 ms W1 topped out near 21 runs/s on 4 cores |
| Code-heavy or large files | 2 to 4 vCPU / 4 to 8 GB | 40 to 80 GB ~1.8 MB per saved Code-heavy run, ~10 KB with successes not saved | Postgres | 5 parallel Code runs peaked the whole 4 GB server at 2.2 GiB 20 parallel runs need about 2.3 GiB for n8n main and the task runner |
| Many parallel runs beyond ~20 W1-style runs/s | 4+ vCPU / 8 GB+ | 80 GB+ | Postgres | more cores stop helping one instance this is when queue mode matters |
| AI agents cloud model | 2 vCPU / 4 GB | 40 GB ~10 KB per agent run | SQLite | an agent run added about 160 MiB and 5% CPU five in parallel stayed under 470 MiB |
All rows assume n8n 2.x’s default filesystem binary mode; setting N8N_DEFAULT_BINARY_DATA_MODE=default adds about 1.3 GB per 50 MB file in flight. No row needs a GPU. Running local AI models with Ollama on the same server needs much more RAM.
To compare these sizes with n8n Cloud’s execution plans, see what running n8n on your own server costs.
Both server sizes in this table are one-click n8n servers in Europe: 4 GB for $15.18 a month and 8 GB for $23.36, with every execution included. Compare the 4 GB and 8 GB n8n servers side by side
Field notes: what surprised our engineer
- Idle was four times what I expected. Every guide says about 100 MB. A fresh n8n 2.40.7 sat at 394 MiB doing nothing, and never went back down after heavy runs: 1.6 GiB idle by the end of one test sequence.
- Too little memory doesn’t fail once, it loops. At 512 MB, one burst of parallel Code runs crashed n8n with
JavaScript heap out of memory. It restarted, loggedLast session crashed, and died again 20 seconds later, over and over. I expected one failed execution, not an instance that stays down. - The smallest box fails silently. At 256 MB there was no error at all, only 22 restarts in 7 minutes. If your container restarts with nothing in the logs, check its memory limit first.
- An old tip now costs RAM. Older guides tell you to set
N8N_DEFAULT_BINARY_DATA_MODE=default. On n8n 2.x that keeps files in memory: a 50 MB file workflow used 75% more RAM and ran four times slower than with the variable left unset. Doubling the cores past 4 did nothing by comparison. - “Write to disk” broke out of the box. n8n 2.x limits file nodes to
~/.n8n-files, and the Docker image doesn’t create that folder, so my first file workflow failed withENOENT:no such file or directory, realpath '/home/node/.n8n-files'. - A red ERROR that isn’t one. The task runner logs
ERROR [runner:js]ExperimentalWarning: localStorage is not availableon every Code node run. It’s a harmless Node warning; ignore it.
The short version
Size n8n for your heaviest workflow’s peak, then add the OS:
- If you run scheduled jobs and webhooks, a 2 vCPU / 4 GB server with SQLite is enough.
- If you run Code nodes over large data or move files, take 8 GB.
- If workflows like W1 top about 20 runs a second, more cores stop helping; look at queue mode.
- If your setup sets N8N_DEFAULT_BINARY_DATA_MODE=default, remove it.
You have the size. The template handles the rest before n8n first starts: HTTPS, the webhook URL and an encryption key pinned outside the containers. Launch n8n on a 4 GB server in about four minutes, $5 welcome credit, no card.
Keep reading:
- One-click n8n on a dedicated server
- n8n pricing: Cloud plans vs running it yourself
- Best n8n hosting providers in 2026, ranked
- n8n vs Zapier: what 1,000 to 20,000 runs cost
n8n system requirements FAQ
Is 2 GB of RAM enough for n8n?
For n8n main, yes: with a 2 GB limit every test workflow passed, the heaviest peaking at 1.12 GiB. A whole server is tighter: on our 4 GB server, the OS, platform and idle n8n used 1.47 GiB. A 2 GB server fits light workflows, not Code-heavy or file work. We did not measure one.
Can n8n run on 1 GB of RAM?
Only for light workflows. n8n main ran every test workflow in a 1 GB limit, but the task runner, which was not limited, added up to 502 MiB during five parallel Code runs. The operating system needs memory too. Light workflows ran with n8n main at 384 MB. We did not test a real 1 GB server.
How many vCPUs does n8n need?
Two was the smallest we tested and is enough to start; four is where one instance stops getting faster. Our light webhook workflow went from 10.9 to 20.8 runs a second between 2 and 4 vCPU, and only to 21.7 at 8. Code-heavy work was capped by the task runner, not by cores.
What are the VPS requirements for n8n?
n8n’s VPS requirements are 2 vCPU and 4 GB of memory for most single-instance setups: with five Code runs in parallel, our whole 4 GB server peaked at 2.2 GiB. Choose 4 vCPU and 8 GB for bursts or heavy Code nodes. Our hosting comparison shows which providers set n8n up for you.
Should I use SQLite or Postgres for n8n?
SQLite is fine for a single instance: we saw no locking errors even at 20 parallel runs. Postgres adds 120 to 300 MiB of RAM, stores Code-heavy execution data in less than half the space (0.76 MB vs 1.8 MB per run), and is required for queue mode.
How much disk space does n8n need?
About 1.6 GB for the images, then whatever your executions carry: about 10 KB per light run, 1.8 MB per Code-heavy run and 50 MB per 50 MB file run when executions are saved. Pruning is on by default; turning off saving successful executions cuts Code-heavy growth to about 10 KB per run.
Based on this page: ·
On now or still deciding?
What's the bill you're looking at?
Roughly how much a month, all in?
Matched to RDS, we bill 3.0x less in ap-south-1 (Mumbai) and 2.1x less in us-east-1.
2 vCPU / 4 GB with 20 GB: $24.54/mo in Mumbai, $35.27/mo in us-east-1, against an estimated $73.75/mo on RDS.
See a real RDS bill, before and after →Neon meters compute hours and sleeps. We bill one fixed hourly rate and never sleep.
{price} Same number in a quiet month and a launch month.
Price your size →Two ways off the Supabase bill and you can keep the Supabase stack.
Self-host Supabase on a managed server: a European 8 GB server is $0.03/hr or move just the database to a dedicated Postgres. {price}
How self-hosted Supabase works here →An enterprise client is moving production ClickHouse to us at up to 60% less.
Worked example: off ClickHouse Cloud Scale to always-on managed ClickHouse, $891.86 to $364.03 a month, 59%.
See the ClickHouse bill, before and after →A PaaS bills per service. A project server is one bill for everything on it.
Worked example: a studio consolidated client hosting onto project servers, $390.00 to $82.66 a month, 78%.
See that bill, before and after →Managed PostgreSQL from $8.10 a month in Mumbai. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Postgres and MySQL price the same.
Price your size →Managed PostgreSQL from $8.10 a month in Mumbai. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price}
Price your size →Managed PostgreSQL from $8.10 a month in Mumbai. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Pay-as-you-go credits, top up from $5, no plan tiers.
Price your size →Most setups map onto two shapes: dedicated databases on AWS and a project server for everything else.
{price} Project servers from about $0.02/hr in Europe.
Price your size →Under $200 a month, the calculator beats a human reply. Price it there first.
What's it for?
Where do your users mostly sit?
Dedicated managed Postgres or MySQL, with point-in-time restore, pooling and Multi-AZ failover when you want it.
{region} If you need scale-to-zero or instant branching, Neon fits better than we do.
What managed Postgres includes →Managed ClickHouse for events at volume or TimescaleDB on managed Postgres for time-series next to your app data.
Worked example: off ClickHouse Cloud Scale, $891.86 to $364.03 a month, 59%. {region}
See the ClickHouse bill, before and after →pgvector on managed Postgres: one database instead of a second vendor.
{region} TimescaleDB is one click away on the same instance if you also have time-series.
When a dedicated vector DB is worth it →A project server from about $0.02/hr in Europe: push to GitHub and it deploys, several apps and their databases on one box.
Auto-deploy on push, PR previews, custom domains. The $5 welcome credit covers the start of it, no card needed; it bills by the hour.
How Projects work →Project servers: many sites per server, one bill.
Worked example: a studio consolidated client hosting, $390.00 to $82.66 a month, 78%.
See that bill, before and after →Most things fit dedicated databases on AWS plus a project server for the apps.
{region}
See it in the live demo →What are you trying to do?
Which editor?
We migrate you, free, on every plan size.
An engineer runs it with you: match the instance, replicate or dump and restore, test the restore, cut over.
See one migration, step by step →The Supabase stack, one click, on a server of your own.
One click from the template. A European 8 GB server is $0.03/hr. Nothing to build or wire up.
Self-hosted Supabase in one click →Paste one config and your editor can run the whole backend.
Run it once, sign in when the browser opens and all 239 tools register.
An hourly instance you stop when you are done.
Restore a snapshot into a second instance, point staging at it and stop it when idle: only its storage bills while it is stopped.
Price a small instance →Push to GitHub and it's live: auto-deploy, PR previews, custom domains.
A project server from about $0.02/hr in Europe runs several apps and their databases.
Deploy guides by framework →The one that matters most:
Managed PostgreSQL from $8.10 a month in Mumbai. Project servers from about $0.02 an hour in Europe.
The smallest dedicated Postgres, a 1 GB t4g.micro with 1 GB of storage, is $8.10 a month in ap-south-1 (Mumbai) and $10.55 in us-east-1; the $5 welcome credit goes toward it. Pay-as-you-go credits, top up from $5, no tiers.
Price your size →When production needs help, you talk to the engineers who run it and a founder reads every request.
Outages, restores, performance issues and migrations reach the people operating the platform. No response-time promise or uptime percentage we cannot prove.
How support and recovery work →Failover, point-in-time restore and backups cover the common ways a database fails.
Multi-AZ failover is a toggle on Postgres, MySQL, Redis and ClickHouse and a cluster you pick at create on OpenSearch; Postgres and MySQL add point-in-time restore and every engine gets automated backups, live metrics and alerts.
The reliability and recovery details →We migrate you, free. An engineer plans and runs the move with you.
Match the instance, replicate or dump and restore, test the restore, cut over. Any plan size, no extra cost.
See one migration, step by step →Run it in your own AWS account with BYOC, in the region you need.
Encryption at rest on every managed instance; client TLS is a switch on PostgreSQL, MySQL and ClickHouse and always on for OpenSearch. We do not hold SOC 2 or HIPAA today and we will say so before you spend an hour.
What we can and cannot certify →Fair enough. The live demo is the fastest way to see it.
Or claim $5 to start, no card needed.
Watch the live demo →Our founder
You've already sent us your setup from this browser. A founder will reply to it; no need to send it twice.
Got it. I'll reply to within two working days, from my own inbox.
Noted. One note when it changes, nothing else.
Ship the app you just read about.
Deploy straight from GitHub onto a dedicated server we run for you, with auto-deploy on push and preview environments. Pay by the hour from about $0.02 in Europe, with no surprise invoices. No DevOps. Limited-time offer: get $5 in free credit at signup, no card needed.
Based on this page: ·
On now or still deciding?
What's the bill you're looking at?
Roughly how much a month, all in?
Matched to RDS, we bill 3.0x less in ap-south-1 (Mumbai) and 2.1x less in us-east-1.
2 vCPU / 4 GB with 20 GB: $24.54/mo in Mumbai, $35.27/mo in us-east-1, against an estimated $73.75/mo on RDS.
See a real RDS bill, before and after →Neon meters compute hours and sleeps. We bill one fixed hourly rate and never sleep.
{price} Same number in a quiet month and a launch month.
Price your size →Two ways off the Supabase bill and you can keep the Supabase stack.
Self-host Supabase on a managed server: a European 8 GB server is $0.03/hr or move just the database to a dedicated Postgres. {price}
How self-hosted Supabase works here →An enterprise client is moving production ClickHouse to us at up to 60% less.
Worked example: off ClickHouse Cloud Scale to always-on managed ClickHouse, $891.86 to $364.03 a month, 59%.
See the ClickHouse bill, before and after →A PaaS bills per service. A project server is one bill for everything on it.
Worked example: a studio consolidated client hosting onto project servers, $390.00 to $82.66 a month, 78%.
See that bill, before and after →Managed PostgreSQL from $8.10 a month in Mumbai. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Postgres and MySQL price the same.
Price your size →Managed PostgreSQL from $8.10 a month in Mumbai. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price}
Price your size →Managed PostgreSQL from $8.10 a month in Mumbai. Dedicated Postgres or MySQL on AWS, with restore, pooling and Multi-AZ failover when you want it.
{price} Pay-as-you-go credits, top up from $5, no plan tiers.
Price your size →Most setups map onto two shapes: dedicated databases on AWS and a project server for everything else.
{price} Project servers from about $0.02/hr in Europe.
Price your size →Under $200 a month, the calculator beats a human reply. Price it there first.
What's it for?
Where do your users mostly sit?
Dedicated managed Postgres or MySQL, with point-in-time restore, pooling and Multi-AZ failover when you want it.
{region} If you need scale-to-zero or instant branching, Neon fits better than we do.
What managed Postgres includes →Managed ClickHouse for events at volume or TimescaleDB on managed Postgres for time-series next to your app data.
Worked example: off ClickHouse Cloud Scale, $891.86 to $364.03 a month, 59%. {region}
See the ClickHouse bill, before and after →pgvector on managed Postgres: one database instead of a second vendor.
{region} TimescaleDB is one click away on the same instance if you also have time-series.
When a dedicated vector DB is worth it →A project server from about $0.02/hr in Europe: push to GitHub and it deploys, several apps and their databases on one box.
Auto-deploy on push, PR previews, custom domains. The $5 welcome credit covers the start of it, no card needed; it bills by the hour.
How Projects work →Project servers: many sites per server, one bill.
Worked example: a studio consolidated client hosting, $390.00 to $82.66 a month, 78%.
See that bill, before and after →Most things fit dedicated databases on AWS plus a project server for the apps.
{region}
See it in the live demo →What are you trying to do?
Which editor?
We migrate you, free, on every plan size.
An engineer runs it with you: match the instance, replicate or dump and restore, test the restore, cut over.
See one migration, step by step →The Supabase stack, one click, on a server of your own.
One click from the template. A European 8 GB server is $0.03/hr. Nothing to build or wire up.
Self-hosted Supabase in one click →Paste one config and your editor can run the whole backend.
Run it once, sign in when the browser opens and all 239 tools register.
An hourly instance you stop when you are done.
Restore a snapshot into a second instance, point staging at it and stop it when idle: only its storage bills while it is stopped.
Price a small instance →Push to GitHub and it's live: auto-deploy, PR previews, custom domains.
A project server from about $0.02/hr in Europe runs several apps and their databases.
Deploy guides by framework →The one that matters most:
Managed PostgreSQL from $8.10 a month in Mumbai. Project servers from about $0.02 an hour in Europe.
The smallest dedicated Postgres, a 1 GB t4g.micro with 1 GB of storage, is $8.10 a month in ap-south-1 (Mumbai) and $10.55 in us-east-1; the $5 welcome credit goes toward it. Pay-as-you-go credits, top up from $5, no tiers.
Price your size →When production needs help, you talk to the engineers who run it and a founder reads every request.
Outages, restores, performance issues and migrations reach the people operating the platform. No response-time promise or uptime percentage we cannot prove.
How support and recovery work →Failover, point-in-time restore and backups cover the common ways a database fails.
Multi-AZ failover is a toggle on Postgres, MySQL, Redis and ClickHouse and a cluster you pick at create on OpenSearch; Postgres and MySQL add point-in-time restore and every engine gets automated backups, live metrics and alerts.
The reliability and recovery details →We migrate you, free. An engineer plans and runs the move with you.
Match the instance, replicate or dump and restore, test the restore, cut over. Any plan size, no extra cost.
See one migration, step by step →Run it in your own AWS account with BYOC, in the region you need.
Encryption at rest on every managed instance; client TLS is a switch on PostgreSQL, MySQL and ClickHouse and always on for OpenSearch. We do not hold SOC 2 or HIPAA today and we will say so before you spend an hour.
What we can and cannot certify →Fair enough. The live demo is the fastest way to see it.
Or claim $5 to start, no card needed.
Watch the live demo →Our founder
You've already sent us your setup from this browser. A founder will reply to it; no need to send it twice.
Got it. I'll reply to within two working days, from my own inbox.
Noted. One note when it changes, nothing else.