Docker 玩法

飞牛NAS部署 Changedetection.io:网页变更监控

2026-07-30 2 admin

飞牛NAS部署 Changedetection.io:网页变更监控

你是否曾因错过心仪商品降价、官网活动更新、或是重要文档的修订而懊恼?手动刷新页面不仅效率低下,还容易遗漏。今天,我们将借助飞牛NAS强大的Docker支持,部署一个轻量级网页监控利器——Changedetection.io。它能自动监测目标网页的文本变化,并通过邮件、Webhook等多种方式即时通知你,从此告别“手动刷新”。

1. 认识Changedetection.io

Changedetection.io是一个开源的网页变更检测服务,采用Python编写,基于Playwright进行页面渲染。它支持JavaScript渲染的页面、CSS选择器精准定位、忽略特定区域(如广告、时间戳)等功能。个人使用完全免费,数据存储在本地的SQLite数据库中,隐私安全可控。

核心优势: - 支持登录态监控(通过浏览器Cookie或Basic Auth) - 可视化差异对比,高亮显示变动内容 - 支持代理、自定义请求头 - 通知渠道覆盖邮件、Slack、Telegram、Discord等20+种

2. 环境准备

你需要一台已安装飞牛NAS并开启Docker功能的设备。建议飞牛OS版本在0.8.24以上,Docker引擎版本20.10+。

确认Docker状态: 打开飞牛NAS的「套件中心」→「Docker」,确保服务已启动。若未安装,可直接从套件中心安装。

3. 部署步骤(SSH/终端方式)

我们使用官方推荐的docker-compose方式部署,便于管理。你也可以通过飞牛NAS的Docker图形界面部署,但SSH方式更易于自定义。

3.1 通过SSH连接飞牛NAS

使用任意SSH客户端(如Putty、Termius)连接你的NAS,登录管理员账户。

3.2 创建项目目录

mkdir -p /volume1/docker/changedetection
cd /volume1/docker/changedetection

注意:/volume1 是你的存储池挂载路径,请根据实际情况调整。可通过 df -h 查看。

3.3 编写docker-compose.yml

创建并编辑文件:

nano docker-compose.yml

粘贴以下内容:

version: '3.8'

services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io:latest
    container_name: changedetection
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - ./data:/datastore
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - BASE_URL=http://你的NASIP:5000
      - PLAYWRIGHT_DRIVER_URL=ws://playwright:3000
    depends_on:
      - playwright

  playwright:
    image: ghcr.io/dgtlmoon/changedetection.io-playwright:latest
    container_name: changedetection-playwright
    restart: unless-stopped
    expose:
      - "3000"
    environment:
      - TZ=Asia/Shanghai

关键参数说明: - PUID/PGID:建议设为你的NAS主用户ID,可通过 id 你的用户名 查看 - BASE_URL:改为你的NAS实际IP(例如 http://192.168.1.100:5000),用于生成正确的通知链接 - ports:左侧端口可自定义,如改为 8080:5000,则访问端口变为8080

Ctrl+X 保存,按 Y 确认,按 Enter 退出。

3.4 启动服务

docker-compose up -d

等待镜像拉取并启动。第一次拉取需几分钟,取决于网络速度。完成后可通过 docker-compose ps 查看状态,两个容器都应为 Up

3.5 通过飞牛NAS图形界面部署(备选)

若你更习惯图形界面,可按以下步骤操作: 1. 打开飞牛NAS的Docker应用 2. 进入「镜像」→「拉取镜像」,搜索 dgtlmoon/changedetection.iodgtlmoon/changedetection.io-playwright 并拉取最新版 3. 创建两个容器: - changedetection:映射端口5000(主机端口可自定义),挂载本地路径到 /datastore,环境变量添加 TZ=Asia/ShanghaiBASE_URL=http://你的IP:5000PLAYWRIGHT_DRIVER_URL=ws://playwright:3000 - playwright:无需端口映射,环境变量添加 TZ=Asia/Shanghai 4. 注意:需先启动playwright容器,再启动changedetection容器,或在compose中设置depends_on

4. 首次访问与配置

打开浏览器,访问 http://你的NASIP:5000(端口若自定义则用自定义端口)。首次进入会显示欢迎界面,要求创建管理员账户。

4.1 创建管理员用户

  • 用户名:建议用邮箱格式(如 [email protected]
  • 密码:至少8位,含字母和数字
  • 点击「Create Account」

4.2 基本设置

登录后点击右上角头像 →「Settings」,推荐进行以下配置:

通知设置(Notifications): - 添加邮件通知:填入SMTP服务器、端口、账号密码(支持SSL/TLS) - 或添加Apprise URL(支持微信、钉钉、Telegram等,具体格式见Apprise文档)

全局设置: - 监控频率:默认每30分钟检查一次,可改为1小时 - 请求超时:建议保持30秒 - 通知频次:可选择“首次变化通知”或“每次变化通知”

5. 添加第一个监控任务

点击左上角「Add a new watch」,开始配置监控:

  1. URL:输入目标网页地址,如某商品详情页
  2. 名称:给任务起个易识别的名字,如“XXX商品价格监控”
  3. 检查频率:可单独覆盖全局设置,如每10分钟检查一次
  4. CSS选择器(可选):若只想监控页面某部分(如价格数字),用浏览器开发者工具获取CSS路径。例如监控京东商品价格,选择器可能是 .price
  5. 忽略文本(可选):排除动态变化的时间、随机数等。如忽略“更新时间:2025-01-15”这类文本
  6. 触发模式:建议选「Text changed」(文本变化),也可选「Re-appeared」(内容重新出现)
  7. 通知:选择已配置的通知渠道

点击「Save」保存。系统会立即执行一次快照,然后按设定频率自动监测。

5.1 查看监控结果

在监控列表页,每个任务会显示: - 最新检查时间 - 当前状态(OK/Changed/Error) - 最近一次变化时间

点击任务进入详情,可查看: - 历史快照:每次检查的页面截图(需Playwright支持) - 差异对比:高亮显示新增/删除的文本 - 手动检查:点击「Re-check」立即执行一次

6. 高级技巧

6.1 监控需要登录的页面

某些网站需要登录才能查看内容。在任务编辑页面,找到「Headers」或「Cookies」选项: - Cookies:复制浏览器中的登录态Cookie字符串填入 - Basic Auth:直接输入用户名密码(仅支持HTTP基本认证)

注意:Cookie会过期,建议定期更新或使用API密钥方式

6.2 使用代理

若目标网站被墙,或需模拟特定地区访问,可在全局设置或单个任务中添加代理: - 格式:http://代理IP:端口socks5://代理IP:端口 - 支持认证:http://用户名:密码@代理IP:端口

6.3 批量导入

点击「Import」按钮,支持从CSV文件批量导入监控URL,格式:

URL,Name,CSS_Selector,Check_Frequency
https://example.com/page1,监控页面1,.content,300
https://example.com/page2,监控页面2,,600

7. 常见问题

Q:监控页面始终显示“Waiting for selector”或超时?
A:可能是Playwright容器未正确连接。检查docker-compose中 PLAYWRIGHT_DRIVER_URL 是否指向playwright容器(ws://playwright:3000),并确保两个容器在同一网络。

Q:通知未收到?
A:检查SMTP设置是否正确,部分邮箱(如QQ邮箱)需开启SMTP服务并获取授权码而非登录密码。测试通知可在设置页面点击「Send Test Notification」。

Q:如何备份数据?
A:所有数据存储在 `