01_Dify开源版使用源代码本地启动

01_Dify开源版使用源代码本地启动

一、前提条件

1.1 硬件要求

在安装 Dify 之前,请确保您的设备符合以下最低系统要求:

  • CPU >= 2 核
  • RAM >= 4 GiB

1.2 安装Docker和Docker Compose

在这里插入图片描述

👉 Ubuntu 安装Docker和Docker Compose图文教程

👉 Windows下DockerDesktop安装配置图文教程,含软件安装包

1.3 安装 Git

👉 Windows下Git安装配置及常用操作图文教程,含软件安装包

二、克隆 Dify 仓库

2.1 添加 Dify 的远程仓库

git remote add dify https://gitee.com/dify_ai/dify.git 
在这里插入图片描述

2.2 查看已关联的远程仓库

git remote -v 
在这里插入图片描述

2.3 拉取 Dify 远程仓库指定 tag 的代码

获取 Dify 远程仓库的所有信息(包括 tags),这会从远程仓库下载所有 tag 和对应的提交历史。

git fetch --tags 
在这里插入图片描述

查看可用的 tag 列表,退出输入q

git tag -l 
在这里插入图片描述

完整克隆 Dify 代码

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

切换到 Dify 代码目录

cd dify 
在这里插入图片描述

然后创建基于 tag 的分支

# git checkout tags/<tag_name> -b <new_branch_name> git checkout tags/1.4.3 -b dify-1.4.3 

三、创建虚拟环境

👉 Windows下Miniconda3安装配置图文教程,含软件安装包

3.1 创建虚拟环境

需要 Python 3.12

conda create --name dify python=3.12
在这里插入图片描述

3.2 查看虚拟环境

conda env list 
在这里插入图片描述

四、启动 API 服务

4.1 Dify 项目配置文件

导航到 api 目录

cd api 
在这里插入图片描述

准备环境变量配置文件

cp .env.example .env 
在这里插入图片描述

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

awk -v key="$(openssl rand -base64 42)"'/^SECRET_KEY=/ {sub(/=.*/, "=" key)} 1' .env > temp_env &&mv temp_env .env 
在这里插入图片描述

4.2 安装 Dify 项目依赖

使用 VSCode 打开 Dify 项目,选择 dify 虚拟环境

在这里插入图片描述

使用 uv 管理依赖,安装 uv

pip install uv 
在这里插入图片描述

通过运行以下命令使用 uv 安装所需依赖

uv sync
在这里插入图片描述

4.3 Dify 数据库迁移

在 PostgreSQL 数据库创建 dify 库

在这里插入图片描述

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

uv run flask db upgrade 
在这里插入图片描述

4.4 启动 API 服务

uv run flask run --host 0.0.0.0 --port=5001 --debug 
在这里插入图片描述

五、启动 Worker 服务

要从队列中消费异步任务,例如数据集文件导入和数据集文档更新,请按照以下步骤启动 Worker 服务

5.1 macOS 或 Linux 启动 Worker 服务

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

5.2 Windows 系统启动 Worker 服务

新建终端,安装 python-magic 的 Windows 兼容版本

# 进入 api 目录 cd api # 安装依赖  pip install python-magic-bin 
在这里插入图片描述

启动 Worker 服务请使用以下命令:

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

预期输出:

在这里插入图片描述

六、设置 Web 服务

启动用于前端页面的 web 服务。

6.1 环境准备

要启动 web 前端服务,需要 Node.js v22 (LTS) 和 PNPM v10。

👉 Windows下Node和pnpm的安装配置图文教程,含软件安装包

6.2 启动 Web 服务

新建终端,进入 web 目录

cd web 
在这里插入图片描述

安装依赖

pnpminstall
在这里插入图片描述

准备环境变量配置文件:在当前目录中创建一个名为 .env.local 的文件,并从 .env.example 复制内容。根据您的需求修改这些环境变量的值:

在这里插入图片描述

启动 web 服务

pnpm run dev 
在这里插入图片描述

6.3 访问 Dify

通过浏览器访问 http://127.0.0.1:3000 即可享受 Dify 所有激动人心的功能

在这里插入图片描述

控制台日志输出:

在这里插入图片描述

6.4 设置管理员账户

注册管理员账户

在这里插入图片描述

注册成功后登录

在这里插入图片描述

登录成功

在这里插入图片描述

七、解决后台报错问题

7.1 问题分析

在这里插入图片描述

在本地部署 Dify 时,其核心模块尝试与插件守护进程(Plugin Daemon Service)通信失败

7.2 解决方案

dify-plugin-daemon使用源码启动图文教程

7.3 效果展示

API 服务端控制台输出不再报获取插件的错误

在这里插入图片描述

Read more

C++庖丁解牛:深入理解多态:从虚函数表到底层实现

C++庖丁解牛:深入理解多态:从虚函数表到底层实现

深入理解多态:从虚函数表到底层实现 * 一、多态的概念 * 1.1 编译时多态 * 1.2 运行时多态 * 二、多态的定义和使用 * 2.1 多态的判定标准 * 2.1.1 虚函数 * 2.1.2 函数重写 * 2.2 相关的题目 * 2.3 析构函数的重写 * 2.4 override 和 final关键字 * 2.5 纯虚函数和抽象类 * 2.6 协变(不重要,了解即可) * 三、多态的底层实现 * 3.1 虚函数表简介 * 3.2 多态的实现

By Ne0inhk
【C++ 入门】:引用、内联函数与 C++11 新特性(auto、范围 for、nullptr)全解析

【C++ 入门】:引用、内联函数与 C++11 新特性(auto、范围 for、nullptr)全解析

目录 一、引用 1.1 引用概念 1.2 引用的特性 1.3 常引用 1.4 使用场景 1.5. 传引用、传值效率比较 1.6  指针和引用的区别 【面试题】:引用和指针的对比 二、内联函数 2.1 内联函数是啥? 2.2 如何判断是否为内联函数? 2.3 内联函数特性 【问题】: 为啥内联函数可能会导致目标文件变大 【问题】:递归不能内联的核心原因 【面试题】:宏的优缺点? 【面试题】:内联函数的优缺点? 三、auto关键字(C++11) 3.1 auto

By Ne0inhk
【C++ 入门】Cyber动态义体——【vector容器】vector底层原理是什么?该怎么使用他?一文带你搞定所有问题!!!

【C++ 入门】Cyber动态义体——【vector容器】vector底层原理是什么?该怎么使用他?一文带你搞定所有问题!!!

⚡ CYBER_PROFILE ⚡ /// SYSTEM READY /// [WARNING]: DETECTING HIGH ENERGY 🌊 🌉 🌊 心手合一 · 水到渠成 >>> ACCESS TERMINAL <<<[ 🦾 作者主页 ][ 🔥 C语言核心 ][ 💾 编程百度 ][ 📡 代码仓库 ] --------------------------------------- Running Process: 100% | Latency: 0ms 索引与导读 * 1. 什么是 vector? * 2. 基本语法 与 核心特性 * 3. vector 常用的构造声明定义 * 3)示例代码与详细讲解 * 4. vector iterator的使用 * 4)示例代码与详细讲解 * 5. vector的容量增长问题 * 🚩注意事项 * 1)

By Ne0inhk
C++ string 类详解:概念、常用操作与实践(算法竞赛类)

C++ string 类详解:概念、常用操作与实践(算法竞赛类)

🔥个人主页:星轨初途 ❄专栏传送门:C语言,数据结构,C++学习(竞赛类)算法及编程题分享 文章目录 * 前言 * 一、string概念 * 二、string的常见操作和功能 * 1、头文件 * 2、创建字符串 * 3、string字符串的输入 * (1)正常输入(cin) * (2)getline(带空格输入) * 第一种(默认以‘\n’为结束标志) * 第二种(自定义结束标志) * 4、size()——字符串长度 * 5、迭代器(iterator) * begin()和end() * (1)比较 * (2)遍历 * 改变指定字符 * 6、字符串的插入和删除 * (1)插入

By Ne0inhk