Dify使用部署與應用實踐

? ? ? 最近在研究AI Agent,發現大家都在用Dify,但Dify部署起來總是面臨各種問題,而且我在部署和應用測試過程中也都遇到了,因此記錄如下,供大家參考。Dify總體來說比較靈活,擴展性比較強,適合基于它做智能聊天機器人,文本生成,工作流任務,Agent應用建設等場景,要比其他客戶端工具更加靈活,更加適合二次開發,但Dify部署起來非常麻煩,會自動部署10個容器,任何一個出現問題,應用都無法正常使用。后續我會與Autogen對比,看看在Agent方面哪個更適合垂直行業AI應用的快速落地。

一、docker部署
1.查看docker-compose版本
docker-compose --version
2.復制環境配置文件

進入dify/docker目錄,復制命令如下
cp .env.example .env

3.Docker Engine中的國內鏡像配置

打開docker desktop設置功能,修改docker的Docker Engine中的國內鏡像地址(否則會出現連接不上錯誤),具體如下

{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": [# 增加部分"https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com","https://docker.1ms.run","https://func.ink","https://lispy.org","https://docker.xiaogenban1993.com"]
}
4.拉取并啟動dify容器

拉取數據、依賴包進行安裝配置。
docker compose up -d

5.配置代理

打開docker desktop設置功能,進入到Resources--》proxy下,設置代理服務器地址。

6.常見錯誤問題的解決方式

錯誤1:docker部署的容器啟動過程中出現db-1總是重啟
需要修改docker下的docker-compose.yaml文件db配置,具體如下

services:db:image: postgres:15-alpinevolumes:- postgres-data:/var/lib/postgresql/data #增加這一行#- ./volumes/db/data:/var/lib/postgresql/data # 注釋掉
# 在該文件結尾處增加
volumes:oradata:dify_es01_data:postgres-data:# 增加的內容。

然后執行容器的重新加載,具體如下。

docker compose down -v # 卸載
docker compose up # 重新加載
docker restart #重啟docker

錯誤2:瀏覽器訪問時出現502錯誤
查看服務情況

docker inspect --format '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-api-1
docker inspect --format '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-web-1

或者運行以下命令,查看服務詳細信息,在返回結果找到IPAddress對應的值,即為ip地址。

docker inspect docker-web-1
docker inspect docker-api-1

比如返回結果如下。
web:172.18.0.4
api:172.18.0.9
然后修改nginx配置文件(比如D:\dify11\docker\nginx\conf.d\default.conf)內容如下:
這種方式重啟docker后或重啟nginx后會沖掉,或者ip地址會有變化,永久修改方式詳見下面的方法。

# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration.
# 主要這里的ip地址要根據docker中顯示的ip地址進行修改,查詢方式詳見上面的docker inspect
server {listen 80;server_name _;location /console/api {proxy_pass http://172.18.0.9:5001;include proxy.conf;}location /api {proxy_pass http://172.18.0.9:5001;include proxy.conf;}location /v1 {proxy_pass http://172.18.0.9:5001;include proxy.conf;}location /files {proxy_pass http://172.18.0.9:5001;include proxy.conf;}location /explore {proxy_pass http://172.18.0.4:3000;include proxy.conf;}location /e/ {proxy_pass http://plugin_daemon:5002;proxy_set_header Dify-Hook-Url ://;include proxy.conf;}location / {proxy_pass http://172.18.0.4:3000;include proxy.conf;}    
}

永久修改default.conf配置文件方式如下,但這種方式容易導致nginx配置出錯。
在docker目錄,新建python程序,內容如下。但目前該程序容易導致安裝nginx無法啟動,解決辦法就是將重啟容器那一段不執行(需要手動重啟nginx對應的容器)

#!/root/anaconda3/envs/llm/bin/python
# -*- coding: utf-8 -*-
'''
@file: dify-nginx.py
@date: 2025/3/11 15:36
@remark: 更新nginx配置信息,參考其他網友代碼。
@input:dify-nginx.py
@output:dify-nginx.py
'''
import os
import dockerclient = docker.from_env()
# 獲取當前 Python 腳本所在的文件夾的絕對路徑
current_dir = os.path.dirname(os.path.abspath(__file__))# 讀取文件
def file_get_contents(file_path):with open(file_path, "r", encoding="utf-8") as file:return file.read()# 寫入文件
def file_put_contents(file_path, content):with open(file_path, "w", encoding="utf-8") as file:file.write(content)# 獲取容器 IP
def get_container_ip(container_name):container = client.containers.get(container_name)return container.attrs['NetworkSettings']['Networks']['docker_default']['IPAddress']# 重啟容器
def restart_container(container_name):# 原始內容container = client.containers.get(container_name)container.restart()def main():# 獲取 API 和 Web 容器的 IP 地址api_container_ip = get_container_ip('docker-api-1')web_container_ip = get_container_ip('docker-web-1')print(f'api_container_ip: {api_container_ip}')print(f'web_container_ip: {web_container_ip}')# 拼接模板文件路徑和目標文件路徑template_path = os.path.join(current_dir, 'nginx/conf.d/default.conf.template')target_path = os.path.join(current_dir, 'nginx/conf.d/default.conf')# 讀取模板文件內容并替換 IP 地址tpl_contents = file_get_contents(template_path)tpl_contents = tpl_contents.replace('http://api', f'http://{api_container_ip}')tpl_contents = tpl_contents.replace('http://web', f'http://{web_container_ip}')# 將修改后的內容寫入目標配置文件file_put_contents(target_path, tpl_contents)# # 重啟 Nginx 容器,記得注釋掉# restart_container('docker-nginx-1')# print("Nginx container restarted with updated configuration.")
if __name__ == '__main__':main()

運行命令:python dify-nginx.py
錯誤3:plugin_daemon安裝依賴庫出錯
解決辦法如下。主要修改docker目錄下的docker-compose.yaml文件內容(比如E:\dify2\docker\docker-compose.yaml)。增加國內鏡像地址,記得注釋掉原來的同名設置,如何需要代理,記得在最前面加上HTTP_PROXY,具體如下。

plugin_daemon:image: langgenius/dify-plugin-daemon:0.0.3-localrestart: alwaysenvironment:# Use the shared environment variables.<<: *shared-api-worker-env# HTTP_PROXY=http://ip:8080# HTTPS_PROXY=http://ip:8080# ... 中間省略# 注釋掉原來的,新增如下內容# 設置 pip 使用國內鏡像源PIP_MIRROR_URL: https://pypi.tuna.tsinghua.edu.cn/simple# 設置超時時間PYTHON_ENV_INIT_TIMEOUT: ${PYTHON_ENV_INIT_TIMEOUT:-640}

錯誤4:vobe文件找不到
這種錯誤一般需要在api對應的容器中,配置HTTP_PROXY代理,配置方式和錯誤3類似,具體不細說,但有時候不管用,所以需要手動更新幾個文件路徑(比如/api/tiktoken_ext/file),主要是vocab.bpe、encoder.json、r50k_base.tiktoken等5個文件。主要修改openai_public.py文件內容,文件位置大概在api容器的/app/api/.venv/lib/python3.12/site-packages/tiktoken_ext目錄下。

# openai_public.py文件
def gpt2():mergeable_ranks = data_gym_to_mergeable_bpe_ranks(vocab_bpe_file="/api/tiktoken_ext/file/vocab.bpe",encoder_json_file="/api/tiktoken_ext/file/encoder.json",vocab_bpe_hash="1ce1664773c50f3e0cc8842619a93edc4624525b728b188a9e0be33b7726adc5",encoder_json_hash="196139668be63f3b5d6574427317ae82f612a97c5d1cdaf36ed2256dbf636783",)return {"name": "gpt2","explicit_n_vocab": 50257,"pat_str": r50k_pat_str,"mergeable_ranks": mergeable_ranks,"special_tokens": {ENDOFTEXT: 50256},}

基本上就是以上四類問題了,如果你遇到了新的問題,那恭喜你中獎了,解決辦法目前看只能采取完全刪除容器和鏡像,重啟docker和系統后,換個好的網絡環境進行拉取安裝了。

二、應用實踐
1.安裝ollama插件

使用瀏覽器訪問dify,首次安裝需要設置管理員用戶密碼信息等,按照向導執行即可,打開插件,安裝ollama插件,最好下載到本地后(需要科學上網),選擇本地安裝。
在用戶--設置,配置大模型服務和embedding模型服務,一般配置本機或局域網內的ollama
服務。
注意:market中提供的好多插件安裝過程會導致容器啟動異常,建議不要裝太多插件,只安裝用到的插件,其他用自定義代碼塊來實現。

2.創建知識庫

按照要求完成知識庫創建,再加一下私域知識進去,worker容器會自動分塊存儲。

3.創建第一個聊天助手

在工作室創建聊天助手應用,在知識庫部分關聯本地知識,然后進行對話,具體如下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898023.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二叉樹的統一迭代法 標記法

我們以中序遍歷為例&#xff0c;在二叉樹&#xff1a;聽說遞歸能做的&#xff0c;棧也能做&#xff01; (opens new window)中提到說使用棧的話&#xff0c;無法同時解決訪問節點&#xff08;遍歷節點&#xff09;和處理節點&#xff08;將元素放進結果集&#xff09;不一致的情…

BaseActivity 和 BaseFragment 的現代化架構:ViewBinding 與 ViewModel 的深度整合

BaseActivity 和 BaseFragment 實現&#xff0c;集成了 View Binding&#xff0c;并增加了對 Lifecycle 和 ViewModel 的支持&#xff0c;同時進一步簡化了代碼結構&#xff0c;使其更易用、更靈活。 啟用 View Binding 確保在 build.gradle 中啟用了 View Binding&#xff1a…

從零開始學習機器人---如何高效學習機械原理

如何高效學習機械原理 1. 理解課程的核心概念2. 結合圖形和模型學習3. 掌握公式和計算方法4. 理論與實踐相結合5. 總結和復習6. 保持好奇心和探索精神 總結 機械原理是一門理論性和實踐性都很強的課程&#xff0c;涉及到機械系統的運動、動力傳遞、機構設計等內容。快速學習機械…

剖析sentinel的限流和熔斷

sentinel的限流和熔斷 前言源碼分析滑動窗口源碼限流源碼熔斷源碼 完結撒花&#xff0c;sentinel源碼還是挺簡單的&#xff0c;如有需要收藏的看官&#xff0c;順便也用發財的小手點點贊哈&#xff0c;如有錯漏&#xff0c;也歡迎各位在評論區評論&#xff01; 前言 平時發起一…

硬盤分區誤刪后的數據救贖

一、硬盤分區誤刪的概述 硬盤分區誤刪&#xff0c;是許多電腦用戶在使用過程中可能遭遇的棘手問題。分區&#xff0c;作為硬盤上存儲數據的邏輯單元&#xff0c;一旦被誤刪除&#xff0c;不僅會導致該分區內的所有數據瞬間消失&#xff0c;還可能影響到整個硬盤的存儲結構和數…

代碼隨想錄算法訓練營第三十五天(20250303) |01背包問題 二維,01背包問題 一維,416. 分割等和子集 -[補卡20250316]

01背包問題 二維 鏈接 遍歷物品沒有大小順序要求重點是模擬&#xff0c;推導出遞推公式 #include <iostream> #include <vector>int main(){int m, n;std::cin>>m>>n;std::vector<int> weight(m,0),value(m,0);for(int i{0}; i<m; i){std:…

老牌軟件,方便處理圖片,量大管飽。

今天介紹的圖片查看器名字是&#xff1a;FastStone Image Viewer&#xff0c;是一款可查看、編輯、批量重命名、批量轉換的圖片查看軟件。文末有分享鏈接。 軟件以資源管理器的方式管理你電腦里的圖片&#xff0c;點擊左側可選擇文件夾&#xff0c;右邊可預覽圖片。 軟妹用得最…

【數據庫相關】mysql數據庫巡檢

mysql數據庫巡檢 巡檢步驟**一、基礎狀態檢查****二、服務器資源監控****CPU使用****內存使用****磁盤I/O****網絡流量** **三、數據庫內部健康度****全局狀態****慢查詢監控****鎖與并發** **四、存儲引擎健康****InnoDB引擎****MyISAM引擎** **五、日志與備份****六、安全與權…

Python進階編程總結

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;…

Redis復制(replica)主從模式

Redis主從復制 Redis 的復制&#xff08;replication&#xff09;功能允許用戶根據一個 Redis 服務器來創建任意多個該服務器的復制品&#xff0c;其中被復制的服務器為主服務器&#xff08;master&#xff09;&#xff0c;而通過復制創建出來的服務器復制品則為從服務器&#…

Adobe Premiere Pro2023配置要求

Windows 系統 最低配置 處理器&#xff1a;Intel 第六代或更新版本的 CPU&#xff0c;或 AMD Ryzen? 1000 系列或更新版本的 CPU&#xff0c;需要支持 Advanced Vector Extensions 2&#xff08;AVX2&#xff09;。操作系統&#xff1a;Windows 10&#xff08;64 位&#xff…

【Kubernets】Deployment 和 StatefulSet 有什么區別?什么時候用 StatefulSet?

Deployment 和 StatefulSet 的區別 在 Kubernetes 中&#xff0c;Deployment 和 StatefulSet 都用于管理 Pod&#xff0c;但它們適用于不同的場景。 1. Deployment&#xff1a;管理無狀態應用 特點&#xff1a; 無狀態&#xff1a;Pod 之間相互獨立&#xff0c;不需要保持順…

R語言零基礎系列教程-03-RStudio界面介紹與關鍵設置

代碼、講義、軟件回復【R語言03】獲取。 設置位置: 菜單欄 - Tools - Blobal Options 設置 通用設置 設置面板左側General選項 版本選擇: 一般只用一個版本即可 默認工作目錄設置: 你希望RStudio打開時是基于哪個目錄進行工作可以不設置, 因為腳本一般都是放置在特定項目路…

車載以太網測試-9【網絡層】-子網劃分的子網掩碼VLAN

目錄 1 摘要2 子網劃分2.1 子網掩碼2.2 VLAN&#xff08;虛擬局域網&#xff09;2.2.1 IEEE 802.1Q VLAN標簽2.2.1.1 VLAN標簽的結構2.2.1.2 VLAN標簽的插入2.2.1.3 VLAN標簽的處理2.1.2.4 PVID&#xff08;Port VLAN Identifier&#xff09; 和 VID&#xff08;VLAN Identifie…

微信小程序刷題邏輯實現:技術揭秘與實踐分享

頁面展示&#xff1a; 概述 在當今數字化學習的浪潮中&#xff0c;微信小程序以其便捷性和實用性&#xff0c;成為了眾多學習者刷題備考的得力工具。今天&#xff0c;我們就來深入剖析一個微信小程序刷題功能的實現邏輯&#xff0c;從代碼層面揭開其神秘面紗。 小程序界面布局…

JVM--垃圾回收

垃圾回收的概念 垃圾回收主要針對的是堆中的對象&#xff0c;堆是一個共享的區域&#xff0c;創建的對象和數組都放在這個位置。但是我們不能一直的創建對象&#xff0c;也不是所有的對象能一直存放&#xff0c;如果不進行垃圾回收&#xff0c;內存遲早會耗盡&#xff0c;及時…

【教程】繼承中的訪問控制 C++

目錄 簡介public&#xff0c;protected 和 private繼承中的 public&#xff0c;protected 和 private示例 簡介 在 C 中派生類可以通過 public&#xff0c;protected 和 private 三種修飾符決定基類成員在派生類中的訪問級別 public&#xff0c;protected 和 private 公有成…

【2025】基于python+django的駕校招生培訓管理系統(源碼、萬字文檔、圖文修改、調試答疑)

課題功能結構圖如下&#xff1a; 駕校招生培訓管理系統設計 一、課題背景 隨著機動車保有量的不斷增加&#xff0c;人們對駕駛技能的需求也日益增長。駕校作為駕駛培訓的主要機構&#xff0c;面臨著激烈的市場競爭和學員需求多樣化等挑戰。傳統的駕校管理模式往往依賴于人工操作…

要登錄的設備ip未知時的處理方法

目錄 1 應用場景... 1 2 解決方法&#xff1a;... 1 2.1 wireshark設置... 1 2.2 獲取網口mac地址&#xff0c;wireshark抓包前預過濾掉自身mac地址的影響。... 2 2.3 pc網口和設備對接... 3 2.3.1 情況1&#xff1a;... 3 2.3.2 情…

一.ffmpeg打開麥克風,錄制音頻并重采樣

一.windows windows下使用msys編譯ffmpeg&#xff0c;先編譯libx264和libx265&#xff0c;然后編譯ffmpeg的時候需要添加這兩個庫的路徑才能--enable&#xff1b;為什么ffplay--enable了還是沒有呢&#xff0c;仔細看編譯打印&#xff0c;可能剛有一段報錯提示SDL找不到&#…