「2GBのVPSでn8nは動くのか」を調べると、たいてい「動く」か「厳しい」のどちらかしか書いてありません。具体的に何MB増えるのかは、ほとんど出てきません。
実際に載せて、1分刻みで測りました。

合計402MB。 そして載せ終わってもまだ1.1GB空いています。
測定条件
- サーバー:さくらのVPS 2Gプラン / Ubuntu 24.04 LTS
- 元から動いていたもの:定期的にデータを取得して予測を回すバッチ処理と、静的サイト1本
- 記録:1分ごとにcronで自動記録(スクリプトは前の記事に載せています)
- 時間:2026-09-07 01:12 〜 01:37
前の記事で43時間分のベースラインを取ってあります。「載せる前」が分かっているので、増えた分がそのままn8nのコストになります。
結果:4段階に分けて測る
多くの記事は「n8nは○MB」で終わります。しかし実際に増えるものは1つではありません。
| 段階 | システム全体のメモリ | 増分 |
|---|---|---|
| 元の状態 | 438MB | — |
| +Dockerデーモン | 476MB | +38MB |
| +n8nコンテナ起動 | 804MB | +328MB |
| +UIを開いてワークフローを1本 | 840MB | +36MB |
| 合計 +402MB |
ディスクは 10GB → 13GB(+3GB)。スワップは 0 → 37MB 使われました。
発見1:Dockerデーモンだけなら38MB
「Dockerは重い」とよく言われます。実際に測ると、デーモン単体では38MBでした。
導入直後の記録がこれです。
01:14 431MB python 90.8, systemd-journal 72.7, multipathd 26.7 ← 導入前
01:15 523MB apt-get 98.3, python 90.8, dockerd 87.6 ← インストール中
01:16 483MB python 90.8, dockerd 88.3, systemd-journal 72.9 ← 完了
01:19 478MB python 90.8, dockerd 87.0, systemd-journal 73.0 ← 安定
インストール中は apt-get で523MBまで上がりますが、終われば478〜485MBに落ち着きます。
重いのはDockerではなく、コンテナの中身です。 ここを分けずに「Dockerを入れるとメモリを食う」と言うのは、少し雑だと思いました。
プロセスのRSSを足しても、実際の増加分にはならない
面白いズレがありました。dockerd のRSSは87MBですが、システム全体の増加は38MBです。
RSSは共有ライブラリを重複して数えるため、プロセスごとの数字を足し上げても実際の消費量にはなりません。信用すべきは free の used のほうです。
ps の数字だけを見て「87MB食っている」と書くと、倍以上ずれます。
発見2:n8nの正体はNode.jsプロセス2本
n8nを起動した直後の上位プロセスがこれです。
node-MainThread 305.6MB
node-MainThread 117.5MB
dockerd 78.1MB
docker stats ではコンテナ全体で 395.9MiB でした。
n8nというアプリケーションが重いのではなく、Node.jsのランタイムが2本立ち上がっているという構図です。片方がメインプロセス、もう片方がワーカーだと考えられます。
参考までに、このサーバーで元から動いている自作のPythonアプリは90MBです。同じ「1つのアプリ」でも、ランタイムが違うと3〜4倍変わります。
発見3:UIを開くだけで36MB増える
ここが今回いちばん意外でした。
ブラウザでn8nの管理画面を開き、ワークフローを1本組んだ結果です。
| コンテナのメモリ | |
|---|---|
| 起動直後(UI未接続) | 395.9MiB |
| UIを開いて操作した後 | 434.4MiB |
+38.5MiB。しかも、操作をやめても戻りませんでした。
システム全体でも 804MB → 840MB に増えています。
つまり 「n8nは○MB」という数字は、測ったタイミングで変わります。 起動直後の数字だけを見て容量を見積もると、実際の運用では足りなくなる可能性があります。
発見4:ディスクが3GB増えた
メモリばかり見ていましたが、先に効いてきそうなのはディスクでした。
| 使用量 | |
|---|---|
| n8n導入前 | 10GB |
| n8n導入後 | 13GB |
/var/lib/docker の中身だけで 2.1GB。n8nのイメージ本体です。
100GBのディスクなので今は問題ありませんが、この調子でDify、Ollama、その他を試したら、メモリより先にディスクが苦しくなります。 ローカルLLMのモデルファイルは1つ数GBです。
測る前は、この順番を逆に考えていました。
メモリ上限を必ず付ける
今回はこう起動しました。
sudo docker run -d --name n8n \
--restart unless-stopped \
--memory=768m \
-p 127.0.0.1:5678:5678 \
-v n8n_data:/home/node/.n8n \
-e GENERIC_TIMEZONE="Asia/Tokyo" \
-e TZ="Asia/Tokyo" \
docker.n8n.io/n8nio/n8n
--memory=768m が要点です。
このサーバーには、本番で動いている処理と公開中のサイトが同居しています。n8nが暴走してメモリを食い尽くすと、OOM Killerがどのプロセスを殺すか選べません。 上限を課しておけば、あふれるのはコンテナの中だけで済みます。
結果は 434.4MiB / 768MiB(56.6%)。余裕を持って収まりました。上限としては妥当な線だったと思います。
-p 127.0.0.1:5678:5678 も必須です
n8nは初期状態で誰でもアクセスできます。 -p 5678:5678 と書くと全世界に公開されてしまう。
127.0.0.1 を頭に付けると、サーバー内部からしか繋がらなくなります。管理画面はSSHトンネル経由で開きます。
ssh -L 5678:127.0.0.1:5678 ユーザー名@サーバーのアドレス
そのうえでブラウザから http://localhost:5678 を開く。外に開けずに使えます。
自動化ツールは認証情報の塊です。APIキーもパスワードも入ります。まずポートを閉じてから起動してください。
結論:2GBに載る。ただし条件がある
載る
- 合計402MB増えて、まだ1.1GB空いている
- 元から動いていた処理も、公開中のサイトも止まらなかった
- CPUは終始ほぼアイドル(ロードアベレージ0.08前後)
気をつけること
- 上限を課さないなら載せないほうがいい。同居しているものが道連れになります
- ディスクが3GB減る。ツールを増やすならここが先に効きます
- UIを開くと増えて、戻らない。起動直後の数字で見積もらないこと
- スワップは用意しておく。今回37MB使われました
載らないケース
- PostgreSQLを別途立てる構成(n8nは本番運用でPostgreSQL推奨。SQLiteのままなら今回の数字ですが、DBを足すとさらに100〜300MB)
- ワーカーを分離するスケール構成
- 同じサーバーでDifyやローカルLLMも動かす
次に測ること
n8nは載りました。残り1.1GB。
次はここにDifyを入れてみます。同じ手順で、同じ間隔で測ります。入るのか、入らないのか。入らないならどこで止まるのか。
「AI用途のVPSは何GB必要か」という問いに、推測ではなく実測で答えられるところまで持っていくつもりです。