LinuxとDockerで始めるDify構築・設定ガイド:実践的なAIワークフローとRAG基盤の構築

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

LangChainやLlamaIndexを使ってRAGパイプライン全体を一から自作するのは、特にUIの構築、セッション管理、権限管理などを考慮すると膨大な時間がかかります。社内50名以上のメンバー向けにDifyを導入して6ヶ月間運用した結果、利便性と柔軟性のバランスが最も優れたオンプレミス向けLLMOpsプラットフォームであると実感しました。

1. クイックスタート:5分でDifyをデプロイする

dockerおよびdocker composeがインストール済みのUbuntu 22.04または24.04のVPSを用意します。手順はわずか4ステップです:

# 1. 公式リポジトリをクローン
git clone https://github.com/langgenius/dify.git
cd dify/docker

# 2. テンプレートから環境変数ファイルを作成
cp .env.example .env

# 3. イメージを取得して全サービスを起動
docker compose up -d

# 4. コンテナの稼働ステータスを確認
docker compose ps

各サービスが起動するまで1〜2分ほど待ちます。すべてのコンテナのステータスがUpになったら、ブラウザを開いて以下のアドレスにアクセスします:

http://<サーバーのIPアドレス>/install

初期管理者アカウントを作成してセットアップを完了すれば、Studioの管理画面に直接アクセスできます。

2. サービス構成とコア環境変数

Difyは単一のコンテナではなく、複数のマイクロサービスが密接に連携するシステム構成となっています。

主要なバックグラウンドサービス

  • dify-web (Nginx/Frontend):ユーザーおよび管理者向けのNext.js製フロントエンド画面。
  • dify-api:ビジネスロジックの処理、LLMのオーケストレーション、データ抽出を担うPythonバックエンド(Flask/Celery)。
  • dify-sandbox:LLMが生成したPython/Node.jsコードを安全に実行するための分離サンドボックス環境。
  • Vector Database:ベクター埋め込みの保存と検索を行うため、デフォルトでWeaviate(またはQdrant)を統合。
  • PostgreSQL & Redis:メタデータや会話履歴の保存、および非同期タスクキューの管理。

直ちに変更すべき環境変数(.env)

公開環境ではデフォルト設定を絶対に使用しないでください。.envファイルを開き、以下の項目を変更します:

# セッション暗号化用のランダムなシークレットキーを生成(実行例: openssl rand -base64 42)
SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY789

# Nginxリバースプロキシ経由で使用する実際のドメインを指定
CONSOLE_WEB_URL=https://dify.example.com
CONSOLE_API_URL=https://dify.example.com
SERVICE_API_URL=https://dify.example.com
APP_WEB_URL=https://dify.example.com

# ナレッジベース用ドキュメントのアップロード上限を引き上げ(デフォルトは15MB)
UPLOAD_FILE_SIZE_LIMIT=50

3. NginxリバースプロキシとSSLの設定

ポート80を直接インターネットに公開するのはセキュリティ上のリスクがあります。DifyをNginxリバースプロキシの背後に配置し、Let’s EncryptのSSL証明書を設定することをおすすめします。

以下は、ストリーミングデータ通信に対応した標準的なNginx設定ファイルの例です:

server {
    listen 80;
    server_name dify.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name dify.example.com;

    ssl_certificate /etc/letsencrypt/live/dify.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dify.example.com/privkey.pem;

    client_max_body_size 50M;

    location / {
        proxy_pass http://127.0.0.1:80;
        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;

        # チャットボットのスムーズな文字単位ストリーミング(SSE)のためバッファリングを必ず無効化
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 300s;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

proxy_buffering off;とproxy_read_timeout 300s;の2つのパラメータは必須です。バッファリングが有効になっていると、Server-Sent Events(SSE)のレスポンスがボットによる全文生成完了まで保持されてしまい、リアルタイムなタイピング出力体験が損なわれます。

4. 本番運用における実践ノウハウ

メモリ不足やシステムのボトルネックを防ぐための、3つの実践的なポイントを紹介します:

1. ハードウェアスペックの見積もり

Difyを安定稼働させるための最小推奨スペックは4 vCPU・8GB RAMです。チーム内で100〜300ページ規模の大容量PDFファイルを同時に複数アップロードすると、テキスト解析を行うCeleryワーカーが急速にメモリを消費します。その場合は、OOM(Out Of Memory)エラーを防ぐためにも、最低16GBのRAMと4GBのスワップメモリを確保してください。

2. データ規模に応じたベクターDBの分離

同梱されているWeaviateコンテナは、ドキュメントチャンク数が10万件未満の規模に適しています。この上限を超えるとベクター検索のレスポンスが低下し始めます。その際は、VECTOR_STORE変数の設定を変更し、専用サーバー上で独立稼働するQdrantやMilvusなどのクラスタへ移行することをおすすめします。

3. データの自動バックアップ

データベースおよびアップロードファイルはすべてdify/docker/volumesディレクトリに保存されています。障害に備えて毎晩データベースをダンプするcronジョブを設定しておきましょう:

# Postgresデータベース全体のダンプを取得
docker compose exec -T db pg_dumpall -U postgres > /backup/dify_db_$(date +%F).sql

DifyはUI、権限管理、モデル連携の基盤を包括的かつスマートに解決してくれます。これにより、開発者はプロンプトの微調整やAIエージェントのビジネスロジック最適化に集中することができます。

Share: