故障分析报告:Dify 版本升级

0 阅读3分钟

一、事件概述

  • 事件名称:Dify 跨版本升级后系统不可用

  • 发生时间:约持续 2 天

  • 影响范围

    • Console不可访问或异常
    • API 接口大量 502 / 500
    • datasets 功能不可用
  • 严重级别:P1(核心功能不可用)

二、故障现象

1. 服务不可用阶段

  • 页面访问 502
  • /console/api/system-features 无响应
  • curl 请求挂起

2. 服务异常阶段

  • apiworker 容器反复重启
  • 报错:无法解析数据库主机(db

3. 部分恢复阶段

  • 页面可打开但白屏

  • 浏览器接口报错:

    • 401 / 502 / 500 混合

4. 功能异常阶段

  • datasets 接口返回 500

  • 日志报错:

    • relation does not exist
    • column does not exist

三、影响评估

登录 / Console异常
API 服务不稳定
数据集(datasets)不可用
后台任务(worker)部分失败

四、时间线

T0执行跨版本升级
T0+出现 502 / API 无响应
T1启用 postgresql profile,数据库恢复
T2修复 .env 中 DB_HOST=db → db_postgres
T3API 可连接但请求挂起
T4发现 weaviate 未启动,手动拉起
T5页面恢复但出现 500
T6排查数据库,发现缺表 / 缺字段
T7发现 alembic_version 缺失或不一致
T8重建 migration 链并执行 upgrade
T9补充缺失字段(datasets.is_multimodal
T10系统完全恢复

五、根因分析

1. 直接根因

数据库 Schema 与当前代码版本不一致:

缺失字段:datasets.is_multimodal
缺失表:human_input_forms 等

导致:

  • API 查询失败
  • 返回 500

2. 根本原因

本次故障由历史迁移环境导致的状态不一致引起,具体包括:

(1)数据库迁移来源不规范
  • 数据库为历史环境迁移
  • 未通过完整 migration 初始化
  • 缺失 alembic_version 元数据

导致 migration 系统无法识别真实版本状态

(2)跨版本升级未执行完整迁移链
  • 未按版本顺序执行 migration
  • 未执行中间版本附加脚本(如 credentials 转换)

导致数据库结构停留在中间态

(3)配置文件(.env)为历史遗留
  • DB_HOST 指向旧服务名
  • VECTOR_STORE=weaviate 与实际运行不一致

导致服务连接异常与依赖错位

(4)Docker Compose Profile 启动不完整
  • 仅启用 postgresql
  • 未启动 weaviate

导致 API 初始化阶段阻塞

3. 根因归纳

历史迁移环境下,数据库、配置和依赖三者状态不一致,导致系统在升级后进入不可用状态。

六、处理过程

1. 修复数据库连接问题

docker compose --profile postgresql up -d

DB_HOST=db_postgres

2. 启动缺失依赖

docker compose up -d weaviate

3. 修复 migration 状态

docker exec -it docker-db_postgres-1 psql -U postgres -d dify -c "
TRUNCATE TABLE alembic_version;
INSERT INTO alembic_version (version_num) VALUES ('xxxx');
"

docker compose run --rm api flask db upgrade

4. 补齐缺失 Schema

ALTER TABLE datasets
ADD COLUMN is_multimodal BOOLEAN NOT NULL DEFAULT FALSE;

5. 验证系统恢复

docker compose logs --since=5m api
curl http://127.0.0.1:9527/console/api/datasets

七、恢复结果

  • 所有核心服务正常运行
  • API 响应正常
  • datasets 功能恢复
  • worker 任务全部成功

八、经验教训

1. 数据库必须有版本元数据

缺失 alembic_version 会导致:

migration 逻辑失效

2. 跨版本升级必须走完整链路

不能直接:

旧版本 → 最新版本

3. .env 不可直接复用

必须与当前版本对齐

4. 依赖服务必须显式确认

docker compose ps

5. migration 成功不代表 schema 正确

必须验证:

\d 表名

九、改进措施

短期

  • 固化当前 .env 和 compose 配置
  • 备份数据库(作为基线)

中期

建立升级流程:

  1. 备份 DB
  2. 升级到中间版本
  3. 执行 migration + 脚本
  4. 再升级
  5. 校验 schema
  6. 校验依赖

长期

  • 建立标准 Runbook
  • 禁止直接跨版本升级生产环境
  • 引入升级前校验机制(schema + config + dependency)

最终总结

本次故障本质是一次“状态不一致”问题:历史迁移环境中的数据库、配置和运行依赖未对齐,在跨版本升级后被放大,最终导致系统不可用。