Dify使用部署与应用实践

ops/2025/3/17 13:57:55/

      最近在研究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.ppmy.cn/ops/166508.html

相关文章

数据库的基本概念

在当今数字化的世界中&#xff0c;数据已成为企业和组织最宝贵的资产之一。有效地管理和利用这些数据对于决策制定、服务优化和业务增长至关重要。数据库作为存储、管理及检索数据的核心工具&#xff0c;在现代信息系统中扮演着至关重要的角色。本文将介绍数据库的一些基本概念…

Linux安装Redis、远程连接Redis

Linux安装Redis、远程连接Redis Redis官方tar包下载地址Linxu安装Redis 1、新建redis安装目录2、上传文件到服务器的安装目录3、解压tar包4、安装gcc环境5、进入tar包解压后的目录编译6、安装Redis命令到指定目录7、修改配置&#xff0c;编辑 redis.conf配置文件 开启redis远程…

Excel(函数篇):COUNTIF与CONUTIFS函数、SUMIF与SUMIFS函数、ROUND函数、MATCH与INDEX函数、混合引用与条件格式

目录 COUNTIF和COUNTIFS函数COUNTIF函数COUNTIFS函数SUMIF和SUMIFS函数SUMIF函数SUMIFS函数SUMIFS函数与控件实现动态年月汇总ROUND、ROUNDUP、ROUNDDOWN函数单元格混合引用条件格式与公式,标记整行数据MATCH和INDEX函数COUNTIF和COUNTIFS函数 COUNTIF函数 统计下“苏州”出现…

PackageManagerService

首语 PackageManagerService(以下简称PMS)是Android最核心的系统服务之一&#xff0c;它是应用程序包管理服务&#xff0c;管理手机上所有的应用程序&#xff0c;包括应用程序的安装、卸载、更新、应用信息的查询、应用程序的禁用和启用等。 职责 在Android系统启动过程中扫…

Open vSwitch(OVS)内核模式与用户模式详解

Open vSwitch&#xff08;OVS&#xff09;是一个开源的虚拟交换机&#xff0c;广泛用于虚拟化网络和SDN&#xff08;软件定义网络&#xff09;。其核心设计通过 内核模式&#xff08;Kernel Datapath&#xff09; 和 用户模式&#xff08;Userspace Datapath&#xff09; 实现高…

数据治理下半场:如何用文化变革撬动企业数字化转型?

数据治理下半场:如何用文化变革撬动企业数字化转型? 一、打破认知茧房:从"数据恐惧症"到"数据生产力"二、重构协作生态:从"部门墙"到"数据共同体"三、建立责任体系:从"无人认领"到"终身责任制"​四、点燃创新…

新矩阵(信息学奥赛一本通-2041)

【题目描述】 已知一个nn(2≤n≤20)的矩阵&#xff08;方阵&#xff09;&#xff0c;把矩阵二条对角线上的元素值加上10&#xff0c;然后输出这个新矩阵。 【输入】 第一行为n; 下面为一个nn&#xff0c;矩阵中各正整数小于100。 【输出】 输出新的矩阵。共n行&#xff0c;每行…

java自带日志系统介绍(JUL)以及和Log4j 2、Logback、SLF4J不同日志工具的对比

Java 日志系统是开发中用于记录应用程序运行时信息的重要工具。以下是 Java 日志系统的核心组件及其使用场景、配置参数的详细介绍&#xff0c;以及不同日志系统的对比分析。 Java 日志系统核心组件 1. 日志记录器&#xff08;Logger&#xff09; 作用&#xff1a;负责生成日…