概要
Difyにはナレッジベースという機能があり、ドキュメントファイルをナレッジベースにアップロードすることでRAGを利用したAIアプリケーションを簡単に作成することができます。
ナレッジベースにアップロードしたファイルの保存先はデフォルトではローカルストレージになっています。
本記事では、Difyのナレッジベース保存先であるストレージをローカルストレージからOracle Cloud Infrastructure(OCI)のオブジェクトストレージに変更してみたので、その手順を紹介します。
前提条件
- Difyはセルフホスト版(Docker Compose)でデプロイ済みであること(筆者は自宅のRaspberry Pi上にデプロイしています)
- OCIのアカウントやコンパートメントを作成済みであること
環境、バージョン
- OCI:東京リージョン(ap-tokyo-1)
- Dify:Version 1.9.1
- Docker:Version 28.5.0
- Docker Compose:Version v2.40.0
- Raspberry Pi:Raspberry Pi 5 (8GB)、Ubuntu 24.04 LTS
手順
OCI側
- オブジェクトストレージの作成
- 顧客秘密キーの生成
- 「Amazon S3互換APIで指定されたコンパートメント」の変更
Dify側
- .envファイルの編集
- Difyの再起動
- privkeysの再作成
1. オブジェクトストレージの作成(OCI)
Difyのナレッジベース用のオブジェクトストレージ(バケット)を作成します。
特別な設定はないのでお好きな方法で作成してください。
ここではOCIコンソールで作成します。
オブジェクトストレージのバケット画面にてコンパートメント(ここではhandson)を指定し、バケットの作成
より、任意のバケット名(ここではdify-bucket)でバケットを作成します。
その他の設定値は全てデフォルトとしました。
2. 顧客秘密キーの生成(OCI)
Difyからオブジェクトストレージにアクセスするための認証情報として利用する顧客秘密キーを生成します。
ユーザプロファイル画面のトークンおよびキー>顧客秘密キー>秘密キーの生成
より、任意の名前(ここではdify key)で秘密キーを生成します。
秘密キーは二度と表示されないのでここでメモしてください。
3. 「Amazon S3互換APIで指定されたコンパートメント」の変更(OCI)
顧客秘密キーによるオブジェクトストレージへのアクセスはAmazon S3互換APIを利用しますが、Amazon S3にはコンパートメントの概念がないためAPIで利用するコンパートメントを指定する必要があります。(参考)
デフォルトではルートコンパートメントになっているので、オブジェクトストレージを作成したコンパートメントに変更します。
テナンシ詳細画面のアクション>オブジェクト・ストレージ設定の編集
より、「Amazon S3互換APIで指定されたコンパートメント」を変更します。(下図では「SWIFT APIで指定されたコンパートメント」も併せて変更していますが今回の手順には関係ありません。)
4. .envファイルの編集(Dify)
OCI側の手順が完了したら、Difyのストレージをローカルストレージからオブジェクトストレージに変更します。
DifyはDocker Composeの起動時に.env
ファイルに記載された環境変数を読み込むことで各種設定を行います。
.env
ファイルを編集し、ストレージを変更します。
cd dify/docker
vi .env
以下のように設定します。
STORAGE_TYPE=oci-storage
OCI_ENDPOINT=https://<ネームスペース名>.compat.objectstorage.<リージョン識別子>.oraclecloud.com
OCI_BUCKET_NAME=<作成したバケット名>
OCI_ACCESS_KEY=<顧客秘密キーのアクセスキー>
OCI_SECRET_KEY=<顧客秘密キーの秘密キー>
OCI_REGION=<リージョン識別子>
5. Difyの再起動(Dify)
.env
ファイルを反映させるために以下のコマンドを実行してDifyを再起動します。
docker compose down
docker compose up -d
6. privkeysの再作成(Dify)
ここまでの手順でDifyのストレージが変更されますが、変更先のストレージにprivkeys
が存在しないためInternal Server Errorが発生します。
以下のコマンドを実行して暗号化キーペアの再作成を行います。(参考)
docker exec -it docker-api-1 flask reset-encrypt-key-pair
上記コマンドを実行するとDifyで設定したLLMモデルのAPIキー設定がリセットされるので再設定してください。
ローカルストレージのprivkeysおよびナレッジファイルを移行するコマンドがあるようですが、2025/10時点では公式情報が確認できなかったため未検証です。(参考)
動作確認
Difyにログインし、通常通りナレッジベースの作成を行います。
今回はWikipediaの「ラブライブ!虹ヶ咲学園スクールアイドル同好会」の内容を抜粋しナレッジベースを作成しました。
ナレッジベースの作成後、オブジェクトストレージを確認するとupload_files/
にファイルがアップロードされています。
また、6.で再作成したprivkeys
もオブジェクトストレージに作成されています。
作成したナレッジベースを使ったRAGワークフローを試してみます。
⇒ コンテキストにない情報は指示通り「わかりません。」と回答している。
ちゃんとRAGができていることが確認できました。
まとめ
DifyのストレージをOCIオブジェクトストレージに変更する手順を紹介しました。
オブジェクトストレージを利用することで可用性やスケーラビリティの向上が期待されます。
OCIに関する情報はまだまだ少なく、Dify公式ドキュメントにもあまり記載がなかったことから今回検証を行ってみました。
お読みいただきありがとうございました。
(参考) 上手くいかない場合
.env
ファイル編集後、Difyが正常に起動しない
.env
ファイルで設定した環境変数が誤っている可能性があります。
docker compose ps
でコンテナの状態を確認し、docker logs docker-api-1
等でログを確認して誤りを修正してください。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
docker-api-1 langgenius/dify-api:1.9.1 "/bin/bash /entrypoi…" api 24 seconds ago Restarting (1) Less than a second ago
docker-db-1 postgres:15-alpine "docker-entrypoint.s…" db 25 seconds ago Up 22 seconds (healthy) 5432/tcp
docker-nginx-1 nginx:latest "sh -c 'cp /docker-e…" nginx 24 seconds ago Up 20 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp
docker-plugin_daemon-1 langgenius/dify-plugin-daemon:0.3.0-local "/bin/bash -c /app/e…" plugin_daemon 24 seconds ago Up 20 seconds 0.0.0.0:5003->5003/tcp, [::]:5003->5003/tcp
docker-redis-1 redis:6-alpine "docker-entrypoint.s…" redis 25 seconds ago Up 22 seconds (health: starting) 6379/tcp
docker-sandbox-1 langgenius/dify-sandbox:0.2.12 "/main" sandbox 25 seconds ago Up 22 seconds (health: starting)
docker-ssrf_proxy-1 ubuntu/squid:latest "sh -c 'cp /docker-e…" ssrf_proxy 25 seconds ago Up 22 seconds 3128/tcp
docker-weaviate-1 semitechnologies/weaviate:1.19.0 "/bin/weaviate --hos…" weaviate 25 seconds ago Up 22 seconds
docker-web-1 langgenius/dify-web:1.9.1 "/bin/sh ./entrypoin…" web 25 seconds ago Up 22 seconds 3000/tcp
docker-worker-1 langgenius/dify-api:1.9.1 "/bin/bash /entrypoi…" worker 24 seconds ago Restarting (1) Less than a second ago
docker-worker_beat-1 langgenius/dify-api:1.9.1 "/bin/bash /entrypoi…" worker_beat 24 seconds ago Restarting (1) 1 second ago
STORAGE_TYPE
Input should be 'opendal', 's3', 'aliyun-oss', 'azure-blob', 'baidu-obs', 'clickzetta-volume', 'google-storage', 'huawei-obs', 'oci-storage', 'tencent-cos', 'volcengine-tos', 'supabase' or 'local' [type=literal_error, input_value='oci', input_type=str]
⇒ STORAGE_TYPE
の設定値はoci
ではなくoci-storage
が正しい。
- STORAGE_TYPE=oci
+ STORAGE_TYPE=oci-storage
修正後、Difyを再起動してください。
docker compose down
docker compose up -d
ストレージ変更後Internal Server Errorが発生する
docker logs docker-api-1
でログを確認すると、作成したバケットにprivkeys
が見つからないことが分かります。
botocore.errorfactory.NoSuchKey: An error occurred (NoSuchKey) when calling the GetObject operation: The object 'privkeys/xxxxxxxxxxxxxxxxxxxxxxxxxxx/private.pem' was not found in the bucket 'dify-bucket'
6. privkeysの再作成
を実施してください。
(参考2) ローカルストレージの保存先
docker-compose.yaml
より、./volumes/app/storage
配下に保存されます。
api:
(省略)
volumes:
# Mount the storage directory to the container, for storing user files.
- ./volumes/app/storage:/app/api/storage
(省略)
ls
privkeys upload_files