Contents
1. 前提条件と環境準備
本セクションでは、Docker Engine と Docker‑Compose プラグイン のインストール方法、および ファイアウォール設定(ufw)を中心に解説します。
VPS にログインできること、sudo 権限が付与されたユーザーで作業できることが前提です。
1.1 Docker Engine のインストール(Ubuntu/Debian 系)
Docker の公式リポジトリは GPG 鍵を apt-key ではなく keyring に保存するのが推奨されています。以下の手順で安全にセットアップできます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 1. 必要パッケージのインストール sudo apt-get update && sudo apt-get install -y \ ca-certificates curl gnupg lsb-release # 2. Docker の公式 GPG 鍵を keyring に保存 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 3. apt 用リポジトリ情報を追加(arch と signed-by オプション必須) echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 4. パッケージインデックス更新 & Docker Engine のインストール sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 5. 動作確認 docker version docker compose version |
ポイント:Docker‑Compose はプラグイン形式 (
docker compose) が公式です。docker-composeバイナリは不要なので、上記手順だけで完結します。
macOS の場合
|
1 2 |
brew install docker docker-compose |
Homebrew 版も同様に docker compose コマンドが利用可能です。
1.2 Docker‑Compose プラグインのバージョン取得(インストール前に実行)
Docker Compose のプラグインは、GitHub Releases API から最新版タグを取得してダウンロードする方法が安全です。以下は Bash スクリプト例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 最新リリース情報を取得し、バージョン番号だけ抽出 COMPOSE_VERSION=$(curl -sSf https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') # ダウンロード URL を組み立て、プラグインとして配置 sudo curl -SL "https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-$(uname -m)" \ -o /usr/local/lib/docker/cli-plugins/docker-compose sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose # バージョン確認 docker compose version |
注意:
DOCKER_COMPOSE_VERSION=$(docker compose version ...)のように、インストール前にdocker composeを呼び出すとエラーになるため、上記 API 取得方式を採用してください。
1.3 ファイアウォール設定(ufw)
n8n の内部ポート 5678 はリバースプロキシ経由でのみ利用し、外部から直接アクセスさせないのがベストプラクティスです。したがって、インターネットに公開するのは 80/tcp(HTTP) と 443/tcp(HTTPS) のみとします。
|
1 2 3 4 5 6 7 8 9 10 11 |
# ufw を有効化し、必要最低限のポートだけ開放 sudo ufw allow 80/tcp # HTTP(リバースプロキシが受け取る) sudo ufw allow 443/tcp # HTTPS(Let's Encrypt 証明書で暗号化) # 5678 はローカルからのみアクセス可能に限定 sudo ufw allow from 127.0.0.1 to any port 5678 comment 'n8n internal' # ファイアウォールを有効化 sudo ufw enable sudo ufw status verbose |
ポイント:
ufw allow 5678/tcpのように全世界へ開放すると、内部 API が外部から直撃される危険があります。上記設定でローカル限定に抑えましょう。
2. n8n Docker イメージの取得とタグ選択
このセクションでは 公式イメージの取得手順 と、バージョン固定の重要性 を解説します。実運用では「最新」タグよりも、特定リビジョンを明示的に指定する方が安定します。
2.1 最新タグ(動的取得)と推奨タグ
Docker Hub の n8nio/n8n リポジトリから 現在の最新版 を自動で取得したい場合は、以下のように API 経由で最新タグを取得します。
|
1 2 3 4 5 6 7 8 |
# Docker Hub API から "latest" ではなく「安定版 LTS」の最新タグを取得 N8N_TAG=$(curl -sSf https://hub.docker.com/v2/repositories/n8nio/n8n/tags?page_size=100 | jq -r '.results[] | select(.name|test("^0\\.[0-9]+\\.[0-9]+$")) | .name' | sort -V | tail -n1) # 取得したタグでイメージをプル docker pull n8nio/n8n:${N8N_TAG} |
実務上の推奨:
N8N_TAGを.envに保存し、Compose ファイルでは${N8N_TAG}と変数展開することで、バージョン管理が容易になります。
2.2 バージョン固定例
以下は 2024 年 10 月時点での最新安定版(執筆時点)を取得する例です。将来的に別タグになる場合は、必ず公式リリースノート(https://github.com/n8n-io/n8n/releases)を確認してください。
|
1 2 3 |
# 例:2024‑10‑15 の安定版 0.240.1 を取得 docker pull n8nio/n8n:0.240.1 |
注意:
0.240.0といった将来のリリース番号を記載すると、実際に存在しない場合に読者が混乱します。必ず「現時点で公開されている最新タグ」か、latestを利用する旨を明示してください。
3. docker‑compose.yml の作成と永続化設定
本章では docker-compose.yml の全体像と、データベース選択・ボリューム定義のベストプラクティスを解説します。
「導入段落 → 設定項目説明 → 実装例」の流れで記載することで、読者が設定意図をすぐに把握できます。
3.1 基本構成(SQLite 使用時)
SQLite はシンプルかつ小規模なワークフローに適しています。以下は バージョン固定 と 汎用ボリューム名 を採用した最小構成です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
version: "3.9" services: n8n: image: n8nio/n8n:${N8N_TAG} # .env の N8N_TAG が展開される restart: unless-stopped ports: - "5678:5678" # ローカル限定(ufwで制限済み) environment: - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=admin - N8N_BASIC_AUTH_PASSWORD=${N8N_ADMIN_PASSWORD} - N8N_HOST=n8n.example.com - N8N_PORT=5678 - N8N_PROTOCOL=https - WEBHOOK_URL=https://n8n.example.com/ - DATABASE_TYPE=sqlite # ← ここは sqlite に統一 volumes: - n8n_data:/home/node/.n8n # 汎用ボリューム名 volumes: n8n_data: |
設定ポイント解説(H3)
DATABASE_TYPE=sqliteは公式ドキュメントでも推奨されるデフォルトです。PostgreSQL を利用する場合は別サービスを追加し、DATABASE_TYPE=postgresdbに変更します。- ボリューム名
n8n_dataはプロジェクト固有ではなく汎用的に命名しているため、他のプロジェクトでも同様のスクリプトが流用可能です。
3.2 PostgreSQL を利用した構成(オプション)
大規模運用や外部ツール連携が必要な場合は、PostgreSQL コンテナ を追加し、DATABASE_TYPE=postgresdb に切り替えます。以下はその全体像です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
version: "3.9" services: postgres: image: postgres:15-alpine restart: unless-stopped environment: - POSTGRES_USER=n8n_user - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=n8n volumes: - pg_data:/var/lib/postgresql/data n8n: image: n8nio/n8n:${N8N_TAG} restart: unless-stopped depends_on: - postgres ports: - "5678:5678" environment: - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=admin - N8N_BASIC_AUTH_PASSWORD=${N8N_ADMIN_PASSWORD} - N8N_HOST=n8n.example.com - N8N_PORT=5678 - N8N_PROTOCOL=https - WEBHOOK_URL=https://n8n.example.com/ - DATABASE_TYPE=postgresdb # ← PostgreSQL 用に変更 - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=n8n - DB_POSTGRESDB_USER=n8n_user - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD} volumes: - n8n_data:/home/node/.n8n volumes: pg_data: n8n_data: |
設定ポイント解説(H3)
depends_onにより、PostgreSQL が起動してから n8n が開始します。- 環境変数はすべて
.envファイルで管理し、機密情報はchmod 600 .envと Docker secrets に移行することを推奨します。
3.3 環境変数一覧(重要度別)
| 変数名 | 必須/任意 | 説明 |
|---|---|---|
N8N_BASIC_AUTH_ACTIVE |
必須 | Basic Auth を有効化 (true) |
N8N_BASIC_AUTH_USER / N8N_BASIC_AUTH_PASSWORD |
必須 | 管理者認証情報。パスワードは .env に保存 |
N8N_HOST |
必須 | 公開ドメイン名(例: n8n.example.com) |
N8N_PORT |
任意 | コンテナ内部ポート(デフォルト 5678) |
N8N_PROTOCOL |
必須 | https に固定し、リバースプロキシ側で TLS を終端 |
WEBHOOK_URL |
必須 | 外部からフックが呼び出される URL |
DATABASE_TYPE |
必須 | sqlite か postgresdb のいずれか |
DB_POSTGRESDB_* 系列 |
PostgreSQL 使用時必須 | 接続情報(ホスト・ポート・ユーザー等) |
4. HTTPS 化の実装パターン
HTTPS が未導入だと、認証情報やワークフロー定義が平文で送信されるリスクがあります。本節では ConoHa VPS 用自動取得スクリプト と、Docker Compose 内で完結する certbot コンテナ方式 の 2 パターンを比較します。
4.1 ConoHa VPS 向けスタートアップスクリプト(公式ガイド参照)
ConoHa が提供している「n8n Docker」セットアップの公式ページは
https://doc.conoha.jp/products/vps-v3/image-v3/image-usage/n8n-docker/(2024‑10‑時点)です。以下はその手順をベースにした cloud‑init スクリプト例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash # 1. 必要パッケージのインストール apt-get update && apt-get install -y nginx certbot python3-certbot-nginx # 2. Nginx リバースプロキシ設定(/etc/nginx/sites-available/n8n.conf) cat > /etc/nginx/sites-available/n8n.conf <<'EOF' server { listen 80; server_name n8n.example.com; location / { proxy_pass http://127.0.0.1:5678/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } EOF ln -s /etc/nginx/sites-available/n8n.conf /etc/nginx/sites-enabled/ systemctl reload nginx # 3. Let's Encrypt 証明書取得(自動リダイレクト有り) certbot --nginx -d n8n.example.com \ --non-interactive --agree-tos -m admin@example.com |
ポイント解説(H3)
- cloud‑init に登録すれば、VPS 起動時に自動で Nginx と Certbot が構築されます。
- 証明書は
/etc/letsencrypt/live/n8n.example.com/に配置され、Nginx が自動的に SSL 終端を行います。
4.2 Docker Compose 内で完結する certbot コンテナ方式
Docker‑Compose のみで 自動取得・自動更新 を実現したい場合は、jwilder/nginx-proxy と nginxproxy/acme-companion の組み合わせが便利です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
version: "3.9" services: nginx-proxy: image: jwilder/nginx-proxy restart: unless-stopped ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - certs:/etc/nginx/certs acme-companion: image: nginxproxy/acme-companion restart: unless-stopped environment: - NGINX_PROXY_CONTAINER=nginx-proxy - ACME_CA_URI=https://acme-v02.api.letsencrypt.org/directory volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - certs:/etc/nginx/certs n8n: image: n8nio/n8n:${N8N_TAG} restart: unless-stopped environment: - VIRTUAL_HOST=n8n.example.com - LETSENCRYPT_HOST=n8n.example.com - LETSENCRYPT_EMAIL=admin@example.com - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=admin - N8N_BASIC_AUTH_PASSWORD=${N8N_ADMIN_PASSWORD} - N8N_PROTOCOL=https - N8N_HOST=n8n.example.com - WEBHOOK_URL=https://n8n.example.com/ volumes: - n8n_data:/home/node/.n8n volumes: certs: n8n_data: |
ポイント解説(H3)
VIRTUAL_HOSTとLETSENCRYPT_*ラベルだけで、nginx‑proxy が自動的にリバースプロキシと SSL 証明書を生成します。- コンテナの再起動や証明書更新は acme-companion がバックグラウンドで処理するため、運用負荷が大幅に低減します。
4.3 IP アドレス+自己署名証明書(テスト向け)
社内限定の検証環境では、Let’s Encrypt の取得が不要な場合があります。その際は 自己署名証明書 を作成し、Nginx に組み込む手順を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 1. 秘密鍵と自己署名証明書の生成(IP アドレス例: 203.0.113.10) sudo openssl req -newkey rsa:2048 -nodes -keyout self.key \ -x509 -days 365 -out self.crt -subj "/CN=203.0.113.10" # 2. Nginx SSL 用設定(/etc/nginx/sites-available/n8n_ssl.conf) cat > /etc/nginx/sites-available/n8n_ssl.conf <<'EOF' server { listen 443 ssl; server_name 203.0.113.10; ssl_certificate /etc/ssl/certs/self.crt; ssl_certificate_key /etc/ssl/private/self.key; location / { proxy_pass http://127.0.0.1:5678/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } EOF ln -s /etc/nginx/sites-available/n8n_ssl.conf /etc/nginx/sites-enabled/ systemctl reload nginx |
Docker 側の環境変数は次の通りです。
|
1 2 3 4 5 |
environment: - N8N_HOST=203.0.113.10 - N8N_PROTOCOL=https - WEBHOOK_URL=https://203.0.113.10/ |
注意:自己署名証明書はブラウザで警告が表示されます。実運用では必ず Let’s Encrypt か社内 PKI の証明書に置き換えてください。
5. 初期設定・運用・保守ガイド
本章では 管理者認証の作成手順、アップデートフロー、バックアップ戦略、そして セキュリティベストプラクティス を体系的にまとめます。
5.1 管理者ユーザーと Basic Auth の設定
n8n は起動時に N8N_BASIC_AUTH_* が設定されていると自動で Basic Auth を有効化します。以下は安全なパスワード生成から .env 管理までの流れです。
|
1 2 3 4 5 6 7 8 9 10 |
# 1. .env ファイル作成(git 管理外に置く) mkdir -p /opt/n8n && cd /opt/n8n cat > .env <<'EOF' N8N_ADMIN_PASSWORD=$(openssl rand -base64 16) POSTGRES_PASSWORD=$(openssl rand -base64 24) # PostgreSQL 使用時 EOF # 2. 環境変数を展開させるために .env を source(docker compose は自動で読み込む) chmod 600 .env |
docker compose up -d 後、ブラウザから https://n8n.example.com/ にアクセスすると Basic Auth のポップアップが表示されます。認証後は ユーザー設定 → API キー で追加のトークン認証も構築できます。
5.2 アップデート手順(安全なロールアウト)
バージョン更新は イメージ取得 → コンテナ停止 → バックアップ → 再起動 の順に行います。ロールバック用のタグ保持も忘れずに実施してください。
|
1 2 3 4 5 6 7 8 9 |
# 1. 最新イメージを取得(N8N_TAG を .env で上書き可能) docker compose pull n8n # 2. バックアップ(後述スクリプト参照) ※必要なら実行 ./backup_n8n.sh # 3. コンテナ再起動(ダウンタイムは数秒程度) docker compose up -d --no-deps --force-recreate n8n |
ロールバック例
|
1 2 3 4 5 |
# 前バージョンに戻す場合 export N8N_TAG=0.239.1 # 例として前リリースを指定 docker compose pull n8n docker compose up -d --no-deps --force-recreate n8n |
5.3 バックアップスクリプト(汎用版)
永続化ボリュームは Docker が管理するため、docker run --rm -v <volume>:/data ... tar で取得できます。プロジェクト固有の名前ではなく、環境変数 N8N_DATA_VOLUME を利用して汎用性を高めます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/usr/bin/env bash set -euo pipefail # --- 設定項目 ------------------------------------------------- TIMESTAMP=$(date +%Y%m%d_%H%M) BACKUP_ROOT=/var/backups/n8n N8N_DATA_VOLUME=${N8N_DATA_VOLUME:-n8n_data} # デフォルトは n8n_data mkdir -p "${BACKUP_ROOT}" # ---------------------------------------------------------------- echo "バックアップ開始: ${TIMESTAMP}" docker run --rm \ -v "${N8N_DATA_VOLUME}:/data" \ -v "${BACKUP_ROOT}:/backup" \ alpine tar czf "/backup/n8n_${TIMESTAMP}.tar.gz" -C /data . echo "バックアップ完了 → ${BACKUP_ROOT}/n8n_${TIMESTAMP}.tar.gz" |
復元手順
|
1 2 3 4 5 |
docker run --rm \ -v "${N8N_DATA_VOLUME}:/data" \ -v "/path/to/backup/n8n_20240627_1200.tar.gz:/backup/archive.tar.gz:ro" \ alpine sh -c "tar xzf /backup/archive.tar.gz -C /data" |
5.4 セキュリティベストプラクティス
| 項目 | 推奨設定 |
|---|---|
| ファイアウォール | ufw allow 80/tcp、ufw allow 443/tcp、ufw allow from 127.0.0.1 to any port 5678 |
| 最小権限ユーザー | Docker デーモンは docker グループに所属した非 root ユーザーで実行 |
| 機密情報の保護 | .env は chmod 600、本番では Docker Secrets または外部シークレットマネージャ(AWS Secrets Manager 等)へ移行 |
| イメージ署名 | Docker Content Trust (DOCKER_CONTENT_TRUST=1) を有効化し、公式イメージの検証を実施 |
| 脆弱性スキャン | 定期的に trivy image n8nio/n8n:${N8N_TAG} で CVE をチェック |
| ログローテーション | /etc/logrotate.d/docker に標準設定があるが、/var/lib/docker/containers/*/*.log が肥大化しないようにサイズ制限を追加 |
まとめ:上記項目は「最小限の露出」と「運用可視性」の両立を目的としています。特にファイアウォールで内部ポート 5678 をローカル限定にすることが、外部からの不正アクセス防止に直結します。
6. 完全なプロジェクト構成例(最終形)
以下は 実務でそのまま使える ディレクトリ構造とファイル一覧です。コメントを多めに入れているので、カスタマイズの際の参考になります。
|
1 2 3 4 5 6 |
/opt/n8n/ ├─ .env # 機密情報(chmod 600) ├─ backup_n8n.sh # 上記バックアップスクリプト ├─ docker-compose.yml # 本稿で示した構成(SQLite or PostgreSQL 切替可) └─ README.md # 本ガイド本文(社内 Wiki 用にコピー可) |
実行手順
|
1 2 3 4 |
cd /opt/n8n docker compose up -d # 初回起動 ./backup_n8n.sh # 任意でバックアップ取得 |
参考リンク
- Docker Engine インストールガイド(公式): https://docs.docker.com/engine/install/ubuntu/
- Docker‑Compose プラグインリリースページ: https://github.com/docker/compose/releases
- n8n 公式 Docker Hub: https://hub.docker.com/r/n8nio/n8n
- ConoHa VPS の n8n Docker ガイド(2024‑10‑時点): https://doc.conoha.jp/products/vps-v3/image-v3/image-usage/n8n-docker/
- Let’s Encrypt (certbot) ドキュメント: https://certbot.eff.org/instructions
以上です。 本ガイドは最新情報に合わせて随時更新してください。安全でスケーラブルな n8n 環境構築の一助となれば幸いです。