セルフホステッドのDifyでPythonのライブラリを利用する方法

セルフホステッド(docker)でローカルに構築したDifyのワークフローのコードブロックにnumpyやduckduckgo-searchのようなサードーパーティ製ライブラリを利用すると

Error: Operation not permitted

のようなエラーが出る問題についての解決策。


対応

  1. Docker Composeファイルの修正

    ホスト上の./docker/docker-compose.yamlファイルをテキストエディタで開き、サンドボックスで許可するシステムコールをホストの環境変数とマッピングする。

    services:
      sandbox:
        environment:
          ALLOWED_SYSCALLS: ${SANDBOX_ALLOWED_SYSCALLS:-}
  2. 許可するsyscallsの設定

    ホストのコンソールで以下のコマンドを実行し、サンドボックスで許可するシステムコール番号を環境変数として登録する。
    (永続化したい場合は必要に応じて~/.bashrc等に登録してください。)

    この設定はDifyサンドボックスで全てのシステムコール番号(0〜500)を許可します。
    コンテナの隔離性が失われることで悪意あるコードが特権操作を実行可能になるなど、ホストのセキュリティも著しく低下することになるため、ローカル環境以外では絶対に利用しないでください。

    システムコール番号はカーネルによって変わる可能性があります。

    export SANDBOX_ALLOWED_SYSCALLS=$(seq -s, 0 500)
  3. Pythonライブラリの登録

    ホスト上の./docker/volumes/sandbox/dependencies/python-requirements.txtファイルをテキストエディタで開き、Difyのコードブロックで使用したいライブラリ名を登録する。

    numpy
    duckduckgo-search
  4. Difyの再起動

    docker compose down && docker compose up -d


検証ワークフロー

テストワークフローは以下のとおり。
STARTに入力パラメータはなく、NUMPYとDUCKDUCKGOが返した値をそのままENDで出力しています(LLMは使っていません)。

file

コードブロック(NUMPY):

import numpy as np

def main() -> dict:
    # NumPyで1から10までの配列の平均を計算して返す
    arr = np.arange(1, 11)
    avg = np.mean(arr)

    return {
        "result": avg,
    }

コードブロック(DUCKDUCKGO):

from duckduckgo_search import DDGS

def main() -> dict:
    # DuckDuckGoで検索した結果を返す
    ddgs = DDGS()
    results = list(ddgs.text('Difyとは?', region='jp-jp', max_results=1))

    return {
        "result": results[0]['body'] if results else None
    }

ワークフロー実行結果

以下の通りNumpyの計算結果とDuckDuckGoのWEB検索結果を出力することができました。

file


参考ウェブサイトなど


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする