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エージェントのビジネスロジック最適化に集中することができます。

