n8n を AlmaLinux9 にセットアップしたログ|小さめVPSで動かすときに考えたこと

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

なぜ n8n を触ることになったのか|社内で ChatGPT を使わせるために試行錯誤していた頃の話
以前、このブログではOpenAI API を社内で使うためのフロントとして・Dify・OpenWebUIを試した話を書きました。このあたりの流れは、以下の記事にもまとめています。ただ、実はその前にもう少し試行錯誤していた時期があります。まだ...

今回はその続きで、実際に 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は公開しない
・リバース側で制御

という形にしていました。

実際この構成でも
軽いワークフローなら普通に動きます。

ただ、あとで 画像処理系のフローを入れたら
さすがに厳しくなりました。

そのときサーバ構成を見直すことになります。
このあたりは次の記事で書いています。


この環境の構成まとめ

n8n構築ログまとめ|社内AIの中継処理を試して分かったVPSスペックの現実
社内でAIを触れる環境を作ろうとしていた頃、いろいろ試行錯誤している中で触ることになったのがn8n でした。最初から「自動化ツールを作ろう」と思っていたわけではなく、むしろ AIを社内で安全に使わせるための中継役 を探していたのがきっかけで...

次の記事

n8nで画像処理をやろうとして諦めかけている話|VPSスペック不足を感じた実務ログ
n8nは、最初は「ChatGPT周りの実験用」として触り始めました。前回、n8n を AlmaLinux9 にセットアップしたログ を書きましたが、普通のチャット用途は、結局別の構成に落ち着いたのですが、中間処理や通知のハブとしてはかなり便...