n8nとは何か:Docker ComposeでVPSにインストールする方法

読了時間 8分
Tropic
n8nとは何か:Docker ComposeでVPSにインストールする方法

VPS上のn8n:手作業のルーティンから解放される自前の自動化プラットフォーム

Webサイトから問い合わせが届くと、n8nがデータを確認し、重複を検索し、案件を作成し、AIで返信の下書きを用意して、Telegramで担当者に通知します。人が関わるのは判断が必要な場面だけで、タブ間でデータを移す作業ではありません。

以下では、n8nの仕組みと、PostgreSQL、HTTPS、分離されたコード実行を備えたn8nをDocker ComposeでVPSにインストールする方法を説明します。

7ステップで始めるn8n

最小構成の導入手順は次のとおりです。

  1. VPSを作成し、n8n.example.comなどのサブドメインを割り当てます。
  2. DockerとDocker Composeをインストールします。
  3. PostgreSQL、外部タスクランナー、Caddyとともにn8nを起動します。
  4. HTTPSで管理画面を開き、所有者アカウントを作成します。
  5. Telegram、CRM、メール、または任意の外部APIを接続します。
  6. エラー処理と実行履歴の保存期間を設定します。
  7. データベース、データ、暗号化キーのバックアップを自動化します。

小規模な本番環境なら、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 CloudVPS上の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 version

SSH、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_URLN8N_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サイトからの問い合わせ処理は、良い動作確認になります。

  1. POSTメソッドのWebhookノードを追加します。
  2. Edit Fieldsで、名前、メールアドレス、流入元だけを残します。
  3. Ifノードで、必須データがない問い合わせを拒否します。
  4. CRMに案件を作成するか、HTTP Requestでリクエストを送信します。
  5. Telegram通知を追加します。
  6. Respond to Webhookノードで処理を終了します。
  7. テスト後にワークフローを有効化し、テスト用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.yamlCaddyfile、そしてN8N_ENCRYPTION_KEYを含む.envです。暗号化したコピーをVPSの外部に保管し、復元テストで確認してください。