0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DifyのストレージをOCIオブジェクトストレージに変更する

Posted at

概要

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側

  1. オブジェクトストレージの作成
  2. 顧客秘密キーの生成
  3. 「Amazon S3互換APIで指定されたコンパートメント」の変更

Dify側

  1. .envファイルの編集
  2. Difyの再起動
  3. privkeysの再作成

1. オブジェクトストレージの作成(OCI)

Difyのナレッジベース用のオブジェクトストレージ(バケット)を作成します。
特別な設定はないのでお好きな方法で作成してください。
ここではOCIコンソールで作成します。

オブジェクトストレージのバケット画面にてコンパートメント(ここではhandson)を指定し、バケットの作成より、任意のバケット名(ここではdify-bucket)でバケットを作成します。
その他の設定値は全てデフォルトとしました。
image.png

image.png

2. 顧客秘密キーの生成(OCI)

Difyからオブジェクトストレージにアクセスするための認証情報として利用する顧客秘密キーを生成します。

ユーザプロファイル画面のトークンおよびキー>顧客秘密キー>秘密キーの生成より、任意の名前(ここではdify key)で秘密キーを生成します。
image.png

image.png

秘密キーは二度と表示されないのでここでメモしてください。

対応するアクセスキーは以下からコピーできます。
image.png

3. 「Amazon S3互換APIで指定されたコンパートメント」の変更(OCI)

顧客秘密キーによるオブジェクトストレージへのアクセスはAmazon S3互換APIを利用しますが、Amazon S3にはコンパートメントの概念がないためAPIで利用するコンパートメントを指定する必要があります。(参考)

デフォルトではルートコンパートメントになっているので、オブジェクトストレージを作成したコンパートメントに変更します。

テナンシ詳細画面のアクション>オブジェクト・ストレージ設定の編集より、「Amazon S3互換APIで指定されたコンパートメント」を変更します。(下図では「SWIFT APIで指定されたコンパートメント」も併せて変更していますが今回の手順には関係ありません。)
image.png

image.png

image.png

4. .envファイルの編集(Dify)

OCI側の手順が完了したら、Difyのストレージをローカルストレージからオブジェクトストレージに変更します。
DifyはDocker Composeの起動時に.envファイルに記載された環境変数を読み込むことで各種設定を行います。
.envファイルを編集し、ストレージを変更します。

cd dify/docker
vi .env

以下のように設定します。

.env
STORAGE_TYPE=oci-storage

OCI_ENDPOINT=https://<ネームスペース名>.compat.objectstorage.<リージョン識別子>.oraclecloud.com
OCI_BUCKET_NAME=<作成したバケット名>
OCI_ACCESS_KEY=<顧客秘密キーのアクセスキー>
OCI_SECRET_KEY=<顧客秘密キーの秘密キー>
OCI_REGION=<リージョン識別子>

OCI_ENDPOINTについてはこちらのページを参照してください。
リージョン識別子についてはこちらのページを参照してください。

ネームスペース名はテナンシ詳細画面で確認できます。
image.png

5. Difyの再起動(Dify)

.envファイルを反映させるために以下のコマンドを実行してDifyを再起動します。

dify/docker
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の「ラブライブ!虹ヶ咲学園スクールアイドル同好会」の内容を抜粋しナレッジベースを作成しました。
image.png

ナレッジベースの作成後、オブジェクトストレージを確認するとupload_files/にファイルがアップロードされています。
また、6.で再作成したprivkeysもオブジェクトストレージに作成されています。
image.png

作成したナレッジベースを使ったRAGワークフローを試してみます。
image.png

image.png
⇒ コンテキストの情報をもとに回答している。

image.png
⇒ コンテキストにない情報は指示通り「わかりません。」と回答している。

ちゃんとRAGができていることが確認できました。

まとめ

DifyのストレージをOCIオブジェクトストレージに変更する手順を紹介しました。
オブジェクトストレージを利用することで可用性やスケーラビリティの向上が期待されます。

OCIに関する情報はまだまだ少なく、Dify公式ドキュメントにもあまり記載がなかったことから今回検証を行ってみました。

お読みいただきありがとうございました。

(参考) 上手くいかない場合

.envファイル編集後、Difyが正常に起動しない

.envファイルで設定した環境変数が誤っている可能性があります。
docker compose psでコンテナの状態を確認し、docker logs docker-api-1等でログを確認して誤りを修正してください。

docker compose ps
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
docker logs docker-api-1 (例、抜粋)
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が正しい。

.env
- STORAGE_TYPE=oci
+ STORAGE_TYPE=oci-storage

修正後、Difyを再起動してください。

dify/docker
docker compose down
docker compose up -d

ストレージ変更後Internal Server Errorが発生する

docker logs docker-api-1でログを確認すると、作成したバケットにprivkeysが見つからないことが分かります。

docker logs docker-api-1 (例、抜粋)
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配下に保存されます。

docker-compose.yaml
api:
    (省略)
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - ./volumes/app/storage:/app/api/storage
    (省略)
./volumes/app/storage
ls
privkeys  upload_files
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?