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.创建第一个聊天助手
在工作室创建聊天助手应用,在知识库部分关联本地知识,然后进行对话,具体如下。

相关文章:
Dify使用部署与应用实践
最近在研究AI Agent,发现大家都在用Dify,但Dify部署起来总是面临各种问题,而且我在部署和应用测试过程中也都遇到了,因此记录如下,供大家参考。Dify总体来说比较灵活,扩展性比较强,适合基于它做…...
Java 大视界 -- 基于 Java 的大数据机器学习模型的迁移学习应用与实践(129)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
1.Windows+vscode+cline+MCP配置
文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…...
C#的字符串之String类与StringBuilder类区别于适用场景
一、分清楚值类型与引用类型 正确理解值类型与引用类型,可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序: C#值类型与引用类型区别 区别值类型引用类型定义所有继承自【System.ValueType】类型的都是值类型(valueType继承自Sys…...
关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】
问题需求 目录和文件结构如下: E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt现在要在master.xlsx点击单元格进而访问Level1.txt、Level2.txt、Level3.txt这些文件。 方法一:“单元格右键…...
conda的基本使用及pycharm里设置conda环境
创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称,python后边的根据自己的需要,选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …...
计算机网络-网络规划与设计
基本流程 需求分析—》通信规范分析—》逻辑网络设计—》物理网络设计—》实施阶段 需求分析: 确定需求,包括:业务需求、用户需求、应用需求、计算机平台需求、网络通信需求等。 产物:需求规范 通信规范分析: 现有…...
【QA】建造者模式在Qt有哪些应用
#设计模式 #Qt 一、QDomDocument(XML 文档构建) 模式角色: Builder:QDomDocument 本身Product:XML 文档对象Director:用户代码通过 QDomDocument 逐步构建文档结构 示例代码: QDomDocument…...
六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
一、算法简介 (一)阿尔法进化(Alpha Evolution,AE)算法 阿尔法进化(Alpha Evolution,AE)算法是2024年提出的一种新型进化算法,其核心在于通过自适应基向量和随机步长的…...
练习-依依的询问最小值(前缀和差分)
问题描述 依依有个长度为 n 的序列 a,下标从 1 开始。 她有 m 次查询操作,每次她会查询下标区间在[li,ri] 的 a 中元素和。她想知道你可以重新排序序列 a,使得这 m 次查询的总和最小。 求你求出 m 次查询总和的最小值。 输入格式 第…...
ctfshow web刷题记录
RCE 第一题 eval代码执行 : 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...
MySQL单表查询大全【SELECT】
山再高,往上攀,总能登顶;路再长,走下去,定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…...
考研系列-408真题计算机网络篇(18-23)
写在前面 此文章是本人在备考过程中408真题计算机网络部分(2018年-2023年)的易错题及相应的知识点整理,后期复习也常常用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…...
卷积神经网络(CNN)之 EfficientNet
在深度学习领域,模型的计算效率与性能之间的平衡一直是一个核心挑战。随着卷积神经网络(CNN)在图像分类、目标检测等任务中取得显著成果,模型的复杂度和计算需求也急剧增加。2019年,Google Research 提出的 EfficientN…...
【eNSP实战】将路由器配置为DHCP服务器
拓图 要求: 为 office100 和 office200 分别配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上创建office100地址池 [AR1…...
工程化与框架系列(35)--前端微服务架构实践
前端微服务架构实践 🏗️ 引言 随着前端应用规模的不断扩大,微服务架构在前端领域的应用越来越广泛。本文将深入探讨前端微服务架构的实现方案、最佳实践和相关工具。 微服务架构概述 前端微服务架构主要包括以下方面: 应用拆分…...
Windows系统中安装Rust工具链方法
Windows系统中安装Rust工具链方法 在Windows上使用PowerShell的命令来下载rustup-init.exe文件。 此外,安装完成后,需要确保Rust的环境变量生效,可能需要重启终端或手动执行设置路径的命令。然后继续升级pip并安装tiktoken。 总结步骤应该是…...
Postman下载安装及简单入门
一.Postman简介 Postman是一款API测试工具,可以帮助开发、测试人员发送HTTP请求,与各种API进行交互,并分析响应 二.下载与安装 访问Postman官网(https://www.postman.com/),下载适…...
vulnhub靶场之loly靶机
前言 挑战攻克该靶机30分钟 靶机:loly靶机,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.6 靶机和攻击机都采用VMware虚拟机,都采用桥接网卡模式 文章涉及的靶机及工具,都可以自行访问官网或者项…...
原生微信小程序实现导航漫游(Tour)
效果: 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…...
LLM论文笔记 25: Chain-of-Thought Reasoning without Prompting
Arxiv日期:2024.5.31机构:Google DeepMind 关键词 cot-decoding推理路径pretrain 核心结论 1. LLMs 不需要prompting就可以生成链式推理路径,prompting只是将这些能力显性化的一种手段 2. cot path 往往与更高的model confidence相关&…...
新型XCSSET恶意软件利用增强混淆技术攻击macOS用户
微软威胁情报团队发现了一种新型的XCSSET变种,这是一种复杂的模块化macOS恶意软件,能够感染Xcode项目,并在开发者构建这些项目时执行。 这是自2022年以来的首个已知XCSSET变种,采用了增强的混淆方法、更新的持久化机制以及新的感…...
Redis存数据就像存钱:RDB定期存款 vs AOF实时记账
Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...
[C++面试] 关于deque
一、入门 1、deque与vector的区别 deque的迭代器包含以下信息: 当前缓冲区指针(current_buffer)当前元素在缓冲区内的位置(current)中控器的位置(map) 每次移动迭代器时,需检查是…...
施磊老师c++(七)
STL组件 文章目录 STL组件1.整体学习内容2.vector容器3.deque和listdeque--双端队列容器list--链表容器 4.vector,deque,list对比主要内容面经问题 5.详解容器适配器--stack, queue, priority_queue容器适配器stack-栈queue-队列priority_queue-优先级队列总结 6.无序关联容器关…...
八股文——C 语言宏、`volatile`、`static`、动态内存管理、堆与栈的区别
文章目录 1. #(字符串化操作符)作用:示例: 2. ##(符号连接操作符)作用:示例1:动态生成变量名 3. volatile 关键字作用:示例: 4. static 关键字作用࿱…...
C++初阶——类和对象(三) 构造函数、析构函数
C初阶——类和对象(三) 上期内容,我们围绕类对象模型的大小计算,成员存储方式,this指针,以及C实现栈和C语言的比较,进一步认识了C的封装特性。本期内容,我们开始介绍类的默认成员函…...
【Function】使用托管身份调用Function App触发器,以增强安全性
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 1. 背景介绍2. 设置3. 使用Web应用调用Function App触发器(Node.js示例)4. 执行结果此方法允许您使用托管身份(Managed Identity)调…...
x012-MSP430F249智能步进电动百叶窗_proteus_光敏电阻_步进电机_仿真
https://www.dong-blog.fun/post/1997 46 、智能步进电动百叶窗 基本要求: 用一台步进电机控制百叶窗叶片的旋转(正转/反转) 用 LED 数码管显示旋转角度 设置按键: 手动/自动切换、手动正转和手动反转,停止/启动键 用一…...
牛客周赛85 题解 Java ABCDEFG
A小紫的均势博弈 判断输入的 n 是奇数还是偶数 import java.io.*; import java.math.*; import java.util.*;public class Main {static IoScanner sc new IoScanner();static final int mod(int) (1e97);static void solve() throws IOException {int nsc.nextInt();if(n%2…...
