dify项目结构说明与win11本地部署

后续会深度研究下dify,智能体的应用要更广泛一些。我也会根据自己的需求,在dify中中的功能进行增强。

项目结构

  1. api - 后端API服务
  2. web - 前端Web应用
  3. sdks - SDK库
  4. docker - Docker相关配置
  5. dev - 开发相关工具,主要是同步脚本等
  6. images - 项目说明的的图片资源

我先让codeBuddy帮我分析下这个工程,看下如何运行。

中间件依赖

dify的启动,一来一堆中间件

shell 复制代码
cd docker
# 拷贝中间件的环境变量
cp middleware.env.example middleware.env
# 我在docker-compose.middleware.yaml 第一行增加
name: 'dify-middleware'

# 挂在
PGDATA_HOST_VOLUME
REDIS_HOST_VOLUME
WEAVIATE_HOST_VOLUME

# 启动
docker compose -f docker-compose.middleware.yaml up -d

api项目

uv环境安装

从1.3开始dify的python环境使用uv管理了。

shell 复制代码
#安装uv
pip install uv
# 安装python 3.12
uv python install 3.12

准备配置文件

shell 复制代码
cd dify/api
# 复制出一个.env
cp .\.env.example .env

替换SECRET_KEY

生成随机密钥并替换 .env 文件中的 SECRET_KEY 值

shell 复制代码
#替换秘钥,官方的是linux版本,我改成了win
$key = [Convert]::ToBase64String((1..42 | ForEach-Object { Get-Random -Maximum 256 }))
(Get-Content .env) -replace '^SECRET_KEY=.*', "SECRET_KEY=$key" | Set-Content temp_env
Move-Item temp_env .env -Force

安装依赖

shell 复制代码
# 同步uv.lock中的一来到本地
uv sync 

设置python interpreter

  • 打开setting
  • 选择dify的项目的Python Interpreter
  • 2 通过Add InterpreterAdd Local Interpreter
  • 3 选择已经存在的
  • 4 选择路径
  • 最后点击ok

执行数据库迁移

执行数据库迁移到最新版本:

shell 复制代码
uv run flask db upgrade

启动api服务

shell 复制代码
# 在dify目录下执行该命令
uv --directory api run  flask run --host 0.0.0.0 --port=5001 --debug

# 等价于 进入api目录后执行
uv run flask run --host 0.0.0.0 --port=5001 --debug

命令解释

  • --directory 指定工作目录为api

启动worker服务

shell 复制代码
# linux 或mac
uv run celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_trace

# win11
uv run celery -A app.celery worker -P solo --without-gossip --without-mingle -Q dataset,generation,mail,ops_trace --loglevel INFO

需要注意的是,在.env中LOG_TZ默认时区为 UTC,改成中国地区LOG_TZ=Asia/Shanghai

前端项目

dify要求前端的环境是:Node.js v22 + Pnpm v10

看了下我本地的,版本比官方的要低

shell 复制代码
PS C:\Users\yxkong> node -v
v20.15.1
PS C:\Users\yxkong> pnpm -v
9.15.4

直接执行报:

text 复制代码
pnpm install --frozen-lockfile  WARN  Unsupported engine: wanted: {"node":">=v22.11.0"} (current: {"node":"v20.15.1","pnpm":"9.15.4"}) Lockfile is up to date, resolution step is skipped Packages: +1781 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ╭───────────────────────────────────────────────────────────────────╮ │ │ │ Update available! 9.15.4 → 10.11.1. │ │ Changelog: https://github.com/pnpm/pnpm/releases/tag/v10.11.1 │ │ Run "pnpm add -g pnpm" to update. │ │ │ ╰───────────────────────────────────────────────────────────────────╯

先升级下,以前用mac的时候,很简单,直接执行下面的命令即可。

shell 复制代码
npm install -g n

在win上没法执行,直接从官网下载一个覆盖安装。 nodejs.org/zh-cn/downl...

nodejs.org/en/download

pnpm安装升级到是简单。

shell 复制代码
# 升级 pnpm 到最新版
npm install -g pnpm@latest

# 验证版本
pnpm -v
10.11.1

建议大家把缓存目录都改下,要不然c盘越来越大。

安装依赖

shell 复制代码
pnpm install --frozen-lockfile

准备配置

在web目录下,直接从.env.example复制出一个.env文件,正常不用改

shell 复制代码
cp .env.example .env

构建web服务

直接执行pnpm build即可

shell 复制代码
(dify-api) PS E:\ai\code\dify\web> pnpm build
> dify-web@1.4.1 build E:\ai\code\dify\web
> next build

   ▲ Next.js 15.2.3
   - Environments: .env

   Creating an optimized production build ...
 ✓ Compiled successfully
   Skipping validation of types
   Skipping linting
 ✓ Collecting page data
 ✓ Generating static pages (26/26)
 ✓ Collecting build traces
 ✓ Finalizing page optimization

启动web服务

在linux或mac中,启动直接执行pnpm start 即可,在win中报错

shell 复制代码
(dify-api) PS E:\ai\code\dify\web> pnpm start

> dify-web@1.4.1 start E:\ai\code\dify\web
> cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public && cross-env PORT=$npm_config_port HOSTNAME=$npm_config_host node .next/standalone/server.js

      0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x71690000, RegionSize 0x80000, State 0x10000
C:\Users\yxkong\scoop\apps\coreutils\current\bin\cp.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0
 ELIFECYCLE  Command failed with exit code 1.

win11上无法执行,我直接让codebuddy给我创建了一个兼容模式

关键点:

  • 使用fs-extra 屏蔽操作系统之间的差异性,添加依赖
shell 复制代码
cd web && pnpm add fs-extra@11 --save-exact
  • 新增start.js
shell 复制代码
const fs = require('fs-extra');  
const { spawn } = require('child_process');  
  
async function main() {  
  try {  
    // 复制.next/static目录  
    await fs.copy('.next/static', '.next/standalone/.next/static');  
    console.log('Copied .next/static successfully');  
  
    // 复制public目录  
    await fs.copy('public', '.next/standalone/public');  
    console.log('Copied public directory successfully');  
  
    // 获取环境变量  
    const port = process.env.npm_config_port || process.env.PORT || 3000;  
    const hostname = process.env.npm_config_host || process.env.HOSTNAME || 'localhost';  
  
    // 启动服务器  
    const server = spawn('node', ['.next/standalone/server.js'], {  
      env: {  
        ...process.env,  
        PORT: port,  
        HOSTNAME: hostname  
      },  
      stdio: 'inherit'  
    });  
  
    server.on('error', (err) => {  
      console.error('Failed to start server:', err);  
      process.exit(1);  
    });  
  
  } catch (err) {  
    console.error('Error during startup:', err);  
    process.exit(1);  
  }  
}  
  
main();
  • codebuddy修改了启动脚本 最后启动成功。

如果启动失败,把node_modules删除,然后重新走一遍即可。

后记

  • 修改的脚本在win11上验证通过,还未在mac和linux上验证,等验证了,我提交一个pr
  • dify官方的文档还是比较健全的,照着操作,遇到的问题不太多
  • 整体上dify的代码清晰度,对于javaer来说,还是比较友好的

系列文章

uv配置环境

dify应用

DeepSeek+dify 本地知识库:真的太香了
Deepseek+Dify本地知识库相关问题汇总
dify的sandbox机制,安全隔离限制
DeepSeek+dify 本地知识库:高级应用Agent+工作流
DeepSeek+dify知识库,查询数据库的两种方式(api+直连)
DeepSeek+dify 工作流应用,自然语言查询数据库信息并展示
聊聊dify权限验证的三种方案及实现
dify1.0.0版本升级及新功能预览
Dify 1.1.0史诗级更新!新增"灵魂功能"元数据,实测竟藏致命Bug?手把手教你避坑
【避坑血泪史】80次调试!我用Dify爬虫搭建个人知识库全记录
手撕Dify1.x插件报错!从配置到网络到Pip镜像,一条龙排雷实录
dify1.2.0升级,全新循环节点优化,长文写作案例
dify1.x无网环境安装插件
dify应用:另类的关键词检索
Dify 1.5.0 上线:这次调试功能,真的省了我一半时间
Dify × MCP 实战(一):用插件一分钟搞定MCP Server(含时间踩坑实践)
Dify × MCP 实战(二):发布工作流为 AI 工具服务,全流程配置 + Cherry 调用实战
# Dify × MCP 实战(三):结果别再堆字了!用 AntV 插件打造图表可视化工具
Dify插件实战

dify源码

dify项目结构说明与win11本地部署
Dify 深度拆解(二):后端架构设计与启动流程全景图
10分钟搞定企业级登录!Dify无缝集成LDAP实战指南
一文吃透Dify账户系统:多租户 + 多登录方式 + 权限模型全揭底

ragflow相关

DeepSeek+ragflow构建企业知识库:突然觉的dify不香了(1)
DeepSeek+ragflow构建企业知识库之工作流,突然觉的dify又香了
DeepSeek+ragflow构建企业知识库:高级应用篇,越折腾越觉得ragflow好玩
RAGFlow爬虫组件使用及ragflow vs dify 组件设计对比
从8550秒到608秒!RAGFlow最新版本让知识图谱生成效率狂飙,终于不用通宵等结果了
以为发现的ragflow的宝藏接口,其实是一个天坑、Chrome/Selenium版本地狱
NLTK三重降噪内幕!RAGFlow检索强悍竟是靠这三板斧
从代码逆向RAGFlow架构:藏在18张表里的AI知识库设计哲学
解剖RAGFlow!全网最硬核源码架构解析
深度拆解RAGFlow分片引擎!3大阶段+视觉增强,全网最硬核架构解析
深度拆解RAGFlow分片引擎之切片实现
RAGFlow核心引擎DeepDoc之PDF解析大起底:黑客级PDF解析术与致命漏洞
RAGFlow 0.18.0 实战解读:从 MCP 支持到插件配置的全流程揭秘
ragflow 0.19.0 图文混排功能支持

mcp

上线3周:告警减少70%!AI巡检分级报告实战(一)
MCP不像想象的那么简单,MCP+数据库,rag之外的另一种解决方案
上线3周:告警减少85%!纯AI驱动巡检通知实战(二)无硬编码方案曝光

相关推荐
程序员爱钓鱼5 分钟前
Go语言实战案例-简易计算器(加减乘除)
后端
学不会就看10 分钟前
Django--01基本请求与响应流程
后端·python·django
Nejosi_念旧6 小时前
解读 Go 中的 constraints包
后端·golang·go
风无雨6 小时前
GO 启动 简单服务
开发语言·后端·golang
小明的小名叫小明6 小时前
Go从入门到精通(19)-协程(goroutine)与通道(channel)
后端·golang
斯普信专业组6 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang
一只叫煤球的猫8 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员
ai小鬼头8 小时前
AIStarter新版重磅来袭!永久订阅限时福利抢先看
人工智能·开源·github
你的人类朋友9 小时前
🫏光速入门cURL
前端·后端·程序员
春哥的研究所9 小时前
可视化DIY小程序工具!开源拖拽式源码系统,自由搭建,完整的源代码包分享
小程序·开源·开源拖拽式源码系统·开源拖拽式源码·开源拖拽式系统