很多人,包括我在最初使用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连接端口即可正常了。



没有回复内容