1.前言
? dify 1.x版本以后插件功能豐富了很多,推出的插件市場上有各式各樣的插件,比如 連接數據庫、連接大模型、搜索和 mcp服務等。其中,有一個比較大的改動,模型供應商不再內置,而是通過插件的形式提供。因此,如果是內網離線部署,則必須提前準備好插件的安裝包。
接下來,本文將從部署的角度對 dify的插件體系進行分析,總結項目落地時的經驗。
環境信息:
? Dify-1.1.3, Dokcer-26, CentOS-7.9
2.插件原理分析
2.1 插件運行環境
聯網安裝插件十分簡單,打開插件市場,點擊安裝即可。
通過對比,發現 1.1.3版本的 dify比 0.8.3版本多了一個容器:docker-plugin_daemon。
在線安裝插件時,查看 docker-plugin_daemon容器的日志發現會去下載很多依賴文件,因此插件的運行環境就是由這個容器提供和進行管理。
2.2 插件安裝文件
觀察到/app/storage/cwd/
目錄存放著插件安裝后生成的文件,按提供廠商進行組織。
進入 docker-plugin_daemon-1
容器的 /app/storage/cwd/langgenius/openai_api_compatible..
目錄,可以看到下面的內容:
total 44
drwxrwxrwx 7 root root 4096 Apr 8 07:35 ./
drwxrwxrwx 15 root root 4096 Aug 12 09:04 …/
drwxrwxrwx 6 root root 4096 Apr 8 07:35 .venv/
-rwxrwxrwx 1 root root 574 Apr 8 07:31 README.md*
drwxrwxrwx 2 root root 4096 Apr 8 07:35 pycache/
drwxrwxrwx 2 root root 4096 Apr 8 07:31 _assets/
-rwxrwxrwx 1 root root 125 Apr 8 07:31 main.py*
-rwxrwxrwx 1 root root 664 Apr 8 07:31 manifest.yaml*
drwxrwxrwx 8 root root 4096 Apr 8 07:35 models/
drwxrwxrwx 3 root root 4096 Apr 8 07:35 provider/
-rwxrwxrwx 1 root root 37 Apr 8 07:31 requirements.txt*
上面內容來自插件:openai_api_compatible,這里面有兩個內容需要關注:
-
venv
這個目錄存放的是運行該插件需要的 python虛擬環境,依賴的第三方包會在安裝插件下載到該虛擬環境。
這樣設計使得每個插件都擁有單獨的依賴環境,能夠有效避免依賴包沖突。
-
requirements.txt
這里面記錄了依賴的 python第三方包清單。
? 通過觀察插件安裝完成后生成的文件,可以知道插件的運行需要 python環境,在安裝時會為每個插件生成一個虛擬 python環境,各個插件依賴環境獨立,互不影響。
3.制作插件安裝包
3.1 官方途徑
? 通過官方插件市場下載的插件安裝包為 difypkg格式,是一個二進制文件,通常只有幾百kb。經過實測,在離線環境下安裝依然會聯網下載 python相關依賴,故此種方式無法實現真正的離線安裝插件。
? 這個包比較小,并不是完整的安裝包,猜測應該是只有插件的依賴信息,比如 requirements.txt
里包含的內容,在安裝插件時才會去下載依賴的第三方包。
3.2 第三方
官網途徑暫時走不通,發現有一個開源項目可以制作完整的插件安裝包,名字叫做:dify-plugin-repackaging。
下面是實操后,總結的步驟:
-
準備打包環境
一臺能聯網、有 docker的 centos7.x服務器(虛擬機)。
-
下載項目源碼
上傳源碼到打包環境并解壓
-
編譯打包項目為 docker鏡像
進到解壓后的目錄執行下面的命令:
docker build -t dify-plugin-repackaging .
-
獲取待制作插件的名稱、公司名和版本號
打開 dify插件市場,搜索要制作的插件,按下面的方式獲取相關信息:
-
制作插件完整安裝包
這里以
JSON 處理
插件為例,使用下面的命令制作插件:docker run -v $(pwd):/app dify-plugin-repackaging ./plugin_repackaging.sh -p manylinux_2_17_x86_64 market langgenius json_process 0.0.2
上面的命令中 langgenius是公司名,json_process是插件英文名,0.0.2是版本號。
制作成功后,會出現下面1個目錄和2個文件:
其中這個 17M的文件
langgenius-json_process_0.0.2-offline.difypkg
就是完整的插件安裝包。
4.離線安裝插件
經過第3步制作完成的安裝包無法直接安裝,需要調整 dify配置,并重啟對應服務。
具體步驟如下:
-
修改 env中的配置
cd dify-1.1.3/docker cp .env.example .env vim .env# 修改下面的參數 FORCE_VERIFYING_SIGNATURE=false PLUGIN_MAX_PACKAGE_SIZE=524288000 NGINX_CLIENT_MAX_BODY_SIZE=1024M
這里主要目的是放寬 nginx對于上傳安裝包的大小限制,否則會出現下面的 nginx報錯:
413 Request Entity Too Large
-
重啟 dify服務
docker compose down docker compose up -d
-
使用本地插件功能離線安裝插件
如下,按照提示上傳剛剛制作好的插件包即可:
5.總結
? 本文主要從部署的角度分析了 1.1.3版本的 dify插件安裝包制作、文件組織方式和運行環境,這里有一個良好的設計值得我們借鑒:為每個插件單獨準備一個 python虛擬環境,各個插件之間互不影響。同時,也得吐槽下官方下載的插件包無法直接離線部署。