这里写自定义目录标题
dify的组成部分
本次部署的是dify社区版本,github地址是:https://github.com/langgenius/dify
dify有以下几个组成部分
| 组件名称 | 实现方式 | 作用 |
|---|---|---|
| web | next.js,在dify项目的web文件夹下 | 前端web界面 |
| api | python,在dify项目的的api文件夹下 | web前端界面的后台api,负责接收前端发起的功能请求 |
| worker | python,在dify项目的的api文件夹下 | |
| sandbox | dify使用go自研,https://github.com/langgenius/dify-sandbox | 专门用于运行不可信代码的沙箱环境 |
| plugin_daemon | dify使用go自研,https://github.com/langgenius/dify-plugin-daemon | 管理dify插件 |
| weaviate | Weaviate | 开源向量数据库 |
| db | postgresql | 持久化数据库 |
| redis | redis开源组件 | 提供内存数据库或当做缓存使用 |
| ssrf_proxy | 使用squid | web http,https,ftp的缓存 |
Dify的部署计划
本次部署按照官方源码部署文档的思想,一部分选择本地代码部署,另外一部分使用docker进行部署
| 组件名称 | 方式 |
|---|---|
| web | 源码 |
| api | 源码 |
| worker | 源码 |
| sandbox | docker |
| plugin_daemon | docker |
| weaviate | docker |
| db | docker |
| redis | docker |
| ssrf_proxy | docker |
系统使用windows11
部署结果
web

api

worker

docker

运行界面

部署过程
官方的部署文档:https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/local-source-code
安装docker
通过官方下载docker desktop.
在安装的过程中需要开启windows的虚拟化支持,和开启wsl2
docker的官方文档:https://docs.docker.com/desktop/setup/install/windows-install/#wsl-2-backend
下载 Dify代码到本地

然后把下载下来的代码解压出来放到一个自己习惯的目录中,主要路径最好不要有中文.我放在了D:\work1中

启动docker
cd docker
cp middleware.env.example middleware.env
docker compose -f docker-compose.middleware.yaml up -d
这里启动完成在docker的管理端应该能看到docker的启动结果了.需要注意docker的状态为运行中,也就是绿色的点

到此为止,dify所有使用docker启动的项目已经部署完毕,如pg,redis,沙箱,plugin管理,http缓存,下面需要进入web,api,worker的代码部署环节
安装uv 为python提供虚拟环境
一般的在本机部署python项目的时候都需要先构建一个python虚拟环境,不然项目多了python的版本非常不好控制,我这次使用的是conda的虚拟环境.conda可以创建出很多个python环境,然后在部署项目的时候选择一个环境激活就可以,这样就可以做到环境隔离.
在cmd命令行下执行一下uv,如果发现没有uv命令需要安装,
pip install uv
如果pip命令也没有,那么需要从官网下载并安装一个python
https://www.python.org/downloads/
配置uv软件源(可选,只是加快uv下载软件的速度)
激活了python虚拟环境后需要更改pip软件源到国内,这样可以加快软件包下载速度.
https://zhuanlan.zhihu.com/p/1930714592423703026
比较懒可以跳过这个步骤,
部署api服务(无debug需求版)
1命令行进入到api文件夹下
2把.env.example复制一份并改名叫 .env 这个文件里面是dify的配置信息
3生成随机密钥并替换 .env 文件中的 SECRET_KEY 值
这个是api服务用来加密cookie的值,官方文档给了一个awk命令,我们在windows下面可以手动替换
SECRET_KEY= 成下面文字,毕竟是测试部署,如果在生产环境,需要自己重新生成一个秘钥
# Your App secret key will be used for securely signing the session cookie
# Make sure you are changing this key for your deployment with a strong key.
# You can generate a strong key using `openssl rand -base64 42`.
# Alternatively you can set it with `SECRET_KEY` environment variable.
SECRET_KEY=6ENPIckuXNN2ReA3Qdqfx668WKc4seM6k/tmY8p/5QSVGKclv99fG9IU
4使用uv安装python依赖,
这个要在api文件夹下执行,并且确定使用的是python虚拟环境正确
uv sync

5 安装依赖完成后需要执行数据库初始化
因为docker运行起来的postgresql并没有dify的数据库结构,所以需要初始化表结构
uv run flask db upgrade
6启动api服务
uv run flask run --host 0.0.0.0 --port=5001 --debug
预期输出
* Debug mode: on
INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5001
INFO:werkzeug:Press CTRL+C to quit
INFO:werkzeug: * Restarting with stat
WARNING:werkzeug: * Debugger is active!
INFO:werkzeug: * Debugger PIN: 695-801-919
如果报错提示5432端口连接不上,需要检查docker的db服务是否启动成功,
如果报错提示5432端口连接不上或者连接拒绝,请检查是不是使用了本地pg数据库,并且用户名密码没有在dify中设置.
如果报错其他端口连接不上,同样检查redis,等服务是否开启正常.
下面是pg无法连接的报错信息:
psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?
部署api服务(需要debug 源代码版)
本届需要先按照上一节(部署api服务(无debug需求版)) 把api服务跑起来.
如果需要使用vscode进行源码级debug,那么需要麻烦一点.
使用vscode打开api这个文件夹,注意是api文件夹不是dify的文件夹

然后构建一个launch.js.
在这里插入图片描述


这样会生成一个launch.js的模板
然后复制下面的文件内容,直接写到这个模板中
{
"version": "0.2.0",
"configurations": [
{
"name": "Flask (conda dify环境)",
"type": "python",
"request": "launch",
"module": "flask",
"args": [
"run",
"--host", "0.0.0.0",
"--port", "5001",
"--debug"
],
"stopOnEntry":false,
"justMyCode": false,
"python": "${workspaceFolder}\\.venv\\Scripts\\python.exe"
}
]
}
然后就可以打断点运行了

比如我在知识库的获取列表的地方打了一个断点:

就可以在代码运行到的地方停住了

部署worker
同样在api目录下,确定是否在对应的python虚拟环境中执行如下命令
uv run celery -A app.celery worker -P solo --without-gossip --without-mingle -Q dataset,generation,mail,ops_trace --loglevel INFO
预期输出
2025-10-15 08:53:42,128 INFO [utils.py:162] NumExpr defaulting to 16 threads.
D:\work1\dify-1.4.2\api\controllers\web\remote_files.py:7: UserWarning: To use python-magic guess MIMETYPE, you need to run `pip install python-magic-bin`
from controllers.common import helpers
-------------- celery@MS-DFVZOBLLJNXI v5.5.3 (immunity)
--- ***** -----
-- ******* ---- Windows-11-10.0.26100-SP0 2025-10-15 16:53:43
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: app_factory:0x29c7d494530
- ** ---------- .> transport: redis://:**@localhost:6379/1
- ** ---------- .> results: postgresql://postgres:**@localhost:5432/dify
- *** --- * --- .> concurrency: 16 (solo)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> dataset exchange=dataset(direct) key=dataset
.> generation exchange=generation(direct) key=generation
.> mail exchange=mail(direct) key=mail
.> ops_trace exchange=ops_trace(direct) key=ops_trace
node版本管理,和node,和pnpm
web服务同样有虚拟环境,我是用的nvm
安装nvm请参考:https://www.nvmnode.com/
根据dify文档要启动 web 前端服务,需要 Node.js v22 (LTS) 和 PNPM v10。
所以在安装完nvm之后可以执行

这样当前window使用的node版本就是node v22了
nvm 不用每个cmd窗口执行一次切换.
安装pnpm, pnpm是用来给前端项目安装依赖包的
npm i -g pnpm
pnpm可以切成国内的软件源,避免从国外下依赖包导致巨慢
pnpm config set registry https://registry.npmmirror.com/
部署web
1进入dify的web目录
2 执行下方代码用来下载依赖
pnpm install --frozen-lockfile
这一步要确定真的执行成功没有报错,如果报错可能是依赖版本冲突,或者网络问题,可以根据报错在网络上搜索解决方案.这部报错很头疼.
3 创建前端的配置文件
在web目录中创建一个名为 .env.local的文件,并从 .env.example复制内容
我完全copy了env.example的内容,放到了env.local里面
4构建web项目
pnpm build
5 使用dev模式运行服务
pnpm dev
预期输出
D:\work1\dify-1.4.2\web>pnpm dev
> dify-web@1.4.2 dev D:\work1\dify-1.4.2\web
> cross-env NODE_OPTIONS='--inspect' next dev
Debugger listening on ws://127.0.0.1:9229/63edbefd-5966-4e37-b7f9-913492f13e04
For help, see: https://nodejs.org/en/docs/inspector
Debugger listening on ws://127.0.0.1:9230/5f96684d-d9b0-49cd-b347-a1fe041d598d
For help, see: https://nodejs.org/en/docs/inspector
the --inspect option was detected, the Next.js router server should be inspected at 9230.
▲ Next.js 15.2.3
- Local: http://localhost:3000
- Network: http://192.168.110.192:3000
- Environments: .env.local
✓ Starting...
✓ Ready in 4.3s
○ Compiling /middleware ...
✓ Compiled /middleware in 511ms (108 modules)
○ Compiling /apps ...
Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
体验
我们访问http://localhost:3000就可以看到dify的窗口了.
第一次访问很慢,而且每点一个按钮都很慢,因为前端是懒加载的,第一次进页面前端才会完全执行编译,所以要有点耐心…
第一次进入dify需要设置管理员邮箱和密码,之后就能正常进入dify了
其他问题
如何配置llm访问本地ollma,
需要在dify中安装ollma插件,然后配置

配置ollama



这里要特别主要,我本地使用的是ollama运行的model,使用api访问一般都是使用http://127.0.0.1:11434做为url来访问ollama服务,如果我们这里填127.0.0.1会报错,原因是dify会说无法访问服务,因为我们的plugin运行在docker中,
需要把127.0.0.1改为http://host.docker.internal
一段时间不用了,管理员密码忘记了怎么办
找到下面这个代码文件,然后把168的代码的后半部分删除掉,
原来的代码的意思是校验密码是否存在,并且验证是否通过,我们改成只校验密码存在就行,然后重启api服务.(反正是本地实验)

1984

被折叠的 条评论
为什么被折叠?



