Dify极简部署手册
1、概述
众所周知的原因,dify cloud国内无法访问,国内使用dify需要自己搭建。本文主要介绍如同通过docker-compose快速部署生产版本(基于dify1.5.1版本),通过本文,你将获得:
- 基于官方项目版本优化的.env配置文件和docker-compose.yaml
- 如何配置域名,SSL证书以及添加自己服务
- 如何通过URL参数设置dify中的sys.user_id值
2、正文
1)配置域名及HTTPS
.env文件中配置域名和证书
NGINX_SERVER_NAME=xxx.yourdomain.com
NGINX_HTTPS_ENABLED=true
....
NGINX_SSL_CERT_FILENAME=your.crt
NGINX_SSL_CERT_KEY_FILENAME=your.key
SSL证书路径在dcoker-compose.yaml中的nginx镜像配置中:
另外,dify项目提供了certbot免费SSL证书功能,具体部署查看:https://github.com/langgenius/dify/blob/main/docker/certbot/README.md
2)上传文档大小限制
默认dify限制单文件最大是15M,这可能会限制掉很多文档(如构建知识库),建议改为:100M,在docker-compose环境变量修改:
NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M}
3)非结构化文档内容提取工具
文档内容的提取是十分常用的功能,改为unstructured.io兼容性更好,否则很多文档内容无法提取。.env文件中如下修改:
# ETL type, support: `dify`, `Unstructured`
# `dify` Dify's proprietary file extraction scheme
# `Unstructured` Unstructured.io file extraction scheme
ETL_TYPE=Unstructured# Unstructured API path and API key, needs to be configured when ETL_TYPE is Unstructured
# Or using Unstructured for document extractor node for pptx.
# For example: http://unstructured:8000/general/v0/general
UNSTRUCTURED_API_URL= http://unstructured:8000/general/v0/general
UNSTRUCTURED_API_KEY=
4)Python插件配置修改
dify插件依赖Python运行环境,国内网络环境需修改python包为国内镜像以及超时时间的修改,否则可能会导致dify市场插件无法安装。docker-compose.yaml环境变量配置:
PLUGIN_PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-320}
PIP_MIRROR_URL: ${PIP_MIRROR_URL:-https://pypi.tuna.tsinghua.edu.cn/simple}
5)主系统与dify生成智能体打通
dify生成的智能体(chatbot,对话流,工作流等)是一个单独的应用实体,自部署dify的应用通常情况下需要其他系统打通才可应用落地。通过修改dify源码部署,可以实现系统之间的打通,但需要较大的开发和运维工作。
本着极简原则,本文提供一种不修改dify源码、传递dify sys.user_id参数的方案,实现系统用户id的打通,在dify智能体中通过用户id实现角色和权限的控制,具体如下:
方案背景
如下是dify应用将URL Params覆盖到dify环境变量参数的代码,通过源码可以看到是,将URL Params目标值使用decodeURIComponent()解码,然后base64解码,最后gzip解压,解码解压的值覆盖对应环境变量。
async function getProcessedSystemVariablesFromUrlParams(): Promise<Record<string, any>> {const urlParams = new URLSearchParams(window.location.search)const systemVariables: Record<string, any> = {}const entriesArray = Array.from(urlParams.entries())await Promise.all(entriesArray.map(async ([key, value]) => {if (key.startsWith('sys.'))systemVariables[key.slice(4)] = await decodeBase64AndDecompress(decodeURIComponent(value))}),)return systemVariables
}
具体方案
基于以上背景,方案实现如下:
- 主系统用户id,通过gzip压缩,然后进行base64编码,最后encodeURIComponent()编码,生成用户id编码串(完整代码在本文附件下载中)
- 将生成的户id编码串带在URL Params调用dify应用(如iframe的src url),dify应用中的sys.user_id则为主系统用户id
- 在搭建dify应用是将sys.user_id带上调用自用http请求判断用户角色,则可以判断用户类型进行对用的权限和角色控制。
3、本文配置文件和源码下载
《dify部署docker-compose.yaml、.env文件,以及sys参数编码函数代码》