当 docker-compose.yaml 文件部署时,Dify 线上版本升级过程

如果线上 Dify 是通过 docker-compose.yaml 文件部署的,那么当 Dify 版本升级时该如何操作呢?官方已经给出了 Docker composeSource Code 两种方式。相对而言,前者更简单些,至少不需要安装依赖包和迁移数据库文件。为了更加具体化理解,假设把 Dify v0.9.1 升级为 Dify v0.9.1-fix1 版本[1]。

本文主要介绍当 docker-compose.yaml 文件部署时,Dify 线上版本升级过程。主要用到的内容就是 docker 目录中的这些文件。对这些文件的详细介绍,参考文献[2]。当docker-compose.yaml文件部署时,Dify线上版本升级过程:https://z0yrmerhgi8.feishu.cn/wiki/O0q9wPKL9istdgkldDzcArV9nMe

一.重点文件介绍

1.yaml 和.env 文件关系

(1).env 文件作用

yaml 文件和 .env 文件什么关系呢?比如 .envdocker-compose.yamlmiddleware.envdocker-compose.middleware.yaml。简单理解,docker-compose.yaml 文件可引用 .env 文件中的环境变量。docker-compose 支持从 .env 文件中加载环境变量,并在 docker-compose.yaml 文件中使用它们。这通常用于配置敏感信息或根据不同环境(开发、生产等)动态设置参数。

(2)默认加载.env 文件

需要注意的是默认情况下,无论是 docker-compose.yaml 还是 docker-compose.middleware.yaml,它们都只会读取当前目录下的 .env 文件,不会自动读取其他命名的 .env 文件(如 middleware.env)。

因此,docker-compose.middleware.yaml 不会默认读取 middleware.env 文件中的环境变量,除非显式指定它。

(3)指定加载 middleware.env 文件

如何让 docker-compose.middleware.yaml 读取 middleware.env需要通过 --env-file 选项来显式指定 middleware.env 文件,这样它才能被正确加载。比如,docker-compose --env-file middleware.env -f docker-compose.middleware.yaml up。具体到 docker-compose.middleware.yaml 文件中指定 middleware.env 如下所示:

(4)docker-compose.yaml 文件部署

因为线上使用 docker-compose.yaml 文件部署,所以用到了 .envdocker-compose.yaml,没有用到 middleware.envdocker-compose.middleware.yaml

二.线上版本更新 [1]

1.需要备份的文件

包括 docker-compose.yaml 文件,.env 文件,volumes 目录。如下所示:

cd docker
cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
cp .env .env.$(date +%s).bak
tar -cvf volumes-$(date +%s).tgz volumes

2.需要更新的文件

包括 docker-compose.yaml 文件,.env 文件。操作方式是使用目标版本(比如 Dify v0.9.1-fix1 版本)的对应文件,同时更新相关参数,比如 URL、数据库密码、开放端口等。

3.线上升级操作过程

备份和更新文件后,首先停止服务,然后更新服务,如下所示:

sudo docker compose -f docker-compose.yaml -p "dify0901" up -d
sudo docker compose -f docker-compose.yaml -p "dify0901-fix1" down

三.线上更新原理

1.镜像是何时更新的

如果使用官方镜像,系统会自动从 Docker Hub 拉取。如果自行打包镜像,那么需要上传服务器后进行加载。

2.数据库是合适迁移的

langgenius/dify-api:0.9.1-fix1 镜像就是通过如下 Dockerfile 打包的,容器启动时会执行命令 ENTRYPOINT ["/bin/bash", "/entrypoint.sh"],如下所示:

ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] 命令中就有数据库迁移的脚本,如下所示:

根据什么迁移呢?就是 alembic_version 表中的 version_num。迁移什么内容呢?就是 dify\api\migrations\versions 目录下自动生成的文件。如下所示:

具体到 Dify v0.9.1 升级为 Dify v0.9.1-fix1 版本,对应的文件为 2024_10_09_1329-d8e744d88ed6_fix_wrong_service_api_history.py。如下所示:

3.解释迁移文件

2024_10_09_1329-d8e744d88ed6_fix_wrong_service_api_history.py 为例,如下所示:

"""fix wrong service-api historyRevision ID: d8e744d88ed6
Revises: 33f5fac87f29
Create Date: 2024-10-09 13:29:23.548498"""
from alembic import op
from constants import UUID_NIL
import models as models
import sqlalchemy as sa# revision identifiers, used by Alembic.
revision = 'd8e744d88ed6'
down_revision = '33f5fac87f29'
branch_labels = None
depends_on = None# (UTC) release date of v0.9.0
v0_9_0_release_date= '2024-09-29 12:00:00'def upgrade():# ### commands auto generated by Alembic - please adjust! ###sql = f"""UPDATEpublic.messages
SETparent_message_id = '{UUID_NIL}'
WHEREinvoke_from = 'service-api'AND parent_message_id IS NULLAND created_at >= '{v0_9_0_release_date}';"""op.execute(sql)# ### end Alembic commands ###def downgrade():# ### commands auto generated by Alembic - please adjust! ###sql = f"""UPDATEpublic.messages
SETparent_message_id = NULL
WHEREinvoke_from = 'service-api'AND parent_message_id = '{UUID_NIL}'AND created_at >= '{v0_9_0_release_date}';"""op.execute(sql)# ### end Alembic commands ###

这段 Alembic [3]迁移脚本用于修正 service-api 相关的数据问题,具体是更新 messages 表中的 parent_message_id 字段。

(1)头部注释

"""fix wrong service-api historyRevision ID: d8e744d88ed6
Revises: 33f5fac87f29
Create Date: 2024-10-09 13:29:23.548498
"""
  • 功能描述:这段注释说明了本次迁移的主要功能是修复 service-api 的历史记录数据。
  • Revision ID: d8e744d88ed6 是此次迁移的唯一标识符。
  • Revises: 依赖于之前的迁移版本 33f5fac87f29
  • Create Date: 创建日期为 2024-10-09。

(2)导入相关模块

from alembic import op
from constants import UUID_NIL
import models as models
import sqlalchemy as sa
  • alembic.op:用于执行数据库操作,如 op.execute(),这是 Alembic 提供的操作接口。
  • UUID_NIL:假设 UUID_NIL 是一个常量,表示空的 UUID。UUID_NIL 通常代表一个零值 UUID (00000000-0000-0000-0000-000000000000)。
  • modelssqlalchemy:虽然导入了 modelssqlalchemy,但在此迁移脚本中并未直接使用这些模块。可能这些导入是模板代码的产物,或者为将来使用做准备。

(3)版本信息

revision = 'd8e744d88ed6'
down_revision = '33f5fac87f29'
branch_labels = None
depends_on = None
  • revision:本次迁移的唯一标识符。
  • down_revision:指向上一个迁移的 ID,即 33f5fac87f29,用于定义迁移顺序。
  • branch_labelsdepends_on:没有定义分支标签或依赖。

(4)定义版本发布日期

v0_9_0_release_date = '2024-09-29 12:00:00'

v0_9_0_release_date:这是版本 v0.9.0 的发布日期。用作 SQL 查询中的条件,用来确保只影响在此日期及之后创建的数据。

(5)upgrade 函数

def upgrade():# ### commands auto generated by Alembic - please adjust! ###sql = f"""UPDATEpublic.messages
SETparent_message_id = '{UUID_NIL}'
WHEREinvoke_from = 'service-api'AND parent_message_id IS NULLAND created_at >= '{v0_9_0_release_date}';"""op.execute(sql)# ### end Alembic commands ###
  • 功能:当运行 upgrade 时,执行一段 SQL 来修复 parent_message_idNULL 的记录。

  • SQL 逻辑

    • UPDATE public.messages:更新 messages 表。
    • SET parent_message_id = ‘{UUID_NIL}’:将 parent_message_id 字段设置为 UUID_NIL
    • WHERE 子句
      • invoke_from = ‘service-api’:只影响由 service-api 触发的记录。
      • parent_message_id IS NULL:筛选出 parent_message_idNULL 的记录。
      • AND created_at >= ‘{v0_9_0_release_date}’:确保只影响在 v0_9_0 版本发布后的数据(即 2024-09-29 12:00:00 之后创建的记录)。

(6)downgrade 函数

def downgrade():# ### commands auto generated by Alembic - please adjust! ###sql = f"""UPDATEpublic.messages
SETparent_message_id = NULL
WHEREinvoke_from = 'service-api'AND parent_message_id = '{UUID_NIL}'AND created_at >= '{v0_9_0_release_date}';"""op.execute(sql)# ### end Alembic commands ###
  • 功能:当需要回滚迁移时,执行 downgrade 函数,恢复之前的状态。

  • SQL 逻辑

    • UPDATE public.messages:更新 messages 表。
    • SET parent_message_id = NULL:将 parent_message_id 字段恢复为 NULL
    • WHERE 子句
      • invoke_from = ‘service-api’:只影响由 service-api 触发的记录。
      • parent_message_id = ‘{UUID_NIL}’:筛选出 parent_message_idUUID_NIL 的记录。
      • AND created_at >= ‘{v0_9_0_release_date}’:确保只影响在 v0_9_0 版本发布后的数据。

小结:这个迁移脚本的作用是修正 service-api 触发的消息记录,其中 parent_message_idNULL 的记录被更新为 UUID_NILupgrade 函数负责修改数据,downgrade 函数则负责回滚修改。

参考文献

[1] https://github.com/langgenius/dify/releases/tag/0.9.1-fix1

[2] Dify 的 Docker 部署指南 (中文翻译):https://z0yrmerhgi8.feishu.cn/wiki/GDscwWIeiir986kTkyNcIZZAnpe

[3] SQLAlchemy(alembic)和 Flask-SQLAlchemy(Flask-Migrate)入门教程:https://z0yrmerhgi8.feishu.cn/wiki/IbMsw5xbLintiGkCc2bcFDStnMc

[4] 当docker-compose.yaml文件部署时,Dify线上版本升级过程:https://z0yrmerhgi8.feishu.cn/wiki/O0q9wPKL9istdgkldDzcArV9nMe

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

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

相关文章

RHCSA学习超详细知识点2命令篇

输入命令行的语法 终端中执行命令需要遵照一定的语法,输入命令的格式如下: 命令 参数命令 -选项 参数 输入命令时可以包含多个选项,假如一个命令有-a,-b,-c,-d四个选项,可以写作 命令 -a -b -c -d 参数 这里的多个选项可以“提…

小米路由器用外网域名访问管理界面

本文在Redmi AX3000 (RA81)设置,其他型号路由器的管理界面端口可能各不相同。 开始之前需要保证路由器SSH功能正常,如果没有SSH可以参考这里。 1. 给WAN口开放80端口 可以通过下载mixbox的firewall插件或者其他防火墙插件开放端口。 2. 把域名解析到路…

✅DAY27贪心算法 | 455.分发饼干 | 376. 摆动序列 | 53. 最大子序和

一、贪心算法 核心理念是每一步都做出局部最优选择,以期最终得到全局最优解。它通常用于求解一些最优化问题,例如最小生成树、最短路径、背包问题等。 二、贪心算法的步骤 1. 定义选择标准:确定每一步如何选择当前最优解。 2. 验证贪心策…

无人机+无人车+机器狗:城市巷战突破技术详解

在城市巷战中,无人机、无人车和机器狗的组合可以形成一种全新的战场突破技术,这种组合能够大幅提升作战效率,减少人员伤亡。以下是对这一技术的详细解析: 一、无人机的作用 1.空中侦察:无人机能够提供高空视角&#x…

智慧环保之环境网格化监测解决方案

1. 引言 智慧环保网格化监测解决方案,旨在通过先进的信息技术手段,实现环境质量的全面、精准、实时监测,为环境治理提供科学依据和决策支持。 2. 背景与挑战 当前,环境污染问题日益严峻,治理难度不断加大。传统监测手…

vue2+3 —— Day5/6

自定义指令 自定义指令 需求&#xff1a;当页面加载时&#xff0c;让元素获取焦点&#xff08;一进页面&#xff0c;输入框就获取焦点&#xff09; 常规操作&#xff1a;操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs <input ref"inp" type&quo…

2024 RISC-V 中国峰会 演讲幻灯片和视频回放 均已公开

目录 一、幻灯片地址&#xff1a; 二、演讲视频&#xff1a; 一、幻灯片地址&#xff1a; RVSC2024/slides at main cnrv/RVSC2024 GitHub 二、演讲视频&#xff1a; RISC-V国际基金会的个人空间-RISC-V国际基金会个人主页-哔哩哔哩视频 参考&#xff1a; 1、RISC-V 中…

sudu问题 --> 添加用户到系统配置文件里面

我们重新创建一个用户lisi 密码&#xff1a;lisixxxxxxxx 重新连接&#xff0c;输入用户&#xff0c;输入密码 是不行的 我们输入exit退出 打开文件 再切换身份&#xff0c;切换为超级管理员root 输入密码 再打开 我们打开后设置行号在50行左右可以看到我们的目标 我们再进行…

C++: string(二)

✨✨ 欢迎大家来到我的文章✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 分类专栏&#xff1a;c 我的主页&#xff1a;tyler s blog 文章目录 一 string的成员函数1 insert2 resize3assign4erase5replace6 find(1) find(2)rfind…

【无人机设计与控制】基于MATLAB的四旋翼无人机PID双闭环控制研究

摘要 本文基于MATLAB/Simulink环境&#xff0c;对四旋翼无人机进行了PID双闭环控制设计与仿真研究。通过分析四旋翼无人机的动力学模型与运动学模型&#xff0c;建立了姿态和位置双闭环控制系统&#xff0c;以实现无人机的稳定飞行与精确轨迹跟踪。仿真实验验证了该控制策略的…

DimensionX 部署笔记

目录 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; DimensionX 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; 可以生成&#xff0c;从左向右旋转的&#xff0c;也可以生成从上往下旋转的&#xff1a; import torch from diffusers import CogVideoXImageToVideo…

如何利用SAP低代码平台快速构建企业级应用?

SAP作为全球领先的企业管理软件解决方案提供商&#xff0c;一直致力于为企业提供全面且高效的业务管理工具。随着技术的快速发展&#xff0c;传统的开发方式已经无法满足企业在快速变化的市场环境下的需求。低代码开发平台应运而生&#xff0c;它通过简化应用程序的创建过程&am…

拉取docker镜像应急方法

发现许多docker hub镜像网址速度也慢得发指啦&#xff0c;如果想速度快点&#xff0c;可以考虑买个按量计费的公有云服务器&#xff0c;用他们的内网镜像&#xff0c;然后再导出&#xff0c;然后传到本地。 开通服务器 可以考虑个开通最低配的&#xff0c;这里我用的是腾讯的…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

Ansible一键部署Kubernetes集群

一、环境准备 主机 ip地址 角色 k8s-master 192.168.252.141 master k8s-node1 192.168.252.142 node k8s-node2 192.168.252.143 node 二、实战 Ansible部署 主节点安装Ansible yum -y install epel-release yum -y install ansible ansible --version 开启记…

Comfy UI Manager 自定义节点管理

在 Stable Diffusion Web UI 中&#xff0c;可以通过插件的方式&#xff0c;扩展更多的功能&#xff0c;如&#xff1a;tagger提示词反推、ControlNet 等。 同样的在 Comfy UI 中有类似的功能实现&#xff0c;不过在 Comfy UI 中叫做自定义节点。 通过安装自定义节点的方式&a…

第二十周:机器学习

目录 摘要 ABSTRACT 一、吴恩达机器学习exp2——逻辑回归 1、logistic函数 2、数据预处理 3、损失函数 4、梯度下降 5、设定评价指标 6、决策边界 7、正则化 二、动手深度学习pytorch——数据预处理 1、数据集读取 2、缺失值处理 3、转换为张量格式 总结 摘要…

从人-物到人-机再到人-AI

从 人-物 到 人-机 再到 人-AI &#xff0c;这一演化过程展现了人类与技术、工具的互动方式随着时代的发展而发生的深刻变化。这一变化不仅是技术进步的体现&#xff0c;更是社会、文化以及工作方式的根本转变。以下是这一演变的主要特点及其背后的影响&#xff1a; 1. 人-物时…

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中&#xff0c;我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API&#xff0c;包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库&#xff0c;并创建user 表 …

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…