Zum Inhalt springen

使用 Docker 安装

Dieser Inhalt ist noch nicht in deiner Sprache verfügbar.

DumbMonit 以单个容器运行:dumbmonit 服务器(采集、API、 告警、Web UI)会启动自己的 VictoriaMetrics 来存储时间序列;该 二进制文件已包含在镜像中。配置和状态存放在内嵌的 SQLite 数据库中。一个卷 /data 保存数据库、实例密钥和 时间序列。

  • 带有 Compose 插件的 Docker Engine(docker compose version 可正常运行)。
  • 一个能够访问你要监控的监控项的机器。监控项不需要能访问 这台机器,代理除外,它们会通过 HTTP 将 测量数据推送到服务器。
  • 主机上的 8080 端口空闲,或者使用你选择的其他端口(见下文)。

这是完整的 docker-compose.yml(不需要 .env 文件);请将它保存在 单独的目录中:

services:
dumbmonit:
image: ghcr.io/laupernoe/dumbmonit:latest
ports:
- "8080:8080"
volumes:
- dumbmonit-data:/data
# Or a host directory; on a SELinux host (Fedora, RHEL) add `:Z`:
# - ./dumbmonit:/data:Z
# environment:
# PUID: "1000" # owner of the files in /data (default 65532)
# PGID: "1000"
restart: unless-stopped
stop_grace_period: 30s
read_only: true
tmpfs: [/tmp]
# Starts as root only to give /data to user 65532 (or PUID/PGID), then
# drops root for good: a host directory works as it is. Remove `user` and
# `cap_add` to run as 65532 from the start (the files must belong to it).
user: "0:0"
cap_drop: [ALL]
cap_add: [CHOWN, DAC_READ_SEARCH, SETUID, SETGID]
security_opt: ["no-new-privileges:true"]
sysctls:
net.ipv4.ping_group_range: "0 2147483647"
volumes:
dumbmonit-data:
name: dumbmonit-data

然后启动它:

Terminal window
docker compose up -d

会拉取已发布的镜像;只读文件系统、capability、PUID/PGID 以及 ping_group_range sysctl 的作用,参见权限与数据目录和 无需 capability 的 ICMP ping。各项选项(端口、 密钥、保留期、外部 VictoriaMetrics、截图)都是 由你自己添加的环境变量。

镜像中包含 VictoriaMetrics 二进制文件(/victoria-metrics-prod,来自 victoriametrics/victoria-metrics:v1.152.0)。当未设置 DUMBMONIT_VM_URL 时, 服务器会将它作为子进程启动,监听 127.0.0.1:8428, 把时间序列存放在 /data/vm 下,将其日志行转发到自己的日志中, 在它崩溃时以退避方式重启,并在关闭时停止它。不会发布任何端口: 该端口只存在于容器内部。

有两个变量值得了解:DUMBMONIT_VM_RETENTION(默认 12 个月; 30d 或 2y 也可以)和 DUMBMONIT_VM_MEMORY(256MB, 其缓存的预算;数百台主机时请调大)。其余内容见 配置参考。

若要使用你已有的 VictoriaMetrics,请将 DUMBMONIT_VM_URL 设置为其 地址(http://host:8428):此时不会启动内嵌的那个, /data/vm 保持为空。

打开 https://<your-host>:8080。浏览器会因自签名证书提示一次警告(见 HTTPS and encryption)。全新的实例会显示 /setup 界面, 你可以在这里创建第一个管理员账户(密码至少 12 个字符)。

该界面首先会要求输入设置码。在尚不存在管理员时, 服务器会在启动时于日志中打印一次性代码:

Terminal window
docker compose logs dumbmonit | grep -A1 "setup code"
First-run setup code: K7XQ4-M9PRT

它用来证明创建管理员账户的人正在运行这台服务器,这样网络上的其他人就无法 抢先占用一个全新的实例。该代码只保存在内存中,在存在管理员之前每次重启都会 变化,输错会受到速率限制。对于自动化部署,可设置 DUMBMONIT_SETUP_CODE 来自行指定。

登录界面

然后添加你的第一个监控项:参见添加第一个监控项。

一切都通过环境变量完成;没有任何一个是必需的。把需要的变量添加到服务的 environment: 下,如高级选项所示。

变量默认值作用
DUMBMONIT_BIND0.0.0.0:8080容器内的监听地址。
PUID / PGID65532配合 user: "0:0" 时:服务器运行时使用的用户和组,也是 /data 中文件的所有者(详情)。DUMBMONIT_PUID / DUMBMONIT_PGID 同样有效。
DUMBMONIT_DATA_DIR/dataSQLite 数据库(dumbmonit.db)、实例密钥(secret.key)以及内嵌 VictoriaMetrics 的数据(vm/)。
DUMBMONIT_VM_URL(未设置)外部 VictoriaMetrics 的 URL。设置后不会启动内嵌的那个。
DUMBMONIT_VM_RETENTION12内嵌 VictoriaMetrics 的保留期:以月为单位,或 30d、2y。
DUMBMONIT_VM_MEMORY256MB内嵌 VictoriaMetrics 缓存的内存预算。
DUMBMONIT_VM_LISTEN127.0.0.1:8428内嵌 VictoriaMetrics 的监听地址,位于容器内部。
DUMBMONIT_SECRET(自动生成)用于加密监控项凭据和令牌的实例密钥。
DUMBMONIT_MAX_CONCURRENT_PROBES64并发探测数,所有采集器合计。
DUMBMONIT_PROBE_TIMEOUT_SECS10单次探测的最长持续时间。
DUMBMONIT_FLUSH_INTERVAL_SECS5写入 VictoriaMetrics 的周期。
DUMBMONIT_LOGinfo日志过滤器(tracing 语法,例如 debug、dumbmonit=trace)。
DUMBMONIT_AGENT_DIR/agents通过 /download/… 提供的代理二进制文件。
DUMBMONIT_RESET_PASSWORD(空)设为 1 可在启动时清除密码和所有会话。
DUMBMONIT_SETUP_CODE(自动生成)在尚无管理员时,/setup 要求输入的设置码。未设置时,每次启动都会在日志中打印一个随机代码。
DUMBMONIT_COOKIE_SECURE(关闭)在 TLS 反向代理之后设为 1,可将会话 cookie 标记为 Secure。
DUMBMONIT_ALERT_INTERVAL_SECS30告警评估周期(不得低于 10)。
DUMBMONIT_ALERT_HISTORY_DAYS90 天告警历史的保留期。关于其单位的注意事项,请参见配置参考。
DUMBMONIT_BACKUP_ENABLED开启将数据库按计划本地备份到 /data/backups/。可用 DUMBMONIT_BACKUP_DIR、_INTERVAL_HOURS(24)和 _KEEP(7)调整;参见备份与恢复。

完整列表及详细说明见配置参考。 更名之前的 EZYMONIT_* 名称仍会作为后备被读取;参见 升级。

SNMP 团体名、密码和 API 令牌使用 AES-256-GCM 加密,密钥 由实例密钥派生。首次启动时,DumbMonit 会在 /data/secret.key (位于 dumbmonit-data 卷内)中生成该密钥。

如果你更愿意自己掌管密钥,可以改在 Compose 文件中设置 DUMBMONIT_SECRET (示例;32 个或更多随机字符)。请把它保存在你的密码管理器中。

Terminal window
docker compose pull
docker compose up -d

数据库迁移会在启动时运行。VictoriaMetrics 的数据不受影响。

现有的 docker-compose.yml 无需修改即可继续使用:镜像仍以用户 65532 运行。新文件增加了 user: "0:0" 和一行 cap_add,使主机目录无需准备即可使用(权限); 如果想改用绑定挂载,请复制这两行。

DumbMonit 在 2026 年 9 月之前叫作 EzyMonit,并以两个容器运行, 即服务器和一个单独的 victoriametrics 服务。升级需要把旧项目的数据 一次性迁移到新卷中。旧项目名为 ezymonit(其卷为 ezymonit_ezymonit-data 和 ezymonit_vm-data; 可用 docker volume ls 确认)。在旧目录中执行:

Terminal window
docker compose down

然后,使用新的 docker-compose.yml:

Terminal window
docker volume create dumbmonit-data
docker run --rm -v ezymonit_ezymonit-data:/from -v dumbmonit-data:/to alpine cp -a /from/. /to/
docker run --rm -v ezymonit_vm-data:/from -v dumbmonit-data:/to alpine sh -c 'mkdir -p /to/vm && cp -a /from/. /to/vm/'
docker compose up -d

旧的 VictoriaMetrics 数据目录与内嵌版本使用的布局相同: 无需转换。另一种做法是继续使用外部的 VictoriaMetrics, 并让 DUMBMONIT_VM_URL 指向它。

服务器在首次启动时会自行处理以下内容:

  • EZYMONIT_* 变量仍会作为后备被读取,每个变量在启动时 产生一条警告(EZYMONIT_X is deprecated, use DUMBMONIT_X)。
  • /data/ezymonit.db 会被重命名为 dumbmonit.db。
  • 代理令牌 ezym_… 继续有效;新令牌为 dmon_…。代理会继续 推送数据;方便时在每台机器上重新运行安装命令,它会 原地迁移旧服务。
  • 会话 cookie 的名称已更改:所有人需要重新登录一次。浏览器的 主题偏好会被保留。

它不会处理的内容:指标前缀从 ezymonit_ 改为 dumbmonit_,不提供兼容。旧的序列会以旧名称留在 VictoriaMetrics 中, 并随保留期过期;图表和内置规则从升级时起重新开始。 引用 ezymonit_… 指标的自定义告警规则必须手动修改。

一个命名卷 dumbmonit-data 保存了所有内容:

路径内容
dumbmonit.db监控项、规则、渠道、告警状态、会话。
secret.key实例密钥。
backups/计划的本地备份:数据库和密钥的副本,默认每天一次,保留七份。
vm/VictoriaMetrics 时间序列(默认保留 12 个月)。

DumbMonit 会按计划备份自己的数据库,也可以将整个 配置——监控项、凭据、规则、渠道——导出为一个用你自选的密码短语 加密的文件,并可恢复到全新的实例上。 两者都在**备份与恢复**中介绍,其中还包括升级前该做什么, 以及那条值得读两遍的关于 secret.key 的规则。

若要归档卷本身(包括图表),请停止整个栈并将其打包:

Terminal window
docker compose stop
docker run --rm -v dumbmonit-data:/data -v "$PWD:/backup" alpine \
tar czf /backup/dumbmonit-data.tgz -C /data .
docker compose start

恢复时,创建卷,用同样的方式把归档解压到其中,然后执行 docker compose up -d。

如果空间紧张,--exclude=./vm 可以让归档保持较小:数据库和 密钥就是全部设置,vm/ 只是图表。

上面的 Compose 文件有意不含任何变量。要更改某项设置,请在 docker-compose.yml 的 dumbmonit: 下添加一个 environment: 块(或在其中加一行),然后再次运行 docker compose up -d。容器会被重新创建;数据卷保持不变。

更改端口。 修改映射的左侧;容器内仍监听 8080:

ports:
- "8099:8080"

自己的密钥,代替 /data/secret.key 中生成的那个。它用于加密监控项凭据: 丢失它意味着要重新输入每一个凭据。

environment:
DUMBMONIT_SECRET: replace-me-with-32-random-characters

内嵌 VictoriaMetrics 的保留期与内存(月数,或 30d / 2y;几十个监控项的 homelab 用 256 MB 就够):

environment:
DUMBMONIT_VM_RETENTION: "24"
DUMBMONIT_VM_MEMORY: 512MB

外部 VictoriaMetrics;此时不会启动内嵌的那个:

environment:
DUMBMONIT_VM_URL: http://victoriametrics:8428

忘记密码。 添加下面这一行,运行 docker compose up -d,在界面中重新创建 第一个管理员(监控项、规则和渠道都会保留),然后删除这一行,再运行一次 docker compose up -d:

environment:
DUMBMONIT_RESET_PASSWORD: "1"

网站变更截图:服务器旁的无头 Chromium;见下文网站变更截图。

更多变量:配置参考。

网站变更监视器始终会比较页面的可见文本。要为每个新版本保存截图,需要一个浏览器,而 DumbMonit 镜像不含浏览器:无头 Chromium 作为第二个服务运行,DUMBMONIT_BROWSER_URL 告诉服务器在哪里找到它。

将以下几行添加到 docker-compose.yml,然后运行 docker compose up -d:

services:
dumbmonit:
environment:
DUMBMONIT_BROWSER_URL: http://browser:9222
browser:
image: chromedp/headless-shell:stable
shm_size: 256m
restart: unless-stopped
  • browser 是服务名;在 Compose 网络中,http://browser:9222 会解析到它。没有任何端口被发布:只有 DumbMonit 与它通信。
  • shm_size: 256m:Chromium 在 /dev/shm 中渲染,Docker 默认的 64 MB 对于长页面太小。
  • 任何以 --remote-debugging-port 启动的 Chromium 都可以;这里使用的镜像是 chromedp/headless-shell。

没有浏览器时,其余功能照常工作(文本比较、告警、前后对照副本);快照只是没有图像。只要服务器连不上浏览器,网站变更监控项的表单就会显示一条包含这些行的提示。 如果重启后提示仍然存在,请检查 docker compose logs browser,确认 DUMBMONIT_BROWSER_URL 中的主机名就是服务名,并且两个服务在同一个 Compose 项目中。

UI 和 API 通过同一个端口提供服务,该端口仅支持 HTTPS(普通 HTTP 请求会收到重定向,见 HTTPS and encryption)。因此反向代理必须通过 HTTPS 连接容器(https://dumbmonit:8080),并对该跳关闭证书验证,或信任 DumbMonit 的证书。不使用 WebSocket: 界面通过轮询 API 获取数据,因此任何反向代理都无需特殊 配置即可使用。

monit.example.com {
reverse_proxy https://127.0.0.1:8080 {
transport http {
tls_insecure_skip_verify
}
}
}
server {
listen 443 ssl;
server_name monit.example.com;
# ssl_certificate / ssl_certificate_key …
location / {
proxy_pass https://127.0.0.1:8080;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# 代理在故障后会发送补传的批量数据:
client_max_body_size 16m;
}
}

当代理终止 TLS 时,请设置 DUMBMONIT_COOKIE_SECURE: "1",使会话 cookie 只通过 HTTPS 发送。仅当每个浏览器都通过 HTTPS 访问 DumbMonit 时才设置它: 浏览器将永远不会回传该 cookie,导致无法登录。

服务器从不以 root 运行。镜像默认以用户 65532:65532 运行,Docker 创建的命名卷本来就属于该用户。

而绑定挂载(./dumbmonit:/data)会保留主机目录的所有者,由 Docker 创建时通常是 root。 这就是上面的 Compose 文件以 root 启动容器(user: "0:0")的原因。服务器只在极短的 一瞬间保持 root:在打开数据库、启动 VictoriaMetrics 或监听网络之前,它把 /data 移交给 65532:65532(只处理属于他人的条目,不跟随符号链接),永久放弃 root,并确认无法再取回。 cap_add 中的四个 capability 仅用于这一步,之后一个也不剩。no-new-privileges 和只读根 文件系统保持开启:/data 和 /tmp 是仅有的可写路径。

选择所有者:PUID 和 PGID。 使用 user: "0:0" 时,指定服务器运行所用的 uid 和 gid; 启动时文件会被移交给它们:

environment:
PUID: "1000"
PGID: "1000"

DUMBMONIT_PUID / DUMBMONIT_PGID 同样有效,且优先。0 会被拒绝。在 Unraid 上, PUID=99 和 PGID=100 与 appdata 的常见所有者一致。没有 user: "0:0" 时, PUID/PGID 会被忽略。

没有 user: "0:0" 时(普通的 docker run -v ./data:/data,或 --user 1000:1000), 不会更改任何所有者,/data 必须已经可写。否则服务器会停止,并先建议使用 --user 0:0, 然后建议在主机上对绑定挂载执行 sudo chown -R 65532:65532 ./data,对命名卷则执行:

Terminal window
docker run --rm -v dumbmonit-data:/data alpine chown -R 65532:65532 /data

在 SELinux 处于 enforcing 模式的主机上(Fedora、RHEL、CentOS Stream、 AlmaLinux 等),绑定挂载在带有容器标签之前会被拒绝访问,即使容器内是 root 也 一样。请在卷后加上 :Z;如果其他容器共用该目录,则加 :z:

volumes:
- ./dumbmonit:/data:Z

否则服务器会停止,并显示 the host enforces SELinux and the volume has no container label。命名卷由 Docker 负责打标签,无需额外操作。

无 root 的 Podman 的工作方式相同,需加上 --user 0:0。容器内的 root 就是主机上你自己的用户,而绑定 挂载中的文件归容器内的 uid 65532 所有,主机上显示为你的某个 sub-uid(按常见的 /etc/subuid 为 165531)。可用 podman unshare ls -l ./dumbmonit 查看。若想让 文件改为归你自己的 uid 所有,请以你自己的身份运行容器;这样不会更改任何所有者:

Terminal window
podman run --userns keep-id --user "$(id -u):$(id -g)" -v ./dumbmonit:/data:Z …

ping 监控会发送 ICMP echo。它没有使用 原始套接字——那需要 NET_RAW,而授予非 root 容器用户的 capability 本来也用不了——而是使用 ICMP echo 套接字,Linux 允许 net.ipv4.ping_group_range 中列出的组使用它。Compose 文件 在容器自己的网络命名空间内设置了该 sysctl:

services:
dumbmonit:
sysctls:
net.ipv4.ping_group_range: "0 2147483647"

主机上不会有任何改变。Docker 20.10 及更高版本会自行在每个 容器中设置此范围;显式写出这几行是为了让它在较旧的引擎和 Podman 上同样生效。没有它时,检查会报告配置错误(显示在 监控项上,不会发送通知),而绝不会误报“主机宕机”。使用 docker run 时,请传入 --sysctl net.ipv4.ping_group_range="0 2147483647"。 只要服务器无法打开 ICMP 套接字,ping 监控项的表单就会显示一条包含这些行的提示。

添加一个演示监控项:它无需任何准备就能产生模拟 测量数据,因此可以立即试用图表、规则和通知。若要获得真实的 SNMP 数据, 运行 Docker 的这台机器通常就足够了——在上面安装 snmpd(apt install snmpd,在 /etc/snmp/snmpd.conf 中允许 Docker 网桥上的 public 团体名),然后添加一台 SNMP 设备,地址填该主机在该网桥上的 地址(默认为 172.17.0.1):配置档案会被自动检测, 接口、内存和进程随即出现。

开发者可以加上 docker-compose.dev.yml 覆盖文件,把内嵌的 VictoriaMetrics 发布到主机的 :8428,以便直接进行 MetricsQL 查询:

Terminal window
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d