DifyをDockerで試す!ローカル開発環境の作り方

はい、承知いたしました。DifyをDockerでローカル環境にセットアップする方法について、詳細な説明を含む記事を記述します。約5000語を目指し、手順、設定、背景知識、トラブルシューティングまで網羅します。


DifyをDockerで試す!ローカル開発環境の作り方 – 詳細解説

はじめに

近年、大規模言語モデル(LLM)の進化は目覚ましいものがあり、様々なアプリケーションへの応用が期待されています。しかし、LLMを組み込んだアプリケーションを開発するには、プロンプトエンジニアリング、知識ベースとの連携(RAG)、API連携、ユーザーインターフェースの構築など、多くの技術的な課題が存在します。

このような課題を解決し、開発者がより手軽に、そして非開発者でさえもLLMアプリケーションを構築できるように設計されたプラットフォームの一つが「Dify」です。Difyは、ノーコード/ローコードでLLMアプリケーション(チャットボット、テキスト生成アプリなど)を構築・運用できるオープンソースプロジェクトです。

Difyの魅力は、直感的なWebインターフェースを通じて、プロンプトの設計、データセットの管理、様々なLLMプロバイダー(OpenAI, Anthropic, Hugging Faceなど)との連携、さらにはエージェント機能やワークフローの構築までが可能になる点にあります。これにより、プログラミングの深い知識がなくても、アイデアを素早く形にし、LLMの能力を最大限に引き出したアプリケーションを開発できます。

この記事では、Difyをローカル環境で手軽に試すための方法として、Dockerを使った環境構築に焦点を当てて詳細に解説します。Dockerを使うことで、OSや既存の環境に依存することなく、クリーンなDify環境を迅速にセットアップできます。

なぜローカル環境で試すのか?
手軽さ: クラウド環境を用意したり、複雑なデプロイ手順を踏む必要がありません。数コマンドで環境が立ち上がります。
コスト: 開発・テスト段階ではクラウド利用料を気にする必要がありません。
プライバシー: 重要なデータやプロンプトを外部に送信することなく、閉じた環境で開発・検証できます。
自由な実験: ネットワーク環境や他システムへの影響を気にせず、様々な設定や機能を試すことができます。

特に、LLMのAPIキーなどの機密情報を扱うため、まずはローカルで安全に試せる環境を構築することは非常に有益です。

Difyの概要:LLMアプリ開発のための統合プラットフォーム

Difyは単なるプロンプト入力ツールではありません。LLMアプリケーション開発に必要な様々な要素を統合したプラットフォームです。その主な機能は以下の通りです。

  1. プロンプトオーケストレーション (Prompt Orchestration):

    • ユーザーからの入力(質問、指示など)を、LLMが効果的に処理できるように整形・加工する技術です。Difyでは、System Prompt、Context、Variables(変数)などを組み合わせることで、複雑なプロンプトを構造的に管理できます。
    • 異なるプロンプトテンプレートを簡単に作成・切り替えることができ、用途に応じた応答を生成させることが可能です。
  2. 知識ベース (Datasets/RAG):

    • Retrieval Augmented Generation (RAG) は、LLMが学習データにない最新情報や固有の知識を参照して応答を生成する技術です。
    • Difyでは、PDFドキュメント、テキストファイル、ウェブサイトなどの独自のデータをアップロードし、知識ベースとして利用できます。
    • アップロードされたデータは、セグメンテーション(分割)され、エンベディング(ベクトル化)されてベクトルデータベースに格納されます。
    • アプリケーション実行時、ユーザーの入力に関連する情報が知識ベースから検索され、プロンプトに組み込まれてLLMに渡されます。これにより、より正確で文脈に沿った応答が可能になります。
  3. エージェント (Agent):

    • LLMが単にテキストを生成するだけでなく、外部ツールを呼び出したり、一連のタスクを自律的に実行したりする機能です。
    • Difyでは、Function Calling(外部APIの呼び出し)や、複数のステップを踏んで目的を達成するワークフロー(Workflow)を構築できます。これにより、LLMに計算や外部情報検索など、より高度な処理を実行させることが可能になります。
  4. モデルプロバイダー連携:

    • OpenAI (GPTシリーズ), Anthropic (Claudeシリーズ), Azure OpenAI, Hugging Face Hub, Replicate, Wenxin (Baidu), Kimi (Moonshot AI)など、様々なLLMプロバイダーをサポートしています。
    • APIキーを設定するだけで、異なるモデルをアプリケーションで簡単に使い分けることができます。
  5. ユーザーインターフェースとAPI:

    • 構築したアプリケーションは、DifyのWeb UIを通じてテスト・利用できるだけでなく、APIとして公開することも可能です。
    • APIを利用すれば、独自のアプリケーションやサービスにDifyで構築したLLM機能を組み込むことができます。

Difyは、これらの機能を一つのプラットフォーム上で提供することで、LLMアプリケーション開発の複雑さを軽減し、アイデアから実用までを加速させることを目指しています。

なぜDifyのローカル構築にDockerを使うのか?

Difyはバックエンド(API)、フロントエンド(Web UI)、ワーカープロセス、データベース(PostgreSQL)、キャッシュ/キュー(Redis)など、複数のコンポーネントで構成されています。これらのコンポーネントは、それぞれ異なる依存関係(プログラミング言語のバージョン、ライブラリ、OSレベルの設定など)を持っています。

これらのコンポーネントをOSに直接インストールし、互いに連携するように設定するのは非常に手間がかかり、環境によっては競合や依存関係の問題が発生しやすいです。いわゆる「環境構築の地獄」です。

ここでDockerの出番です。Dockerを使うことには、以下のような多くのメリットがあります。

  1. 環境構築の容易さ: Difyは公式にDocker Composeファイルを提供しています。このファイルを使えば、必要なすべてのコンポーネントを定義された構成で一度に起動できます。複雑なインストールや設定の手順を大幅に省略できます。
  2. 依存関係の解消: 各コンポーネントはDockerコンテナとして実行されます。コンテナは、必要な依存関係(特定のPythonバージョン、ライブラリなど)をすべて含んだ独立した実行環境です。ホストOSの環境に影響されないため、「私の環境では動かない」という問題を避けることができます。
  3. 隔離性: 各コンポーネントはコンテナとして互いに隔離されています。これにより、DifyがホストOSの他のアプリケーションに影響を与えたり、逆にホストOSの環境がDifyに影響を与えたりすることがありません。クリーンな状態で開発・テストが行えます。
  4. 再現性: Docker Composeファイルは、環境の構成をコードとして記述したものです。このファイルを使えば、誰でも、どこでも、同じ環境を正確に再現できます。
  5. クリーンな開始と終了: 不要になったら、簡単なコマンド一つで関連するすべてのコンテナやネットワークを停止・削除できます。環境を汚しません。

このように、Dockerは複雑なアプリケーション構成を持つDifyのようなソフトウェアを、手軽に、確実に、そしてクリーンにローカル環境に構築するための最適なツールと言えます。

前提条件

DifyをDockerでローカル実行するために、以下の準備が必要です。

  1. Docker Desktopのインストール:
    • Windows、macOS、またはLinuxにDocker Desktopがインストールされている必要があります。
    • Windowsの場合はWSL2 (Windows Subsystem for Linux 2) が必要になることがあります。
    • Linuxの場合はDocker EngineとDocker Compose (またはDocker Compose V2) がインストールされている必要があります。
  2. Gitクライアント:
    • Difyのソースコード(Docker Composeファイルを含む)を取得するために使用します。
    • Gitがインストールされていない場合は、インストールしておいてください。
  3. システムリソース:
    • Difyの全コンポーネント(DB, Redis, API, Webなど)を同時に実行するため、それなりのリソースが必要です。
    • メモリ: 最低8GB、推奨16GB以上。特にRAGで大きなデータセットを扱う場合や、複数のLLMを連携させる場合はより多くのメモリが必要です。
    • CPU: 4コア以上のプロセッサ推奨。
    • ストレージ: Dockerイメージのダウンロード、DBデータ、ログなどに数GB以上の空き容量が必要です。データセットを大量にアップロードする場合は、さらに多くの容量が必要になります。
  4. 安定したインターネット接続:
    • Dockerイメージをダウンロードするために必要です。初回起動時は特に大量のデータをダウンロードするため、時間がかかる場合があります。

Docker Desktopのインストール方法

まだDockerをインストールしていない場合は、以下の公式ドキュメントを参照してインストールしてください。OSによって手順が異なります。

インストール後、ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してDockerが正しくインストールされ、実行できることを確認してください。

bash
docker --version
docker compose version # または docker-compose --version (V1の場合)

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

Difyのインストール手順 (Docker Compose使用)

それでは、実際にDifyをDocker Composeを使ってローカル環境にセットアップする手順を追っていきましょう。

ステップ1: Dify GitHubリポジトリのクローン

まず、Difyのソースコード一式をGitHubから取得します。これには、Docker Composeファイルや環境設定ファイルのサンプルが含まれています。

ターミナルまたはコマンドプロンプトを開き、Difyをインストールしたいディレクトリに移動して、以下のコマンドを実行します。

bash
git clone https://github.com/dify-ai/dify.git

これにより、カレントディレクトリに dify という名前の新しいディレクトリが作成され、その中にDifyの最新のソースコードがダウンロードされます。

ステップ2: クローンしたディレクトリへ移動

次に、クローンした dify ディレクトリの中に移動します。

bash
cd dify

このディレクトリの中に、必要なファイル(docker-compose.yaml, .env.example など)が含まれています。

ステップ3: .env ファイルの準備と設定

DifyのDocker Compose設定は、.env ファイルという環境設定ファイルに依存しています。このファイルには、データベースのパスワードやアプリケーションの秘密鍵、使用するLLMのAPIキーなどの重要な設定が含まれます。

リポジトリには .env.example というサンプルファイルが用意されていますので、これをコピーして .env ファイルを作成します。

bash
cp .env.example .env

次に、作成した .env ファイルをテキストエディタ(VS Code, Atom, Sublime Text, Nano, Vimなど)で開いて編集します。

“`bash

例えばVS Codeを使う場合

code .env
“`

.env ファイルの中身は、以下のような形式になっています(コメント行や一部の設定は省略しています)。

“`dotenv

.env ファイルの例 (一部抜粋)

Application configs

APP_KEY= # 秘密鍵、32文字以上のランダム文字列推奨
APP_SECRET= # 別の秘密鍵、32文字以上のランダム文字列推奨

…その他のアプリケーション設定…

Database configs

PostgreSQL service name in docker-compose.yaml is db

DB_DRIVER=postgresql
DB_HOST=db
DB_PORT=5432
DB_DATABASE=dify
DB_USERNAME=dify
DB_PASSWORD= # PostgreSQLのパスワード、安全なパスワードを設定
PG_MAINTAINER_PASSWORD= # DBメンテナンス用パスワード、DB_PASSWORDと別に設定推奨

Redis configs

Redis service name in docker-compose.yaml is redis

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD= # Redisのパスワード、安全なパスワードを設定

LLM configs

Add at least one LLM provider config here.

For example, for OpenAI:

OPENAI_API_KEY=your-openai-api-key

OPENAI_API_BASE=https://api.openai.com/v1

OPENAI_MODEL_NAME=gpt-4o # Default model for applications

…その他のLLMプロバイダー設定…

Web config

WEB_PORT=3000 # Web UIがリッスンするポート
API_PORT=5001 # APIがリッスンするポート

…その他の設定…

“`

最低限編集が必要な項目:

  • APP_KEY: アプリケーションの秘密鍵です。セキュリティのため、必ずデフォルトから変更し、32文字以上のランダムな文字列を設定してください。ランダムな文字列は、例えば以下のコマンドで生成できます。
    • Linux/macOS: openssl rand -base64 32 または head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo
    • オンラインツールでも生成可能です。
  • APP_SECRET: こちらも秘密鍵です。APP_KEY とは異なる32文字以上のランダムな文字列を設定してください。
  • DB_PASSWORD: PostgreSQLデータベースへの接続パスワードです。推測困難な、複雑なパスワードを設定してください。
  • PG_MAINTAINER_PASSWORD: データベースメンテナンス用のパスワードです。DB_PASSWORD とは異なるパスワードを設定することを推奨します。
  • REDIS_PASSWORD: Redisへの接続パスワードです。推測困難な、複雑なパスワードを設定してください。
  • LLM APIキー: Difyで使用したいLLMプロバイダーのAPIキーを設定します。例えばOpenAIを使用する場合、OPENAI_API_KEY=your-openai-api-key の行のコメントアウトを外し (# を削除)、your-openai-api-key の部分をあなたのOpenAI APIキーに置き換えます。最初はOpenAIだけでも構いませんし、他のプロバイダーのキーを設定しても構いません。ローカルでDifyのUIを試すだけであれば、後からUI上でLLMプロバイダーを設定することも可能です。しかし、実際にLLMを使った機能を試すには最低一つ以上の有効なLLMプロバイダー設定が必要です。

その他の考慮事項:

  • WEB_PORT: デフォルトでは3000番ポートでWeb UIにアクセスします。もし3000番ポートが他のアプリケーションで使用されている場合は、WEB_PORT の値を別の空いているポート番号に変更してください (例: WEB_PORT=8000)。
  • API_PORT: デフォルトでは5001番ポートでAPIがリッスンします。通常は変更不要ですが、必要に応じて変更できます。
  • LOG_LEVEL: ログの詳細度を設定できます。開発中は DEBUGINFO が便利ですが、ログ量が増えます。

重要: 設定したパスワードや秘密鍵は、忘れないように安全な場所に控えておいてください。また、.env ファイルには機密情報が含まれるため、Gitなどで共有する場合は十分に注意してください(通常は.gitignore.env が含まれていることを確認してください)。

.env ファイルの編集が完了したら、ファイルを保存して閉じます。

ステップ4: Docker Composeを使った起動

.env ファイルの設定が終われば、いよいよDifyの全コンポーネントをDocker Composeを使って起動します。dify ディレクトリにいることを確認し、以下のコマンドを実行してください。

bash
docker compose up -d

このコマンドの詳細は以下の通りです。

  • docker compose: Docker Composeを実行するコマンドです(V2の場合)。古いバージョンでは docker-compose となることもあります。
  • up: docker-compose.yaml ファイルに定義されたサービス(コンテナ)を起動するコマンドです。
  • -d: デタッチモード (detached mode) のオプションです。このオプションを付けると、コンテナはバックグラウンドで起動し、ターミナルはすぐに解放されます。オプションを付けない場合、コンテナのログがターミナルに表示され続けます(起動時の詳細を確認したい場合に便利です)。

初回起動時は、Dockerイメージのダウンロードやビルドが行われるため、インターネット接続速度やPCの性能によっては数分から数十分かかることがあります。画面には、各サービスのビルドや起動の進捗状況が表示されます。

すべてのサービスが正常に起動すると、特にエラーメッセージが表示されなければ成功です。

ステップ5: 起動確認

コンテナがバックグラウンドで起動していることを確認するには、以下のコマンドを使います。

bash
docker compose ps

または

bash
docker ps

これらのコマンドは、現在実行中のDockerコンテナの一覧を表示します。Difyに関連するコンテナ(dify-api, dify-web, dify-worker, dify-worker-long, dify-redis, dify-db, dify-rag-observerなど)がリストアップされ、それぞれの STATUSUp (...) となっていることを確認してください。もしどれかのコンテナが Exited (...) となっている場合は、起動に失敗しています。

起動に失敗しているコンテナがある場合は、そのコンテナのログを確認して原因を特定します。

bash
docker compose logs <service_name>

例: docker compose logs dify-api または docker compose logs dify-db

ログを確認する際は、ターミナルを全画面表示にしたり、必要ならログをファイルにリダイレクトしたりすると見やすいでしょう。特に起動直後のエラーメッセージに注目してください。環境変数の設定ミス(特にパスワード)、ポート競合、リソース不足などが原因で起動しないことが多いです。

ステップ6: Dify初期設定

すべてのコンテナが正常に起動したら、WebブラウザからDifyのWeb UIにアクセスし、初期設定を行います。

Webブラウザを開き、以下のURLにアクセスしてください。

http://localhost:<WEB_PORT>

<WEB_PORT>.env ファイルで設定したポート番号です。デフォルトでは 3000 なので、通常は以下のURLになります。

http://localhost:3000

初めてアクセスすると、Difyの初期設定画面が表示されます。ここで、管理者アカウントを作成します。

  • Email: 管理者として使用するメールアドレスを入力します。
  • Password: 管理者アカウントのパスワードを設定します。
  • Workspace Name: ワークスペースの名前を設定します。これはDify上でアプリケーションやデータセットを管理するための単位です。
  • Set up initial LLM provider: 必要に応じて、ここでLLMプロバイダー(OpenAIなど)のAPIキーを再度設定できます。.env ファイルで設定済みであれば、ここではスキップしても構いません。

必要な情報を入力し、「Setup」ボタンをクリックします。

設定が完了すると、Difyのダッシュボード画面が表示されます。これで、ローカルのDocker環境でDifyを使う準備がすべて整いました!

Difyの基本的な使い方

ダッシュボードにアクセスしたら、Difyの様々な機能を試してみましょう。主な使い方を紹介します。

  1. ダッシュボードの概要:

    • 画面左側のメニューバーから、Difyの主要な機能にアクセスできます。
    • Overview: ワークスペース全体の概要を表示します。
    • Explore: 他のユーザーが公開しているDifyアプリケーションを試すことができます(ローカル環境なので、インターネット上のものにアクセスします)。
    • Studio: 新しいアプリケーションを作成・管理したり、既存のアプリケーションを編集したりします。LLMアプリ開発の中心となる場所です。
    • Datasets: 知識ベースとして使用するデータを管理します。ドキュメントのアップロードや編集を行います。
    • Settings: ワークスペースの設定、メンバー管理、APIキー管理、モデルプロバイダー設定、履歴管理などを行います。
  2. アプリケーションの作成 (Studio):

    • 左メニューから「Studio」を選択し、「Create new app」ボタンをクリックします。
    • アプリケーションの種類を選択します。「Chat App」(チャットボット)か「Text Generation App」(テキスト生成)。最初は「Chat App」が分かりやすいでしょう。
    • アプリケーション名と説明を入力します。
    • 作成画面が表示されます。ここでプロンプト、コンテキスト、変数、RAGなどを設定します。
      • Prompt Enginnering: LLMへの指示(プロンプト)を設計します。「System Prompt」でAIの役割や基本的な指示を与え、「Context」でRAGデータなどを紐づけ、「Variables」でユーザー入力やその他の情報をプロンプトに埋め込むための変数を定義します。
      • Context: Datasetsで作成した知識ベースを紐づけます。これにより、ユーザーの質問に関連する情報が自動的に検索され、プロンプトに含められます。
      • Model: 使用するLLMプロバイダーとモデルを選択します。.env またはSettingsで事前に設定したプロバイダーが表示されます。
      • Plugins: 外部ツール連携(例: Web検索、計算など)を設定できます。
      • Workflow: より複雑な処理フロー(複数のステップや条件分岐)をGUIで設計できます。
    • 画面右側のプレビューエリアで、設定したプロンプトやRAGがどのように機能するかをテストできます。ユーザー入力を模倣して応答を確認しましょう。
    • 設定が完了したら、画面右上または左上の「Save」ボタンで保存し、必要であれば「Publish」で公開します(ローカル環境では公開しても外部からはアクセスできませんが、Dify UI上で他のユーザー(ローカルワークスペース内の)が使えるようになります)。
  3. 知識ベース (Datasets) の活用:

    • 左メニューから「Datasets」を選択し、「Create Dataset」ボタンをクリックします。
    • データセット名を入力し、作成します。
    • 作成したデータセットを開き、「Upload Document」または「Add from website」を選択します。
    • ローカルファイル(PDF, txt, docxなど)をアップロードするか、URLを指定します。
    • アップロードされたドキュメントは、セグメンテーション(意味のあるチャンクに分割)され、ベクトル化(エンベディング)されます。この処理には時間がかかる場合があります。
    • 処理が完了すると、データセット内のドキュメントやセグメントを確認できます。必要に応じて編集や削除も可能です。
    • このデータセットをStudioで作成するアプリケーションの「Context」に紐づけることで、RAG機能が有効になります。
  4. APIキーの発行と利用:

    • 作成したDifyアプリケーションを、独自のコードから呼び出したい場合は、APIキーを発行します。
    • 左メニューの「Settings」を開き、「API & SDK」を選択します。
    • 「Add API Key」ボタンをクリックし、APIキーを作成します。
    • 作成されたAPIキーを使って、Difyが提供するAPIエンドポイント(デフォルトでは http://localhost:5001/v1/...)にアクセスすることで、アプリケーションを実行したり、データセットを操作したりできます。
    • APIドキュメントはDifyのGitHubリポジトリや公式ドキュメントで確認できます。

これらの基本的な機能を試すことで、Difyでどのようなことができるのかを理解し、独自のアイデアを形にするための第一歩を踏み出せます。

Docker Composeファイルの詳細解説

Difyのローカル環境を支えているのは、ルートディレクトリにある docker-compose.yaml ファイルです。このファイルを理解することで、環境のカスタマイズやトラブルシューティングが容易になります。主要な部分を見てみましょう。

“`yaml

docker-compose.yaml (簡略化・主要部分抜粋)

version: ‘3.8’ # Docker Composeファイルのバージョン

services:
api: # DifyのバックエンドAPIサービス
# … ビルド設定またはイメージ指定 …
build:
context: .
dockerfile: ./docker/api/Dockerfile
# image: difyai/dify # 公開イメージを使う場合
ports:
– “${API_PORT:-5001}:5001” # ホストのAPP_PORT(または5001)をコンテナの5001にマッピング
env_file:
– .env # 環境変数ファイルを読み込み
environment:
# … コンテナ内部で使用する環境変数設定 …
API_URL: “http://api:${API_PORT:-5001}” # コンテナ内部でのAPI URL
# … LLM関連の環境変数は.envから読み込まれる …
depends_on: # 依存関係。これらのサービスが起動してからapiを起動
– db
– redis
volumes: # ボリュームマッピング
– ./data/logs:/app/logs # ホストのログディレクトリをコンテナにマッピング
# … その他のボリューム …
restart: unless-stopped # コンテナが停止した場合に再起動する設定

web: # Difyのフロントエンド(Web UI)サービス
# … ビルド設定またはイメージ指定 …
build:
context: .
dockerfile: ./docker/web/Dockerfile
# image: difyai/dify-web # 公開イメージを使う場合
ports:
– “${WEB_PORT:-3000}:80” # ホストのWEB_PORT(または3000)をコンテナの80にマッピング
env_file:
– .env # 環境変数ファイルを読み込み
environment:
# … コンテナ内部で使用する環境変数設定 …
REACT_APP_API_URL: “http://localhost:${API_PORT:-5001}” # フロントエンドがAPIにアクセスするURL
# ローカル開発ではlocalhostを使う
# REACT_APP_API_URL: “http://api:${API_PORT:-5001}” # コンテナ内部ネットワークの場合
depends_on: # 依存関係。apiサービスが起動してからwebを起動
– api

worker: # 非同期タスクワーカーサービス (例: ドキュメント処理、ワークフロー実行など)
# … ビルド設定またはイメージ指定 …
build:
context: .
dockerfile: ./docker/worker/Dockerfile
# image: difyai/dify # 公開イメージを使う場合
env_file:
– .env
environment:
TASK_QUEUE_TYPE: celery # 使用するキューシステム
# … その他の環境変数 …
depends_on:
– db
– redis
– api # APIへの依存関係

worker-long: # 時間のかかる非同期タスクワーカーサービス (例: RAG処理)
# workerとほぼ同じ設定だが、キューが異なる場合がある

redis: # Redisサービス (キャッシュ、キュー)
image: redis:7-alpine # Redisイメージを使用
ports:
– “6379:6379” # ホストの6379をコンテナの6379にマッピング (オプション)
volumes:
– dify_redis_data:/data # データを永続化するためのボリューム
environment:
# … Redisパスワード設定 …
REDIS_PASSWORD: “${REDIS_PASSWORD}”
restart: unless-stopped

db: # PostgreSQLデータベースサービス
image: postgres:15-alpine # PostgreSQLイメージを使用
ports:
– “5432:5432” # ホストの5432をコンテナの5432にマッピング (オプション)
volumes:
– dify_pg_data:/var/lib/postgresql/data # データを永続化するためのボリューム
environment:
POSTGRES_DB: “${DB_DATABASE:-dify}”
POSTGRES_USER: “${DB_USERNAME:-dify}”
POSTGRES_PASSWORD: “${DB_PASSWORD}”
# PG_MAINTAINER_PASSWORD: “${PG_MAINTAINER_PASSWORD}” # メンテナンスユーザーは不要な場合も
restart: unless-stopped

# rag-observer: # RAG処理監視サービス (バージョンによっては存在する)
# … 設定 …

volumes: # ボリュームの定義
dify_pg_data: # PostgreSQLデータ用ボリューム
driver: local
dify_redis_data: # Redisデータ用ボリューム
driver: local
# … その他のボリューム …

“`

各サービスの役割:

  • api: DifyのバックエンドAPIサーバーです。Web UIからのリクエストを受け付けたり、ワーカーにタスクを渡したり、データベースと連携したりします。LLMプロバイダーとの通信も担当します。
  • web: Difyのフロントエンド(Web UI)を提供するサーバーです。ユーザーがブラウザからアクセスしてDifyを操作する部分です。静的なファイルを提供し、APIサービスと通信します。
  • worker / worker-long: 非同期タスクを実行するワーカープロセスです。ドキュメントのアップロードと処理(セグメンテーション、エンベディング)、ワークフローの実行、一部のLLM呼び出しなど、時間がかかる処理を担当します。タスクキュー(通常はRedis)を介してAPIサービスと連携します。worker-long は特にRAG処理など、より長時間かかるタスクを処理するために分離されています。
  • redis: 高速なキー・バリュー型ストアです。Difyでは、キャッシュ、セッション管理、タスクキュー(Celeryのメッセージブローカー)として利用されます。
  • db (PostgreSQL): Difyのすべてのデータ(アプリケーション設定、プロンプト、ユーザー情報、データセットメタデータ、セグメント情報など)を保存するリレーショナルデータベースです。
  • rag-observer (バージョンによる): RAG関連の処理(特にファイル解析など)の進捗を監視するサービスかもしれません。最新のcomposeファイルで確認してください。

主要なDocker Compose構文:

  • version: Docker Composeファイルの形式バージョンを指定します。
  • services: 起動するコンテナのコレクションを定義します。各キーがサービス名(コンテナ名の一部になります)。
  • build: コンテナイメージをビルドするための設定です。context はビルドコンテキストのパス、dockerfile は使用するDockerfileを指定します。ローカルのソースコードからイメージをビルドする場合に使用します。
  • image: Docker Hubなどのコンテナレジストリから既存のイメージを取得して使用する場合に指定します。ローカルビルドかイメージ取得のどちらかを使います。公式がビルド済みイメージを提供している場合はこちらが手軽です。
  • ports: ポートマッピングを設定します。"ホスト側のポート:コンテナ側のポート" の形式で指定します。例えば "${WEB_PORT:-3000}:80" は、「ホスト側の ${WEB_PORT} 環境変数で指定されたポート(未指定なら3000)を、コンテナ側の80番ポートにマッピングする」という意味です。Webサーバーの多くはデフォルトで80番ポートを使用します。
  • env_file: 環境変数を定義したファイルを指定します。指定されたファイル(.env)の内容が、そのサービスのコンテナ内の環境変数として設定されます。これにより、機密情報などをYAMLファイル本体から分離できます。
  • environment: env_file とは別に、YAMLファイル内に直接環境変数を設定する場合に使用します。ここでは、コンテナ内部でのサービス間通信のためのURL設定などが行われています。${VAR:-default} の形式で、環境変数が設定されていない場合のデフォルト値を指定できます。
  • depends_on: サービスの依存関係を指定します。例えば api サービスは dbredis に依存しているため、Docker Composeは dbredis が起動してから api を起動します。
  • volumes: データを永続化するためのボリュームマッピングを設定します。
    • ホストパス:コンテナパス: ホストマシン上の特定のディレクトリとコンテナ内のディレクトリを同期します。例えば ./data/logs:/app/logs は、ホストの dify/data/logs ディレクトリをコンテナ内の /app/logs ディレクトリにマッピングし、ログファイルをホストに残します。
    • ボリューム名:コンテナパス: Docker管理の匿名または名前付きボリュームを使用します。dify_pg_data:/var/lib/postgresql/data は、dify_pg_data という名前付きボリュームをDBコンテナのデータディレクトリにマッピングします。このボリュームはDockerが管理し、コンテナを停止・削除してもボリューム自体はデフォルトでは削除されません。データベースのデータはこのボリュームに保存されるため、コンテナを再作成してもデータが失われることはありません。
  • restart: コンテナが停止した場合の再起動ポリシーを設定します。unless-stopped は、ユーザーが手動で停止しない限り、エラーなどで停止した場合に自動的に再起動します。
  • volumes: ファイルの末尾にある volumes セクションは、名前付きボリュームを定義します。ここで定義されたボリュームは、services セクションで参照されます。

この docker-compose.yaml ファイルと .env ファイルによって、Difyの複雑なサービス構成がシンプルに定義され、簡単に起動できるようになっています。

カスタマイズと高度な設定

ローカル環境をより便利に使うためのカスタマイズや、知っておくと良い設定について説明します。

  1. ポート番号の変更:

    • デフォルトの WEB_PORT (3000) や API_PORT (5001) が既に他のアプリケーションで使用されている場合、.env ファイルの該当行を変更するだけです。
    • 例: WEB_PORT=8000 に変更すれば、http://localhost:8000 でアクセスできるようになります。
    • 変更後、docker compose down で既存コンテナを停止・削除し、docker compose up -d で再起動が必要です。
    • docker-compose.yaml ファイルの ports セクションは ${VAR:-default} 形式で環境変数を参照しているため、直接YAMLファイルを編集する必要はありません(.env ファイル優先)。
  2. データ永続化の確認:

    • docker-compose.yamlvolumes セクションと各サービスの volumes マッピングにより、データベース (dify_pg_data) とRedis (dify_redis_data) のデータは永続化されるように設定されています。
    • これにより、docker compose down でコンテナを停止・削除しても、次に docker compose up で起動した際に以前のデータが引き継がれます。
    • Docker Desktop UIや docker volume ls コマンドで作成されたボリューム一覧を確認できます。docker volume inspect <volume_name> で、そのボリュームがホストマシンのどこに保存されているかなどの詳細情報を確認することも可能です。
    • 注意: ボリュームを削除すると、保存されていたデータは完全に失われます。データのリセットが必要な場合以外は、ボリュームの削除は慎重に行ってください (docker volume rm <volume_name>)。
  3. LLMプロバイダーの追加と管理:

    • .env ファイルに複数のLLMプロバイダーのAPIキーを設定できます(例: OPENAI_API_KEY, ANTHROPIC_API_KEY, AZURE_OPENAI_API_KEY など)。
    • または、DifyのWeb UIの「Settings」->「Model Providers」から、GUIでプロバイダーを追加・管理することもできます。UIで設定した内容はデータベースに保存されます。
    • 複数のプロバイダーを設定した場合、アプリケーション作成時にどのモデルを使用するか選択できるようになります。
    • 注意: 無料枠を超えると課金が発生します。APIキーの管理と利用状況の確認を怠らないようにしましょう。
  4. コンテナ内部ネットワーク:

    • Docker Composeで起動された各サービスは、デフォルトで一つの内部ネットワークを共有します。このネットワーク内では、サービス名(例: api, db, redis)を使って互いに通信できます。
    • docker-compose.yamlREACT_APP_API_URL: "http://localhost:${API_PORT:-5001}" のような設定は、フロントエンドがブラウザからバックエンドAPIにアクセスする際に、ホストの localhost と公開ポートを使うことを意味します。一方、バックエンドがデータベースにアクセスする際の DB_HOST=db のような設定は、内部ネットワーク内でサービス名を使ってアクセスしていることを意味します。

トラブルシューティング

Dockerを使ったセットアップでも、予期せぬ問題が発生することがあります。ここでは、よくある問題とその対処法を紹介します。

1. コンテナが起動しない、すぐに終了してしまう

  • 症状: docker compose ps を実行したときに、特定のサービス(特に api, web, worker)の STATUSExited (...) となっている。
  • 原因: 設定ミス、ポート競合、依存サービスの起動失敗、リソース不足など。
  • 対処法:
    • docker compose up-d オプションなしで実行し、起動プロセス中に表示されるログを確認します。エラーメッセージが表示されていないか注意深く見てください。
    • 特定のサービスのログを確認します: docker compose logs <service_name>. 例えば、api サービスが起動しない場合は docker compose logs api を確認してください。
    • ログの読み方: エラーメッセージ(”Error”, “Failed”, “Permission denied”, “Address already in use”, “FATAL: password authentication failed” などを含む行)を探します。スタックトレースが表示されていることもあります。
    • よくあるエラー:
      • Address already in use: ポート競合です。.envWEB_PORTAPI_PORT を別のポート番号に変更し、docker compose down -> docker compose up -d で再起動してください。
      • FATAL: password authentication failed for user "dify" (DBログ): .envDB_PASSWORD と、DBコンテナ起動時に設定されたパスワードが一致していません。.env を確認・修正し、DBボリュームを削除してから再起動が必要な場合があります(データが失われるので注意)。あるいは、api サービスの DB_PASSWORD 環境変数設定が .env から正しく読み込まれていない可能性も確認します。
      • redis.exceptions.AuthenticationError: Invalid password (API/Workerログ): .envREDIS_PASSWORD と、Redisコンテナ起動時に設定されたパスワードが一致していません。DBと同様に.env を確認・修正します。
      • Container ... unhealthy: ヘルスチェックに失敗しています。サービスのログで具体的な失敗理由を確認してください。DBやRedisへの接続失敗が多いです。
    • リソース不足: 特にメモリ不足はコンテナの起動失敗や予期せぬ終了を引き起こします。Docker Desktopのリソース設定を確認し、割り当てを増やしてみてください。

2. Web UIにアクセスできない

  • 症状: ブラウザで http://localhost:<WEB_PORT> にアクセスしても「サイトにアクセスできません」「接続が拒否されました」といったエラーが表示される。
  • 原因: web コンテナが起動していない、指定したポート番号が間違っている、ファイアウォールがブロックしているなど。
  • 対処法:
    • docker compose psdify-web コンテナが Up 状態になっているか確認します。起動していない場合は、前述の「コンテナが起動しない」の対処法を参照してください。
    • ブラウザのアドレスバーに入力したポート番号が、.env で設定した WEB_PORT と一致しているか確認します。
    • PCのファイアウォール設定を確認し、指定したポート(デフォルト3000など)へのアクセスが許可されているか確認します。
    • 別のブラウザやシークレットウィンドウで試してみる。

3. 初期設定画面でエラーが発生する、LLMが使えない

  • 症状: 初期設定でアカウント作成時にエラーが出る、またはダッシュボードに進んだ後、アプリケーション作成やテストでLLMが応答しない、エラーが表示される。
  • 原因: データベース接続問題、Redis接続問題、LLM APIキーの設定ミス、APIキーが無効、ネットワーク問題(LLMプロバイダーのエンドポイントに接続できない)。
  • 対処法:
    • docker compose logs api を確認します。DBやRedisへの接続エラー、LLMプロバイダーへの接続エラー、認証エラー(APIキー不正)などのログが出力されている可能性が高いです。
    • .env ファイルの DB_PASSWORD, REDIS_PASSWORD, およびLLMプロバイダー(例: OPENAI_API_KEY)の設定が正しいか再度確認します。コピペミスや不要な空白が入っていないか注意してください。
    • LLMプロバイダーのAPIキーが有効であるか、利用制限にかかっていないか確認します。必要であれば、プロバイダーのサイトでAPIキーを再発行したり、利用状況を確認したりしてください。
    • PCがインターネットに接続されており、LLMプロバイダーのエンドポイント(例: api.openai.com)にアクセスできるか確認します。

4. パフォーマンスが非常に遅い

  • 症状: Web UIの応答が遅い、ドキュメントのアップロードや処理に時間がかかりすぎる、LLMの応答が遅い(これはLLMプロバイダー側の問題の可能性もありますが)。
  • 原因: PCのリソース不足、特にメモリ不足やCPU負荷が高い。Docker Desktopへのリソース割り当てが少ない。大量のデータを処理している。
  • 対処法:
    • Docker Desktopの「Resources」(Windows/macOS)またはDocker Engineの設定(Linux)で、Dockerに割り当てるメモリ、CPUコア数、ディスク容量を確認し、可能であれば増やします。
    • PC全体のタスクマネージャーやアクティビティモニターで、CPUやメモリの使用率を確認します。Difyのコンテナが高いリソースを消費しているか確認します。
    • 同時に多数のコンテナを実行している場合は、不要なコンテナを停止します。
    • RAGで非常に大きなドキュメントや多数のドキュメントを扱う場合、処理に時間がかかるのは正常です。処理中のコンテナ(worker, worker-long)のログを確認して、エラーが出ていないか確認します。

5. 既存のデータが壊れた、環境をクリーンにしたい

  • 症状: データベース関連のエラーが頻繁に出る、Difyの内部状態がおかしい。最初からやり直したい。
  • 原因: DBボリュームのデータ破損、設定ファイルの不整合など。
  • 対処法:
    • Difyのコンテナと関連ボリュームをすべて削除し、最初から再構築します。
    • docker compose down --volumes
      • down: Docker Composeで起動したサービスをすべて停止・削除します。
      • --volumes: これまでサービスが利用していた名前付きボリューム(dify_pg_data, dify_redis_dataなど)も同時に削除します。これにより、Difyに保存していたデータはすべて失われます。
    • ボリューム削除の確認メッセージが表示されるので、内容を理解した上で続行します。
    • ボリューム削除後、再度 docker compose up -d を実行すれば、まっさらな状態でDify環境が再構築されます。

Difyのアップデート手順

Difyは活発に開発が進められています。新しい機能や改善、バグ修正を取り込むためには、定期的にアップデートを行うことを推奨します。Docker Composeを使ったアップデート手順は比較的簡単です。

  1. 既存のDifyコンテナを停止・削除:
    bash
    cd dify # difyリポジトリのルートディレクトリにいることを確認
    docker compose down

    これにより、現在実行中のDifyに関連するすべてのコンテナが停止・削除されます。--volumes オプションは付けないでください。付けた場合、データベースなどのデータが削除されてしまいます。

  2. 最新のソースコードを取得:
    DifyのGitHubリポジトリから最新の変更をプルします。
    bash
    git pull origin main

    これにより、ローカルの dify ディレクトリのコードが最新の状態になります。main ブランチ以外を使用している場合は、適宜ブランチ名を変更してください。

  3. .env.example.env の差分を確認:
    新しいバージョンで .env.example に設定項目が追加されている可能性があります。git diff .env.example などのコマンドを使って、.env.example とあなたの .env ファイルの差分を確認してください。新しい設定項目があれば、あなたの .env ファイルにも追加・設定してください。特に新しい環境変数や設定が追加されているかどうか確認することが重要です。

  4. 新しいバージョンで再起動:
    最新のソースコードと .env ファイルで、再度Dify環境を起動します。
    bash
    docker compose up -d

    docker compose up コマンドは、必要に応じて新しいバージョンのDockerイメージをビルドまたはダウンロードし、コンテナを再作成します。DifyのDBスキーマに変更がある場合、api コンテナの起動時に自動的にマイグレーション処理が行われることがあります。起動ログを注意深く見て、エラーが出ていないか確認してください。

注意点:
* メジャーバージョンアップなど、大きな変更があった場合は、公式のリリースノートやドキュメントを確認し、特別な手順が必要ないか確認することを推奨します。
* DBスキーマの変更を伴うアップデートの場合、マイグレーションが失敗する可能性もゼロではありません。重要なデータがローカルDBにある場合は、アップデート前にDBボリュームのバックアップを取ることも検討してください(Dockerボリュームのバックアップ方法は別途調べる必要があります)。

ローカル環境での注意点

Dockerを使ってローカルに構築したDify環境は、開発やテストには最適ですが、本番運用を想定したものではありません。以下の点に注意してください。

  • セキュリティ: デフォルト設定では、Difyは localhost やローカルネットワーク上の特定のポートでリッスンします。インターネットに直接公開する設定にはなっていません。もし外部からアクセス可能にしたい場合は、リバースプロキシ(Nginx, Caddyなど)を介したり、ファイアウォールで保護したり、HTTPSを有効にしたりするなど、厳重なセキュリティ対策が必要です。しかし、個人利用目的でのローカル環境をインターネットに公開することは、セキュリティリスクが非常に高いため推奨しません
  • 可用性とスケーラビリティ: Docker Composeは複数のコンテナを協調して動かすツールですが、これは開発・単一サーバー用途向けです。本番環境では、複数のサーバーに負荷分散したり、データベースを冗長化したり、Kubernetesのようなコンテナオーケストレーションツールを使用したりするなど、高い可用性やスケーラビリティを実現するための別の設計が必要です。
  • リソース消費: Difyの各コンポーネント(特にDB, Redis, Worker)は、特に負荷が高い処理(大量のドキュメント処理、複雑なワークフロー実行)を行う際に、それなりのCPUやメモリを消費します。PCのリソースが十分でない場合、動作が不安定になったり、他のアプリケーションのパフォーマンスに影響を与えたりする可能性があります。

まとめ

この記事では、DifyをDockerを使ってローカル環境にセットアップする詳細な手順を解説しました。DifyはLLMアプリケーション開発を劇的に効率化する強力なプラットフォームであり、Dockerを使うことでその複雑な構成を手軽に、そしてクリーンにローカルで実現できることがお分かりいただけたかと思います。

ローカル環境でDifyを構築することで、クラウド利用料を気にすることなく、自由にLLMの能力を試したり、プロンプトやRAGの設定を実験したり、独自のアプリケーション開発のアイデアを検証したりすることが可能になります。

Docker Composeファイルの詳細や、一般的なトラブルシューティングについても触れました。これらの知識があれば、発生した問題の多くの原因を特定し、解決に近づけるはずです。

ローカルでの実験を通じてDifyの可能性を感じたら、次はより高度な機能(ワークフロー、エージェントツール開発)を試したり、開発したアプリケーションを外部に公開するためのクラウド環境へのデプロイを検討したりと、次のステップに進むことができます。

DifyとDockerを活用して、創造的なLLMアプリケーション開発を楽しんでください!

参考資料

  • Dify公式GitHubリポジトリ: https://github.com/dify-ai/dify – 最新のソースコード、Docker Composeファイル、.env.example、Issueトラッカーなど。
  • Dify公式ドキュメント: https://docs.dify.ai/ – 機能の詳細、APIドキュメント、デプロイガイドなど。
  • Docker公式ドキュメント: https://docs.docker.com/ – Dockerのインストール、コマンド、概念など。

これで約5000語の詳細な記事になります。手順、設定、背景、トラブルシューティングまで網羅し、読者がDifyをDockerでローカルにセットアップし、基本的な使い方を理解できる内容を目指しました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール