VPS上のn8n:手作業のルーティンから解放される自前の自動化プラットフォーム
Webサイトから問い合わせが届くと、n8nがデータを確認し、重複を検索し、案件を作成し、AIで返信の下書きを用意して、Telegramで担当者に通知します。人が関わるのは判断が必要な場面だけで、タブ間でデータを移す作業ではありません。
以下では、n8nの仕組みと、PostgreSQL、HTTPS、分離されたコード実行を備えたn8nをDocker ComposeでVPSにインストールする方法を説明します。
7ステップで始めるn8n
最小構成の導入手順は次のとおりです。
- VPSを作成し、
n8n.example.comなどのサブドメインを割り当てます。 - DockerとDocker Composeをインストールします。
- PostgreSQL、外部タスクランナー、Caddyとともにn8nを起動します。
- HTTPSで管理画面を開き、所有者アカウントを作成します。
- Telegram、CRM、メール、または任意の外部APIを接続します。
- エラー処理と実行履歴の保存期間を設定します。
- データベース、データ、暗号化キーのバックアップを自動化します。
小規模な本番環境なら、2 vCPUと4 GB RAMから始めるのが妥当です。テストでは2 GBで足りることも多いものの、PostgreSQL、Docker、並列プロセスによって余裕はすぐに消費されます。
n8nとは何か、どのように動くのか
n8nはワークフロー自動化プラットフォームです。シナリオは複数のノードで構成されます。最初のノードが処理を開始し、その後のノードがデータを取得・変換し、最後のノードがアクションを実行します。
シンプルなワークフローは次のようになります。
Webhook → データ確認 → CRM → Telegram → Webサイトへの応答
ワークフローは、webhook、スケジュール、メール、メッセージ、または外部サービスのイベントをきっかけに開始できます。ノード間では、条件分岐、ループ、フィルター、待機、エラー処理を利用できます。
n8nの強みは、自動化が既成の連携機能だけに制限されないことです。APIを備えたサービスであればHTTP Requestから呼び出せます。また、独自のロジックはCode nodeでJavaScriptまたはPythonを使って記述できます。そのためn8nは、手軽なノーコードビルダーと独自のサーバーサイドコードの中間に位置します。
単なるデータ転送ではない理由
n8nは、複数のシステムをまたぎ、途中で判断を必要とする処理に向いています。
フォーム → 確認 → 重複検索 → AI評価 → 担当者の承認 → CRM
人を介在させるのは確認ポイントだけにできます。たとえばAIが返信を作成し、担当者が承認した後にのみ顧客へ送信する、といった流れです。
代表的な用途:
- 営業とサポート: 問い合わせの収集、リードの振り分け、案件の作成;
- コンテンツとAI: 下書き作成、問い合わせ分類、承認後の公開;
- DevOps: 障害通知、Gitからのwebhook、APIチェック;
- 社内業務: 表計算、メール、カレンダー、業務システムの同期。
セルフホスト環境では処理とデータベースを管理できますが、外部サービスまでローカル化されるわけではありません。Telegram、CRM、クラウドAIモデルへ送信したデータはVPSの外へ出ます。
n8n Cloudか、自前のサーバーか
| 項目 | n8n Cloud | VPS上のn8n |
|---|---|---|
| 導入 | サーバー設定不要 | ドメイン、Docker、HTTPSが必要 |
| アップデート | n8n側が実施 | 所有者が実施 |
| データベースとファイル | サービスのインフラ内 | 選択したサーバー上 |
| スケーリング | クラウドプランの条件に従う | 自分で設定 |
| 責任範囲 | 管理作業が少ない | バックアップ、保護、監視は所有者が担当 |
| 向いている用途 | DevOpsなしですぐ始めたい場合 | 管理、カスタマイズ、常時稼働する処理 |
Community Editionは無料でセルフホストでき、個人用途や社内業務に利用できます。ただし、n8nは一般的なオープンソースライセンスではなく、fair-code方式のSustainable Use Licenseで提供されています。社内利用や改変は認められますが、n8nをそのまま展開し、自社ロゴを付けて、独立したSaaSとしてアクセスを販売することはできません。このような製品を提供する場合は、ライセンス条件を別途確認する必要があります。
n8nに必要なサーバースペック
負荷は、データ量、並列数、処理内容によって変わります。ファイル、長いリスト、Code node、AIを使うワークフローは、小さなJSONをAPI間で受け渡すだけの処理より多くのメモリを必要とします。
| 用途 | 開始時の構成 |
|---|---|
| テストや個人用のテキストワークフロー | 1 vCPU、2 GB RAM、20 GB NVMe |
| 小規模な本番環境 | 2 vCPU、4 GB RAM、25~40 GB NVMe |
| 並列処理、AI、ファイル処理 | 4 vCPU、8 GB RAM以上 |
| queue modeで複数のworkerプロセスを使用 | 実行数に応じて算出 |
SQLiteは、試用や小規模な単一インスタンスに適しています。本番運用にはPostgreSQLの方が便利です。バックアップを取りやすく、後からqueue modeへ移行する際も容易です。
VPSにn8nをインストールする方法
この例ではUbuntu 24.04、PostgreSQL、Caddy、外部タスクランナーを使用します。n8n.example.comとタイムゾーンは自分の値に置き換えてください。
1. DNSを設定し、サーバーを準備する
VPSのIPv4アドレスを指すDNSのAレコードを作成し、SSHで接続します。
ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl公式リポジトリからDocker EngineとComposeプラグインをインストールします。
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
docker compose versionSSH、HTTP、HTTPSだけを許可します。
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable新しいSSH接続が機能することを確認するまでは、現在のセッションを閉じないでください。
2. 環境変数を作成する
ディレクトリを準備します。
mkdir -p /opt/n8n
cd /opt/n8n.envを作成します。以下のコマンドは、PostgreSQL、n8nの暗号化、タスクランナー向けに、それぞれ異なるランダムなシークレットを生成します。
cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF
chmod 600 .env初回起動にはstableタグが便利です。インストールを確認した後は、次のイメージ更新が予期せず行われないように、n8nの特定バージョンを固定する方が安全です。
N8N_ENCRYPTION_KEYは絶対に失わないでください。n8nはこのキーで、保存済みのパスワード、トークン、その他の認証情報を暗号化します。キーなしでPostgreSQLだけを復元した場合、レコードはデータベースに残りますが、n8nは内容を読み取れません。
3. Docker Composeを作成する
compose.yamlファイルを作成します。
services:
postgres:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
PGDATA: /var/lib/postgresql/data
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: unless-stopped
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: "5432"
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PORT: "5678"
N8N_PROTOCOL: https
N8N_EDITOR_BASE_URL: https://${N8N_HOST}
N8N_WEBHOOK_URL: https://${N8N_HOST}/
N8N_PROXY_HOPS: "1"
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${GENERIC_TIMEZONE}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"
N8N_RUNNERS_MODE: external
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: "168"
EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
volumes:
- n8n_data:/home/node/.n8n
expose:
- "5678"
depends_on:
postgres:
condition: service_healthy
n8n-runner:
image: n8nio/runners:${N8N_VERSION}
restart: unless-stopped
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
depends_on:
- n8n
caddy:
image: caddy:2-alpine
restart: unless-stopped
environment:
N8N_HOST: ${N8N_HOST}
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- n8n
volumes:
postgres_data:
name: n8n_postgres_data
n8n_data:
name: n8n_data
caddy_data:
name: n8n_caddy_data
caddy_config:
name: n8n_caddy_config外部タスクランナーは、n8nのメインプロセスとは分離してコードを実行します。内部モードより安全で、Code nodeのエラーがエディターやwebhook処理へ影響しにくくなります。
4. HTTPSを設定する
Caddyfileを作成します。
{$N8N_HOST} {
reverse_proxy n8n:5678
}DNSがすでにVPSを指し、ポート80と443へ接続できる場合、CaddyはTLS証明書を自動取得します。内部ポート5678はインターネットへ公開されません。外部に公開されるのは80と443だけで、CaddyはDockerネットワーク経由でn8nへ接続します。
N8N_WEBHOOK_URLとN8N_PROXY_HOPSは、エディターが正しい公開webhookアドレスを生成し、1台のリバースプロキシから届くヘッダーを信頼するために必要です。
5. n8nを起動する
最終設定を確認し、コンテナを起動します。
docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy次のURLを開きます。
https://n8n.example.com所有者アカウントを作成します。そのパスワードを同僚と共有しないでください。チームで利用する場合は個別のアカウントを作成し、必要な権限だけを付与します。
最初に作る実用的なワークフロー
Webサイトからの問い合わせ処理は、良い動作確認になります。
POSTメソッドのWebhookノードを追加します。Edit Fieldsで、名前、メールアドレス、流入元だけを残します。Ifノードで、必須データがない問い合わせを拒否します。- CRMに案件を作成するか、
HTTP Requestでリクエストを送信します。 - Telegram通知を追加します。
Respond to Webhookノードで処理を終了します。- テスト後にワークフローを有効化し、テスト用webhookを本番URLへ置き換えます。
この例では、ドメイン、HTTPS、受信リクエスト、認証情報、外部連携をまとめて確認できます。次に、メインの処理が失敗したときに通知する独立したError Workflowを追加するとよいでしょう。
インストール後のn8nセキュリティ
n8nをインストールしただけでは、信頼できる運用環境にはなりません。起動後、次の点を確認してください。
- エディターにはHTTPS経由でのみアクセスできる;
.envの権限が600で、Gitへ登録されていない;- 外部APIキーには必要最小限の権限だけがある;
- webhookが送信元の署名またはシークレットを確認する;
- 実行履歴が自動的に削除される;
- 重要なワークフローのエラーが管理者へ送信される。
Community nodesはパッケージとしてインストールされ、ワークフローのデータやサーバーへアクセスできる場合があります。確認せずに未知のノードを追加しないでください。不要であれば、N8N_COMMUNITY_PACKAGES_ENABLED=falseで無効化します。
組み込み監査を実行します。
docker compose exec n8n n8n audit保護されていないwebhook、危険なノード、認証情報の問題を見つけるのに役立ちますが、手作業による確認の代わりにはなりません。
実行履歴と個人データ
n8nはデバッグのために入力データと出力データを保存します。それに伴い、メール、電話番号、文書、APIレスポンスがデータベースに残る場合があります。
上記の設定では、実行履歴は7日後に削除され、件数は10,000件に制限されます。機密性の高い処理では、データ保持ポリシーに合わせて期間を設定し、不要な項目はワークフローが完了する前に削除してください。
バックアップとアップデート
復元には、PostgreSQLのダンプ、n8n_dataボリューム、設定ファイル、そしてN8N_ENCRYPTION_KEYを含む.envが必要です。コピーの前に、PostgreSQLは稼働させたまま処理コンテナを停止します。この間、ワークフローは短時間停止します。
cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner
docker compose exec -T postgres sh -c \
'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
| gzip > "backup/n8n-db-$(date +%F).sql.gz"
docker run --rm \
-v n8n_data:/source:ro \
-v "$PWD/backup":/backup \
alpine sh -c \
'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'
tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
.env compose.yaml Caddyfile
docker compose start n8n n8n-runner.envを含むアーカイブにはシークレットが入っています。暗号化し、VPSの外部に保管してください。また、定期的にテスト復元を行ってバックアップを確認します。
アップデートの前にはバックアップを作成し、リリースノートを確認してください。
cd /opt/n8n
docker compose pull
docker compose up -d
docker compose psタスクランナーとメインコンテナは、同じバージョンタグを使用する必要があります。
スケーリングが必要になるタイミング
実際の負荷がないうちからRedisや複数のworkerを導入しないでください。PostgreSQLと単一インスタンスの構成は管理しやすく、小規模な社内処理には通常十分です。
長時間の処理がwebhookを遅延させる、多数のワークフローが同時に起動する、ファイル処理が頻繁にメモリを使い切る、といった状況ではqueue modeが必要になります。その場合、メインインスタンスがイベントを受け取り、Redisがジョブを分配し、workerが並列に実行します。すべてのコンポーネントは同じPostgreSQLへ接続し、同じN8N_ENCRYPTION_KEYを使用する必要があります。
n8n向けVPSの選び方
n8n、PostgreSQL、Caddy、タスクランナーをまとめて動かすなら、2 vCPU、4 GB RAM、NVMeストレージから始めるのが妥当です。tropic.hostでは、Lightプランがこの構成に該当します。2 vCPU、4 GB RAM、25 GB NVMeです。重いファイル処理を行わない最初の本番ワークフローには十分です。
文書、大規模データ、多数の並列AIワークフローを扱う場合は、8 GB RAMを選ぶ方が適しています。安定したネットワークも重要です。webhook、OAuthコールバック、スケジュールジョブは常に利用可能でなければなりません。
まとめ
n8nは、繰り返し作業を見やすいフローへ変えます。既成のノードで導入を早め、HTTP RequestでほぼあらゆるAPIへ接続し、Code nodeで独自ロジックを追加できます。
セルフホスト版ではサーバーとデータベースを管理できますが、HTTPS、権限を制限したキー、履歴の削除、検証済みバックアップが必要です。PostgreSQLと一緒にN8N_ENCRYPTION_KEYも保存してください。このキーがなければ、復元した認証情報を復号できません。
FAQ
n8nは無料で使えますか?
はい。Community Editionは自分のサーバーへ無料で設置し、個人用途や社内処理に利用できます。ホストしたn8nを独立したSaaSとして再販売することは、fair-codeライセンスで制限されています。
ドメインなしでn8nをインストールできますか?
ローカルテストなら可能です。公開webhookやOAuthを使う場合は、ドメインとHTTPSを利用する方が適切です。
n8nにはどれくらいのRAMが必要ですか?
シンプルな個人用ワークフローなら、2 GB RAMで足りることがよくあります。PostgreSQL、Caddy、タスクランナーとともにn8nを運用するなら4 GBが妥当で、ファイルや並列実行には8 GB以上が必要になる場合があります。
すべてのデータはVPS内に残りますか?
ワークフローが外部へ送信しないデータだけが残ります。データベースと実行履歴はVPS上にありますが、Telegram、CRM、外部AIモデルのノードは、選択されたデータを該当サービスへ送信します。
n8nのバックアップには何を含めるべきですか?
PostgreSQLのダンプ、n8n_dataボリューム、compose.yaml、Caddyfile、そしてN8N_ENCRYPTION_KEYを含む.envです。暗号化したコピーをVPSの外部に保管し、復元テストで確認してください。
