剪藏#剪藏#各种折腾

群晖部署DoUpRo,容器更新翻车自动回滚

2026 年 8 月 19 日1 分钟
分享Twitter / XTelegram微博
群晖部署DoUpRo,容器更新翻车自动回滚 封面

简介

什么是 DoUpRo ?

DoUpRo(发音 "do pro",即 Docker Update Rollback)是一个开源的 Docker 主机监控工具。它可以帮助你查看哪些容器已经过期、立即或在计划中更新它们,当更新出现问题时一键回滚。

DoUpRo 介于 Watchtower 式「静默自动更新」和「手动一个个 docker compose pull && up -d」之间:它监控主机上每一个容器(运行中或已停止),从注册表解析真正的版本号(而不是只显示一个浮动 tag),并且把每一次选择都交给你——立即更新、定时更新,或让某个 stack 按自己的循环策略自动更新。

主要特点

  • 精准识别过期容器:显示真实的 Docker 状态(不仅是 "running"),并从注册表的实际元数据解析当前版本与可用版本,而非仅凭浮动 tag 猜测。

  • 立即 / 延时 / 自动更新:支持一次性定时任务、按 stack 的循环策略(cron 或相对延迟),默认全局「仅检测」姿态,自动应用需显式开启。

  • 始终可用的回滚:每次更新都会保留旧镜像和完整容器配置。可随时手动回滚;若更新后容器 crash-loopDoUpRo 会自动回滚。

  • 多通道通知:支持 TelegramDiscordSlackntfyGotify,或任意通用 webhook,含按事件 /stack/容器的过滤与持久投递队列。

  • 同一套 API,三种入口Web UICLIREST API 都是同一个后端的不同瘦客户端,三者行为永远一致。

  • 面向真实家庭实验室RBAC(用户 + 受控 API Key)、OIDC/SSO、静态加密密钥、结构化 JSON 日志(Loki/ELK 友好)、Prometheus 指标,以及强化 CSPWeb UI

  • 开源免费:基于 MIT 协议开源,可免费使用和修改。

应用场景

  • 家庭实验室批量更新:在 NAS 或一台主机上跑几十个容器时,集中查看哪些需要更新,避免逐个 stack 手动操作。

  • 谨慎的自动更新:对关键服务设置「检测到新版本先通知、人工确认后再更新」,更新失败还能自动回滚,不留后患。

  • 多 stack 循环策略:给不同 stack 配置不同的更新节奏(如业务容器每天、测试容器每周),统一由 DoUpRo 调度。

  • 运维可观测:通过 Prometheus 指标、JSON 日志与通知通道,把容器更新纳入既有的监控与告警体系。

  • 开发者测试:开发者可快速搭建一个带 RBACSSO 的更新面板,验证镜像发布后的回滚链路。

Notion image

DoUpRo界面截图

DoUpRo 是一个让你「既能自动更新、又永远留好后路」的 Docker 容器管家,更新出问题再也不怕无法复原。

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 doupro ,选择第一个 sharlihe/doupro,版本选择 latest

本文写作时, latest 版本对应为 45c1757

Notion image

DoUpRo 官方镜像托管在 Docker Hubsharlihe/doupro),为单容器项目。但它需要挂载宿主机的 /var/run/docker.sock 才能管理容器,而群晖 Docker 套件不支持图形化挂载此类系统 socket,因此只能通过命令行用 docker clidocker-compose 部署

docker cli 安装

如果你熟悉命令行,可能用 docker cli 更快捷

●●●

JAVASCRIPT
# 新建文件夹 doupro 和 子目录
mkdir -p /volume1/docker/doupro/data

# 进入 doupro 目录
cd /volume1/docker/doupro

# 修改目录权限
chmod a+rw data

# 运行容器
docker run -d \
  --name doupro \
  --restart unless-stopped \
  -p 8718:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(pwd)/data:/data \
  -w /tmp \
  --user root \
  sharlihe/doupro:latest

docker-compose 安装

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

●●●

JAVASCRIPT
services:
  doupro:
    image: sharlihe/doupro:latest
    container_name: doupro
    restart: unless-stopped
    labels:
      # 稳定的身份标识,便于自身安全更新;容器名和 Docker ID 可能变化
      doupro.instance: "true"
    working_dir/tmp
    user: root
    ports:
      - "8718:8080"
    volumes:
      # 赋予 DoUpRo 管理本机容器的权限——等效于 root 权限,部署前请阅读 README/SECURITY.md
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/data
    environment:
      DOUPRO_BIND_ADDR":8080"
      DOUPRO_DATA_DIR"/data"
      DOUPRO_DB_PATH"/data/doupro.db"
      DOUPRO_DOCKER_SOCKET"/var/run/docker.sock"
      DOUPRO_LOG_LEVEL"${DOUPRO_LOG_LEVEL:-info}"
      # 两个都留空(默认)则使用零配置 admin/admin 账户,首次登录强制改密码
      # 在 .env 中同时设置两者,可从首次启动就用真实密码
      DOUPRO_ADMIN_USER"${DOUPRO_ADMIN_USER:-}"
      DOUPRO_ADMIN_PASSWORD"${DOUPRO_ADMIN_PASSWORD:-}"
      # 仅当 DoUpRo 前面有终止 TLS 的反向代理并剥离客户端 X-Forwarded-Proto 时为 true
      DOUPRO_TRUST_PROXY_HEADERS"${DOUPRO_TRUST_PROXY_HEADERS:-false}"
    healthcheck:
      test: ["CMD""/usr/local/bin/doupro""healthcheck"]
      interval: 30s
      timeout: 3s
      start_period: 10s
      retries3

然后通过 SSH 登录到您的群晖,执行下面的命令:

●●●

JAVASCRIPT
# 新建文件夹 doupro(命名卷 doupro_data 会自动创建,可不建本地子目录)
mkdir -p /volume1/docker/doupro

# 进入 doupro 目录
cd /volume1/docker/doupro

# 修改目录权限
chmod a+rw data

# 将 docker-compose.yml 与 .env(可选)放入当前目录

# 一键启动
docker-compose up -d

Notion image

运行

在浏览器中访问 http://<群晖IP>:8718 即可进入登录界面

使用默认账号 admin / admin 登录(若部署时未设置 DOUPRO_ADMIN_USER/DOUPRO_ADMIN_PASSWORD

Notion image

系统会强制要求你修改 admin 密码后才能继续操作

Notion image

Containers 页面查看本机所有容器及其更新状态

Notion image

刷新一下就能看到本机的已经安装的容器

Notion image

有新版本的会显示可用的版本。对需要更新的容器选择「立即更新」「定时」或「加入循环策略」;更新失败会自动回滚

Notion image

如果网络不稳定,可能会遇到类似下面的报错

●●●

JAVASCRIPT
Error: update failed before the original container was removed: pull ghcr.io/wechat-article/wechat-article-exporter:latest: pull image ghcr.io/wechat-article/wechat-article-exporter:latest: Error response from daemon: Get "https://ghcr.io/v2/": EOF

Notion image

如果 Docker 守护进程 API 版本低于 1.44,更新和回滚是不行的

Notion image

Notifications → + Add a channel 配置 Telegram / Discord / ntfy 等通知通道

Notion image

Settings → Security 创建 API Key

Notion image

交互式 REST API 文档可在实例的 /swagger 路径查看;CLI 用法见项目 https://github.com/arnaudcharles/Doupro/blob/main/manuals/cli.md

Notion image

注意事项

  1. Docker socket 权限等同于 rootDoUpRo 通过读写 /var/run/docker.sock 来管理和重建容器,这等效于宿主机的 root 权限。务必在受信任的网络边界内运行,或置于反向代理鉴权之后;更严格的场景可考虑 docker-socket-proxy。

  2. 数据备份DoUpRo 会在 /data 下生成 doupro.db 数据库以及加密密钥 doupro.key。备份数据库时务必连同密钥一起备份,否则加密配置无法恢复。

  3. 默认账号安全:零配置启动会生成 admin/admin 并强制首次改密,但仍建议部署时通过 DOUPRO_ADMIN_USER/DOUPRO_ADMIN_PASSWORD 直接设定强密码。

  4. 反向代理:若 DoUpRo 前面有 Traefik / nginx / Caddy 等终止 TLS 的反向代理,请将 DOUPRO_TRUST_PROXY_HEADERS 设为 true,否则会话/CSRF Cookie Secure 标志可能不正确。

  5. Docker Hub 限流:监听大量容器时匿名拉取可能触发 Docker Hub 速率限制,可在 .env 中配置 DOUPRO_DOCKERHUB_USERNAME/DOUPRO_DOCKERHUB_PASSWORD(建议用 Personal Access Token)提升上限。

  6. 安全建议:生产环境避免使用无 TLStcp:// Docker API;DoUpRo 在检测到此类配置时会拒绝启动,除非显式设置 DOUPRO_ALLOW_INSECURE_DOCKER_TCP=true

参考文档

arnaudcharles/Doupro: Docker Update Rollback tool. 地址:https://github.com/arnaudcharles/Doupro

sharlihe/doupro - Docker 镜像 | Docker Hub 地址:https://hub.docker.com/r/sharlihe/doupro

DoUpRo 终端用户手册(Getting started / Containers / Schedule / Notifications / Settings / CLI / FAQ) 地址:https://github.com/arnaudcharles/Doupro/tree/main/manuals

@所有人:写文不易,如果你都看到了这里,请点个在看,分享给更多的朋友;为确保你能收到每一篇文章,请主页右上角设置星标。

原文地址: https://mp.weixin.qq.com/s?__biz=MzI1NTQxMzc3MA==&mid=2247515191&idx=1&sn=33698171718310a7d9e65c42fb90d833&chksm=eb02ca0122e945a3745ea703989f2ff4eb0c6df2b144f45548054831039e2b9917efe4f2fd99&mpshare=1&scene=1&srcid=0818HyyI4GB4ArwxAOIyIjAE&sharer_shareinfo=b518c57e0e01df2ca9d5d3eb74dc12e8&sharer_shareinfo_first=b518c57e0e01df2ca9d5d3eb74dc12e8#rd

相关文章