ubuntu使用dify源码安装部署教程+避坑指南 - 宋马

ubuntu使用dify源码安装部署教程+避坑指南

很多人,包括我在最初使用dify的时候都习惯使用docker来部署安装环境,但在二次开发使用过程中,我们可能希望使用源码来安装,那么这篇文章我将给大家分享如何在ubuntu系统下使用源码安装,并提供大家遇到的疑难杂症如下:

dify安装使用过程中报错:/console/api/workspaces/current/plugin/tasks?page=1&page_size=100 返回400错误

相信这个问题已经困扰了众多开发者,而且github上很多人聊的天花乱坠,包括我试图从github上寻找答案也未果,最终我通过阅读源码,从源码中找到了答案。 

目录

1.安装步骤

下载源码

安装一些中间件容器

安装API服务

uv安装依赖的报错处理

启动api服务:

启动任务服务:

安装web服务:

登录

异常报错

1.Expecting value:line 1 column 1 (chat 0)


1.安装步骤

下载源码

git clone https://github.com/langgenius/dify.git

我建议使用1.3.0,修复了一些bug(如果后边有更新的release版本,建议大家使用最新的版本即可)

git checkout 1.3.0

安装一些中间件容器

源码下载到本地后,我们进入到docker目录下

然后使用命令:

cp middleware.env.example middleware.env

这里编辑中间件服务器的ip,端口,用户名和密码等参数

postgres的端口是5432

redis的端口是6379

plugin_daemon的端口5002-5003

ssrf_proxy的端口是3128,8194

如果你的端口没有被其他进程服务占用,你基本上不用修改任何参数

接下来就是docker镜像和容器化环境的打包制作

docker compose -f docker-compose.middleware.yaml –profile weaviate -p dify up -d

部署好之后,查看容器:

如果有某个容器没有起来,请查看日志,看下是否有端口被占用的情况,你可以重新修改 docker-compose.middleware.yaml里的映射端口信息。

安装API服务

进入到api路径下

复制一份配置文件:

cp .env.example .env 

然后修改API服务中验签用到的SECRT_KEY

sed -i “/^SECRET_KEY=/cSECRET_KEY=$(openssl rand -base64 42)” .env 

安装uv

pip install uv

dify后边的新版本都是通过uv来管理包的依赖,因此如果你本地可以安装uv,dify需要依赖的python版本至少是3.12的,因此我建议你安装3.12以上的任何版本,并创建一个虚拟环境:

在根目录下创建一个dify_env的虚拟环境:

python -m venv dify_env 

 然后

source ../dify_env/bin/activate

安装依赖:

uv sync –dev

uv安装依赖的报错处理

使用uv sync –dev的时候如果你有告警,请看下面的解决方案,如果没有,请跳过

你可能会收到上面的警告信息,

不要慌,在api文件夹下面你可以看到多了一个.env文件夹

 这个时候你需要

source .venv/bin/activate

包括以后你切换python虚拟环境的时候就用这个了,不用dify_env了。 

同步数据库

uv run flask db upgrade

启动api服务:

uv run flask run –host 0.0.0.0 –port=5001 –debug

如果后台启动,使用

nohup uv run flask run –host 0.0.0.0 –port=5001 –debug &

启动任务服务:

uv run celery -A app.celery worker -P gevent -c 1 –loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion

如果后台启动,使用

nohup uv run celery -A app.celery worker -P gevent -c 1 –loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion &

安装web服务:

进入到web路径下,

首先确保你安装了nodejs 22.11以上版本,pnpm在10以上版本

Before starting the web frontend service, please make sure the following environment is ready.
– [Node.js](https://nodejs.org) >= v22.11.x
– [pnpm](https://pnpm.io) v10.x

我们使用命令行:

nvm install v22.12.0

npm install -g pnpm@10.1

安装依赖:

pnpm install

编辑修改配置文件

cp .env.example .env.local

 修改我圈出来的这两个地方,使用你的域名也好,ip地址也好。


打包编译:

pnpm run build

编译好之后就可以使用

nohup pnpm run start –port=3001 –host=0.0.0.0 &

启动web服务了

登录

浏览器里输入http://ip:3000 一步步创建一个管理员账号。登录主界面后显示如下:

这样我们通过dify源码安装部署的操作就结束了。

异常报错

1.Expecting value:line 1 column 1 (chat 0)

这种一般是访问某一个服务的接口报错导致的,浏览器使用开发者模式查看发现这里报错:

 然后从git官网尝试寻找答案,分别从

https://github.com/langgenius/dify/issues/14663 这里找到了一个和我很类似的问题,我最开始以为是代理的问题,cat /etc/docker/daemon.json 

 增加了一项 no-proxy:

"no-proxy":"localhost,127.0.0.1,elasticsearch,kibana,weaviate,qdrand,db,redis,web,worker,plugin_daemon,api,sandbox,ssrf_proxy,nginx"

然后重启docker (service docker restart)然而并没有生效。

在我一筹莫展的时候,我决定调试下python工程,我从报400错误的请求地址入手,找到dify1.0apicontrollersconsoleworkspaceplugin.py 这个文件,进而找到这一行代码

api.add_resource(PluginFetchInstallTasksApi, “/workspaces/current/plugin/tasks”)

接下来进入到这个函数里

继续往里走:-》fetch_plugin_installation_tasks

继续走:

这里我加了一行代码输出了结构:

发现是 调用接口查询http://192.168.10.171:5002/plugin/1f40ec23-3d5f-4c97-9e65-7790f71c691d/management/install/tasks?page=1&page_size=100

出现了502错误,于是我发现5002端口正好是容器化环境 dify_plugin_daemon的端口,于是我attach进入之后发现redis数据库连接失败了,使用的还是默认的是6379端口,而不是新的映射端口6380因此plugin_daemon一直在尝试重连redis。

然后我就重修改镜像配置docker-compose.middleware.yaml

将映射到主机上的端口6379改成6380

重新打镜像,还是提示redis连接失败,redis对应的桥接地址是172.21.0.4,plugin_daemon这里配置的连接redis的地址是自动获取redis的桥接地址,最开始以为是桥接ip不通的原因,于是我ping了下172.21.0.4:

ip是通的,于是我继续修改docker-compose.middleware.yaml配置文件,将原来获取桥接地址的都统一换成localhost了另外将容器plugin_daemon的网络模式换成主机模式的网络

 重新安装镜像,修改api服务里的redis连接端口即可正常了。

请登录后发表评论

    没有回复内容