目次
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日