跳到主要内容

更新 OPL 数据空间

保持版本更新,同时不丢数据。

你的数据,例如聊天记录、用户、设置、上传文件,通常都保存在 Docker volume 或本地数据库里,而不是容器镜像本身。更新 OPL 数据空间的本质,是把容器镜像替换成更新版本;数据仍然留在原来的位置。

先决定更新策略

更新前,先决定你要如何跟踪版本:

ScenarioRecommended approach
个人 / homelab使用 :main,需要时手动 pull 最新版本
共享 / 团队实例固定到具体版本(例如 :v0.8.6),并用 Diun 只做更新通知
生产 / 关键环境固定版本,先读 release notes,先在 staging 测试

:main 与固定版本

:main 永远指向最新构建,方便,但也可能无预警带入破坏性变化。

如果你更看重稳定性,建议固定到具体版本号,例如:

ghcr.io/open-webui/open-webui:v0.9.0
ghcr.io/open-webui/open-webui:v0.9.0-cuda
ghcr.io/open-webui/open-webui:v0.9.0-ollama

完整标签可以在 GitHub releases 查看。

更新前建议

  1. 先备份数据
  2. 阅读 release notes
  3. 更新后清理浏览器缓存
多 worker / 多副本部署

如果是多 worker 或多副本环境,先只在一个实例上运行迁移:把其他实例设为 UVICORN_WORKERS=1ENABLE_DB_MIGRATIONS=false。详见 Scaling guide

手动更新

docker rm -f open-webui
docker pull ghcr.io/open-webui/open-webui:main
docker run -d -p 3000:8080 \
  -v open-webui:/app/backend/data \
  -e WEBUI_SECRET_KEY="your-secret-key" \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main

如果需要 NVIDIA GPU,给 docker run 增加 --gpus all

固定 WEBUI_SECRET_KEY

如果 WEBUI_SECRET_KEY 不持久,每次容器重建时都会生成新 key,导致所有用户被强制登出。可以用 openssl rand -hex 32 生成一个固定值,并在后续更新中一直沿用。

更新后验证

更新完成后,建议检查:

  1. 日志里的版本号
    docker logs open-webui 2>&1 | head -20
  2. UI 是否能正常打开
  3. 若前端看起来异常,先强刷缓存
  4. 若日志中出现 migration 错误,先看 release notes 和 Connection Errors

回滚

如果新版本有问题,可以退回旧版本,但要注意数据库迁移风险。

docker rm -f open-webui
docker pull ghcr.io/open-webui/open-webui:v0.8.3
docker run -d -p 3000:8080 -v open-webui:/app/backend/data \
  -e WEBUI_SECRET_KEY="your-secret-key" \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:v0.8.3
数据库迁移通常不可逆

如果新版本已经跑过数据库迁移,单纯把容器换回旧版本并不会自动回滚 schema。旧版本可能仍然无法启动。这种情况下,你需要恢复“更新前的备份”。若要做数据库级恢复,可参考 Manual Database Migration

及时获知新版本

如果你不想手动盯 release,可以用工具监控更新:

推荐
  • 生产 / 关键系统:Diun(只通知)+ 手工更新
  • 可视化管理环境:WUD(面板查看 + 手动触发)
  • 个人 / homelab:Watchtower(全自动)
FeatureDiunWUDWatchtower
自动更新容器❌(手动点)
Web 界面
通知
Docker 29+✅(fork 版)
资源占用很低中等

Diun

只负责通知,不会自动替你动容器。适合生产环境。

services:
  diun:
    image: crazymax/diun:latest
    container_name: diun
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data:/data
    environment:
      - TZ=America/New_York
      - LOG_LEVEL=info
      - DIUN_WATCH_WORKERS=10
      - DIUN_WATCH_SCHEDULE=0 */6 * * *
      - DIUN_PROVIDERS_DOCKER=true
      - DIUN_NOTIF_MAIL_HOST=smtp.gmail.com
      - DIUN_NOTIF_MAIL_PORT=587
      - DIUN_NOTIF_MAIL_USERNAME=your-email@gmail.com
      - DIUN_NOTIF_MAIL_PASSWORD=your-app-password
      - DIUN_NOTIF_MAIL_FROM=your-email@gmail.com
      - DIUN_NOTIF_MAIL_TO=your-email@gmail.com
    restart: unless-stopped

WUD

带 Web UI 的更新监控工具,适合想看面板、但仍想手动触发更新的人。详见 WUD

Watchtower

全自动更新容器。

注意

原始 containrrr/watchtower 已不再维护,并且与 Docker 29+ 不兼容。请改用 nicholas-fedor/watchtower fork。

注意

自动更新在生产环境里有风险。若新版本包含破坏性变化或数据库迁移,可能会直接打断你的服务。启用前请确保有备份,并清楚 release note 风险。

一次性更新:

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  nickfedor/watchtower --run-once open-webui

持续监控(每 6 小时检查一次):

docker run -d --name watchtower --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  nickfedor/watchtower --interval 21600 open-webui