Dify源码本地部署启动

news2024/11/23 19:29:04

背景

Dify是一个开源LLM应用程序开发平台。Dify的直观界面结合了人工智能工作流、RAG管道、代理功能、模型管理、可观察性功能等,让您快速从原型到生产。

Dify提供在线试用功能,可以直接在线体验其功能。同时也支持docker部署,源码部署等方式。源码部署可以查看Dify的实现细节,并进行定制化改造。本次记录源码部署遇到的问题和解决方案。

前置准备

由于是源码部署,还要对Dify进行改造,所以在Windows系统进行部署。本次部署使用win11系统。

Dify官网建议源码在linux系统下启动,所以需要在Windows下安装WSL2,启动linux子系统。本次安装WSL2使用的是Ubuntu 20.04.6系统。

同时需要在Windows系统安装Docker Desktop。点击下载

上面下载链接国内可能打不开,如果打不开需要自己找Docker Desktop安装包进行安装。本次使用的是4.31.1版本Docker Desktop。下载后正常安装Docker Desktop即可。然后注册账号进行登录。后续需要在Docker Desktop上拉取镜像。

部署过程

1. 拉取源码

在Windows系统,拉取源码即可:

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

2. 拉取必要镜像

首先,打开拉取的Dify源码代码,在docker文件夹中,打开docker-compose.middleware.yaml文件,看里面定义的镜像已经版本。
包括:

  • image: postgres:15-alpine
  • image: redis:6-alpine
  • image: semitechnologies/weaviate(此处注意,官网定义的版本在Docker Desktop中不能拉取到,所以把版本去掉了,拉取最新版本镜像)
  • image: langgenius/dify-sandbox:0.2.1
  • image: ubuntu/squid:latest

在Docker Desktop中搜索上面镜像,点击pull进行拉取(不要使用Docker Desktop启动镜像),如下图所示:

在这里插入图片描述

3. 启动容器

通过WSL2系统进入到下载的Dify源码文件夹中,进入docker 文件夹,使用以下命令启动容器:

docker compose -f docker-compose.middleware.yaml up -d

注:Windows系统安装了Docker Desktop后,WSL2系统也可以使用docker命令。

这里遇到一个坑,安装官网操作,上述命令应该能正常启动docker容器。但是在实际操作中postgres容器启动报错。报错信息是:

initdb: error: could not change permissions of directory "/var/lib/postgresql/data/pgdata"

没有操作/var/lib/postgresql/data/pgdata的权限。通过查看docker-compose.middleware.yaml中的定义,如下图:
在这里插入图片描述
在PGDATA和volumes中定义了此路径。

这里的解决方案是绕了一个弯解决此问题,因为我是用源码启动进行Dify源码的学习,所以数据是否要挂载出来并没有太大影响,所以我选择不进行此路径的挂载。同时,PGDATA的系统变量我也不再进行设置,而是使用它的默认值。

这里,我用Docker Desktop来启动postgresql镜像,并没有使用docker compose来启动。

首先,把WSL中使用docker compose启动的postgresql容器stop,然后将其rm删掉。因为这个容器一直报错一直重启,无法正常使用。然后在Windows的Docker Desktop下,启动postgresql镜像,并按照docker-compose.middleware.yaml中的配置来设置启动参数(volumes和PGDATA除外),如下图所示:
在这里插入图片描述

这样可以正常启动postgres容器,且在WSL2中也可以正常使用。

4. 启动后台服务

后台服务包括一个api service,一个Worker Asynchronous Queue Consumption Service。需要启动这两个服务。

首先需要在WSL2中安装Anaconda,安装方式此处不再进行赘述。
同时需要创建虚拟空间,如下命令所示:

conda create --name dify python=3.10

同时切换到此虚拟环境:

conda activate dify

然后进行以下操作:

  1. 在WSL2中进入Dify源码的api文件夹下,配置.env文件:
cp .env.example .env
  1. 生成SECRET_KEY:
openssl rand -base64 42
  1. 把生成的key复制到.env文件里的SECRET_KEY后面。

  2. 安装api服务需要的python依赖:

pip install -r requirements.txt
  1. 初始化postgres表数据:
flask db upgrade

**注意:**执行到这里时,出现了报错,具体报错博主没有进行记录。大概错误也是少python包。根据报错提示,pip install对应的包,再执行此命令,就可以成功。

  1. 启动api服务:
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
  1. 启动Worker service服务

重新打开一个WSL2终端,切换到dify虚拟环境,在cd到Dify源码的api文件夹下,执行下面命令:

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

输出以下字样代表启动成功:

-------------- celery@TAKATOST.lan v5.2.7 (dawn-chorus)
— ***** -----
– ******* ---- macOS-10.16-x86_64-i386-64bit 2023-07-31 12:58:08

  • *** — * —
  • ** ---------- [config]
  • ** ---------- .> app: app:0x7fb568572a10
  • ** ---------- .> transport: redis://😗*@localhost:6379/1
  • ** ---------- .> results: postgresql://postgres:**@localhost:5432/dify
  • *** — * — .> concurrency: 1 (gevent)
    – ******* ---- .> 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

[tasks] .
tasks.add_document_to_index_task.add_document_to_index_task .
tasks.clean_dataset_task.clean_dataset_task .
tasks.clean_document_task.clean_document_task .
tasks.clean_notion_document_task.clean_notion_document_task .
tasks.create_segment_to_index_task.create_segment_to_index_task .
tasks.deal_dataset_vector_index_task.deal_dataset_vector_index_task
. tasks.document_indexing_sync_task.document_indexing_sync_task .
tasks.document_indexing_task.document_indexing_task .
tasks.document_indexing_update_task.document_indexing_update_task .
tasks.enable_segment_to_index_task.enable_segment_to_index_task .
tasks.generate_conversation_summary_task.generate_conversation_summary_task
. tasks.mail_invite_member_task.send_invite_member_mail_task .
tasks.remove_document_from_index_task.remove_document_from_index_task
. tasks.remove_segment_from_index_task.remove_segment_from_index_task
. tasks.update_segment_index_task.update_segment_index_task .
tasks.update_segment_keyword_index_task.update_segment_keyword_index_task

[2023-07-31 12:58:08,831: INFO/MainProcess] Connected to
redis://:@localhost:6379/1 [2023-07-31 12:58:08,840:
INFO/MainProcess] mingle: searching for neighbors [2023-07-31
12:58:09,873: INFO/MainProcess] mingle: all alone [2023-07-31
12:58:09,886: INFO/MainProcess] pidbox: Connected to
redis://:
@localhost:6379/1. [2023-07-31 12:58:09,890:
INFO/MainProcess] celery@TAKATOST.lan ready.

5. 启动前台服务

重新打开一个WSL2终端,进入Dify源码的web文件夹下,进行以下操作:

  1. 安装node以及npm。
    需要Node.js v18.x (LTS) 以上和 NPM version 8.x.x以上。
    安装命令如下:
# installs nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# download and install Node.js (you may need to restart the terminal)
nvm install 18

# verifies the right Node.js version is in the environment
node -v # should print `v18.20.3`

# verifies the right NPM version is in the environment
npm -v # should print `10.7.0`
  1. 下载前端依赖包:
npm install
  1. 复制web文件夹下的.env.example文件,并将复制的文件重命名为.env.local。里面内容无需改动。
  2. 构建前端代码:
npm run build
  1. 启动前端服务:
npm run start

当出现以下字样时,代表启动成功:

ready - started server on 0.0.0.0:3000, url: http://localhost:3000
warn - You have enabled experimental feature (appDir) in
next.config.js. warn - Experimental features are not covered by
semver, and may cause unexpected or broken application behavior. Use
at your own risk. info - Thank you for testing appDir please leave
your feedback at https://nextjs.link/app-feedback

6. 访问系统,初始化账号

访问 http://127.0.0.1:3000 地址,出现登录界面或注册账号界面,代表启动成功。
首先注册账号,此处遇到的坑是密码如果带 * 号或者括号等特殊字符,可以注册成功,但是登录不进去,会有问题。所以设置密码时,只设置字母大小写+数字的密码才行。

最后

本文部署过程参考官方文档。并对官方文档中没有写明的坑进行了补充。可以结合官方文档和本文进行本地化源码部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++多线程:生产者消费者模式

文章目录 一、模式简介二、头文件、全局变量2.1 仓库类的设计2.1.1 关于仓库类的分析2.1.2 仓库类的设计代码 2.2 工厂类的设计2.2.1 关于工厂类的分析2.2.2 工厂类的设计代码a 将产品item放到仓库repob 将产品item从仓库repo取出c 生产者操作d 消费者操作 2.2.3 主函数代码 三…

Github 2024-06-14 开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量JavaScript项目2Python项目2非开发语言项目2TypeScript项目1Dart项目1Rust项目1Lua项目1Java项目1Jupyter Notebook项目1从零开始构建你喜爱的技…

Jira,一个强大灵活的项目和任务管理工具 Python 库

目录 01初识 Jira 为什么选择 Jira? 02安装与配置 安装 jira 库 配置 Jira 访问 获取 API token: 配置 Python 环境: 03基本操作 创建项目 创建任务 查询任务 更新任务 删除任务 04高级操作 处理子任务 搜索任务 添加附件 评论任务 05实战案例 自动化创建…

java:spring actuator扩展原有info endpoint的功能

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437506 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

DomoAI让你轻松变身视频达人!支持20s完整视频生成!

账号注册 官网&#xff1a;https://www.domoai.app/zh-Hant/library 功能 支持不同风格的视频类型&#xff0c;支持图片转视频&#xff0c;支持文字转图片&#xff0c;支持静态图片变为动态。 可以切换语言为中文 风格转换 选择不同风格的 支持生成20s&#xff0c;目前接触…

牛客网金九银十最新版互联网Java高级工程师面试八股文出炉!面面俱到,太全了

前言 作为一个 Java 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#x…

IDEA创建web项目

IDEA创建web项目 第一步&#xff1a;创建一个空项目 第二步&#xff1a;在刚刚创建的项目下创建一个子模块 第三步&#xff1a;在子模块中引入web 创建结果如下&#xff1a; 这里我们需要把这个目录移到main目录下&#xff0c;并改名为webapp&#xff0c;结果如下 将pom文件…

贪心算法学习四

例题一 解法&#xff08;暴⼒解法 -> 贪⼼&#xff09;&#xff1a; 暴⼒解法&#xff1a; a. 依次枚举所有的起点&#xff1b; b. 从起点开始&#xff0c;模拟⼀遍加油的流程 贪⼼优化&#xff1a; 我们发现&#xff0c;当从 i 位置出发&#xff0c;⾛了 step 步…

如何在 Windows 上安装 MySQL(保姆级教程2024版)

MySQL 是最流行的数据库管理系统 (DBMS) 之一。它轻量、开源且易于安装和使用&#xff0c;因此对于那些刚开始学习和使用关系数据库的人来说是一个不错的选择。 本文主要系统介绍Windows的环境下MySQL的安装过程和验证过程。 目录 1 安装过程 1.1 前置要求 1.2 下载并安装 …

【three.js】旋转、缩放、平移几何体

目录 一、缩放 二、平移 三、旋转 四、居中 附源码 BufferGeometry通过.scale()、.translate()、.rotateX()、.rotateY()等方法可以对几何体本身进行缩放、平移、旋转,这些方法本质上都是改变几何体的顶点数据。 我们先创建一个平面物体,样子是这样的。 一、缩放 // 几何…

基于Matlab的人脸表情识别系统(GUI界面)【W5】

简介&#xff1a; 该系统是一个基于Matlab开发的人脸表情识别应用程序&#xff0c;旨在识别输入图像中的人脸表情&#xff0c;并通过直观的图形用户界面&#xff08;GUI&#xff09;向用户展示识别结果。系统结合了图像处理、机器学习和用户交互技术&#xff0c;使用户能够轻松…

【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存

&#x1f4ad; 写在前面&#xff1a;我们将再次扩展之前的C语言&#xff0c;让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言&#xff1a;有块的作用域 0x01 C- 语言&#xff1a;更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言&#xff1a;有块的…

DistilBertModel模型的简单解释

前言 DistilBertModel((embeddings): Embeddings((word\_embeddings): Embedding(30522, 768, padding\_idx0)(position\_embeddings): Embedding(512, 768)(LayerNorm): LayerNorm((768,), eps1e-12, elementwise\_affineTrue)(dropout): Dropout(p\0.1, inplaceFalse))(trans…

洗地机哪个牌子质量好,性价比高?一文盘点市场热门选择

近年来&#xff0c;洗地机因为其能快速的解决我们耗时、费力又繁琐的地板清洁工作&#xff0c;备受人们的喜爱。但面对多款设备不同功能和特点相近的洗地机&#xff0c;你可能会疑惑&#xff1a;“洗地机哪个牌子质量好&#xff1f;”&#xff0c;如果你正在寻找一款高效、便捷…

视频剪辑可以赚钱吗 快速学会视频剪辑的方法

由于视频剪辑的需求不断增长&#xff0c;学会视频剪辑成为一项自媒体必备的技能&#xff0c;这个技能可以为个人带来收入和职业发展带来机会。无论是作为自由职业者还是在公司工作&#xff0c;掌握视频剪辑技能都可以为你提供更多的工作机会和竞争优势。这篇文章将讲解视频剪辑…

mongodb-java apispringboot整合mongodb

mongodb入门mongodb-java api的使用springboot整合mongodb评论 一 MongoDB 1.1 MongoDB简介 ​ MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&…

Java——可变参数

一、可变参数 1、介绍 Java的可变参数&#xff08;Varargs&#xff09;是一种语法特性&#xff0c;允许一个方法接受不定数量的参数。可变参数的使用通过在参数类型后面添加省略号&#xff08;...&#xff09;实现。这使得方法在调用时可以传入不同数量的参数&#xff0c;而不…

【靶场搭建】-01- 在kali上搭建DVWA靶机

1.DVWA靶机 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是使用PHPMysql编写的web安全测试框架&#xff0c;主要用于安全人员在一个合法的环境中测试技能和工具。 2.下载DVWA 从GitHub上将DVWA的源码clone到kali上 git clone https://github.com/digininj…

新机器到底是入手DDR5还是DDR4?2024年的DDR5能否战未来?

前言 前几天有个小伙伴发来问候&#xff1a;在今年&#xff08;2024年&#xff09;装新机器到底是选择DDR4还是DDR5&#xff1f; 小白淡定了抿了一口茶&#xff0c;缓缓道&#xff1a;…… 小伙伴不淡定了&#xff01;上来就是一句&#xff1a;2024年的DDR5能否战未来&#…

用一个ESP32S3-Zero把有线键盘变为无线

三脚猫最近一直琢磨&#xff0c;那些喜欢买剪线键盘&#xff0c;以及自制键盘瞎折腾的人都是怎么搞的。经过不懈努力&#xff0c;终于想明白除了直接的硬件一个个pin针的高低电压判断后转给蓝牙&#xff0c;拿到现成的古董剪线键盘还有一个方式其实是在usb host转发给蓝牙类似这…