タグ: Docker

  • 【5分で完了】n8nローカルインストール方法|Windows・Mac対応の初心者向け手順ガイド

    【5分で完了】n8nローカルインストール方法|Windows・Mac対応の初心者向け手順ガイド

    n8nを試してみたいけど、クラウド版は有料だし、VPSを契約するのは大げさ…。そんな方におすすめなのがローカルインストールです。

    自分のパソコンにn8nをインストールすれば、完全無料でワークフロー数も実行回数も無制限。学習や検証に最適な環境を5〜10分で構築できます。

    この記事では、Windows・Mac対応のn8nローカルインストール方法を、初心者でも迷わない手順で解説します。

    ローカルインストールのメリット

    クラウド版との比較

    項目 n8n Cloud ローカルインストール
    費用 月額€20〜(約3,000円〜) 完全無料
    ワークフロー数 プランにより制限 無制限
    実行回数 プランにより制限 無制限
    データ保存場所 クラウドサーバー 自分のPC内
    24時間稼働 可能 PCの電源が入っている間のみ
    Webhook受信 可能 追加設定が必要
    セットアップ 不要 5〜10分

    ローカルインストールが向いている人

    • n8nを無料で試したい
    • ワークフローの学習・検証がしたい
    • 機密データを外部に出したくない
    • VPSやサーバー管理は避けたい
    • まずは気軽に始めたい

    インストール方法は2種類

    n8nをローカルにインストールする方法は主に2つあります。

    方法 難易度 特徴 おすすめ
    Docker Desktop ★☆☆ GUIで操作、データ永続化が簡単 初心者におすすめ
    npx(Node.js) ★★☆ コマンドで即起動、手軽 すぐ試したい方

    本記事では、初心者に最もおすすめのDocker Desktopを使った方法を中心に解説します。

    方法①:Docker Desktopでインストール(推奨)

    Docker Desktopを使えば、コマンド操作なしでn8nをインストールできます。

    Step 1:Docker Desktopをインストール

    Docker公式サイトからDocker Desktopをダウンロードします。

    ダウンロードURLhttps://www.docker.com/

    1. 公式サイトにアクセス
    2. 「Download Docker Desktop」をクリック
    3. 自分のOS(Windows / Mac)を選択
    4. ダウンロードしたファイルを実行してインストール

    システム要件

    • Windows:Windows 10/11(64bit)、WSL 2対応
    • Mac:macOS 12以降(Intel / Apple Silicon対応)
    • メモリ:4GB以上推奨
    • ストレージ:約2GB必要

    インストール後、Docker Desktopを起動しておきます。

    Step 2:n8nイメージをダウンロード

    1. Docker Desktopを起動
    2. 左メニューの「Images」をクリック
    3. 検索窓に「n8n」と入力
    4. 「n8nio/n8n」を見つけて「Pull」をクリック

    ダウンロードには1〜2分かかります。

    Step 3:データ保存用フォルダを作成

    n8nのワークフローや設定を保存するフォルダを作成します。

    Windowsの場合


    C:Usersあなたのユーザー名Documentsn8n-data

    Macの場合


    /Users/あなたのユーザー名/Documents/n8n-data

    エクスプローラー(Windows)またはFinder(Mac)で上記フォルダを作成してください。

    Step 4:n8nコンテナを設定・起動

    1. Docker Desktopの「Images」タブを開く
    2. 「n8nio/n8n」の右にある「▶」(Run)ボタンをクリック
    3. 「Optional settings」をクリックして詳細設定を開く

    設定項目

    項目 入力内容
    Container name n8n
    Ports – Host port 5678
    Volumes – Host path Step 3で作成したフォルダのパス
    Volumes – Container path /home/node/.n8n

    Environment variables(環境変数)

    以下を追加すると便利です。

    Variable Value
    GENERIC_TIMEZONE Asia/Tokyo
    TZ Asia/Tokyo

    設定が完了したら「Run」をクリック。

    Step 5:n8nにアクセス

    コンテナが起動したら、ブラウザで以下のURLにアクセスします。


    http://localhost:5678

    Step 6:アカウントを作成

    初回アクセス時はアカウント作成画面が表示されます。

    1. メールアドレス(ローカル用なので任意でOK)
    2. 名前
    3. パスワード

    を入力して「Next」をクリック。

    これでn8nのセットアップ完了です!

    方法②:npxで即起動(Node.js)

    Node.jsがインストールされていれば、コマンド一発でn8nを起動できます。

    Step 1:Node.jsをインストール

    Node.js公式サイトからインストーラーをダウンロードします。

    ダウンロードURLhttps://nodejs.org/

    重要:n8nはNode.js v20.19〜v24.xが必要です。最新版(v25以降)では動作しない場合があるため、LTS版(v20またはv22)を選択してください。

    Step 2:n8nを起動

    ターミナル(Mac)またはコマンドプロンプト(Windows)を開いて、以下を実行します。


    npx n8n

    初回実行時は「y」を入力してEnterを押すと、必要なファイルがダウンロードされます。

    Step 3:ブラウザでアクセス

    起動が完了したら、ブラウザで以下にアクセスします。


    http://localhost:5678

    注意点

    • ターミナルを閉じるとn8nも停止します
    • 次回も同じコマンドで起動できます
    • データは ~/.n8n フォルダに保存されます

    PC起動時に自動でn8nを起動する設定

    Docker Desktopを使う場合、PC起動時にn8nを自動起動できます。

    Docker Desktopの自動起動設定

    1. Docker Desktop右上の歯車(Settings)をクリック
    2. 「General」タブを開く
    3. 「Start Docker Desktop when you sign in to your computer」にチェック
    4. 「Apply」をクリック

    n8nコンテナの自動起動設定

    コンテナ作成時に「restart」ポリシーを設定するか、Docker Desktopの「Containers」タブで対象コンテナの設定を変更します。

    これでPC起動時に自動でn8nが立ち上がります。

    データの永続化について

    ローカルインストールで重要なのが、データの永続化です。

    Docker Desktopの場合

    Step 4で設定したVolumes(ボリューム)により、以下のデータがPC内に保存されます。

    • ワークフロー
    • 認証情報(Credentials)
    • 実行履歴
    • 設定

    コンテナを削除しても、Volumesに指定したフォルダのデータは残ります。

    npxの場合

    データは以下のフォルダに保存されます。

    • Windows:C:Usersユーザー名.n8n
    • Mac:/Users/ユーザー名/.n8n

    このフォルダをバックアップしておけば、データを保護できます。

    よく使う操作

    n8nの停止

    Docker Desktopの場合

    1. 「Containers」タブを開く
    2. n8nコンテナの「□」(Stop)ボタンをクリック

    npxの場合

    ターミナルで「Ctrl + C」を押す

    n8nの再起動

    Docker Desktopの場合

    1. 「Containers」タブを開く
    2. n8nコンテナの「▶」(Start)ボタンをクリック

    npxの場合

    再度 npx n8n を実行

    n8nのアップデート

    Docker Desktopの場合

    1. 「Images」タブを開く
    2. n8nio/n8nを右クリック → 「Pull」
    3. コンテナを停止 → 削除 → 再作成

    npxの場合


    npx n8n@latest

    トラブルシューティング

    よくある問題と解決方法

    問題 原因 解決方法
    localhost:5678にアクセスできない コンテナが起動していない Docker Desktopでコンテナを起動
    ポート5678が使用中 他のアプリがポートを使用 ポート番号を変更(例:5679)
    npx n8nでエラー Node.jsバージョン不一致 v20〜v24のLTS版を使用
    データが消えた Volumeが設定されていない Host pathを正しく設定
    動作が重い メモリ不足 Docker Desktopのメモリ割り当てを増やす

    Docker Desktopのメモリ設定

    1. Docker Desktop → Settings → Resources
    2. Memoryのスライダーを4GB以上に設定
    3. 「Apply & Restart」をクリック

    ローカル版の制限事項

    ローカルインストールには以下の制限があります。

    機能 ローカル版での対応
    24時間稼働 PCの電源が必要
    外部からのWebhook受信 ngrokなど追加設定が必要
    チームでの共有 同一PC内のみ
    公式サポート コミュニティのみ

    本格的な運用が必要になったら、VPSでのセルフホストやn8n Cloudへの移行を検討してください。

    次のステップ

    n8nのインストールが完了したら、以下のステップに進みましょう。

    1. 最初のワークフローを作成

    1. 「+ Add Workflow」をクリック
    2. 「Manual Trigger」ノードを追加
    3. 「Edit Fields」ノードを追加
    4. 「Test Workflow」で実行

    2. テンプレートを試す

    n8nにはすぐに使えるテンプレートが用意されています。

    1. 左メニューの「Templates」をクリック
    2. 興味のあるテンプレートを選択
    3. 「Use this template」で自分のワークフローに追加

    3. 外部サービスと連携

    1. Google、Slack、Notionなどの認証情報を設定
    2. 実際の業務で使えるワークフローを作成

    よくある質問(FAQ)

    Q. Docker Desktopとnpxはどちらがおすすめ?

    A. 初心者にはDocker Desktopをおすすめします。GUIで操作でき、データの永続化も簡単です。npxはNode.jsに慣れている方や、とにかく素早く試したい方向けです。

    Q. ローカルで作成したワークフローはクラウド版に移行できる?

    A. はい、ワークフローはJSONでエクスポート/インポートできるため、クラウド版やVPSへの移行も簡単です。

    Q. 無料で使い続けられる?

    A. はい、ローカルインストールは完全無料です。ワークフロー数や実行回数に制限はありません。

    Q. PCを閉じるとワークフローは止まる?

    A. はい、ローカル版はPCの電源が入っている間のみ動作します。常時稼働が必要な場合はVPSでのセルフホストを検討してください。

    Q. MacとWindowsで違いはある?

    A. 基本的な操作は同じです。フォルダパスの書式が異なるだけです。Docker DesktopもNode.jsも両OSに対応しています。

    まとめ

    この記事では、n8nのローカルインストール方法を解説しました。

    インストール方法

    • Docker Desktop(推奨):GUIで簡単、データ永続化も楽
    • npx:コマンド一発で起動、手軽に試せる

    ローカル版のメリット

    • 完全無料
    • ワークフロー数・実行回数が無制限
    • データは自分のPC内に保存
    • 5〜10分でセットアップ完了

    次のステップ

    • 最初のワークフローを作成
    • テンプレートを活用
    • 本格運用ならVPSへ移行

    まずはローカルでn8nを試して、ワークフロー自動化の世界を体験してみてください!

  • n8n Dockerインストール完全ガイド|docker-composeで本番環境を構築する手順

    n8n Dockerインストール完全ガイド|docker-composeで本番環境を構築する手順

    n8nをDockerでセルフホストすれば、実行回数無制限で月額コストを大幅に削減できます。この記事では、ローカル開発環境から本番環境まで、Docker/Docker Composeを使ったn8nのインストール手順を解説します。

    前提条件

    必要な環境

    • Docker Engine 20.10以上
    • Docker Compose v2以上
    • メモリ:最低2GB(推奨4GB以上)
    • ストレージ:10GB以上の空き容量

    Dockerのインストール確認

    以下のコマンドでDockerがインストールされているか確認します。

    
    docker –version
    docker compose version
    

    バージョン情報が表示されればOKです。未インストールの場合は、Docker公式サイトからDocker Desktopをインストールしてください。

    方法1:docker runで手軽に起動(ローカル開発向け)

    最もシンプルな方法です。ローカルでn8nを試したい場合に最適です。

    基本の起動コマンド

    
    docker run -it –rm 
      –name n8n 
      -p 5678:5678 
      -v n8n_data:/home/node/.n8n 
      n8nio/n8n
    

    起動後、ブラウザで http://localhost:5678 にアクセスするとn8nの画面が表示されます。

    コマンドの解説

    オプション 説明
    -it 対話モード(ログをターミナルに表示)
    –rm コンテナ停止時に自動削除
    –name n8n コンテナ名を指定
    -p 5678:5678 ポートマッピング
    -v n8n_data:/home/node/.n8n データ永続化(名前付きボリューム)

    バックグラウンドで起動

    ターミナルを閉じてもn8nを動かし続けたい場合は、-dオプションを使用します。

    
    docker run -d 
      –name n8n 
      -p 5678:5678 
      -v n8n_data:/home/node/.n8n 
      –restart unless-stopped 
      n8nio/n8n
    

    –restart unless-stopped により、PCを再起動してもn8nが自動起動します。

    方法2:Docker Compose(推奨)

    設定をファイルで管理できるDocker Composeを使う方法です。環境変数やデータベース連携が簡単に設定でき、本番運用にも対応できます。

    ディレクトリ構成

    
    n8n/
    ├── docker-compose.yml
    ├── .env
    └── n8n_data/          # データ永続化用(自動作成)
    

    基本のdocker-compose.yml

    まずはシンプルな構成から始めましょう。

    
    services:
      n8n:
        image: n8nio/n8n
        container_name: n8n
        ports:
          - “5678:5678″
        environment:
          - GENERIC_TIMEZONE=Asia/Tokyo
          - TZ=Asia/Tokyo
        volumes:
          - n8n_data:/home/node/.n8n
        restart: unless-stopped
    
    volumes:
      n8n_data:
    

    .envファイル

    環境変数は.envファイルで管理すると便利です。

    
    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo
    TZ=Asia/Tokyo
    

    起動コマンド

    
    # 起動
    docker compose up -d
    
    # ログ確認
    docker compose logs -f n8n
    
    # 停止
    docker compose down
    
    # 停止(ボリューム削除も含む)
    docker compose down -v
    

    方法3:PostgreSQL連携(本番環境向け)

    本番環境では、デフォルトのSQLiteではなくPostgreSQLを使用することを推奨します。データの信頼性とパフォーマンスが向上します。

    docker-compose.yml(PostgreSQL版)

    
    services:
      n8n:
        image: n8nio/n8n
        container_name: n8n
        ports:
          - “5678:5678″
        environment:
          - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
          - TZ=${TZ}
          - 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_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
        volumes:
          - n8n_data:/home/node/.n8n
        depends_on:
          postgres:
            condition: service_healthy
        restart: unless-stopped
    
      postgres:
        image: postgres:15
        container_name: n8n-postgres
        environment:
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
          - POSTGRES_DB=${POSTGRES_DB}
        volumes:
          - postgres_data:/var/lib/postgresql/data
        healthcheck:
          test: [“CMD-SHELL”, “pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}”]
          interval: 5s
          timeout: 5s
          retries: 10
        restart: unless-stopped
    
    volumes:
      n8n_data:
      postgres_data:
    

    .env(PostgreSQL版)

    
    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo
    TZ=Asia/Tokyo
    
    # PostgreSQL設定
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_secure_password_here
    POSTGRES_DB=n8n
    
    # n8n暗号化キー(認証情報の暗号化に使用)
    # 以下のコマンドで生成: openssl rand -hex 32
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here
    

    暗号化キーの生成

    N8N_ENCRYPTION_KEYは認証情報の暗号化に使用される重要なキーです。以下のコマンドで生成してください。

    
    openssl rand -hex 32
    

    重要:このキーは変更するとすべての認証情報が復号できなくなります。必ずバックアップしてください。

    方法4:HTTPS対応(外部公開向け)

    n8nを外部に公開する場合は、HTTPSが必要です。TraefikまたはCaddyをリバースプロキシとして使用します。

    docker-compose.yml(Traefik版)

    
    services:
      traefik:
        image: traefik:v2.10
        container_name: traefik
        command:
          - “–api.insecure=false”
          - “–providers.docker=true”
          - “–providers.docker.exposedbydefault=false”
          - “–entrypoints.web.address=:80″
          - “–entrypoints.websecure.address=:443″
          - “–certificatesresolvers.letsencrypt.acme.tlschallenge=true”
          - “–certificatesresolvers.letsencrypt.acme.email=${SSL_EMAIL}”
          - “–certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json”
          - “–entrypoints.web.http.redirections.entrypoint.to=websecure”
        ports:
          - “80:80″
          - “443:443″
        volumes:
          - traefik_data:/letsencrypt
          - /var/run/docker.sock:/var/run/docker.sock:ro
        restart: unless-stopped
    
      n8n:
        image: n8nio/n8n
        container_name: n8n
        environment:
          - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
          - N8N_HOST=${N8N_HOST}
          - N8N_PORT=5678
          - N8N_PROTOCOL=https
          - WEBHOOK_URL=<a href="https://${N8N_HOST}/" target="_blank" rel="noopener">https://${N8N_HOST}/</a>
          - 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_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
        volumes:
          - n8n_data:/home/node/.n8n
        labels:
          - “traefik.enable=true”
          - “traefik.http.routers.n8n.rule=Host(<code>${N8N_HOST}</code>)”
          - “traefik.http.routers.n8n.entrypoints=websecure”
          - “traefik.http.routers.n8n.tls.certresolver=letsencrypt”
          - “traefik.http.services.n8n.loadbalancer.server.port=5678″
        depends_on:
          postgres:
            condition: service_healthy
        restart: unless-stopped
    
      postgres:
        image: postgres:15
        container_name: n8n-postgres
        environment:
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
          - POSTGRES_DB=${POSTGRES_DB}
        volumes:
          - postgres_data:/var/lib/postgresql/data
        healthcheck:
          test: [“CMD-SHELL”, “pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}”]
          interval: 5s
          timeout: 5s
          retries: 10
        restart: unless-stopped
    
    volumes:
      n8n_data:
      postgres_data:
      traefik_data:
    

    .env(HTTPS版)

    
    # ドメイン設定
    N8N_HOST=n8n.example.com
    SSL_EMAIL=admin@example.com
    
    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo
    TZ=Asia/Tokyo
    
    # PostgreSQL設定
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_secure_password_here
    POSTGRES_DB=n8n
    
    # n8n暗号化キー
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here
    

    初期設定

    オーナーアカウントの作成

    n8nに初めてアクセスすると、オーナーアカウントの作成画面が表示されます。

    1. メールアドレスを入力
    2. 名前を入力
    3. パスワードを設定
    4. 「Next」または「Set up」をクリック

    このアカウントがn8nの管理者アカウントになります。

    タイムゾーンの確認

    設定画面でタイムゾーンが「Asia/Tokyo」になっていることを確認してください。スケジュール実行の時刻に影響します。

    n8nのアップデート

    Docker Composeの場合

    
    # 最新イメージを取得
    docker compose pull
    
    # コンテナを再作成(データは保持)
    docker compose up -d
    

    特定バージョンを指定

    docker-compose.ymlのimageを変更してバージョンを固定できます。

    
    services:
      n8n:
        image: n8nio/n8n:1.70.0  # バージョン指定
    

    バージョン確認

    n8nの画面左下に現在のバージョンが表示されます。また、以下のコマンドでも確認できます。

    
    docker exec n8n n8n –version
    

    バックアップと復元

    データのバックアップ

    PostgreSQL使用時

    
    # データベースのバックアップ
    docker exec n8n-postgres pg_dump -U n8n n8n > backup_$(date +%Y%m%d).sql
    

    SQLite使用時(デフォルト)

    
    # ボリュームのバックアップ
    docker run –rm -v n8n_data:/data -v $(pwd):/backup alpine tar cvf /backup/n8n_backup.tar /data
    

    ワークフローのエクスポート

    n8nのUI上からもワークフローをJSONファイルとしてエクスポートできます。

    1. ワークフロー一覧画面を開く
    2. エクスポートしたいワークフローを選択
    3. 「…」メニューから「Download」を選択

    トラブルシューティング

    コンテナが起動しない

    
    # ログを確認
    docker compose logs n8n
    
    # コンテナの状態を確認
    docker compose ps
    

    ポートが使用中

    5678ポートが他のアプリケーションで使用されている場合は、docker-compose.ymlのポートマッピングを変更します。

    
    ports:
      - “15678:5678″  # ホスト側を15678に変更
    

    パーミッションエラー

    n8nはUID 1000で動作します。ボリュームマウント時に権限エラーが出る場合は、以下を実行します。

    
    sudo chown -R 1000:1000 ./n8n_data
    

    PostgreSQLに接続できない

    • depends_onでpostgresの起動を待っているか確認
    • healthcheckが正常に動作しているか確認
    • .envファイルの認証情報が正しいか確認
    
    # PostgreSQLの状態確認
    docker compose exec postgres pg_isready -U n8n
    

    主要な環境変数

    環境変数 説明 デフォルト値
    GENERIC_TIMEZONE タイムゾーン UTC
    N8N_HOST ホスト名 localhost
    N8N_PORT ポート番号 5678
    N8N_PROTOCOL プロトコル(http/https) http
    WEBHOOK_URL Webhook用のベースURL
    N8N_ENCRYPTION_KEY 認証情報の暗号化キー
    DB_TYPE データベースタイプ sqlite
    NODE_FUNCTION_ALLOW_EXTERNAL Functionノードで許可する外部パッケージ
    EXECUTIONS_DATA_PRUNE 実行履歴の自動削除 true
    EXECUTIONS_DATA_MAX_AGE 実行履歴の保持期間(時間) 336

    セキュリティのベストプラクティス

    • N8N_ENCRYPTION_KEYを必ず設定:認証情報を暗号化
    • PostgreSQLを外部に公開しない:Dockerネットワーク内のみでアクセス
    • HTTPSを使用:外部公開時は必須
    • 強力なパスワード:オーナーアカウントとDB認証
    • 定期的なバックアップ:データとワークフローを保護
    • 最新バージョンを維持:セキュリティパッチの適用

    まとめ

    n8nをDockerでインストールする方法を解説しました。

    方法 用途 難易度
    docker run お試し・ローカル開発 簡単
    Docker Compose(基本) ローカル開発・小規模運用 簡単
    Docker Compose + PostgreSQL 本番環境 中程度
    Docker Compose + PostgreSQL + HTTPS 外部公開・本番環境 やや複雑

    ローカルで試すなら「docker run」、本番運用なら「PostgreSQL + HTTPS」構成がおすすめです。

    n8nの基本的な使い方は、セルフホストの詳細についてはも参考にしてください。

  • n8nセルフホスト構築ガイド|Docker Composeで本番環境を構築する方法

    n8nセルフホスト構築ガイド|Docker Composeで本番環境を構築する方法

    n8nのセルフホストは、Cloud版と比べてコストを大幅に抑えながら、実行回数無制限・完全なデータ管理を実現できる運用方法です。この記事では、Docker Composeを使ったセルフホスト環境の構築から、本番運用に必要なHTTPS化、バックアップ、アップデートまでを解説します。

    セルフホストとCloud版の比較

    n8nには大きく3つの利用形態があります。

    項目 Cloud版 セルフホスト(VPS) ローカル(Docker Desktop)
    月額コスト €20〜50 ¥700〜2,000(サーバー代) 無料
    実行回数 2,500〜10,000/月 無制限 無制限
    外部連携(Webhook) △(トンネル必要)
    24時間稼働 ×(PC起動時のみ)
    運用・保守 不要 自己責任 自己責任
    データ管理 n8n社 自社管理 自社管理

    セルフホストが向いているケース

    • ワークフローの実行回数が多く、Cloud版の上限を超える
    • 機密データを外部サービスに預けたくない
    • 月額コストを最小限に抑えたい
    • サーバー運用の知識がある(または学ぶ意欲がある)

    セルフホストの選択肢

    セルフホストの構築先として、主に以下の選択肢があります。

    サービス 月額目安 特徴
    Hostinger VPS ¥780〜1,200 1クリックでn8nインストール可能、初心者向け
    XServer VPS ¥830〜1,150 国内サーバー、日本語サポート充実
    シン・VPS ¥620〜900 国内最安クラス
    DigitalOcean $6〜12 1クリックでn8nインストール可能、海外サーバー
    Railway $5〜(従量課金) PaaS型、使用量に応じて課金
    GCP Compute Engine 無料枠あり e2-micro無料枠で運用可能

    この記事では、汎用的なVPS環境を想定し、Docker Composeを使った構築方法を解説します。

    前提条件

    • VPS(Ubuntu 22.04/24.04 推奨、メモリ2GB以上)
    • SSH接続環境
    • 独自ドメイン(HTTPS化する場合)
    • 基本的なLinuxコマンドの知識

    ステップ1:Dockerのインストール

    まずVPSにSSH接続し、Dockerをインストールします。

    1-1. システムの更新

    
    sudo apt update && sudo apt upgrade -y
    

    1-2. Dockerのインストール

    公式のインストールスクリプトを使用します。

    
    curl -fsSL <a href="https://get.docker.com" target="_blank" rel="noopener">https://get.docker.com</a> | sh
    

    1-3. 現在のユーザーをdockerグループに追加

    
    sudo usermod -aG docker $USER
    

    一度ログアウトして再ログインするか、以下を実行します。

    
    newgrp docker
    

    1-4. インストール確認

    
    docker –version
    docker compose version
    

    バージョン情報が表示されれば成功です。

    ステップ2:n8n用のディレクトリとファイルを作成

    2-1. 作業ディレクトリの作成

    
    mkdir -p ~/n8n
    cd ~/n8n
    

    2-2. docker-compose.ymlの作成

    本番運用を想定し、PostgreSQLをデータベースとして使用する構成です。

    
    nano docker-compose.yml
    

    以下の内容を貼り付けます。

    
    version: ‘3.8’
    
    services:
      postgres:
        image: postgres:16
        restart: always
        environment:
          POSTGRES_USER: ${POSTGRES_USER}
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
          POSTGRES_DB: ${POSTGRES_DB}
        volumes:
          - postgres_data:/var/lib/postgresql/data
        healthcheck:
          test: [“CMD-SHELL”, “pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}”]
          interval: 10s
          timeout: 5s
          retries: 5
    
      n8n:
        image: n8nio/n8n:latest
        restart: always
        ports:
          - “5678:5678″
        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=${N8N_PROTOCOL}
          - WEBHOOK_URL=${WEBHOOK_URL}
          - GENERIC_TIMEZONE=Asia/Tokyo
          - TZ=Asia/Tokyo
        volumes:
          - n8n_data:/home/node/.n8n
        depends_on:
          postgres:
            condition: service_healthy
    
    volumes:
      postgres_data:
      n8n_data:
    

    Ctrl + XYEnter で保存します。

    2-3. 環境変数ファイルの作成

    
    nano .env
    

    以下の内容を記述します。パスワードは必ず変更してください。

    
    # PostgreSQL設定
    POSTGRES_USER=n8n_user
    POSTGRES_PASSWORD=your_secure_password_here
    POSTGRES_DB=n8n
    
    # n8n設定
    N8N_HOST=localhost
    N8N_PROTOCOL=http
    WEBHOOK_URL=<a href="http://localhost:5678/" target="_blank" rel="noopener">http://localhost:5678/</a>
    

    パスワードの生成例

    
    openssl rand -base64 24
    

    ステップ3:n8nの起動と初期設定

    3-1. コンテナの起動

    
    docker compose up -d
    

    初回はイメージのダウンロードに数分かかります。

    3-2. 起動確認

    
    docker compose ps
    

    両方のコンテナが「running」になっていれば成功です。

    
    docker compose logs -f n8n
    

    ログを確認し、エラーがないことを確認します(Ctrl + Cで終了)。

    3-3. ブラウザでアクセス

    http://サーバーのIPアドレス:5678

    にアクセスします。初回はオーナーアカウントの作成画面が表示されます。

    1. メールアドレス、パスワード、名前を入力
    2. 「Next」をクリック
    3. アンケートに回答(スキップ可)
    4. ライセンス登録画面でメールアドレスを入力し、無料ライセンスキーを取得

    ステップ4:HTTPS化(本番運用向け)

    本番環境ではHTTPS化が必須です。ここではCaddyをリバースプロキシとして使用する方法を紹介します。

    4-1. ドメインのDNS設定

    お使いのドメインのDNS設定で、AレコードをVPSのIPアドレスに向けます。

    例:n8n.example.com203.0.113.1

    4-2. docker-compose.ymlの修正

    Caddyを追加した構成に変更します。

    
    version: ‘3.8’
    
    services:
      caddy:
        image: caddy:2
        restart: always
        ports:
          - “80:80″
          - “443:443″
        volumes:
          - ./Caddyfile:/etc/caddy/Caddyfile
          - caddy_data:/data
          - caddy_config:/config
        depends_on:
          - n8n
    
      postgres:
        image: postgres:16
        restart: always
        environment:
          POSTGRES_USER: ${POSTGRES_USER}
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
          POSTGRES_DB: ${POSTGRES_DB}
        volumes:
          - postgres_data:/var/lib/postgresql/data
        healthcheck:
          test: [“CMD-SHELL”, “pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}”]
          interval: 10s
          timeout: 5s
          retries: 5
    
      n8n:
        image: n8nio/n8n:latest
        restart: always
        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
          - WEBHOOK_URL=<a href="https://${N8N_HOST}/" target="_blank" rel="noopener">https://${N8N_HOST}/</a>
          - GENERIC_TIMEZONE=Asia/Tokyo
          - TZ=Asia/Tokyo
        volumes:
          - n8n_data:/home/node/.n8n
        depends_on:
          postgres:
            condition: service_healthy
    
    volumes:
      postgres_data:
      n8n_data:
      caddy_data:
      caddy_config:
    

    n8nのportsを削除し、Caddyからのみアクセスさせる構成にしています。

    4-3. Caddyfileの作成

    
    nano Caddyfile
    
    
    n8n.example.com {
        reverse_proxy n8n:5678
    }
    

    n8n.example.comを実際のドメインに置き換えてください。CaddyはLet’s Encryptから自動でSSL証明書を取得します。

    4-4. .envファイルの更新

    
    # PostgreSQL設定
    POSTGRES_USER=n8n_user
    POSTGRES_PASSWORD=your_secure_password_here
    POSTGRES_DB=n8n
    
    # n8n設定
    N8N_HOST=n8n.example.com
    

    4-5. 再起動

    
    docker compose down
    docker compose up -d
    

    https://n8n.example.comでアクセスできれば完了です。

    ステップ5:運用・保守

    n8nのアップデート

    n8nは頻繁にアップデートされます。以下のコマンドで最新版に更新できます。

    
    cd ~/n8n
    docker compose pull
    docker compose up -d
    

    現在のバージョン確認:

    
    docker exec -it n8n-n8n-1 n8n -v
    

    バックアップ

    定期的なバックアップを推奨します。

    データベースのバックアップ

    
    docker exec n8n-postgres-1 pg_dump -U n8n_user n8n > backup_$(date +%Y%m%d).sql
    

    ボリュームごとバックアップ

    
    docker compose down
    sudo tar -czvf n8n_backup_$(date +%Y%m%d).tar.gz 
      /var/lib/docker/volumes/n8n_postgres_data 
      /var/lib/docker/volumes/n8n_n8n_data
    docker compose up -d
    

    ログの確認

    
    # n8nのログ
    docker compose logs -f n8n
    
    # PostgreSQLのログ
    docker compose logs -f postgres
    
    # 直近100行
    docker compose logs –tail=100 n8n
    

    コンテナの再起動

    
    docker compose restart
    

    トラブルシューティング

    コンテナが起動しない

    
    docker compose logs
    

    でエラー内容を確認します。よくある原因:

    • ポート5678が他のプロセスで使用中
    • .envファイルの記述ミス
    • PostgreSQLの接続エラー

    Webhookが動作しない

    • WEBHOOK_URLが正しく設定されているか確認
    • ファイアウォールでポート80/443が開いているか確認
    • ドメインのDNS設定が正しいか確認

    セキュアクッキーのエラー

    HTTPでアクセスしている場合に発生します。本番環境ではHTTPS化してください。ローカルテスト時は以下の環境変数を追加することで回避できます(非推奨)。

    
    environment:
      - N8N_SECURE_COOKIE=false
    

    メモリ不足

    VPSのメモリが1GB未満の場合、n8nの動作が不安定になることがあります。スワップファイルを追加するか、メモリを増設してください。

    
    # スワップファイルの追加(2GB)
    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    echo ‘/swapfile none swap sw 0 0’ | sudo tee -a /etc/fstab
    

    ライセンスについて

    n8nは「Sustainable Use License」を採用しています。

    • 無料で利用可能:社内業務、非商用、個人利用
    • 商用利用可能:自社の業務自動化に使用する場合
    • 有料ライセンス必要:n8nをホスティングサービスとして第三者に提供する場合、ホワイトラベル提供する場合

    自社の業務自動化目的であれば、セルフホストは完全無料で利用できます。

    よくある質問

    Q. Cloud版からセルフホストに移行できますか?

    A. はい、可能です。Cloud版のn8nからワークフローをエクスポート(JSON形式)し、セルフホスト環境にインポートできます。ただし、認証情報(Credentials)は再設定が必要です。

    Q. 複数人で使えますか?

    A. はい、セルフホスト版でも複数ユーザーを作成できます。ユーザー管理機能は無料で利用可能です。

    Q. PostgreSQLの代わりにSQLiteでも動きますか?

    A. はい、環境変数でDB_TYPE=sqliteを指定すれば動作します。ただし、本番環境ではPostgreSQLを推奨します。SQLiteはパフォーマンスや同時接続数に制限があります。

    Q. どのくらいのスペックが必要ですか?

    A. 最低要件としてCPU 1コア、メモリ1GBで動作しますが、安定運用には2コア、2GB以上を推奨します。ワークフローの複雑さや実行頻度に応じてスケールアップを検討してください。

    Q. 自動バックアップは設定できますか?

    A. cronを使って定期バックアップを設定できます。以下は毎日午前3時にバックアップを実行する例です。

    
    crontab -e
    # 以下を追加
    0 3 * * * cd ~/n8n && docker exec n8n-postgres-1 pg_dump -U n8n_user n8n > ~/backups/n8n_$(date +%Y%m%d).sql
    

    まとめ

    n8nのセルフホストは、初期設定の手間はかかりますが、一度構築すれば低コストで実行回数無制限の自動化環境を手に入れられます。

    この記事で解説した内容

    • Docker Composeを使ったn8n環境の構築
    • PostgreSQLをデータベースとして使用する本番構成
    • CaddyによるHTTPS化
    • アップデート、バックアップなどの運用方法

    まずはCloud版の14日間無料トライアルでn8nの使い方を学び、本格運用の段階でセルフホストに移行するのがおすすめの流れです。

    n8nの基本的な使い方については、料金プランの詳細はも参考にしてください。

  • 【初心者向け】n8nローカルインストール完全ガイド|Dockerで5分で始める方法

    【初心者向け】n8nローカルインストール完全ガイド|Dockerで5分で始める方法

    n8nをローカルPCにインストールすれば、無料でワークフロー自動化を試せます。クラウド版の月額費用を気にせず、じっくり学習したい方に最適です。

    この記事では、Docker Desktopを使った最も簡単なインストール方法を解説します。コマンド操作が苦手な方でも、画面の指示に従って進めるだけで、5分程度でn8nを起動できます。

    n8nローカル版とは?クラウド版との違い

    n8nには「クラウド版」「セルフホスト版(VPS)」「ローカル版」の3つの導入方法があります。それぞれの特徴を確認しましょう。

    項目 クラウド版 セルフホスト版(VPS) ローカル版
    月額費用 €20〜(約3,000円〜) VPS代(500〜1,500円) 無料
    常時稼働 ×(PC起動中のみ)
    Webhook受信 △(ngrok等が必要)
    セットアップ難易度 簡単 やや難しい 簡単
    推奨用途 本番運用 本番運用 学習・テスト

    ローカル版の最大のメリットは費用が0円であることです。ワークフロー数や実行回数の制限もないため、n8nの機能を存分に試せます。

    ただし、PCをシャットダウンするとn8nも停止するため、常時稼働が必要な本番運用には向きません。まずはローカル版で基本を学び、本格運用時にVPSやクラウド版へ移行するのが一般的な流れです。

    インストールに必要な環境

    n8nをDockerでローカル実行するには、以下の環境が必要です。

    対応OS

    • Windows 10 Pro/Enterprise(ビルド19041以上)またはWindows 11
    • macOS 10.15 Catalina以降
    • Linux(Ubuntu 20.04以降推奨)

    Windows 10 Homeでも、WSL2(Windows Subsystem for Linux 2)を有効化すれば利用できます。

    推奨スペック

    項目 最低要件 推奨スペック
    メモリ 4GB 8GB以上
    ストレージ 10GB以上の空き 20GB以上
    CPU デュアルコア 4コア以上

    一般的なビジネス用PCであれば問題なく動作します。

    Step 1:Docker Desktopのインストール

    まず、Dockerをインストールします。Dockerは「仮想的なアプリ環境を作るツール」です。n8nを直接PCにインストールせず、安全に動作させることができます。

    Dockerのダウンロード

    Docker公式サイト(https://www.docker.com/products/docker-desktop/)にアクセスし、お使いのOSに合ったDocker Desktopをダウンロードします。

    Windowsの場合は、AMDまたはARM64のどちらかを選択します。一般的なPCはAMD64(x64)を選んでください。ARM64は一部のSurface ProやARM搭載ノートPC向けです。

    インストール手順

    ダウンロードしたインストーラーを実行し、画面の指示に従って進めます。

    Windowsの場合、インストール中に「Use WSL 2 instead of Hyper-V」というオプションが表示されたら、チェックを入れたままにしてください。Windows 10 Homeユーザーは、この設定が必須です。

    インストールが完了したら、PCを再起動します。再起動後、Docker Desktopが自動的に起動します。

    Docker Desktopの起動確認

    Docker Desktopを起動すると、タスクバー(Windowsの場合)またはメニューバー(macOSの場合)にクジラのアイコンが表示されます。

    初回起動時にサービス規約への同意を求められる場合があります。内容を確認して同意してください。

    Windowsユーザーで「WSL 2 installation is incomplete」というエラーが表示された場合は、表示される指示に従ってWSL2をアップデートしてください。

    Step 2:n8nのインストール(Docker Desktop GUI版)

    Docker Desktopを使った最も簡単なインストール方法を紹介します。コマンドを入力する必要はありません。

    Volumeの作成(データ永続化)

    最初に、ワークフローやデータを保存するための場所(Volume)を作成します。この設定をしないと、n8nを再起動したときにデータが消えてしまいます。

    Docker Desktopを開き、左側のメニューから「Volumes」を選択します。右上の「Create」ボタンをクリックし、Volume名に「n8n_data」と入力して作成します。

    n8nイメージのダウンロード

    左側のメニューから「Images」を選択します。上部の検索バーに「n8n」と入力し、表示される「n8nio/n8n」の右側にある「Pull」ボタンをクリックします。

    ダウンロードには数分かかる場合があります。完了すると、Imagesの一覧に「n8nio/n8n」が表示されます。

    コンテナの起動

    ダウンロードしたイメージの右側にある「Run」ボタン(再生アイコン)をクリックします。設定画面が表示されるので、「Optional settings」を展開して以下の項目を入力します。

    項目 設定値
    Container name n8n
    Host port 5678
    Volume (Host path) n8n_data
    Volume (Container path) /home/node/.n8n

    環境変数(Environment variables)として、以下を追加するとタイムゾーンが日本時間になります。

    Variable Value
    GENERIC_TIMEZONE Asia/Tokyo
    TZ Asia/Tokyo

    設定が完了したら「Run」ボタンをクリックします。

    Step 3:n8nにアクセス

    コンテナが起動したら、ブラウザを開いて以下のURLにアクセスします。

    
    <a href="http://localhost:5678" target="_blank" rel="noopener">http://localhost:5678</a>
    

    n8nのセットアップ画面が表示されます。

    アカウントの作成

    初回アクセス時に、オーナーアカウントの作成を求められます。以下の情報を入力してください。

    • 名前
    • メールアドレス
    • パスワード

    このアカウント情報はローカルに保存されるため、外部に送信されることはありません。ただし、パスワードは忘れないように控えておいてください。

    「Next」をクリックして進むと、n8nのダッシュボードが表示されます。これでインストールは完了です。

    Step 4(任意):コマンドラインでのインストール

    より細かい設定をしたい方や、GUI操作が苦手な方向けに、コマンドラインでのインストール方法も紹介します。

    Volumeの作成

    ターミナル(Windows: PowerShell、mac: ターミナル)を開き、以下のコマンドを実行します。

    
    docker volume create n8n_data
    

    n8nの起動

    以下のコマンドでn8nを起動します。

    
    docker run -d 
      –name n8n 
      -p 5678:5678 
      -e GENERIC_TIMEZONE=”Asia/Tokyo” 
      -e TZ=”Asia/Tokyo” 
      -v n8n_data:/home/node/.n8n 
      –restart unless-stopped 
      n8nio/n8n
    

    Windowsの場合は、バックスラッシュ()を使わず1行で入力するか、PowerShellでバッククォート(`)に置き換えてください。

    
    docker run -d –name n8n -p 5678:5678 -e GENERIC_TIMEZONE=”Asia/Tokyo” -e TZ=”Asia/Tokyo” -v n8n_data:/home/node/.n8n –restart unless-stopped n8nio/n8n
    

    各オプションの説明

    オプション 説明
    -d バックグラウンドで実行
    –name n8n コンテナの名前を設定
    -p 5678:5678 ポート5678でアクセス可能にする
    -e 環境変数の設定
    -v データの永続化(ボリュームマウント)
    –restart unless-stopped PC再起動時に自動で起動

    n8nの基本操作

    インストールが完了したら、簡単なワークフローを作成してみましょう。

    最初のワークフロー作成

    ダッシュボードの「Create a new workflow」または「+」ボタンをクリックして、新しいワークフローを作成します。

    ワークフロー編集画面が開いたら、「+」ボタンをクリックしてノードを追加できます。検索ボックスに「Manual Trigger」と入力し、選択してください。

    Manual Triggerは手動でワークフローを実行するためのトリガーです。「Execute Workflow」ボタンをクリックすると、ワークフローが実行されます。

    AIエージェントのテスト

    n8nはAI機能も搭載しています。ホームページから「Test a simple AI Agent example」を選択すると、AIエージェントのデモワークフローを試せます。

    OpenAI APIキーがない場合は、Google Geminiに置き換えることも可能です。Geminiは無料でAPIキーを取得できるため、初心者にもおすすめです。

    n8nの停止・起動・アップデート

    日常的な操作方法を解説します。

    停止方法

    Docker Desktopの「Containers」タブから、n8nコンテナの右側にある停止ボタン(■)をクリックします。

    コマンドラインの場合は以下を実行します。

    
    docker stop n8n
    

    起動方法

    Docker Desktopで停止中のコンテナの右側にある再生ボタン(▶)をクリックします。

    コマンドラインの場合は以下を実行します。

    
    docker start n8n
    

    アップデート方法

    n8nは頻繁にアップデートされるため、定期的に最新版に更新することをおすすめします。

    Docker Desktopの場合は、「Images」タブで「n8nio/n8n」を右クリックし、「Pull」を選択して最新イメージをダウンロードします。その後、既存のコンテナを削除して、新しいコンテナを作成します。

    コマンドラインの場合は以下の手順で実行します。

    
    # 最新イメージをダウンロード
    docker pull n8nio/n8n
    
    # 既存コンテナを停止・削除
    docker stop n8n
    docker rm n8n
    
    # 新しいコンテナを起動(Step 4の起動コマンドを再実行)
    docker run -d –name n8n -p 5678:5678 -e GENERIC_TIMEZONE=”Asia/Tokyo” -e TZ=”Asia/Tokyo” -v n8n_data:/home/node/.n8n –restart unless-stopped n8nio/n8n
    

    Volumeにデータが保存されているため、コンテナを削除してもワークフローや設定は消えません。

    トラブルシューティング

    インストール時によくある問題と解決方法をまとめました。

    ポート5678が使用中のエラー

    「port is already in use」というエラーが表示された場合、すでに5678番ポートを使用しているアプリケーションがあります。

    別のポート番号(例:5679)を使用するか、該当のアプリケーションを停止してください。ポートを変更する場合は、起動時に「-p 5679:5678」と指定します。

    WSL 2のエラー(Windows)

    「WSL 2 installation is incomplete」や「WSL update is required」というエラーが表示された場合、PowerShellを管理者権限で開き、以下のコマンドを実行してください。

    
    wsl –update
    

    その後、PCを再起動してDocker Desktopを起動します。

    コンテナが起動しない

    Docker Desktopの「Containers」タブでn8nコンテナのログを確認します。コンテナ名をクリックすると、ログが表示されます。

    よくある原因として、メモリ不足があります。Docker Desktopの設定(歯車アイコン)から「Resources」を開き、割り当てメモリを増やしてください(4GB以上を推奨)。

    データが消えた

    Volumeを設定せずにコンテナを削除すると、データが失われます。必ずVolumeを作成し、「-v n8n_data:/home/node/.n8n」オプションを指定してください。

    ローカル版の制限事項と対処法

    ローカル版には本番運用と比較していくつかの制限があります。

    Webhookの制限

    ローカル環境では、外部サービスからのWebhookを受け取れません。「localhost」はインターネットからアクセスできないためです。

    この制限を回避するには、ngrokやCloudflare Tunnelなどのトンネリングサービスを使用します。これらのサービスは、一時的な公開URLを発行し、外部からのアクセスをローカル環境に転送します。

    常時稼働の制限

    PCをシャットダウンまたはスリープすると、n8nも停止します。定期実行のワークフローは、PCが起動中でないと動作しません。

    常時稼働が必要な場合は、VPSへのセルフホストまたはn8n Cloudの利用を検討してください。

    次のステップ

    ローカル版でn8nの基本を学んだら、以下のステップに進んでみてください。

    • n8nの公式テンプレートを試す:700以上のテンプレートからワークフローをインポートできます
    • 外部サービスと連携する:Gmail、Slack、Google Sheetsなど400以上のサービスと接続できます
    • AI機能を活用する:ChatGPT、Claude、Geminiなどと連携したワークフローを構築できます
    • 本番運用を検討する:VPSへのセルフホストやn8n Cloudへの移行を検討します

    よくある質問(FAQ)

    Q. ローカル版は完全に無料ですか?

    A. はい、ローカル版(Community版)は完全無料です。ワークフロー数や実行回数の制限もありません。ただし、商用サービスとして第三者に提供する場合は、ライセンスの確認が必要です。

    Q. Docker以外の方法でインストールできますか?

    A. はい、Node.jsとnpmを使ってインストールすることも可能です。ただし、n8nはNode.js v20.19〜v24.xを要求するため、バージョン管理が必要です。Dockerを使う方法が最も簡単で、公式でも推奨されています。

    Q. PCのスペックが低くても動きますか?

    A. メモリ4GB、デュアルコアCPUがあれば基本的なワークフローは動作します。ただし、複雑なワークフローや大量のデータ処理を行う場合は、より高いスペックが必要です。

    Q. ローカル版からVPSやクラウドに移行できますか?

    A. はい、ワークフローをエクスポートして、別の環境にインポートできます。ただし、認証情報(Credentials)は暗号化されているため、移行先で再設定が必要な場合があります。

    Q. セキュリティは大丈夫ですか?

    A. ローカル版はPCの中だけで動作するため、外部からのアクセスはありません。データはすべてPC内に保存されるため、プライバシーの観点では安全です。ただし、ngrokなどで公開する場合は、認証設定などのセキュリティ対策が必要です。

    まとめ

    この記事では、Docker Desktopを使ったn8nのローカルインストール方法を解説しました。

    インストールの流れは以下の通りです。

    1. Docker Desktopをインストール
    2. Volumeを作成(データ永続化)
    3. n8nイメージをPull
    4. コンテナを起動
    5. http://localhost:5678 にアクセス

    ローカル版は無料でn8nの全機能を試せるため、学習やテストに最適です。まずはシンプルなワークフローから始めて、徐々に複雑な自動化に挑戦してみてください。本格的な運用が必要になったら、VPSへのセルフホストやn8n Cloudへの移行を検討しましょう。

  • 【エンジニア向け】n8n Docker Compose設定完全ガイド|環境変数・PostgreSQL・Queue Mode・Traefik連携

    【エンジニア向け】n8n Docker Compose設定完全ガイド|環境変数・PostgreSQL・Queue Mode・Traefik連携

    n8nをDockerで運用するエンジニアにとって、Docker Composeの設定は最も重要な基盤です。

    環境変数の設定ミス、ボリュームの永続化忘れ、ネットワーク設定の誤りなど、多くのトラブルはdocker-compose.ymlの設定に起因します。

    この記事では、n8nのDocker Compose設定について、環境変数の完全リファレンス、本番向け構成パターン、Queue Mode設定、Traefik連携まで、エンジニアが知っておくべき技術を網羅的に解説します。

    基本構成:最小限のdocker-compose.yml

    まず、ローカル開発用の最小構成を確認します。

    最小構成(SQLite + HTTP)


    version: "3.8"

    services:
    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
    - "5678:5678"
    environment:
    - GENERIC_TIMEZONE=Asia/Tokyo
    - TZ=Asia/Tokyo
    volumes:
    - n8n_data:/home/node/.n8n

    volumes:
    n8n_data:

    この構成の特徴:

    • データベース:SQLite(デフォルト)
    • プロトコル:HTTP(ローカル開発向け)
    • ボリューム:Docker Named Volume

    起動コマンド


    # 起動
    docker compose up -d

    # ログ確認
    docker compose logs -f n8n

    # 停止
    docker compose down

    # ボリューム含めて削除
    docker compose down -v

    環境変数リファレンス

    n8nの挙動は環境変数で制御します。カテゴリ別に主要な環境変数を解説します。

    基本設定

    環境変数説明デフォルト
    N8N_HOSTn8nのホスト名localhostn8n.example.com
    N8N_PORTリッスンポート56785678
    N8N_PROTOCOLプロトコルhttphttps
    WEBHOOK_URLWebhook用外部URLhttps://n8n.example.com/
    N8N_EDITOR_BASE_URLエディタのベースURLhttps://n8n.example.com/
    GENERIC_TIMEZONEタイムゾーンAmerica/New_YorkAsia/Tokyo
    TZシステムタイムゾーンUTCAsia/Tokyo

    認証・セキュリティ

    環境変数説明デフォルト
    N8N_BASIC_AUTH_ACTIVEBasic認証の有効化false
    N8N_BASIC_AUTH_USERBasic認証ユーザー名
    N8N_BASIC_AUTH_PASSWORDBasic認証パスワード
    N8N_ENCRYPTION_KEY認証情報暗号化キー自動生成
    N8N_SECURE_COOKIESecure Cookieの有効化true
    N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS設定ファイル権限チェックfalse

    N8N_ENCRYPTION_KEYの重要性


    # 32バイト(64文字の16進数)を生成
    openssl rand -hex 32

    このキーは認証情報(Credentials)の暗号化に使用されます。設定しないと起動時に自動生成されますが、コンテナを再作成すると既存の認証情報が復号できなくなります。必ず明示的に設定し、安全にバックアップしてください。

    データベース設定

    環境変数説明デフォルト
    DB_TYPEデータベースタイプsqlite
    DB_POSTGRESDB_HOSTPostgreSQLホストlocalhost
    DB_POSTGRESDB_PORTPostgreSQLポート5432
    DB_POSTGRESDB_DATABASEデータベース名n8n
    DB_POSTGRESDB_USERユーザー名postgres
    DB_POSTGRESDB_PASSWORDパスワード
    DB_POSTGRESDB_SCHEMAスキーマ名public

    実行履歴(Executions)

    環境変数説明デフォルト
    EXECUTIONS_DATA_PRUNE実行履歴の自動削除true
    EXECUTIONS_DATA_MAX_AGE保持期間(時間)336(14日)
    EXECUTIONS_DATA_PRUNE_MAX_COUNT最大保持件数10000
    EXECUTIONS_DATA_SAVE_ON_ERRORエラー時の保存all
    EXECUTIONS_DATA_SAVE_ON_SUCCESS成功時の保存all
    EXECUTIONS_DATA_SAVE_ON_PROGRESS進行中の保存false
    EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS手動実行の保存true

    Queue Mode(Redis)

    環境変数説明デフォルト
    EXECUTIONS_MODE実行モードregular
    QUEUE_BULL_REDIS_HOSTRedisホストlocalhost
    QUEUE_BULL_REDIS_PORTRedisポート6379
    QUEUE_BULL_REDIS_PASSWORDRedisパスワード
    QUEUE_BULL_REDIS_DBRedisDB番号0
    QUEUE_HEALTH_CHECK_ACTIVEヘルスチェックfalse

    本番向け構成:PostgreSQL + HTTPS

    本番環境向けの推奨構成です。

    .envファイル


    # ドメイン設定
    DOMAIN_NAME=example.com
    SUBDOMAIN=n8n
    SSL_EMAIL=admin@example.com

    # PostgreSQL
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_strong_db_password
    POSTGRES_DB=n8n

    # n8n
    N8N_ENCRYPTION_KEY=your_64_char_hex_key_here
    N8N_BASIC_AUTH_USER=admin
    N8N_BASIC_AUTH_PASSWORD=your_admin_password

    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo

    docker-compose.yml(PostgreSQL + Nginx)


    version: "3.8"

    services:
    postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
    volumes:
    - postgres_data:/var/lib/postgresql/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
    - "5678:5678"
    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_BASIC_AUTH_ACTIVE=true
    - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    # ホスト設定
    - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
    - N8N_PORT=5678
    - N8N_PROTOCOL=https
    - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
    - N8N_SECURE_COOKIE=true
    # タイムゾーン
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    - TZ=${GENERIC_TIMEZONE}
    # 実行履歴
    - EXECUTIONS_DATA_PRUNE=true
    - EXECUTIONS_DATA_MAX_AGE=168
    - EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000
    # その他
    - NODE_ENV=production
    - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
    volumes:
    - n8n_data:/home/node/.n8n
    - ./local-files:/files
    networks:
    - n8n-network
    depends_on:
    postgres:
    condition: service_healthy

    volumes:
    postgres_data:
    n8n_data:

    networks:
    n8n-network:
    driver: bridge

    Traefik連携:自動SSL証明書

    Traefikを使用すると、Let’s EncryptのSSL証明書を自動取得・更新できます。

    docker-compose.yml(Traefik版)


    version: "3.8"

    services:
    traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: always
    command:
    - "--api.dashboard=true"
    - "--providers.docker=true"
    - "--providers.docker.exposedbydefault=false"
    - "--entrypoints.web.address=:80"
    - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
    - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
    - "--entrypoints.websecure.address=:443"
    - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
    - "--certificatesresolvers.letsencrypt.acme.email=${SSL_EMAIL}"
    - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - ./traefik_data:/letsencrypt
    - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
    - n8n-network

    postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
    volumes:
    - postgres_data:/var/lib/postgresql/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: always
    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_BASIC_AUTH_ACTIVE=true
    - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
    - N8N_PROTOCOL=https
    - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
    - N8N_SECURE_COOKIE=true
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    - TZ=${GENERIC_TIMEZONE}
    - NODE_ENV=production
    volumes:
    - n8n_data:/home/node/.n8n
    - ./local-files:/files
    networks:
    - n8n-network
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.n8n.rule=Host(${SUBDOMAIN}.${DOMAIN_NAME})"
    - "traefik.http.routers.n8n.entrypoints=websecure"
    - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
    - "traefik.http.services.n8n.loadbalancer.server.port=5678"
    depends_on:
    postgres:
    condition: service_healthy

    volumes:
    postgres_data:
    n8n_data:

    networks:
    n8n-network:
    driver: bridge

    Traefik用ディレクトリ準備


    mkdir -p traefik_data local-files
    touch traefik_data/acme.json
    chmod 600 traefik_data/acme.json

    Queue Mode構成:Redis + Worker

    大規模なワークフロー処理には、Queue Modeを使用してワーカーを分離します。

    Queue Modeのアーキテクチャ

    • Main(n8n):UI、API、Webhookを処理し、ジョブをRedisに投入
    • Redis:ジョブキューとして機能
    • Worker:Redisからジョブを取得して実行
    • PostgreSQL:ワークフロー定義、認証情報、実行結果を保存

    docker-compose.yml(Queue Mode)


    version: "3.8"

    services:
    postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
    volumes:
    - postgres_data:/var/lib/postgresql/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}']
    interval: 10s
    timeout: 5s
    retries: 5

    redis:
    image: redis:7-alpine
    container_name: n8n-redis
    restart: always
    volumes:
    - redis_data:/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD', 'redis-cli', 'ping']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    image: n8nio/n8n:latest
    container_name: n8n-main
    restart: always
    ports:
    - "5678:5678"
    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}
    # Queue Mode
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379
    - QUEUE_HEALTH_CHECK_ACTIVE=true
    # 認証・セキュリティ
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    - N8N_BASIC_AUTH_ACTIVE=true
    - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    # ホスト設定
    - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
    - N8N_PROTOCOL=https
    - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
    - N8N_SECURE_COOKIE=true
    # タイムゾーン
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    - TZ=${GENERIC_TIMEZONE}
    - NODE_ENV=production
    volumes:
    - n8n_data:/home/node/.n8n
    networks:
    - n8n-network
    depends_on:
    postgres:
    condition: service_healthy
    redis:
    condition: service_healthy

    n8n-worker:
    image: n8nio/n8n:latest
    container_name: n8n-worker
    restart: always
    command: worker
    environment:
    # データベース(Mainと同じ設定)
    - 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}
    # Queue Mode
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379
    # 暗号化キー(Mainと同じ)
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    # タイムゾーン
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    - TZ=${GENERIC_TIMEZONE}
    - NODE_ENV=production
    volumes:
    - n8n_data:/home/node/.n8n
    networks:
    - n8n-network
    depends_on:
    - n8n
    - redis

    volumes:
    postgres_data:
    redis_data:
    n8n_data:

    networks:
    n8n-network:
    driver: bridge

    Workerのスケーリング


    # Worker数を増やす
    docker compose up -d --scale n8n-worker=3

    ボリュームとパーミッション

    Named Volume vs Bind Mount

    方式メリットデメリット
    Named VolumeDockerが管理、移植性が高い直接アクセスしにくい
    Bind Mount直接アクセス可能、バックアップ容易パーミッション管理が必要

    Bind Mountを使用する場合


    volumes:
    - ./n8n_data:/home/node/.n8n
    - ./postgres_data:/var/lib/postgresql/data

    パーミッション設定


    # n8nデータ(コンテナ内はnode:node = 1000:1000)
    sudo mkdir -p n8n_data
    sudo chown -R 1000:1000 n8n_data

    # PostgreSQLデータ(コンテナ内はpostgres = 999:999)
    sudo mkdir -p postgres_data
    sudo chown -R 999:999 postgres_data

    機密情報の管理(_FILE接尾辞)

    環境変数に直接パスワードを記載する代わりに、ファイルから読み込むことができます。

    Docker Secretsの使用


    # シークレットファイルを作成
    echo "your_db_password" > ./secrets/db_password.txt
    echo "your_encryption_key" > ./secrets/encryption_key.txt
    chmod 600 ./secrets/*


    services:
    n8n:
    environment:
    - DB_POSTGRESDB_PASSWORD_FILE=/run/secrets/db_password
    - N8N_ENCRYPTION_KEY_FILE=/run/secrets/encryption_key
    secrets:
    - db_password
    - encryption_key

    secrets:
    db_password:
    file: ./secrets/db_password.txt
    encryption_key:
    file: ./secrets/encryption_key.txt

    ヘルスチェックとリソース制限

    ヘルスチェック設定


    services:
    n8n:
    healthcheck:
    test: ['CMD-SHELL', 'wget -q --spider http://localhost:5678/healthz || exit 1']
    interval: 30s
    timeout: 10s
    retries: 3
    start_period: 30s

    リソース制限


    services:
    n8n:
    deploy:
    resources:
    limits:
    cpus: '2'
    memory: 2G
    reservations:
    cpus: '0.5'
    memory: 512M

    アップデート手順

    イメージの更新

    # 最新イメージをプル docker compose pull # コンテナを再作成 docker compose up -d

    # 古いイメージを削除
    docker image prune -f

    バージョン固定(推奨)

    本番環境では、latestではなくバージョンを固定することを推奨します。


    services:
    n8n:
    image: n8nio/n8n:1.70.0

    トラブルシューティング

    よくある問題と解決方法

    問題原因解決方法
    認証情報が読めないN8N_ENCRYPTION_KEYの変更元のキーを復元
    PostgreSQLに接続できない起動順序の問題depends_on + healthcheckを設定
    SQLiteにフォールバックDB_TYPE未設定DB_TYPE=postgresdbを確認
    Webhookが動作しないWEBHOOK_URL未設定外部アクセス可能なURLを設定
    SSL証明書エラーDNS未反映Aレコードの設定を確認
    Permission deniedボリュームの権限UID/GIDを確認してchown

    ログ確認コマンド


    # 全サービスのログ
    docker compose logs -f

    # 特定サービスのログ
    docker compose logs -f n8n

    # 最新100行のみ
    docker compose logs --tail 100 n8n

    # タイムスタンプ付き
    docker compose logs -t n8n

    コンテナ内でのデバッグ


    # n8nコンテナに入る
    docker exec -it n8n /bin/sh

    # PostgreSQLに接続
    docker exec -it n8n-postgres psql -U n8n -d n8n

    # Redisに接続
    docker exec -it n8n-redis redis-cli

    よくある質問(FAQ)

    Q. latestタグを使っても大丈夫ですか?

    A. 開発環境では問題ありませんが、本番環境ではバージョンを固定することを強く推奨します。n8nは週次でリリースがあり、破壊的変更が含まれる可能性があります。

    Q. Named VolumeとBind Mountはどちらが良いですか?

    A. 一般的にはNamed Volumeが推奨されます。ただし、バックアップを容易にしたい場合やファイルに直接アクセスしたい場合はBind Mountが便利です。

    Q. Queue ModeではRedisは必須ですか?

    A. はい、Queue ModeではRedisが必須です。Redisがジョブキューとして機能し、MainプロセスとWorkerプロセス間の通信を仲介します。

    Q. Workerは何台必要ですか?

    A. ワークフローの実行頻度と複雑さによります。小〜中規模であれば1〜2台、大規模であれば3台以上を検討してください。CPUコア数に応じてスケールするのが目安です。

    Q. docker compose v1とv2の違いは?

    A. v2は「docker compose」(ハイフンなし)で実行し、v1は「docker-compose」(ハイフンあり)です。現在はv2が推奨されており、v1は非推奨です。

    まとめ

    この記事では、n8nのDocker Compose設定について詳しく解説しました。

    構成パターン

    • 最小構成:SQLite + HTTP(ローカル開発向け)
    • 本番構成:PostgreSQL + HTTPS(Nginx or Traefik)
    • スケール構成:Queue Mode + Redis + Worker

    重要な環境変数

    • N8N_ENCRYPTION_KEY:認証情報の暗号化(必ず固定・バックアップ)
    • DB_TYPE:データベースタイプ(本番はpostgresdb)
    • WEBHOOK_URL:Webhook用外部URL(HTTPS推奨)
    • EXECUTIONS_MODE:実行モード(スケール時はqueue)

    本番運用のポイント

    • バージョンを固定(latestは避ける)
    • healthcheckでサービス依存関係を管理
    • リソース制限でメモリ枯渇を防止
    • 機密情報は_FILE接尾辞でファイルから読み込み

    Docker Composeの設定を正しく理解することで、n8nの安定運用が実現できます。

  • 【完全版】n8n VPS構築ガイド|Ubuntu・Docker・SSL設定からセルフホスト本番運用まで

    【完全版】n8n VPS構築ガイド|Ubuntu・Docker・SSL設定からセルフホスト本番運用まで

    n8nをVPSにセルフホストすることで、月額3,000円以上のクラウド版と同等の機能を、月額500〜1,500円程度のコストで運用できます。

    ワークフロー数や実行回数の制限がなく、データを自社管理下に置けるため、セキュリティ面でも優れています。

    この記事では、VPSの選定からUbuntu環境の構築、Docker設定、SSL証明書の取得、独自ドメインでの公開まで、n8nセルフホストの全工程を詳しく解説します。

    セルフホストのメリットとクラウド版との比較

    n8n Cloudとセルフホストの比較

    項目 n8n Cloud セルフホスト(VPS)
    月額費用 €20〜(約3,000〜4,500円) VPS代のみ(500〜1,500円)
    ワークフロー数 プランにより制限あり 無制限
    実行回数 プランにより制限あり 無制限
    データ管理 Anthropic社サーバー 自社管理
    カスタマイズ 制限あり 完全に自由
    運用負担 なし 自己責任
    サポート 公式サポートあり コミュニティのみ

    セルフホストが向いているケース

    • 月額コストを抑えたい
    • 大量のワークフローを実行する
    • 機密データを外部に置きたくない
    • カスタムノードを使用したい
    • サーバー管理の基礎知識がある

    VPSの選定とスペック要件

    n8nの最低システム要件

    項目 最低要件 推奨スペック
    CPU 1 vCPU 2 vCPU以上
    メモリ 2GB RAM 4GB以上
    ストレージ 10GB SSD 20GB以上(NVMe推奨)
    OS Ubuntu 20.04+ Ubuntu 22.04 / 24.04

    おすすめVPSプロバイダー

    国内サービス

    サービス 最小プラン 月額料金 特徴
    XServer VPS 2GB 830円〜 国内最安クラス、無料枠あり
    ConoHa VPS 1GB 682円〜 時間課金対応、管理画面が使いやすい
    さくらのVPS 1GB 880円〜 安定性、サポート充実

    海外サービス

    サービス 最小プラン 月額料金 特徴
    DigitalOcean 1GB $6〜 n8nテンプレートあり
    Vultr 1GB $5〜 東京リージョンあり
    Hetzner 2GB €4〜 コスパ最強

    Ubuntu環境の初期セットアップ

    VPSを契約したら、まずUbuntu環境の初期設定を行います。

    Step 1:SSHでサーバーに接続


    ssh root@your_server_ip

    Step 2:システムの更新


    # パッケージリストの更新
    sudo apt update

    # インストール済みパッケージの更新
    sudo apt upgrade -y

    Step 3:新規ユーザーの作成(推奨)

    rootでの運用は避け、一般ユーザーを作成します。


    # 新規ユーザー作成
    adduser n8nadmin

    # sudo権限を付与
    usermod -aG sudo n8nadmin

    # 新ユーザーでログイン確認
    su – n8nadmin

    Step 4:ファイアウォールの設定


    # UFWの有効化
    sudo ufw allow OpenSSH
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw allow 5678/tcp
    sudo ufw enable

    # 設定確認
    sudo ufw status

    Step 5:タイムゾーンの設定


    sudo timedatectl set-timezone Asia/Tokyo

    Dockerのインストール

    n8nの運用にはDockerを使用することを強く推奨します。

    Docker Engineのインストール


    # 公式スクリプトでインストール
    curl -fsSL https://get.docker.com | bash

    # 一般ユーザーでDockerを実行できるようにする
    sudo usermod -aG docker $USER

    # 設定を反映(再ログインが必要)
    newgrp docker

    # 動作確認
    docker –version

    Docker Composeのインストール


    # Docker Compose v2(プラグイン版)
    sudo apt install docker-compose-plugin -y

    # 動作確認
    docker compose version

    n8nのインストールと起動

    Step 1:作業ディレクトリの作成


    mkdir -p ~/n8n-docker
    cd ~/n8n-docker

    Step 2:環境変数ファイルの作成


    nano .env

    以下の内容を入力:


    # n8n設定
    N8N_BASIC_AUTH_ACTIVE=true
    N8N_BASIC_AUTH_USER=admin
    N8N_BASIC_AUTH_PASSWORD=your_secure_password

    # サーバー設定
    N8N_HOST=your_server_ip
    N8N_PORT=5678
    N8N_PROTOCOL=http
    WEBHOOK_URL=http://your_server_ip:5678/

    # タイムゾーン
    TZ=Asia/Tokyo

    # 暗号化キー(32文字以上のランダム文字列)
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here

    Step 3:docker-compose.ymlの作成


    nano docker-compose.yml

    以下の内容を入力:


    version: "3.8"

    services:
    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
    – “5678:5678”
    environment:
    – N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
    – N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    – N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    – N8N_HOST=${N8N_HOST}
    – N8N_PORT=${N8N_PORT}
    – N8N_PROTOCOL=${N8N_PROTOCOL}
    – WEBHOOK_URL=${WEBHOOK_URL}
    – GENERIC_TIMEZONE=${TZ}
    – TZ=${TZ}
    – N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    – N8N_SECURE_COOKIE=false
    volumes:
    – n8n_data:/home/node/.n8n

    volumes:
    n8n_data:

    Step 4:n8nの起動


    # コンテナを起動
    docker compose up -d

    # ログ確認
    docker compose logs -f n8n

    Step 5:動作確認

    ブラウザで以下にアクセス:


    http://your_server_ip:5678

    .envで設定したユーザー名とパスワードでログインします。

    独自ドメインとSSL証明書の設定

    本番運用では、独自ドメインとHTTPS接続が必須です。

    Step 1:ドメインのDNS設定

    ドメインのDNS管理画面で、Aレコードを追加します。


    Type: A
    Name: n8n(またはサブドメイン)
    Value: your_server_ip
    TTL: 3600

    Step 2:Nginxのインストール


    sudo apt install nginx -y
    sudo systemctl enable nginx
    sudo systemctl start nginx

    Step 3:Nginx設定ファイルの作成


    sudo nano /etc/nginx/sites-available/n8n

    以下の内容を入力(n8n.yourdomain.comを自分のドメインに置換):


    server {
    listen 80;
    server_name n8n.yourdomain.com;

    location / {
    proxy_pass http://localhost:5678;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection “upgrade”;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
    }
    }

    Step 4:設定の有効化


    # シンボリックリンクの作成
    sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/

    # 設定テスト
    sudo nginx -t

    # Nginx再起動
    sudo systemctl reload nginx

    Step 5:SSL証明書の取得(Let’s Encrypt)


    # Certbotのインストール
    sudo apt install certbot python3-certbot-nginx -y

    # SSL証明書の取得と設定
    sudo certbot –nginx -d n8n.yourdomain.com

    メールアドレスの入力と利用規約への同意が求められます。

    Step 6:環境変数の更新

    SSL設定後、.envファイルを更新します。


    N8N_HOST=n8n.yourdomain.com
    N8N_PROTOCOL=https
    WEBHOOK_URL=https://n8n.yourdomain.com/

    docker-compose.ymlも更新:


    environment:
    # ...他の設定
    - N8N_SECURE_COOKIE=true

    Step 7:n8nの再起動


    docker compose down
    docker compose up -d

    これで https://n8n.yourdomain.com でアクセスできます。

    PostgreSQLの追加(本番向け)

    本番運用では、SQLiteではなくPostgreSQLを使用します。

    docker-compose.yml(PostgreSQL版)


    version: "3.8"

    services:
    postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
    – POSTGRES_USER=n8n
    – POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    – POSTGRES_DB=n8n
    volumes:
    – postgres_data:/var/lib/postgresql/data
    healthcheck:
    test: [‘CMD-SHELL’, ‘pg_isready -U n8n’]
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
    – “5678:5678”
    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_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
    – N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    – N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    – N8N_HOST=${N8N_HOST}
    – N8N_PORT=${N8N_PORT}
    – N8N_PROTOCOL=${N8N_PROTOCOL}
    – WEBHOOK_URL=${WEBHOOK_URL}
    – GENERIC_TIMEZONE=${TZ}
    – TZ=${TZ}
    – N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    – N8N_SECURE_COOKIE=true
    volumes:
    – n8n_data:/home/node/.n8n
    depends_on:
    postgres:
    condition: service_healthy

    volumes:
    postgres_data:
    n8n_data:

    .envにPostgreSQLのパスワードを追加:


    POSTGRES_PASSWORD=your_db_password_here

    n8nのアップデート方法

    Dockerイメージの更新


    # 作業ディレクトリに移動
    cd ~/n8n-docker

    # 最新イメージをプル
    docker compose pull

    # コンテナを再作成
    docker compose up -d

    # 古いイメージを削除
    docker image prune -f

    アップデート前の確認事項

    • リリースノートで破壊的変更を確認
    • バックアップを取得
    • テスト環境で動作確認(可能であれば)

    バックアップの設定

    自動バックアップスクリプト


    nano ~/n8n-backup.sh


    #!/bin/bash
    BACKUP_DIR="/home/n8nadmin/backups"
    DATE=$(date +%Y%m%d_%H%M%S)

    # ディレクトリ作成
    mkdir -p ${BACKUP_DIR}

    # PostgreSQLバックアップ(PostgreSQL使用時)
    docker exec n8n-postgres pg_dump -U n8n -d n8n | gzip > ${BACKUP_DIR}/n8n_db_${DATE}.sql.gz

    # n8nデータボリュームのバックアップ
    docker run –rm -v n8n-docker_n8n_data:/data -v ${BACKUP_DIR}:/backup alpine
    tar czf /backup/n8n_data_${DATE}.tar.gz -C /data .

    # 7日より古いバックアップを削除
    find ${BACKUP_DIR} -name “*.gz” -mtime +7 -delete

    echo “Backup completed: ${DATE}”


    # 実行権限を付与
    chmod +x ~/n8n-backup.sh

    cronで自動実行


    crontab -e

    以下を追加:


    0 3 * * * /home/n8nadmin/n8n-backup.sh >> /home/n8nadmin/backup.log 2>&1

    セキュリティ強化

    SSH鍵認証の設定


    # ローカルPCで鍵を生成
    ssh-keygen -t ed25519 -C "your_email@example.com"

    # 公開鍵をサーバーにコピー
    ssh-copy-id n8nadmin@your_server_ip

    # パスワード認証を無効化
    sudo nano /etc/ssh/sshd_config
    # PasswordAuthentication no に変更

    sudo systemctl restart sshd

    Fail2banの導入


    sudo apt install fail2ban -y
    sudo systemctl enable fail2ban
    sudo systemctl start fail2ban

    自動セキュリティ更新


    sudo apt install unattended-upgrades -y
    sudo dpkg-reconfigure -plow unattended-upgrades

    トラブルシューティング

    よくある問題と解決方法

    問題 原因 解決方法
    ブラウザでアクセスできない ファイアウォール設定 UFWでポート5678を許可
    Webhookが動作しない WEBHOOK_URLの設定ミス 外部からアクセス可能なURLを設定
    認証情報が保存されない ボリュームマウントの問題 docker-compose.ymlのvolumes設定を確認
    SSL証明書エラー DNS設定の反映待ち 数分〜数時間待って再試行
    コンテナが再起動を繰り返す 設定エラー docker compose logs で確認

    ログの確認方法


    # n8nのログ
    docker compose logs -f n8n

    # Nginxのログ
    sudo tail -f /var/log/nginx/error.log

    # システムログ
    sudo journalctl -u docker -f

    よくある質問(FAQ)

    Q. VPSのスペックはどれくらい必要ですか?

    A. 小〜中規模のワークフローであれば、2GB RAM / 1 vCPUで十分です。複雑なワークフローや同時実行が多い場合は、4GB RAM以上を推奨します。

    Q. セルフホストでも公式サポートは受けられますか?

    A. Community版(セルフホスト)では公式サポートはありません。コミュニティフォーラムやGitHubのIssueを活用してください。Enterprise版を契約すれば公式サポートが受けられます。

    Q. SQLiteのままでも問題ないですか?

    A. 個人利用や小規模な使用であれば問題ありません。ただし、Webhookを多数受け付ける場合や、本番運用ではPostgreSQLを推奨します。

    Q. アップデートでデータは消えませんか?

    A. Dockerボリュームを使用していれば、イメージの更新でデータは消えません。ただし、念のためアップデート前にバックアップを取得してください。

    Q. 複数人で使用できますか?

    A. Community版では複数ユーザーの管理機能は制限されています。チームでの利用にはEnterprise版の検討をおすすめします。

    まとめ

    この記事では、n8nのVPSセルフホスト構築を解説しました。

    構築の流れ

    1. VPSの契約(2GB RAM以上推奨)
    2. Ubuntu環境の初期設定
    3. Docker / Docker Composeのインストール
    4. n8nのdocker-compose.yml作成と起動
    5. 独自ドメインとSSL証明書の設定
    6. PostgreSQLの追加(本番向け)
    7. バックアップの自動化

    本番運用のポイント

    • N8N_ENCRYPTION_KEYを必ず設定・バックアップ
    • SSL証明書でHTTPS接続を有効化
    • PostgreSQLでデータベースを永続化
    • 定期的なバックアップを自動化
    • セキュリティ設定(SSH鍵認証、Fail2ban)

    コスト比較

    • n8n Cloud:月額€20〜(約3,000〜4,500円)
    • セルフホスト:月額500〜1,500円(VPS代のみ)

    セルフホストにより、年間で2〜4万円のコスト削減が可能です。サーバー管理の手間はありますが、一度構築すれば安定して運用できます。ぜひチャレンジしてみてください。

  • 【本番運用】n8n PostgreSQL永続化の完全ガイド|Docker設定・バックアップ・移行手順

    【本番運用】n8n PostgreSQL永続化の完全ガイド|Docker設定・バックアップ・移行手順

    n8nはデフォルトでSQLiteを使用しますが、本番運用ではPostgreSQLへの移行が推奨されます。

    SQLiteはファイルベースで手軽ですが、同時接続やスケーリングに制限があります。PostgreSQLを使用することで、データの永続化、バックアップ、高可用性を実現できます。

    この記事では、n8nのPostgreSQL永続化について、Docker Compose設定から環境変数、バックアップ、SQLiteからの移行まで、本番運用に必要な技術を詳しく解説します。

    なぜPostgreSQLが必要か?SQLiteとの比較

    SQLiteの特徴と限界

    項目 SQLite PostgreSQL
    アーキテクチャ ファイルベース クライアント・サーバー型
    同時接続 制限あり(書き込みロック) 多数の同時接続に対応
    スケーリング 単一インスタンスのみ Queue Mode / Worker対応
    バックアップ ファイルコピー pg_dump / レプリケーション
    高可用性 非対応 レプリケーション対応
    推奨用途 開発・テスト・小規模 本番・大規模ワークフロー

    PostgreSQLが必要なケース

    • Webhookを多数受け付ける
    • ワークフローの実行頻度が高い
    • 複数ワーカーでの分散処理(Queue Mode)
    • データの確実なバックアップが必要
    • 本番環境での安定運用

    Docker Composeによる構築

    n8nとPostgreSQLをDocker Composeで構築する方法を解説します。

    ディレクトリ構成


    n8n-production/
    ├── docker-compose.yml
    ├── .env
    └── backups/

    .envファイル


    # PostgreSQL設定
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_strong_password_here
    POSTGRES_DB=n8n

    # n8n設定
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here
    N8N_BASIC_AUTH_USER=admin
    N8N_BASIC_AUTH_PASSWORD=your_admin_password
    N8N_HOST=n8n.yourdomain.com
    N8N_PROTOCOL=https
    WEBHOOK_URL=https://n8n.yourdomain.com/
    GENERIC_TIMEZONE=Asia/Tokyo

    重要:N8N_ENCRYPTION_KEYは32文字以上のランダムな文字列を設定してください。このキーは認証情報の暗号化に使用され、変更すると既存の認証情報が読めなくなります。

    docker-compose.yml


    version: '3.8'

    services:
    postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
    volumes:
    - postgres_data:/var/lib/postgresql/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER}']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
    - "5678:5678"
    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設定
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    - N8N_BASIC_AUTH_ACTIVE=true
    - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    - N8N_HOST=${N8N_HOST}
    - N8N_PORT=5678
    - N8N_PROTOCOL=${N8N_PROTOCOL}
    - NODE_ENV=production
    - WEBHOOK_URL=${WEBHOOK_URL}
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    volumes:
    - n8n_data:/home/node/.n8n
    networks:
    - n8n-network
    depends_on:
    postgres:
    condition: service_healthy

    volumes:
    postgres_data:
    n8n_data:

    networks:
    n8n-network:
    driver: bridge

    起動手順


    # ディレクトリ作成
    mkdir -p n8n-production && cd n8n-production

    # .envとdocker-compose.ymlを作成(上記内容)

    # 起動
    docker compose up -d

    # ログ確認
    docker compose logs -f n8n

    環境変数の詳細解説

    データベース関連

    環境変数 説明 デフォルト値
    DB_TYPE データベースタイプ sqlite(postgresdbに変更)
    DB_POSTGRESDB_HOST PostgreSQLホスト名 localhost
    DB_POSTGRESDB_PORT PostgreSQLポート 5432
    DB_POSTGRESDB_DATABASE データベース名 n8n
    DB_POSTGRESDB_USER ユーザー名 postgres
    DB_POSTGRESDB_PASSWORD パスワード
    DB_POSTGRESDB_SCHEMA スキーマ名 public

    SSL接続(マネージドDB向け)

    AWS RDSやCloud SQLなどのマネージドデータベースを使用する場合、SSL接続が必要です。

    環境変数 説明
    DB_POSTGRESDB_SSL_CA CA証明書のパス
    DB_POSTGRESDB_SSL_CERT クライアント証明書のパス
    DB_POSTGRESDB_SSL_KEY クライアント秘密鍵のパス
    DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED 証明書検証(true/false)

    暗号化キー


    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here

    重要なポイント

    • 認証情報(Credentials)の暗号化に使用
    • 設定しないと起動時に自動生成される
    • キーを変更すると既存の認証情報が復号できなくなる
    • 必ず安全な場所にバックアップすること

    キーの生成方法


    # OpenSSLでランダムな32文字を生成
    openssl rand -hex 16

    .n8nディレクトリの永続化

    PostgreSQLを使用しても、.n8nディレクトリの永続化は引き続き必要です。

    .n8nディレクトリに保存されるデータ

    • 暗号化キー(N8N_ENCRYPTION_KEYを設定しない場合)
    • インスタンスログ
    • Source Control機能のアセット
    • 一時ファイル

    ボリュームマッピング


    volumes:
    - n8n_data:/home/node/.n8n

    または、ホストディレクトリにマッピング:


    volumes:
    - ./n8n-data:/home/node/.n8n

    バックアップ戦略

    本番運用では、定期的なバックアップが必須です。

    PostgreSQLのバックアップ

    手動バックアップ(pg_dump)


    # バックアップ実行
    docker exec n8n-postgres pg_dump -U n8n -d n8n > backup_$(date +%Y%m%d_%H%M%S).sql

    # 圧縮してバックアップ
    docker exec n8n-postgres pg_dump -U n8n -d n8n | gzip > backup_$(date +%Y%m%d).sql.gz

    自動バックアップスクリプト


    #!/bin/bash
    # backup.sh

    BACKUP_DIR="/path/to/backups"
    DATE=$(date +%Y%m%d_%H%M%S)
    RETENTION_DAYS=7

    # PostgreSQLバックアップ
    docker exec n8n-postgres pg_dump -U n8n -d n8n | gzip > ${BACKUP_DIR}/n8n_db_${DATE}.sql.gz

    # n8n_dataボリュームのバックアップ
    docker run --rm -v n8n_data:/data -v ${BACKUP_DIR}:/backup alpine
    tar czf /backup/n8n_data_${DATE}.tar.gz -C /data .

    # 古いバックアップの削除
    find ${BACKUP_DIR} -name "*.gz" -mtime +${RETENTION_DAYS} -delete

    echo "Backup completed: ${DATE}"

    cronで自動実行


    # 毎日午前3時にバックアップ
    0 3 * * * /path/to/backup.sh >> /var/log/n8n-backup.log 2>&1

    リストア手順

    PostgreSQLのリストア


    # 圧縮ファイルからリストア
    gunzip -c backup_20250101.sql.gz | docker exec -i n8n-postgres psql -U n8n -d n8n

    # 非圧縮ファイルからリストア
    cat backup.sql | docker exec -i n8n-postgres psql -U n8n -d n8n

    n8n_dataボリュームのリストア


    # 既存ボリュームを削除(注意)
    docker volume rm n8n_data

    # 新しいボリュームを作成してリストア
    docker run --rm -v n8n_data:/data -v /path/to/backups:/backup alpine
    tar xzf /backup/n8n_data_20250101.tar.gz -C /data

    SQLiteからPostgreSQLへの移行

    既存のSQLite環境からPostgreSQLに移行する手順です。

    移行方法の選択肢

    方法 メリット デメリット
    ワークフローのエクスポート/インポート 確実、クリーン 実行履歴は移行されない
    SQLダンプの変換 データ完全移行 スキーマ差異の調整が必要
    新規構築 シンプル 再設定が必要

    推奨:ワークフローのエクスポート/インポート

    Step 1:ワークフローのエクスポート

    1. n8nの管理画面にログイン
    2. 各ワークフローを開いて「Export」→ JSONファイルを保存
    3. または、CLIでエクスポート:


    # 全ワークフローをエクスポート
    docker exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows.json

    Step 2:認証情報のエクスポート


    # 認証情報をエクスポート(暗号化されたまま)
    docker exec n8n n8n export:credentials --all --output=/home/node/.n8n/credentials.json

    Step 3:PostgreSQL環境の構築

    上記のdocker-compose.ymlを使用して新しい環境を構築します。

    重要:N8N_ENCRYPTION_KEYは元の環境と同じ値を使用してください。

    Step 4:データのインポート


    # ワークフローのインポート
    docker exec n8n n8n import:workflow --input=/home/node/.n8n/workflows.json

    # 認証情報のインポート
    docker exec n8n n8n import:credentials --input=/home/node/.n8n/credentials.json

    本番運用のベストプラクティス

    ヘルスチェックの設定


    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER}']
    interval: 10s
    timeout: 5s
    retries: 5

    PostgreSQLの準備が完了してからn8nを起動することで、接続エラーを防ぎます。

    リスタートポリシー


    restart: always

    コンテナが停止した場合に自動的に再起動します。

    リソース制限


    services:
    n8n:
    deploy:
    resources:
    limits:
    cpus: '2'
    memory: 2G
    reservations:
    cpus: '0.5'
    memory: 512M

    ログ管理


    services:
    n8n:
    logging:
    driver: "json-file"
    options:
    max-size: "10m"
    max-file: "3"

    リバースプロキシとSSL

    本番環境では、Nginx / TraefikなどのリバースプロキシでSSL終端を行います。

    Nginxの設定例


    server {
    listen 443 ssl http2;
    server_name n8n.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/n8n.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.yourdomain.com/privkey.pem;

    location / {
    proxy_pass http://localhost:5678;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
    }
    }

    Queue Modeでのスケーリング

    大規模なワークフロー処理には、Queue Mode + Redisを使用します。

    Queue Mode構成


    version: '3.8'

    services:
    postgres:
    # ... 上記と同じ

    redis:
    image: redis:7-alpine
    container_name: n8n-redis
    restart: always
    volumes:
    - redis_data:/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD', 'redis-cli', 'ping']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    # ... 基本設定に以下を追加
    environment:
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379

    n8n-worker:
    image: n8nio/n8n:latest
    container_name: n8n-worker
    restart: always
    command: worker
    environment:
    # n8nと同じDB設定
    - DB_TYPE=postgresdb
    - DB_POSTGRESDB_HOST=postgres
    # ... その他の設定
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379
    depends_on:
    - postgres
    - redis

    volumes:
    postgres_data:
    redis_data:
    n8n_data:

    トラブルシューティング

    よくある問題と解決方法

    問題 原因 解決方法
    DB接続エラー PostgreSQLが起動していない healthcheckとdepends_onを設定
    認証情報が読めない 暗号化キーが異なる N8N_ENCRYPTION_KEYを確認
    SQLiteにフォールバック DB_TYPE未設定 環境変数を確認
    Permission denied ボリュームの権限問題 UID/GID設定またはchown
    起動時にハング マイグレーション中 初回起動時は時間がかかる

    ログの確認方法


    # n8nのログ
    docker compose logs -f n8n

    # PostgreSQLのログ
    docker compose logs -f postgres

    # 全サービスのログ
    docker compose logs -f

    データベース接続の確認


    # PostgreSQLに直接接続
    docker exec -it n8n-postgres psql -U n8n -d n8n

    # テーブル一覧を確認
    dt

    # ワークフロー数を確認
    SELECT COUNT(*) FROM workflow_entity;

    よくある質問(FAQ)

    Q. SQLiteからPostgreSQLへの移行は必須ですか?

    A. 必須ではありませんが、本番運用では強く推奨されます。SQLiteは同時書き込みに制限があり、Webhookを多数受け付けるような使い方では問題が発生する可能性があります。

    Q. マネージドPostgreSQL(RDS、Cloud SQL)は使えますか?

    A. はい、使用できます。接続情報を環境変数で設定し、必要に応じてSSL接続を設定してください。

    Q. N8N_ENCRYPTION_KEYを忘れた場合はどうなりますか?

    A. 既存の認証情報が復号できなくなります。ワークフロー自体は残りますが、認証情報は再設定が必要です。キーは必ずバックアップしてください。

    Q. PostgreSQLのバージョンは何を使うべきですか?

    A. PostgreSQL 13以上が推奨です。2025年現在、PostgreSQL 15または16が安定しており推奨されます。

    Q. 実行履歴(Executions)はどこに保存されますか?

    A. PostgreSQLのexecution_entityテーブルに保存されます。実行履歴が増えるとディスク容量を消費するため、定期的なクリーンアップまたは保持期間の設定を検討してください。

    まとめ

    この記事では、n8nのPostgreSQL永続化について解説しました。

    本番運用のための必須設定

    • DB_TYPE=postgresdb で PostgreSQLを指定
    • N8N_ENCRYPTION_KEY を固定値で設定
    • .n8nディレクトリのボリューム永続化
    • PostgreSQLデータのボリューム永続化

    運用のポイント

    • healthcheckでPostgreSQLの準備完了を待つ
    • 定期的なバックアップ(pg_dump + ボリューム)
    • 暗号化キーの安全な管理
    • リバースプロキシでSSL終端

    スケーリング時の追加設定

    • Queue Mode + Redis
    • n8n-workerの追加

    PostgreSQLを使用することで、n8nの安定性と信頼性が大きく向上します。本番環境では必ずPostgreSQLを使用し、適切なバックアップ戦略を実装してください。

  • Dockerの辛いところ|20年現場で見てきた「便利だけど困る」7つの落とし穴

    Dockerの辛いところ|20年現場で見てきた「便利だけど困る」7つの落とし穴

    「Dockerさえ入れれば全部解決する」

    そんな期待を胸にDockerを導入したものの、気づけば新たな悩みと格闘している…。開発の現場でこんな経験をしたことはないでしょうか。

    前回の記事でDockerのメリットをお伝えしましたが、20年以上エンジニアとして様々な現場を見てきた私としては、正直に言わなければならないこともあります。Dockerは確かに革命的な技術ですが、「銀の弾丸」ではありません。

    この記事では、Dockerを実際に使い込んでいく中で遭遇する「辛いところ」を率直にお伝えします。これからDockerを導入しようとしている方も、すでに使っていて困っている方も、事前に知っておくことで対策が立てやすくなるはずです。

    辛いところ1:Mac・Windowsだと動作が遅い

    Dockerの最大の落とし穴のひとつが、Mac・Windows環境での動作速度です。

    「軽量で高速」がDockerの売りのはずなのに、実際に使ってみると「なんか遅い…」と感じる方は多いのではないでしょうか。特に開発中にファイルを編集するたびに反映が遅かったり、ビルドに時間がかかったりすると、せっかくの開発効率が台無しです。

    なぜ遅くなるのか

    根本的な原因は、DockerがLinuxのカーネル機能を前提としているところにあります。

    LinuxマシンでDockerを動かす場合、コンテナはホストOSのカーネルをそのまま使うため、オーバーヘッドはほぼありません。しかしMacやWindowsの場合、Dockerを動かすためにLinux VMを内部で立ち上げており、その上でコンテナが動いています。

    特に問題になるのが、ホストマシンとコンテナ間のファイル同期です。開発時には自分のエディタでコードを編集し、それをコンテナ内のアプリケーションで動かすわけですが、このファイル同期処理が意外と重いのです。MacのファイルシステムとLinuxのファイルシステムを橋渡しするために、変換処理が都度走ることになります。

    対処法

    Windows環境の場合、WSL2(Windows Subsystem for Linux 2)を活用し、ソースコードをWSL2側のファイルシステムに置くことで大幅に改善できます。Linux側にファイルを置けば変換処理が不要になるからです。

    Mac環境では、Docker Desktopの設定でCPUやメモリの割り当てを増やす、あるいはボリュームマウント時に「cached」や「delegated」オプションを使うことで、多少の改善が見込めます。

    ただし、これらは根本解決ではありません。本当にパフォーマンスが必要な場面では、Linux環境での開発を検討するのも選択肢のひとつです。

    辛いところ2:ボリュームマウントの権限問題

    「Permission denied」

    Dockerを使っていると、このエラーに何度も遭遇することになります。特にLinux環境でDockerを使う場合、ボリュームマウント時の権限問題は避けて通れません。

    何が起きているのか

    ホストマシンのディレクトリをコンテナにマウントする際、ファイルの所有者情報(UID/GID)がそのまま引き継がれます。問題は、ホストで使っているユーザーとコンテナ内のユーザーのUID/GIDが一致しないケースです。

    たとえば、ホストでUID=1000のユーザーとして作業していて、コンテナ内ではrootユーザー(UID=0)で動作している場合、コンテナ内で作成されたファイルはホスト側から見るとrootの所有物になり、一般ユーザーでは編集できなくなってしまいます。

    興味深いことに、Docker Desktop for MacやWindowsではこの問題が発生しにくいです。内部でうまくハンドリングしてくれているようですが、Linux環境では自分で対処する必要があります。

    対処法

    よく使われる対処法は、docker run時に「-u」オプションでユーザーを指定するか、/etc/passwdと/etc/groupを読み取り専用でマウントしてホストのユーザー情報を共有する方法です。

    Dockerfileでユーザーを作成し、そのユーザーで実行するように設計しておくことも有効です。ただし、環境ごとにUID/GIDが異なる場合は、ビルド時に引数として渡すなどの工夫が必要になります。

    正直なところ、この問題に対する「これだ」という万能解はありません。プロジェクトの状況に応じて最適な方法を選ぶしかないのが現状です。

    辛いところ3:気づいたらディスクが満杯

    「なんかPCの容量がないな…」と思って調べてみたら、Dockerが数十GBを占有していた。そんな経験をした方も多いのではないでしょうか。

    なぜ容量を食うのか

    Dockerはイメージのレイヤー構造を採用しており、効率的に容量を節約できる仕組みになっています。しかし実際の運用では、様々な「ゴミ」が蓄積していきます。

    まず、使われなくなったイメージ(dangling image)です。同じタグで何度もビルドを繰り返すと、古いイメージはタグを失い「none」という状態で残り続けます。次に、停止したままのコンテナ。明示的に削除しない限り、ディスク上にデータが残ります。そしてビルドキャッシュ。ビルド高速化のためにキャッシュされたレイヤーが積み重なっていきます。

    さらにWindowsの場合、やっかいな問題があります。Dockerの仮想ディスク(ext4.vhdx)は自動的に拡張されますが、中身を削除しても自動的には縮小されません。つまり、一度膨らんだ仮想ディスクは手動で圧縮しない限りそのままなのです。

    対処法

    定期的なお掃除が必要です。まずは「docker system df」で現状を確認しましょう。「docker system prune」で未使用のコンテナ、ネットワーク、イメージを一括削除できます。ボリュームも含めて削除したい場合は「–volumes」オプションを付けます。

    Windowsの場合は、さらに仮想ディスクの圧縮も必要です。Docker Desktopを停止した状態で、PowerShellの「Optimize-VHD」コマンドを使って圧縮できます(Hyper-Vが必要)。

    私の経験では、月に一度くらいはお掃除の時間を取るようにしています。自動化したい場合は、CI/CDパイプラインに組み込むか、cronで定期実行するのも手です。

    辛いところ4:ネットワークとポートの罠

    Dockerのネットワーク周りは、初心者にとってかなりの鬼門です。「繋がらない」「意図せず公開されていた」など、トラブルの温床になりがちです。

    よくあるトラブル

    まず、EXPOSEに関する誤解。Dockerfile内でEXPOSEを書いても、それだけではポートは外部に公開されません。単なるドキュメント的な意味しかなく、実際に公開するには「docker run -p」で明示的に指定する必要があります。

    逆に危険なのが、ポートマッピングのデフォルト挙動です。「-p 8080:80」のように指定すると、デフォルトでは全てのインターフェース(0.0.0.0)に対してポートが公開されます。ファイアウォールで閉じているつもりでも、Dockerは独自のiptablesルールを設定するため、ufwなどの設定を迂回してしまいます。

    公衆WiFiに繋いだ状態で開発用コンテナを立ち上げていたら、LAN内の他の端末からアクセスできてしまった…という怖い話も実際にあります。

    対処法

    ローカル開発では「-p 127.0.0.1:8080:80」のように、必ずlocalhostを指定するようにしましょう。docker-compose.ymlでも「ports: “127.0.0.1:8080:80″」と書けます。

    また、依存サービスの起動順序にも注意が必要です。docker-composeのdepends_onは起動順序を制御しますが、サービスが「使える状態になったか」までは保証しません。アプリ起動時にデータベースがまだ準備中…というケースは珍しくありません。dockerizeなどのツールを使って、依存サービスの起動を待つ仕組みを入れることをおすすめします。

    辛いところ5:学習コストが意外と高い

    「Dockerは簡単」という評判を聞いて始めてみたものの、覚えることが多くて挫折しそうになる。これも多くの人が経験することです。

    覚えなければならないこと

    Dockerを使いこなすには、最低限以下の知識が必要になります。

    Dockerの基本概念(イメージ、コンテナ、レイヤー)、Dockerfileの書き方、docker-compose.ymlの記法、ネットワークの仕組み、ボリュームとデータ永続化、そしてLinuxの基礎知識。特にLinuxに馴染みがない方にとっては、コンテナ内でのデバッグ作業がかなりハードルが高く感じるでしょう。

    さらに本番環境での運用を考えると、セキュリティ設定、リソース制限、ログ管理、オーケストレーション(Kubernetes等)といった知識も必要になってきます。

    対処法

    一度に全部を覚えようとしないことが大切です。まずは「docker run」と「docker-compose up」だけで動かせる環境を用意し、実際に使いながら少しずつ理解を深めていきましょう。

    既存のdocker-compose.ymlを読み解くところから始めるのも良いアプローチです。先人が作った設定を眺めながら「なぜこう書いてあるんだろう」と調べていくと、実践的な知識が身につきます。

    辛いところ6:LinuxベースであることのしがらみがLinux以外では制限になる

    DockerはLinuxのカーネル機能をベースにした技術です。この事実が、いくつかの制限を生み出しています。

    異なるOS間の制約

    Linux上でWindowsコンテナを動かすことはできませんし、その逆もできません(Docker Desktop for Windowsでは切り替えは可能ですが、同時には使えません)。これは、コンテナがホストOSのカーネルを共有する仕組みだからです。

    また、仮想マシンと比較すると分離レベルが低いという特性があります。コンテナ同士、あるいはコンテナとホストの間で完全な分離ができているわけではありません。セキュリティ要件が厳しい環境では、この点が問題になることもあります。

    対処法

    マルチOSでのテストが必要な場合は、DockerではなくVMを併用する必要があります。

    セキュリティ面では、信頼できるベースイメージを使う、不要なパッケージを入れない、rootユーザーで実行しないといった基本的な対策を徹底することが重要です。より高い分離が必要な場合は、gVisorやKata Containersといったサンドボックス技術の導入も検討に値します。

    辛いところ7:「私のPCでは動きます」問題の変形版が起きる

    皮肉なことに、Dockerは「環境差異問題を解決する」ために生まれた技術なのに、Docker環境特有の「動かない」問題が新たに発生することがあります。

    Dockerならではの罠

    ローカルでは動くのにCI/CDで失敗する、開発環境では動くのに本番で動かない。原因を調べると、Dockerイメージのバージョン違い、ベースイメージの更新、ビルドキャッシュの有無、ネットワーク設定の違いなどが見つかります。

    また、Dockerを使いこなす知識がないまま複雑な構成を組むと、問題が発生したときの調査が困難になります。「どのコンテナで何が起きているのか」を追うのは、慣れていないとかなり大変です。

    対処法

    イメージのタグは「latest」を避け、明示的にバージョンを固定しましょう。CI/CDとローカルで同じDockerfileを使い、ビルド手順を統一することも重要です。

    そして何より、Dockerの仕組みをしっかり理解することです。ブラックボックスのまま使っていると、いざというときに手も足も出なくなります。

    まとめ:それでもDockerを使うべき理由

    この記事では、Dockerの「辛いところ」を7つ紹介しました。

    Mac・Windowsでの速度問題、権限周りのトラブル、ディスク容量の肥大化、ネットワークの罠、学習コスト、Linux依存の制約、そして新たな「動かない」問題。なかなか手強い課題が並んでいます。

    それでも、私は断言します。Dockerは使うべきです。

    なぜなら、これらの辛さを差し引いても、Dockerがもたらすメリットのほうが圧倒的に大きいからです。環境構築が数分で終わる、チーム全員が同じ環境で開発できる、本番環境との差異がなくなる。20年前の「手順書地獄」を知る身としては、これらの恩恵は何物にも代えがたいものです。

    そして、辛さの多くは「知っていれば対処できる」ものばかりです。この記事を読んだあなたは、すでに多くの落とし穴を知っています。それだけで、かなり有利なスタートを切れるはずです。

    まだDockerを触ったことがない方は、まずDocker Desktopをインストールして、「docker run hello-world」を実行するところから始めてみてください。すでに使っている方は、この記事で紹介した対処法をぜひ試してみてください。

    トラブルに遭遇するたびに少しずつ理解が深まり、気づけばDockerなしでは開発できない体になっているはずです。私がそうであったように。

  • Docker入門|20年現場で見てきた環境構築の変遷と始め方

    Docker入門|20年現場で見てきた環境構築の変遷と始め方

    「手順書通りにやったのに動かない」「自分のPCでは動くのに、他の人の環境だとエラーになる」

    開発の現場でこんな経験をしたことはないでしょうか。私は20年以上エンジニアとして様々な現場を見てきましたが、環境構築にまつわるトラブルは本当に多く、時には丸一日を費やすこともありました。

    Dockerは、こうした「環境の違いによる問題」を根本から解決するために生まれた技術です。この記事では、Dockerの基本概念から実際の使い方まで、初心者の方にもわかりやすく解説します。

    Dockerとは何か?一言で理解する

    Dockerとは、アプリケーションの実行環境をまるごとパッケージ化して、どこでも同じように動かせる仕組みです。

    たとえば、あなたが作ったWebアプリがあるとします。このアプリを動かすには、特定のバージョンのNode.jsが必要で、データベースも必要で、いくつかのライブラリも必要です。従来は、これらを一つひとつ手作業でインストールして設定していました。

    Dockerを使えば、これらの「アプリを動かすために必要なもの一式」をひとつの箱(コンテナ)にまとめられます。この箱さえあれば、WindowsでもMacでもLinuxでも、同じようにアプリが動きます。

    なぜDockerが必要になったのか?昔の開発現場の話

    Dockerの価値を理解するには、Dockerがなかった時代の苦労を知るのが一番です。

    手順書地獄の時代

    10〜15年ほど前、新しいプロジェクトに参加すると、まず渡されるのが「環境構築手順書」でした。ひどいときには50ページ以上あり、「このソフトをインストールして、この設定ファイルをこう書き換えて、この環境変数を設定して…」と延々と続きます。

    しかも、この手順書通りにやっても動かないことが珍しくありませんでした。なぜなら、手順書を作った人のPCと自分のPCでは、すでにインストールされているソフトのバージョンが違ったり、OSの設定が微妙に異なったりするからです。

    「私のPCでは動きます」問題

    開発中によく起きたのが、「自分の環境では正常に動くのに、他の人の環境やサーバーにデプロイすると動かない」という問題です。

    原因を調べると、Javaのバージョンが8と11で違っていたとか、ライブラリのマイナーバージョンが違っていたとか、そういった些細な差異が原因でした。本番リリース直前に発覚して、深夜まで対応に追われたことも一度や二度ではありません。

    Dockerが解決したこと

    Dockerは、この「環境の差異」という根本的な問題を解決しました。アプリケーションと、それを動かすために必要な環境をすべてひとまとめにして配布できるようになったのです。

    開発者のPCで動いたコンテナは、テスト環境でも本番環境でも、まったく同じように動きます。「環境が違うから動かない」という言い訳が通用しなくなった代わりに、環境構築で苦しむ時間が劇的に減りました。

    Dockerの基本概念を押さえる

    Dockerを使いこなすために、まず3つの重要な概念を理解しましょう。

    イメージ(Image)

    イメージは、コンテナを作るための「設計図」です。

    たとえば「Python 3.11がインストールされたLinux環境」や「nginx(Webサーバー)が設定済みの環境」といった、特定の状態を記録したものがイメージです。

    イメージ自体は読み取り専用で、変更することはできません。イメージをもとにコンテナを作成して使います。

    コンテナ(Container)

    コンテナは、イメージから作られた「実際に動く環境」です。

    イメージが設計図だとすれば、コンテナはその設計図から建てられた家のようなものです。同じ設計図(イメージ)から、何個でも家(コンテナ)を建てることができます。

    コンテナは起動したり停止したり、中でコマンドを実行したりできます。不要になったら削除して、また必要になったらイメージから新しく作れます。

    Dockerfile

    Dockerfileは、イメージを作るためのレシピです。

    「Ubuntu をベースにして、Node.js をインストールして、このアプリのコードをコピーして、このコマンドで起動する」といった手順をテキストファイルに記述します。このDockerfileがあれば、誰でも同じイメージを作成できます。

    Docker Hub

    Docker Hubは、イメージを共有するためのサービスです。GitHubのDocker版と考えるとわかりやすいでしょう。

    公式のイメージ(nginx、MySQL、Pythonなど)が多数公開されており、自分でゼロから作らなくても、必要なイメージをダウンロードしてすぐに使えます。

    Dockerを実際に動かしてみよう

    概念を理解したら、実際に手を動かしてみましょう。

    Docker Desktopのインストール

    まずはDocker Desktopをインストールします。WindowsでもMacでも、公式サイトからインストーラーをダウンロードして実行するだけです。

    Docker Desktop公式サイト

    インストールが完了したら、ターミナル(Windowsならコマンドプロンプト、Macならターミナル)を開いて、以下のコマンドを実行してください。

    docker --version

    バージョン情報が表示されれば、インストール成功です。

    最初のコンテナを起動する

    では、実際にコンテナを起動してみましょう。以下のコマンドを実行してください。

    docker run hello-world

    初回は「hello-world」というイメージをDocker Hubからダウンロードするため、少し時間がかかります。成功すると、「Hello from Docker!」から始まるメッセージが表示されます。

    これだけで、あなたは初めてのDockerコンテナを起動できました。

    Webサーバーを立ち上げてみる

    もう少し実用的な例として、Webサーバー(nginx)を起動してみましょう。

    docker run -d -p 8080:80 nginx

    このコマンドを実行したら、ブラウザで http://localhost:8080 にアクセスしてください。「Welcome to nginx!」というページが表示されるはずです。

    たった1行のコマンドで、Webサーバーが立ち上がりました。従来であれば、nginxをダウンロードして、設定ファイルを編集して、サービスを起動して…という作業が必要でしたが、Dockerならこれだけです。

    覚えておきたい基本コマンド5つ

    Dockerを使う上で、最低限覚えておきたいコマンドを紹介します。

    1. docker run
    イメージからコンテナを作成して起動します。

    docker run イメージ名

    2. docker ps
    現在動いているコンテナの一覧を表示します。

    docker ps

    停止中のコンテナも含めて表示するには -a オプションをつけます。

    docker ps -a

    3. docker stop
    コンテナを停止します。

    docker stop コンテナID

    4. docker rm
    停止したコンテナを削除します。

    docker rm コンテナID

    5. docker images
    ダウンロード済みのイメージ一覧を表示します。

    docker images

    まずはこの5つを覚えておけば、基本的な操作はできるようになります。

    実務ではDockerがどう使われているか

    Dockerは学習用のツールではなく、実際の開発現場で幅広く使われています。ここでは代表的な活用シーンを紹介します。

    開発環境の共有

    チーム開発では、全員が同じ環境で作業することが重要です。Dockerを使えば、Dockerfileとdocker-compose.yml(複数のコンテナを管理する設定ファイル)をリポジトリに含めておくだけで、新しくプロジェクトに参加したメンバーも docker compose up の一発で開発環境が整います。

    「環境構築に3日かかる」というプロジェクトが、「5分で開発開始できる」プロジェクトに変わります。

    CI/CDパイプライン

    GitHub ActionsやCircleCIなどのCI/CDツールでも、Dockerは欠かせません。テストを実行する環境をDockerで統一することで、「ローカルではテストが通るのにCIでは失敗する」という問題を防げます。

    本番環境への展開

    AWSのECS(Elastic Container Service)やEKS(Elastic Kubernetes Service)、Google CloudのCloud Runなど、主要なクラウドサービスはDockerコンテナをそのままデプロイできる仕組みを提供しています。

    開発環境で動作確認したコンテナを、そのまま本番環境にデプロイできるため、「本番だけで起きる謎のバグ」が大幅に減ります。

    まとめ:Dockerは現代の開発に欠かせないスキル

    この記事では、Dockerの基本概念から実際の使い方までを解説しました。

    Dockerを学ぶことで得られるメリットを改めて整理すると、環境構築の時間が劇的に短縮される、「自分の環境では動く」問題から解放される、チームでの開発環境を簡単に統一できる、本番環境との差異によるトラブルが減る、といった点が挙げられます。

    20年前の開発現場を知る身としては、Dockerの登場は本当に革命的でした。環境構築に費やしていた膨大な時間を、本来の開発作業に使えるようになったのですから。

    まずは今回紹介した基本コマンドを実際に試してみてください。そこから徐々にDockerfileの書き方やDocker Composeの使い方を学んでいけば、開発効率は確実に向上します。

    次のステップとしては、Docker Composeを使った複数コンテナの管理や、実際のアプリケーションをDockerで動かす方法を学ぶことをおすすめします。