跳到主要内容

changedetection.io 公告监控:轻量部署、过滤与恢复

在 VPS 上用 changedetection.io 监控公告正文,设置内容过滤和变化通知,并保存冷备份、验证恢复副本。

先确认公告正文能读取

公告页没有 RSS,又不想每天打开确认有没有新通知,可以用 changedetection.io定时比较网页内容。它保存前后快照,再把变化标出来,适合盯维护公告、软件更新说明或自己网站的一段正文。

changedetection.io ↗

先确定目标内容在普通 HTTP 响应里是否存在。静态页面可以只运行一个抓取服务;必须执行 JavaScript 才出现的内容,需要另外配置浏览器服务,内存、CPU 和维护成本都会增加。本文先部署固定的 0.60.9 版本,只用普通 HTTP 抓取,不启用浏览器、AI 或付费通知服务。

先按抓取方式和保留历史选机器

个人少量公告页,可以从已有 Linux VPS 上试用。选型时先留出应用、Docker 和系统的空间,再考虑每次抓取的页面大小、并发数与历史保留量。整台机器有 2 GiB 内存、20 GiB 本地磁盘,可作为少量静态页面的试部署起点;这不是测得的最低配置,也不适用于大量浏览器任务。

优先选择能稳定访问目标站的机房。后台打开快,不代表该机房访问公告来源也顺畅;先在服务器上确认能取得实际正文,遇到 403、验证码或仅有空壳的响应,就记录失败。把检查频率调得更高不能解决访问限制。目标已有可靠 RSS 时,订阅 RSS 通常更省事。

需要新机器时,按目标站可达性、月付费用、磁盘和备份条件比较雨云 RCS。

查看雨云 RCS 的地区与配置 ↗

注册推荐码:KuZhuJi

已有服务器资源足够便继续使用,不必为了单个监控服务重买一台。总费用还包括异地备份、可能使用的邮件或消息服务。VPS 的套餐端口速率也不能保证每个目标网站的抓取速度。

先放在回环端口,用 SSH 完成设置

以下命令用于已安装 Docker Engine 和 Compose 插件的 Linux 服务器,使用有 Docker 权限的 root shell。/srv/change-watch 应是本次新建目录;如果已经存在实例,先查看配置和数据,不覆盖它。

sh;使用前请核对本文前提。
umask 077
mkdir -p /srv/change-watch/data
chmod 700 /srv/change-watch /srv/change-watch/data
cd /srv/change-watch

保存为 compose.yaml。镜像固定版本及多架构索引 digest,运行时会选择对应架构;512m 是此示例给服务设的上限,并非官方最低内存。FETCH_WORKERS 先设为 1,避免刚安装就并行抓取很多网页。

yaml;使用前请核对本文前提。
services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io:0.60.9@sha256:04eaae7915bad711160cb15abe160f6d3fabe98bbbd658509d4b7a654000fb2d
    restart: unless-stopped
    ports:
      - "127.0.0.1:${WATCH_PORT:-5000}:5000"
    environment:
      TZ: Asia/Shanghai
      FETCH_WORKERS: "1"
      DISABLE_VERSION_CHECK: "true"
      LLM_FEATURES_DISABLED: "true"
    volumes:
      - ./data:/datastore
    mem_limit: 512m
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
sh;使用前请核对本文前提。
docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=80 changedetection
curl -I http://127.0.0.1:5000/

HTTP 能响应只是启动检查。还要在 Docker 实际配置中核对端口绑定和内存限制,确认没有把管理界面映射到 0.0.0.0。在自己的电脑另开终端,替换 SSH 用户与服务器地址:

sh;使用前请核对本文前提。
ssh -N -L 15000:127.0.0.1:5000 user@your-server

浏览器打开 http://127.0.0.1:15000。先设置管理密码,移除不需要的示例任务,检查实例的通知设置。只自己使用时可以长期保留 SSH 隧道访问。要用域名访问,再按现有 Caddy 教程配置 HTTPS 和访问控制;不要直接开放 5000 端口。域名只是访问入口,不会自动限制谁能管理监控规则。

现有 Caddy 教程 →

只比较有用的部分,先确认一次真实变化

新增一个允许自动访问的公告地址,选择普通 HTTP 抓取,先手动检查一次,再看保存的正文。首次内容用于建立基线,不能把“尚无前后差异”当作抓取没有工作。页面只有“请启用 JavaScript”或验证提示时,先解决读取条件,不继续设置通知。

如果只关心公告列表,打开该任务的编辑页,在内容过滤设置中选中列表对应的 CSS 选择器。不要直接复制别的网站的选择器;在目标 HTML 中确认它能选中所需文字,再查看过滤后的预览。页面顶部时钟、访问量或随机推荐会带来大量无关变化,应该排除这些区域。

检查间隔可先设为 30 分钟,再按公告更新频率和目标站规则调整。这个间隔是使用建议,不是检测时效承诺。对自己的测试页改一段公告文字,触发新检查,确认差异页能同时看到旧值和新值;只在列表里看到绿色状态还不够。目标站暂时失败时,也要能分清抓取错误与正文变化。

确定差异有用后,再配置自己已有的通知渠道。先检查通知收件人和内容,再做一次有意的测试,避免把后台密码、访问令牌或含私人参数的 URL 发出去。任务的比较历史、通知地址和全局设置都在数据保护范围内。

若以后需要 JavaScript 页面,另行评估浏览器容器的版本、并发和资源上限。本文没有部署该服务,也没有验证特定网站的登录、验证码、价格识别或浏览器步骤。不要直接给整个实例放开内网地址访问;有权添加监控 URL 的人,实际也能触发服务器发起网络请求。

冷备整个数据目录,再在空目录验证恢复

网页快照会持续占用磁盘。定期查看 /srv/change-watch/data 的大小,按保留需要整理历史。磁盘满了再删除 Docker 的所有卷,会把监控规则和历史一起丢掉。

应用内下载的备份适合规则迁移,但不能据此推断全局设置已完整恢复。保留实例时,停下服务后归档整个 data、Compose 和可能存在的 .env 配置。以下在服务器执行,每次生成独立目录;中途失败会尝试重新启动原服务,失败产物不会被当成完成备份。

sh;使用前请核对本文前提。
set -eu
cd /srv/change-watch
umask 077
[ -e .env ] || : > .env
chmod 600 .env
mkdir -p /srv/change-watch-backups
snapshot=$(mktemp -d /srv/change-watch-backups/cold-XXXXXX)
cid=$(docker compose ps -q changedetection)
test -n "$cid"
trap 'docker compose start changedetection >/dev/null' EXIT
docker compose stop -t 60 changedetection
state=$(docker inspect --format '{{.State.Status}} {{.State.OOMKilled}} {{.State.ExitCode}}' "$cid")
case "$state" in
  "exited false 0"|"exited false 143") ;;
  *) printf '未确认正常停止,拒绝归档:%s\n' "$state" >&2; exit 1 ;;
esac
tar --numeric-owner -czpf "$snapshot/instance.tar.gz.partial" \
  -C /srv/change-watch compose.yaml .env data
tar -tzf "$snapshot/instance.tar.gz.partial" >/dev/null
mv "$snapshot/instance.tar.gz.partial" "$snapshot/instance.tar.gz"
(cd "$snapshot" && sha256sum instance.tar.gz > SHA256SUMS)
docker compose start changedetection
trap - EXIT
printf '备份目录:%s\n' "$snapshot"

把完成的归档与校验文件加密保存在另一台设备;同盘备份不能应对整台 VPS 丢失。压缩包可能包含通知凭据,不能放到网站可下载目录。校验值只证明文件没有意外改变,还需要恢复验证。

先确认主机有同时容纳原实例和恢复副本的资源;不足时在维护窗口停止原实例后验证,或使用已有的隔离测试机器。下面把自己创建的可信归档解到新空目录,使用同一镜像和禁止联网的恢复配置。把 snapshot 换成实际目录:

sh;使用前请核对本文前提。
set -eu
snapshot=/srv/change-watch-backups/cold-实际后缀
(cd "$snapshot" && sha256sum -c SHA256SUMS)
restore=$(mktemp -d /srv/change-watch-restore.XXXXXX)
tar --numeric-owner -xzpf "$snapshot/instance.tar.gz" -C "$restore"
cd "$restore"
cat > compose.restore.yaml <<'YAML'
services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io:0.60.9@sha256:04eaae7915bad711160cb15abe160f6d3fabe98bbbd658509d4b7a654000fb2d
    network_mode: none
    restart: "no"
    environment:
      TZ: Asia/Shanghai
      FETCH_WORKERS: "1"
      DISABLE_VERSION_CHECK: "true"
      LLM_FEATURES_DISABLED: "true"
    volumes:
      - ./data:/datastore
    mem_limit: 512m
YAML
docker compose -p change-watch-restore -f compose.restore.yaml up -d
docker compose -p change-watch-restore -f compose.restore.yaml \
  exec -T changedetection python -c \
  'import urllib.request; print(urllib.request.urlopen("http://127.0.0.1:5000/", timeout=10).status)'

无网络副本没有发布端口,HTTP 检查在容器内部运行;有管理密码时,页面跳转到登录页也是可能的正常行为。查看日志确认没有数据库或文件读取错误。这个检查只证明应用能启动并提供页面,不能证明规则、历史和通知全部正确。

完整验收还要比较备份前记录的规则、过滤器、间隔、前后快照和全局设置,并让自有测试页产生一次新差异。可先在同一无外网容器的回环地址运行合成测试页,再通过应用 API 验证;不要为测试随意全局开放内网抓取。需要浏览器验收时,在已设置出站限制、仅允许管理员入站的独立测试环境中操作,防止恢复任务立即重复抓取、发通知。没有这些条件,就保留副本为待验证,不能把上一条 HTTP 成功写成完整恢复。

验完执行 docker compose -p change-watch-restore -f compose.restore.yaml stop,保留数据和归档供排查。正式换机接管前先停止旧实例,重新核对通知收件人,再按原配置只启动一个生产实例。

升级时把镜像与数据放在同一个恢复点

更新前阅读目标版本发布说明,先完成上一节冷备与副本恢复。记录当前完整镜像地址,修改 Compose 的版本和对应 digest,再执行 docker compose pull 和 docker compose up -d。检查登录、规则数量、旧历史以及自有测试页的新差异。

新版本写过的数据不能保证旧版本读得懂。需要退回时,恢复升级前的完整数据和原 Compose 配置,再用原镜像验证;不要仅把 tag 改回去就称为回退完成。本文的主要选型边界仍是普通 HTTP 抓取,浏览器模式与更大并发需要单独验证。

本文关联资源