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.mzph.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找不到&#…