群晖部署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 的更新面板,验证镜像发布后的回滚链路。

DoUpRo界面截图

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

安装

在群晖上以 Docker 方式安装。

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

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

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

docker cli 安装

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 新建文件夹 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 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
retries: 3

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

1
2
3
4
5
6
7
8
9
10
11
12
13
# 新建文件夹 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

运行

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

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

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

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

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

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

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

1
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

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

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

Settings → Security 创建 API Key

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

注意事项

  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