前回の記事で、なぜ n8n を触ることになったのかを書きました。
社内で ChatGPT を使わせるために、色々な方法を試していた頃の話です。

今回はその続きで、実際に n8n をサーバに入れたときのログです。
といっても、ちゃんとした構築記事というより
当時 AlmaLinux9 の VPS に入れて動かしたときのメモ整理に近いです。
スペックはかなり小さめでした。
・2 vCPU
・メモリ 2GB
・ディスク 40GB
「とりあえず動かして検証する」くらいの感覚です。
この構成は、当時検証用で使っていた VPS(今は別用途にしている)で動かしていました。
Node.js を入れて n8n をインストール
まず Node.js を入れます。
当時は Node20 を使いました。
yum module install -y nodejs:20
npm も一緒に入ります。
そのまま n8n をグローバルインストール。
npm install n8n -g
Docker で動かす例も多いですが、
この時は「まず触ってみたい」が目的だったのでシンプルな構成にしました。
環境変数は systemd ではなく別ファイルに分離
n8n は環境変数で色々設定できます。
systemd の service ファイルに直接書いてもいいんですが、
あとで触ることを考えて /etc/sysconfig に分離しました。
vi /etc/sysconfig/admin
内容はこんな感じです。
N8N_HOST=localhost
N8N_PORT=5678
N8N_PROTOCOL=http
WEBHOOK_URL=https://n8n.example.com/
VUE_APP_URL_BASE_API=https://n8n.example.com/
途中で一度ポートを変えて試したことがあるんですが
一部サービスが webhook 連携できないケースがありました。
なので最終的に 443配下に統一しています。
あと、当時気にしていたのが 実行ログの保存量です。
DB_SQLITE_VACUUM_ON_STARTUP=true
EXECUTIONS_DATA_SAVE_ON_ERROR=all
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
EXECUTIONS_DATA_SAVE_ON_PROGRESS=true
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168
このサーバ、ディスクが 40GBしかないので
ログを全部残していくと普通に埋まります。
なので
・成功ログは残さない
・エラーは残す
・古い実行履歴は削除
という運用にしました。
あと地味ですがタイムゾーンも。
GENERIC_TIMEZONE=Asia/Tokyo
systemd で常駐化
サービス化もシンプルです。
vi /etc/systemd/system/n8n.service
[Unit]
Description=n8n service
[Service]
Restart=always
EnvironmentFile=/etc/sysconfig/admin
Environment=NODE_FUNCTION_ALLOW_EXTERNAL=rrule
ExecStart=/usr/local/bin/n8n
[Install]
WantedBy=multi-user.target
起動確認。
systemctl status n8n
この時点で localhost:5678 では動きます。
ただ、このままだと外から触れないので
次にリバースプロキシを入れます。
nginx を入れてリバースプロキシ
dnf -y install nginx
設定ファイル。
vi /etc/nginx/conf.d/n8n.conf
まず http → https リダイレクト。
server {
listen 80;
server_name n8n.example.com;
location / { return 301 https://$server_name$request_uri; }
}
n8n は WebSocket を使うのでここが重要です。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
そして proxy 側。
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
これが無いと
UI がうまく動かないことがありました。
最終的な proxy は localhost:5678 に流しています。
proxy_pass http://localhost:5678;
UI は社内IPだけ許可
n8n の UI はそのまま公開するのが少し怖かったので
社内IPだけ許可にしました。
location / {
allow 220.xxx.xxx.xxx/32;
allow 220.xxx.xxx.xxx/32;
deny all;
proxy_pass http://localhost:5678/;
}
外部からは
・webhook
・OAuth callback
だけ使える状態です。
この辺は完全に好みですが、
UIを直接公開するのはあまり落ち着かないのでこの形にしています。
nginx 起動
systemctl enable nginx
systemctl start nginx
これで
https://n8n.example.com
でアクセスできます。
小さいVPSで動かすときに考えていたこと
この構成で一番意識していたのは
リソースを食いすぎないことです。
2vCPU / 2GBメモリだと
ちょっと重い処理を入れるとすぐ限界が見えます。
なので
・実行ログは削減
・不要な履歴は削除
・UIは公開しない
・リバース側で制御
という形にしていました。
実際この構成でも
軽いワークフローなら普通に動きます。
ただ、あとで 画像処理系のフローを入れたら
さすがに厳しくなりました。
そのときサーバ構成を見直すことになります。
このあたりは次の記事で書いています。
この環境の構成まとめ

次の記事



