当 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 history

Revision 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"""UPDATE
    public.messages
SET
    parent_message_id = '{UUID_NIL}'
WHERE
    invoke_from = 'service-api'
    AND parent_message_id IS NULL
    AND created_at >= '{v0_9_0_release_date}';"""
    op.execute(sql)
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    sql = f"""UPDATE
    public.messages
SET
    parent_message_id = NULL
WHERE
    invoke_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 history

Revision 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"""UPDATE
    public.messages
SET
    parent_message_id = '{UUID_NIL}'
WHERE
    invoke_from = 'service-api'
    AND parent_message_id IS NULL
    AND 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"""UPDATE
    public.messages
SET
    parent_message_id = NULL
WHERE
    invoke_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【H3C华三 】VRRP与BFD、Track联动配置案例

原创 厦门微思网络 组网需求 如图1所示,区域A和区域B用户所在网络的出口处部署了两台汇聚层设备(Device A和Device B)。 现要求使用VRRP与BFD、Track联动功能,实现以下需求: • 在Device A和Device B上分别配置两个…

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行,mentor给的是一个rosbag格式的数据包,配置过程出了几个问题记录一下,沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…

【汇编】c++游戏开发

由一起学编程创作的‘C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~’: C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~_射击c-CSDN博客文章浏览…

Vue Canvas实现区域拉框选择

canvas.vue组件 <template><div class"all" ref"divideBox"><!-- 显示图片&#xff0c;如果 imgUrl 存在则显示 --><img id"img" v-if"imgUrl" :src"imgUrl" oncontextmenu"return false" …

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

在MATLAB中导入TXT文件的若干方法

这是一篇关于如何在MATLAB中导入TXT文件的文章&#xff0c;包括示例代码和详细说明 文章目录 在MATLAB中导入TXT文件1. 使用readtable函数导入TXT文件示例代码说明 2. 使用load函数导入TXT文件示例代码说明 3. 使用importdata函数导入TXT文件示例代码说明 4. 自定义导入选项示例…

Clonezilla 再生龙制作系统U盘还原系统 ubuntu 22.04 server

参考 Clonezilla 再生龙制作系统U盘还原系统(UltraISO) https://blog.csdn.net/qq_57172130/article/details/120417522 Clonezilla-备份_部署ubuntu https://blog.csdn.net/xiaokai1999/article/details/131054826 基于再生龙&#xff08;clonezilla&#xff09;的Ubuntu镜…

号卡分销系统,号卡系统,物联网卡系统源码安装教程

号卡分销系统&#xff0c;号卡系统&#xff0c;物联网卡系统&#xff0c;&#xff0c;实现的高性能(PHP协程、PHP微服务)、高灵活性、前后端分离(后台)&#xff0c;PHP 持久化框架&#xff0c;助力管理系统敏捷开发&#xff0c;长期持续更新中。 主要特性 基于Auth验证的权限…

Nature Communications 基于触觉手套的深度学习驱动视触觉动态重建方案

在人形机器人操作领域&#xff0c;有一个极具价值的问题&#xff1a;鉴于操作数据在人形操作技能学习中的重要性&#xff0c;如何有效地从现实世界中获取操作数据的完整状态&#xff1f;如果可以&#xff0c;那考虑到人类庞大规模的人口和进行复杂操作的简单直观性与可扩展性&a…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

vue3点击按钮el-dialog对话框不显示问题

vue3弹框不显示问题&#xff0c;控制台也没报错 把 append-to-body:visible.sync"previewDialogOpen" 改为 append-to-bodyv-model"previewDialogOpen" 就好了。

vue项目使用eslint+prettier管理项目格式化

代码格式化、规范化说明 使用eslintprettier进行格式化&#xff0c;vscode中需要安装插件ESLint、Prettier - Code formatter&#xff0c;且格式化程序选择为后者&#xff08;vue文件、js文件要分别设置&#xff09; 对于eslint规则&#xff0c;在格式化时不会全部自动调整&…

Python爬虫----python爬虫基础

一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些&#xff1f; 2、什么是网络爬虫&#xff1f; 3、什么是通用爬虫和聚焦爬虫&#xff1f; 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…

大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

Unity中HDRP设置抗锯齿

一、以前抗锯齿的设置方式 【Edit】——>【Project Settings】——>【Quality】——>【Anti-aliasing】 二、HDRP项目中抗锯齿的设置方式 在Hierarchy中——>找到Camera对象——>在Inspector面板上——>【Camera组件】——>【Rendering】——>【Pos…

动手学深度学习72 优化算法

1. 优化算法 任意两点连线&#xff0c;所有线上的值都在集合里面–凸集 在机器学习&#xff0c;凹凸函数的区别&#xff1f; 凸函数表达能力有限 动量法&#xff1a; 比较平滑的改变方向&#xff0c;两个下降方向不一样【冲突】的时候&#xff0c;抵消掉一些使梯度的更新不那…

Linux:进程的优先级 进程切换

文章目录 前言一、进程优先级1.1 基本概念1.2 查看系统进程1.3 PRI和NI1.4 调整优先级1.4.1 top命令1.4.2 nice命令1.4.3 renice命令 二、进程切换2.1 补充概念2.2 进程的运行和切换步骤&#xff08;重要&#xff09; 二、Linux2.6内核进程O(1)调度队列&#xff08;重要&#x…

Python绘制雪花

文章目录 系列目录写在前面技术需求完整代码代码分析1. 代码初始化部分分析2. 雪花绘制核心逻辑分析3. 窗口保持部分分析4. 美学与几何特点总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4…

2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 B题 城市轨道交通列车时刻表优化问题 原题再现&#xff1a; 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发&#xff08;或通过&#xff09;时刻&#xff0c;其在实际…