dify 升级记录

背景 dify 版本存在一定的漏洞,需要升级至指定版本 1.10.1-fix.1 , 目前存在使用的数据 需要进行迁移保存,包括不限于 工作流,用户交互记录。 流程 备份当前编排文件与环境变量 1 2 3 4 5 cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak cp .env .env.$(date +%s).bak # 备份数据卷(包含知识库和应用数据) sudo tar -cvf volumes-$(date +%s).tgz volumes 停服 1 docker compose down 拉取最新文件 1 2 git pull git checkout 1.10.1-fix.1 修改配置文件 问题 升级过程中遇到以下情况: 配置的时候数据库选择的是 Postgres , compose.yaml 中 对应的service name 改变了,所以.env 中 db_host 需要修改。 我在恢复的时候出现数据丢失情况, workspace 中添加的成员全部丢失,另外工作流丢失部分,这很奇怪,但是我还没找到原因(不敢随意乱动)。好在之前备份了数据库,基于备份找回了原先内容。 备份脚本: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 mkdir -p "$(dirname "$FILE")" export PGHOST=127.0.0.1 export PGUSER=postgres export PGDATABASE=dify export PGPASSWORD=difyai123456 set -x pg_dump | gzip --best > "$FILE" # 备份本机数据 if [ "$LOCAL" = "Fla" ]; then LOCAL_DIR="/backup/${LOCAL}/gof-cs-cn" elif [ "$LOCAL" = "Ray" ]; then LOCAL_DIR="/backup/${LOCAL}/gof-cs-en" else echo "错误:未知的 LOCAL 值: $LOCAL" exit 1 fi 恢复脚本 1 2 3 # 1. 把压缩包解压并通过 psql 灌库 gunzip -c /path/to/dify-2025-12-08.sql.gz \\ | docker exec -i <db-container> psql -U postgres -d dify 如果你已经用「临时容器」验证过数据完整,现在要覆盖正式库,按下面 4 步操作即可: ✅ ① 停正式栈 & 起干净库 1 2 3 4 5 6 7 8 cd /www/tallis/dify/docker docker compose down # 停止全部服务 docker run -d --name db_restore \\ -e POSTGRES_PASSWORD=postgres \\ -p 5433:5432 \\ -v "$PWD"/volumes/db/data_new:/var/lib/postgresql/data \\ postgres:15 sleep 3 ✅ ② 导入(用你脚本里同样的环境变量,确保字符集一致) 1 2 3 4 5 6 export PGHOST=127.0.0.1 export PGPORT=5433 export PGUSER=postgres export PGPASSWORD=postgres gunzip -c /www/tallis/dify-2025-12-08.sql.gz \\ | psql -d postgres ✅ ③ 验证(仍连 5433) 1 2 3 4 psql -h 127.0.0.1 -p 5433 -U postgres -d dify -c " SELECT count(*) FROM tenant_account_joins; SELECT count(*) FROM datasets; SELECT count(*) FROM apps;" 数量正常 → 继续第 ④ 步。 ✅ ④ 替换正式数据目录 1 2 3 4 docker stop db_restore && docker rm db_restore mv volumes/db/data volumes/db/data.empty.$(date +%F) mv volumes/db/data_new volumes/db/data docker compose up -d 浏览器登录 Dify,老成员、老知识库应该全部回归。 ⚠️ 注意 正式库默认密码是 difyai123456,而临时容器里我们用了默认的 postgres,所以导入时 不要 把 .env 里的密码变量直接带进去,用上面显式 PGPASSWORD=postgres 即可。 如果 SQL 里带 CREATE DATABASE dify;,导入前先把临时容器里的默认库叫 postgres 即可,pg_dump 纯文本格式会自动切换连接。

December 8, 2025 · Tallis

asyncio

定义 asyncio 是 Python 用来编写 异步 I/O 程序的标准库。 它提供了: 事件循环(Event Loop) — 负责调度和执行异步任务; 协程(Coroutine) — 一种特殊的函数,用 async def 定义; 任务(Task) — 在事件循环中运行协程的具体调度单位; Future 对象 — 表示一个“未来”会完成的结果。 简而言之: 协程 下面就是一个 协程函数, 调用的时候不会执行,而是返回一个 协程对象。 1 2 3 4 5 async def foo(): print("start") await asyncio.sleep(1) print("end") 事件循环相当于一个“任务调度中心”,它不断从任务列表中取出可以执行的协程, 运行直到遇到await,再切换到其他任务。 1 2 3 import asyncio asyncio.run(foo()) 创建一个新的事件循环; 把协程放到事件循环中调度; 运行到协程完成; 清理并关闭循环; await: 挂起当前协程 await 表示一个异步操作的结果; 后面必须跟一个 await 对象, 一般是另一个协程 或者 asyncio 提供的异步函数; 当执行到 await 语句时,协程会暂时让出控制权,可以去执行其他任务 asyncio 的核心组合方式 并发运行多个任务: asyncio.gather 1 results = await asyncio.gather(task1(), task2(), task3()) 让多个协程几乎同时启动执行,返回一个列表保存结果。 并发但非并行(仍在单线程中依次切换执行) ...

November 11, 2025 · Tallis

Nginx

介绍 Nginx(读作 Engine X)是一个高性能的Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。它最早由俄罗斯的程序员 Igor Sysoev 编写,于 2004 年首次发布。Nginx 以其高并发处理能力、低资源占用和稳定性著称,广泛用于各种规模的网站与应用部署中。 一、Nginx 的主要功能 静态资源服务器 反向代理(Reverse Proxy) 负载均衡 动静分离 缓存与压缩 HTTPS / SSL 支持 作为 API 网关 二、Nginx 的核心特点 高并发:采用异步、事件驱动架构(基于 epoll/kqueue)。单机可支撑十万级甚至百万级并发连接。 轻量级:占用内存小,配置灵活。 模块化设计:通过加载不同模块扩展功能。 跨平台:支持 Linux、Unix、Windows 等系统。 三、Nginx 的常见应用场景 大型网站的前端 Web 服务(例如静态资源分发) 反向代理 + 负载均衡集群 动静分离架构 微服务或 API 网关入口 HTTPS 证书终止层 CDN 边缘缓存节点 四、总结 一句话概括: Nginx 是一个高性能、轻量级的 Web 服务器和反向代理服务器,能高效处理大量并发连接,是现代网站架构中的核心组件之一。 反向代理 一、什么是反向代理(Reverse Proxy) 反向代理是代理服务器的一种工作方式。 简单理解就是:客户端只访问代理服务器,由代理服务器将请求转发给后端服务器并把响应返回给客户端。 正向代理(Forward Proxy):代理 客户端 向目标服务器发起请求。 反向代理(Reverse Proxy):代理 服务器端 来响应客户端请求。 🔁 反向代理的核心逻辑 用户访问入口(如 Nginx)。 Nginx 接收到请求后,根据配置判断应该把请求转发到哪个后端服务器。 Nginx 从后端服务器获取响应。 Nginx 把响应返回给客户端。 客户端始终只和 Nginx 通信,而不知道实际的后端服务部署在哪里。 二、为什么要用反向代理 反向代理的好处包括: ...

July 3, 2024 · Tallis

欢迎来到我的博客

欢迎来到我的博客! 这是我的第一篇博客文章。我使用 Hugo 静态网站生成器和 PaperMod 主题来创建这个博客。 为什么选择Hugo? Hugo是一个快速的静态网站生成器,具有以下优点: ⚡ 速度快 - 构建速度极快 🎨 主题丰富 - 有大量优秀的主题可供选择 📝 Markdown支持 - 使用Markdown编写内容 🔧 易于配置 - 配置文件简单明了 🚀 部署简单 - 可以轻松部署到各种平台 代码示例 下面是一个简单的Python代码示例: 1 2 3 4 5 6 7 def hello_world(): print("Hello, World!") return "欢迎来到我的博客!" if __name__ == "__main__": message = hello_world() print(message) 下一步计划 接下来我计划: 完善博客配置 添加更多内容 自定义主题样式 配置评论系统 部署到生产环境 感谢你的阅读!🎉

January 1, 2024 · Tallis

docker

知识点 repo 、image name 和tag repository 是指仓库 或者镜像仓库,即一个空间; 公有仓库 Docker hub; 私有仓库 Harbor 阿里云镜像仓库; image name 是指 repo下某一类应用的具体名称; tag 用于标识镜像的版本,每个tag 对应一个镜像ID docker 镜像是由多层layer 叠加而成,可以被多个镜像共享 docker 常用命令 image 1 2 3 4 5 6 7 8 9 10 11 12 13 docker pull xxx docker image ls docker images docker build -t myapp:1.0 . docker tag myapp:1.0 myrepo/myapp:latest docker rmi image-name docker inspect image-name container 1 2 3 4 5 6 7 docker run \ --rm \ # 容器退出的时候直接销毁 -it \ -v xxx:xxx \ # 挂载目录 --entrypoint /bin/bash \ # 如果容器有自启动命令,这样设置可以跳过; --name xxx \ # 指定容器名 image-name 挂载目录之后,本地修改文件, 容器内文件也同步修改; 如果image tag 不是 latest , 需要加上tag; docker compose compose 允许用户通过一个单独的 docker-compose.yml 模版文件 来定义一组相关联的应用容器作为一个项目。 ...

October 6, 2022 · Tallis

git

基本概念 裸仓库 裸仓库 指的是 没有工作区(代码文件)的 Git 仓库,只包含Git 版本控制所需的元数据和对象(.git 目录的内容),而不包含实际的项目文件副本 1 git init --bare myproject.git 使用方式: 1 2 3 4 5 6 7 8 9 10 11 12 13 mkdir /srv/git/ cd /srv/git/ git init --bare myproject.git git clone user@server:/srv/git/myproject.git git add . git commit -m "add new feature" git push origin main origin 别名 origin 是远程仓库的一个名称,是默认的别名,可以使用其他的。通常在以下两个场景下被设置 ...

April 6, 2021 · Tallis