n8nをセルフホストする方法:初心者から上級者まで

n8nをセルフホストする方法:初心者から上級者まで

数年前にn8nをセルフホストしようとしたとき、私は敷居の高さとプログラミング知識の必要性から断念しました。

しかし、近年のAI技術の進化やDifyとの連携が注目を集めていることから、再びn8nのセルフホストに挑戦してみることにしました。

この記事では、n8nをセルフホストするための3つの方法を紹介します。

n8nとは?

n8nは、ワークフローオートメーションツールであり、様々なサービスやAPIを連携させて自動化を実現するためのオープンソースプラットフォームです。

ZapierやIFTTTに似ていますが、セルフホストできる点が大きな特徴です。

Image in a image block

1. ローカルPCでのデプロイ(初心者向け)

最も簡単な方法は、Docker Composeを使用してローカルPCにn8nをデプロイすることです。以下のdocker-compose.ymlファイルを作成し、コマンドラインから実行するだけです。

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    ports:
      - 5678:5678
    volumes:
      - n8n-data:/home/node/.n8n
    environment:
      - TZ=Asia/Tokyo

volumes:
  n8n-data:

このファイルを保存したディレクトリで docker-compose up -d コマンドを実行すると、n8nが起動します。

起動後は、ブラウザから http://localhost:5678 にアクセスすることでn8nのUIを利用できます。

2. サブディレクトリでデプロイ(中級者向け)

すでに他のウェブサービスを運用していて、サブディレクトリでn8nを利用したい場合は、Traefikのようなリバースプロキシを活用することができます。

以下の設定では、/n8nというパスでn8nにアクセスできるようになります。

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    environment:
      - GENERIC_TIMEZONE=Asia/Tokyo
      - N8N_HOST=192.168.1.20
      - N8N_PROTOCOL=http
      - N8N_PORT=5678
      - N8N_PATH=/n8n
      - N8N_SECURE_COOKIE=false
    volumes:
      - ./n8n_data:/home/node/.n8n
    networks:
      - traefik_network
    mem_limit: 512m
    cpus: 0.5
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_network"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"
      - "traefik.http.routers.n8n.rule=PathPrefix(`/n8n`)"
      - "traefik.http.routers.n8n.entrypoints=web"
      - "traefik.http.middlewares.n8n-strip.stripprefix.prefixes=/n8n"
      - "traefik.http.routers.n8n.middlewares=n8n-strip"
volumes:
  n8n_data:
networks:
  traefik_network:
    external: true

この設定では、Traefikがすでに設定されていることを前提としています。traefik_networkという名前のDockerネットワークが存在し、Traefikがそのネットワーク上で動作している必要があります。

3. 独自ドメインでデプロイ(上級者向け)

本格的に利用する場合は、独自ドメインでn8nをデプロイするのがおすすめです。この方法では、SSL証明書を自動的に取得・更新し、Basic認証を設定してセキュリティを高めることができます。

まず、環境変数を設定するための.envファイルを作成します。

注意点:HASH値はhtpasswdコマンドで作成して貼り付けますが、$をエスケープする必要があるので、$$にする必要があります。

GENERIC_TIMEZONE=Asia/Tokyo
DB_TYPE=sqlite
WEBHOOK_URL=https://n8n.your.domain/
TRAEFIK_AUTH_HASH=admin:$$apr1$$GkEAMq34$$uQxxxxcZmW..l4zwbLrw
N8N_HOST=n8n.your.domain

次に、docker-compose.ymlファイルを作成します。

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    environment:
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - DB_TYPE=${DB_TYPE}
      - WEBHOOK_URL=${WEBHOOK_URL}
    volumes:
      - ./.data/n8n:/home/node/.n8n
      - ./.data/logs:/var/log/n8n
    networks:
      - traefik-network
    mem_limit: 512m
    cpus: 0.5
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik-network"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"
      # Web UI用ルーター(Basic認証あり)
      - "traefik.http.routers.n8n-ui.rule=Host(`${N8N_HOST}`) && !PathPrefix(`/webhook`) && !PathPrefix(`/api`) && !PathPrefix(`/webhook-test`)"
      - "traefik.http.routers.n8n-ui.service=n8n"
      - "traefik.http.routers.n8n-ui.tls=true"
      - "traefik.http.routers.n8n-ui.tls.certresolver=cloudflare"
      - "traefik.http.routers.n8n-ui.entrypoints=websecure"
      - "traefik.http.routers.n8n-ui.middlewares=n8n-auth"
      # API/Webhook用ルーター(Basic認証なし)
      - "traefik.http.routers.n8n-api.rule=Host(`${N8N_HOST}`) && (PathPrefix(`/webhook`) || PathPrefix(`/api`) || PathPrefix(`/webhook-test`))"
      - "traefik.http.routers.n8n-api.service=n8n"
      - "traefik.http.routers.n8n-api.tls=true"
      - "traefik.http.routers.n8n-api.tls.certresolver=cloudflare"
      - "traefik.http.routers.n8n-api.entrypoints=websecure"
      # Basic認証設定
      - "traefik.http.middlewares.n8n-auth.basicauth.users=${TRAEFIK_AUTH_HASH}"
networks:
  traefik-network:
    external: true
独自ドメインでのデプロイのポイント

独自ドメインでn8nを公開する場合、セキュリティ対策として以下の点に注意する必要があります:

  • Basic認証を設定して、管理画面へのアクセスを制限する
  • Webhook用のエンドポイントには認証を設定しない(外部サービスからのリクエストを受け付けるため)
  • API用のエンドポイントも同様に認証を設定しない
  • SSL証明書を使用して通信を暗号化する

上記の設定では、TraefikとCloudflareを利用してSSL証明書を自動的に取得・更新するようになっています。

また、UIへのアクセスにはBasic認証が必要ですが、WebhookやAPIへのアクセスには認証が不要になっています。

まとめ

n8nは非常に強力なワークフローオートメーションツールであり、セルフホストすることで自分だけの自動化環境を構築できます。

本記事で紹介した3つの方法から、自分のスキルレベルや用途に合った方法を選んでデプロイしてみてください。

AIとの連携やDifyなどの新しいサービスとの組み合わせにより、n8nの可能性はさらに広がっています。

ぜひ、自分だけの自動化ワークフローを作成して、日々の作業を効率化してみましょう。