前言
Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。
Dify都有什么功能以及怎么使用这里就不细说了,可以参考官方文档地址:docs.dify.ai/v/zh-hans/g...
也可以通过它的官网进行在线试用,如下: Dify 在线使用:cloud.dify.ai/
本文主要讲一讲Dify如何搭建部署的。
安装docker
Dify需要很多应用支持,包括redis、nginx、postgres等等,一个个安装配置很麻烦。所以Dify提供了docker快速部署的方案,所以首先要安装docker和docker-compose。
使用wsl在windows上安装docker
我的环境是Windows+WSL,所以选用了下面的方案来进行安装。
docs.docker.com/desktop/wsl...
1、下载Docker Desktop最新版本地址
2、安装,注意安装的时候要选择WSL 2
3、安装完打开Docker,可以不用登录。打开设置Setting,在General下选中Use the WSL 2 based engine,然后apply$restart
4、打开设置Setting,在Resources -> WSL integration下选择要使用docker的虚拟机,然后apply$restart
5、打开虚拟机,检查一下docker和docker-compose的版本
docker -v
docker-compose -v
如果都正常,就可以在这个虚拟机中使用docker了。
CentOS安装docker
我的环境是CentOS7,官方文档是docs.docker.com/engine/inst...
首先卸载以前安装的docker,如下:
arduino
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
然后配置仓库
arduino
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
但是国内无法访问这个仓库,所以可以使用阿里云镜像仓库
arduino
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
然后安装docker
lua
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
都选yes即可。
安装完成需要启动Docker服务,使用命令sudo systemctl start docker
。
可以使用命令sudo systemctl status docker
查看docker服务的状态。
其他环境安装docker
大家直接参考官方文档:docs.dify.ai/v/zh-hans/g...即可。
部署
安装完docker后就可以开始部署了,这部分需要代理,提前准备好就不细说了。
克隆代码仓库
克隆 Dify 源代码至本地。
bash
git clone https://github.com/langgenius/dify.git
也可以自己fork后再克隆。
启动容器
接着第一步,目录不变,执行
bash
cd dify/docker
cp .env.example .env
docker compose up -d
注意:如果没有.env.example文件,有可能是分支不对,切换到主分支main即可。
就开始自动进行部署了,这个过程非常慢,因为需要下载很多应用,有些还需要代理才可以,而且速度很慢。所以在执行这一步之前先代理,然后执行过程中耐心等待。如果速度特别慢,就换了路线试试。
执行完成后,就自动启动了。
这时候在docker desktop中就可以看到一个名为docker的容器了,状态是running。
开始使用
在浏览器中输入 http://localhost 访问 Dify。
第一次进入的时候会要求你创建一个管理员账户。
如果要自定义配置,注意修改.env.example文件后,还需要同步修改.env文件,这个文件才是最终生效的配置。
这时候虚拟机关了也不影响服务。dify的容器在docker desktop中管理即可,所以如果彻底关闭了docker desktop,服务会停止。不过重新打开后会自动启动,但是进入平台会发现数据都没了,所以需要重新进入虚拟机关闭docker再重新启动即可
docker-compose down
docker-compose up -d
修改端口
默认dify使用了80和443端口,所以访问的时候不需要加端口。但是我们部署可能不希望使用默认端口,那么就需要改变一下端口。
首先要修改.env文件,如下:
ini
# ------------------------------
# Docker Compose Service Expose Host Port Configurations
# ------------------------------
EXPOSE_NGINX_PORT=80
EXPOSE_NGINX_SSL_PORT=443
将80和443改成其他端口。
注意NGINX_PORT和NGINX_SSL_PORT不要改,不要弄混了,如果都改了确实可以通过新端口访问,但是这个nginx还会占用80端口,因为内部80端口没有被映射到其他端口,默认就会占用外部的80端口。
然后还需要修改docker-compose.yaml文件中的nginx部分:
bash
nginx:
...
environment:
NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}
NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}
NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443}
NGINX_PORT: ${NGINX_PORT:-80}
...
ports:
- "${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}"
- "${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}"
同样只修改EXPOSE_NGINX_PORT和EXPOSE_NGINX_SSL_PORT。NGINX_PORT和NGINX_SSL_PORT不要改。这样nginx容器的内部80和443端口就可以映射到外部的其他端口,就不会占用外部的80和443端口了。
然后重启docker就可以了。
修改数据库连接数
dify中数据库PostgreSQL的连接数默认设置成了30,如果并发多的话,链接池就不够了。我们可以增加这个连接数,在.env中
- SQLALCHEMY_POOL_SIZE就是连接数,默认30个
- SQLALCHEMY_POOL_RECYCLE是连接池回收时间,默认3600秒
- POSTGRES_MAX_CONNECTIONS是PostgreSQL数据库的最大连接数,默认100
这个连接数也不能修改太大,因为PostgreSQL数据库本身有最大连接数的限制,默认是100,所以最好不要超过这个限制。
PostgreSQL数据库默认的最大连接数限制也可以修改,进入docker通过命令就行修改。但是如果增加最大连接数,可能需要同时增加shared_buffers和kernel.shmmax的值,以提高数据库的缓存能力和性能,同时可能影响系统性能。所以要谨慎修改,除非对系统非常了解。
常见问题
这个过程中可能遇到一些问题,下面是我遇到过的问题
ERROR [flask_migrate] Error: Can't locate revision identified by 'xxxx'
这个问题是因为数据库版本不对,我是在docker完整部署后停掉,又去掉dify部分部署并且本地部署dify,官方文档中本地部署的时候中间有一个步骤是更新数据库。
然后停掉本地部署,再完整的进行docker部署的时候就会报这个错误。在api和worker两个容器中都会报这个错误,导致worker无法工作,知识库训练等异步操作就卡住了,一直是排队中。
目前怀疑就是更新数据库那一步导致的,出问题的是postgres这个数据库,即docker-db-1这个容器里运行的。
我试了很多都不起作用,最终只好先把这个数据库彻底删掉,它的路径在dify项目的docker/volumes/db/data
下,有一个pgData文件夹,把它删掉再重新docker部署即可。
但是注意这样的话之前的所有数据就会丢失,一定要慎重。我如果找到其他方法再更新。
所以各位注意!如果要在一台机器上即进行docker部署也进行本地部署,最好clone两套代码,别用一套代码,容易出问题。
商业模型无法使用
比如文心模型,使用的时候可以看到api的后台日志提示key错误,这时候查看配置中的key发现不是我们设置的,自动变成了 "SFlCUk************==" 和 "SFlCUk************7p"。
这是因为该错误可能是由于更换了部署方式,导致api/storage/privkeys
改变了,这个文件是用来加密大模型密钥的,这里讨论的是Docker compose 部署,所以使用如下命令进行重置加密公私钥:
python
docker exec -it docker-api-1 flask reset-encrypt-key-pair