目次

n8n セルフホスト入門:Docker Compose、PostgreSQL、HTTPS で学ぶ本番環境へのデプロイ

自分のパソコンで問題なく動作することを確認したら、ワークフローを 24 時間稼働させ、Webhook や Telegram などの外部サービスから接続できるように、固定 URL のサーバーへデプロイします。

準備するもの

  • Linux のクラウドサーバー(VPS)。軽い用途なら 1~2 コア、メモリ 2 GB で十分です。ワークフローが多い場合やローカル AI モデルを実行する場合は、より高いスペックが必要です。
  • ドメインと、サブドメイン(例:n8n.example.com)の DNS A レコードをサーバーの IP アドレスに向ける設定。
  • Docker と Docker Compose をインストールしたサーバー(Docker チュートリアル:インストールを参照)。
  • ファイアウォールで 80、443 ポートを開放します。

構成

インターネット ──HTTPS──▶ Caddy(証明書を自動取得) ──▶ n8n:5678 ──▶ PostgreSQL
  • Caddy:リバースプロキシ。Let's Encrypt 証明書を自動で取得、更新します。
  • PostgreSQL:本番運用に推奨するデータベースです(デフォルトの SQLite は個人利用やテストに適しています)。
  • n8n とデータベースは、どちらもインターネットに直接公開しません。

n8n 2.x 以降では、MySQL / MariaDB は n8n のデータベースとしてサポートされていません。PostgreSQL または SQLite を使用してください。

ファイル

サーバー上に /opt/n8n ディレクトリを作成します。

/opt/n8n/
├── compose.yaml
├── .env
└── Caddyfile

.env

DOMAIN=n8n.example.com
POSTGRES_PASSWORD=長くランダムなパスワードに置き換えてください
N8N_ENCRYPTION_KEY=別の長くランダムな文字列に置き換えてください

ランダムな文字列を生成します。

openssl rand -hex 32

N8N_ENCRYPTION_KEY はすべての認証情報の暗号化に使われます。**必ず別途安全にバックアップしてください。**紛失すると、すべての認証情報が使用できなくなります。

Caddyfile

{$DOMAIN} {
    reverse_proxy n8n:5678
}

compose.yaml

services:
  caddy:
    image: caddy:2
    ports:
      - "80:80"
      - "443:443"
    environment:
      DOMAIN: ${DOMAIN}
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    restart: unless-stopped

  postgres:
    image: postgres:17
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
      interval: 5s
      retries: 10
    restart: unless-stopped

  n8n:
    image: n8nio/n8n:2.42.7   # 使用する固定バージョンに変更してください
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: ${DOMAIN}
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      N8N_WEBHOOK_URL: https://${DOMAIN}/
      N8N_PROXY_HOPS: 1
      NODE_ENV: production
      GENERIC_TIMEZONE: Asia/Taipei
      TZ: Asia/Taipei
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: 336
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

volumes:
  caddy_data:
  pg_data:
  n8n_data:

重要な環境変数の説明

変数説明
N8N_HOST、N8N_PROTOCOL外部公開するドメインとプロトコルです。OAuth のコールバック URL などに影響します。
N8N_WEBHOOK_URL外部公開する Webhook URL です。設定しないと、Webhook ノードには http://localhost:5678/... と表示されます。 n8n 2.30 より前のバージョンでは、WEBHOOK_URL を使用してください。
N8N_PROXY_HOPSリバースプロキシの背後で実行する場合は 1 に設定します。n8n がユーザーの実 IP アドレスを取得できるようになります。
N8N_ENCRYPTION_KEY認証情報を暗号化するキーです。
GENERIC_TIMEZONEスケジュールに使用するタイムゾーンです。
EXECUTIONS_DATA_PRUNE、EXECUTIONS_DATA_MAX_AGE指定時間(336 時間 = 14 日)を超えた実行履歴を自動削除し、データベースの肥大化を防ぎます。

起動

cd /opt/n8n
docker compose up -d
docker compose logs -f n8n

数分以内に Caddy が証明書を自動取得します。https://n8n.example.com を開き、オーナーアカウントを作成してください。

**すぐにアカウントを作成してください。**オーナーアカウントを設定するまでは、この URL にアクセスできる人なら誰でも先にアカウントを作成できます。

セキュリティの推奨事項

  • イメージには固定バージョンのタグを使用し、latest は使わないでください。アップグレード前にバージョン情報を確認してください。
  • サーバーで開放するポートは 22、80、443 のみにし、SSH 接続は鍵認証だけを許可します。
  • アカウントの 2 段階認証を有効にします(個人設定から設定できます)。
  • システムコマンドを実行するノードなど、危険なノードは 2.x ではデフォルトで無効になっています。安易に有効にしないでください。
  • 定期的にバックアップします(バックアップと更新を参照)。

ローカル AI モデルとの連携

n8n でローカルの Ollama モデルを使うには、同じ compose.yaml に ollama サービスを追加します。n8n と Ollama の連携を参照してください。AI モデルの実行には多くのメモリと計算リソースが必要です。一般的な小型 VPS では実行できません。

大量実行:Queue mode

ワークフローが多く、実行頻度も高い場合は、queue mode を有効にできます。メインプロセスがトリガーを受け取り、Redis キューを介して複数の worker に処理を渡し、並列実行します。これは高度なデプロイ方法です。詳しくは公式ドキュメントの queue mode の説明を参照してください。

更新日 2026年10月12日