Cài đặt Changedetection.io trên Docker: Theo dõi thay đổi website và nhận cảnh báo Telegram tức thì trong HomeLab

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Vấn đề: Bạn bỏ lỡ những thứ quan trọng

Có một kiểu bực bội rất đặc trưng: bạn vào trang sản phẩm mỗi ngày suốt hai tuần — thủ công, trên tab trình duyệt — rồi phát hiện ra hàng đã về kho và bán hết sạch trong lúc bạn đang ngủ. Hoặc theo dõi trang giá của đối thủ, một biểu mẫu nhà nước, một tin tuyển dụng. Đến một lúc nào đó, việc theo dõi thủ công không còn là quy trình làm việc nữa mà trở thành một công việc thứ hai.

Nguyên nhân không phải do lười biếng. Các website đơn giản là không thông báo cho bạn khi nội dung thay đổi. RSS feed thì gần như đã chết. Newsletter email được thiết kế cho mục đích marketing, không phải để theo dõi nội dung trang cụ thể. Các extension trình duyệt làm việc này thường hay lỗi, bị gắn với một máy duy nhất, và đáng ngờ về quyền riêng tư.

Thứ bạn thực sự cần là một dịch vụ tự host chạy 24/7 trong HomeLab. Một thứ kiểm tra URL theo lịch, so sánh nội dung, và đẩy cảnh báo đến nơi bạn đang chú ý. Đó chính xác là những gì Changedetection.io làm, và triển khai nó trên Docker chỉ mất khoảng 10 phút.

Changedetection.io thực sự làm gì

Changedetection.io là công cụ mã nguồn mở để theo dõi nội dung web. Nó tải trang theo các khoảng thời gian có thể cấu hình, so sánh nội dung mới với lần cuối đã thấy, và gửi thông báo khi phát hiện sự khác biệt.

Đây là những lý do nên dùng nó thay vì extension trình duyệt đơn giản:

  • Hỗ trợ render bằng trình duyệt — thông qua Playwright, xử lý được các SPA nặng JavaScript mà một HTTP fetch thông thường sẽ trả về trang trống.
  • Lọc bằng XPath/CSS selector — giới hạn phạm vi theo dõi vào một phần cụ thể của trang, bỏ qua thanh điều hướng và footer thay đổi liên tục.
  • Tích hợp thông báo — Telegram, Slack, Discord, email, ntfy, Pushover và nhiều hơn nữa, tất cả thông qua Apprise.
  • Lịch sử thay đổi — mọi thay đổi phát hiện được lưu lại kèm giao diện diff để bạn thấy chính xác điều gì đã thay đổi.
  • Visual diff — tô sáng văn bản được thêm/xóa trực tiếp trên giao diện web.

Chạy qua Docker Compose cho bạn một monitor liên tục, luôn hoạt động. Không cần mở tab trình duyệt ở bất kỳ đâu.

Cài đặt Changedetection.io với Docker Compose

Yêu cầu trước khi bắt đầu

Bạn cần Docker và Docker Compose đã cài trên máy chủ HomeLab. Trên Ubuntu/Debian:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker

Kiểm tra hoạt động:

docker compose version

Tạo thư mục dự án

mkdir -p ~/homelab/changedetection/datastore
cd ~/homelab/changedetection

Viết file Docker Compose

Tạo file docker-compose.yml với nội dung bên dưới. Cấu hình này tích hợp sẵn container trình duyệt Playwright để xử lý các trang render bằng JavaScript. Nếu bạn chỉ theo dõi các trang tĩnh, hãy bỏ service playwright-chrome và biến môi trường PLAYWRIGHT_DRIVER_URL — sẽ tiết kiệm cho bạn khoảng 300–500MB RAM.

services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io
    container_name: changedetection
    hostname: changedetection
    volumes:
      - ./datastore:/datastore
    environment:
      - PORT=5000
      - PLAYWRIGHT_DRIVER_URL=ws://playwright-chrome:3000
    ports:
      - "5000:5000"
    depends_on:
      playwright-chrome:
        condition: service_started
    restart: unless-stopped

  playwright-chrome:
    image: dgtlmoon/sockpuppetbrowser:latest
    container_name: playwright-chrome
    hostname: playwright-chrome
    cap_add:
      - SYS_ADMIN
    restart: unless-stopped
    environment:
      - SCREEN_WIDTH=1920
      - SCREEN_HEIGHT=1024
      - SCREEN_DEPTH=16
      - MAX_CONCURRENT_CHROME_PROCESSES=10

Khởi động các service

docker compose up -d

Kiểm tra cả hai container đang chạy:

docker compose ps

Bạn sẽ thấy cả changedetectionplaywright-chrome đều ở trạng thái running. Mở http://<ip-homelab-của-bạn>:5000 trên trình duyệt.

Thêm watch đầu tiên

Trên dashboard chính, dán bất kỳ URL nào vào ô nhập liệu và nhấn Watch. Changedetection.io tải trang ngay lập tức và lưu một snapshot làm cơ sở. Ở mỗi lần kiểm tra tiếp theo (khoảng thời gian mặc định: 24 giờ, có thể điều chỉnh từng watch), nó so sánh với snapshot đó.

Để thay đổi khoảng thời gian cho một watch cụ thể, nhấn tên watch → Edit → đặt trường Time between checks. Với các trang giá hoặc tồn kho, khoảng từ 30 phút đến 2 giờ là hợp lý — đủ thường xuyên để bắt kịp thay đổi, nhưng không quá tải cho máy chủ đích.

Cấu hình thông báo Telegram

Tạo Telegram Bot

  1. Mở Telegram và tìm kiếm @BotFather.
  2. Gửi /newbot, làm theo hướng dẫn, và sao chép HTTP API token được cấp.
  3. Gửi bất kỳ tin nhắn nào đến bot mới của bạn để khởi tạo cuộc trò chuyện.
  4. Lấy chat ID bằng cách chạy lệnh này trong terminal (thay TOKEN bằng token bot thực của bạn):
curl -s "https://api.telegram.org/botTOKEN/getUpdates" | python3 -m json.tool

Tìm "chat":{"id": 123456789} trong kết quả trả về. Con số đó chính là chat ID của bạn.

Thêm URL thông báo trong Changedetection.io

Changedetection.io dùng Apprise để gửi thông báo. Định dạng cho Telegram là:

tgram://BOT_TOKEN/CHAT_ID

Vào Settings → Notifications trong giao diện web, dán URL Apprise của bạn, và nhấn Send test notification. Tin nhắn thử nghiệm sẽ xuất hiện trên Telegram trong vài giây.

Bạn cũng có thể đặt URL thông báo riêng cho từng watch trong Edit → Notifications. Tiện lợi nếu bạn muốn một số watch gửi cảnh báo vào group chat trong khi những watch khác gửi vào DM cá nhân.

Tùy chỉnh nội dung thông báo

Template thông báo mặc định hoạt động tốt ngay từ đầu. Để chỉnh sửa, vào Settings → Notifications → Notification body. Các biến hữu ích nhất:

  • {{watch_url}} — URL đang được theo dõi
  • {{watch_title}} — nhãn bạn đặt cho watch
  • {{diff}} — diff văn bản của những gì đã thay đổi
  • {{preview_url}} — link đến giao diện diff trong instance Changedetection của bạn

Một template hoạt động tốt với Telegram:

🔔 Phát hiện thay đổi: {{watch_title}}

URL: {{watch_url}}

Xem chi tiết: {{preview_url}}

Thực hành: Theo dõi trang render bằng JavaScript

Một số trang tải nội dung thực sự sau phản hồi HTML ban đầu — chẳng hạn các ứng dụng React hoặc Vue render trên trình duyệt. Một HTTP fetch thông thường chỉ trả về một trang rỗng. Đây chính là lúc container Playwright phát huy tác dụng.

Khi thêm hoặc chỉnh sửa một watch, cuộn xuống Request → Fetch backend và chuyển từ Basic fast Fetch sang Chrome/Javascript. Changedetection.io sẽ định tuyến watch đó qua trình duyệt Playwright, render đầy đủ trang trước khi chụp snapshot.

Kết hợp với CSS/XPath filter trong Filters & Triggers để chỉ theo dõi phần tử bạn quan tâm — ví dụ giá sản phẩm:

css:.product-price

Lúc này mọi thứ khác trên trang đều bị bỏ qua. Bạn sẽ không bị thông báo mỗi khi quảng cáo thay đổi hay banner cookie cập nhật. Chỉ khi chính giá thay đổi.

Bảo vệ dữ liệu

Toàn bộ cấu hình watch và lịch sử thay đổi được lưu trong ./datastore trên máy chủ của bạn. Sao lưu chỉ cần một lệnh:

tar -czf changedetection-backup-$(date +%Y%m%d).tar.gz ./datastore

Chuyển sang máy chủ khác cũng đơn giản không kém — sao chép thư mục datastore, khởi động lại các container, và mọi thứ đều có sẵn: các watch, lịch sử, cài đặt thông báo — tất cả.

Tôi đã chạy cấu hình này để theo dõi một số trang giá của nhà cung cấp và dashboard nội bộ. Rất ổn định. Container Playwright có thêm overhead về bộ nhớ — ước tính khoảng 512MB–1GB tổng cộng tùy số lần kiểm tra đồng thời — nhưng với bất kỳ máy homelab nào có 4GB+ RAM, đó không phải vấn đề đáng lo.

Bước tiếp theo

Đến đây bạn đã có một monitor tự host kiểm tra URL theo lịch của mình, xử lý được JavaScript rendering, giới hạn thay đổi đúng vào nội dung bạn quan tâm, và đẩy cảnh báo Telegram ngay khi có gì đó thay đổi. Không cần mở tab trình duyệt. Không bỏ lỡ hàng về kho nữa.

Hai bước tiếp theo tự nhiên: đầu tiên, đặt một reverse proxy phía trước — Nginx Proxy Manager, Caddy, hoặc Traefik đều dùng được — để bạn có thể truy cập giao diện qua HTTPS mà không cần expose port 5000 trực tiếp. Thứ hai, thêm xác thực cơ bản nếu instance có thể truy cập từ bên ngoài mạng nội bộ. Cả hai đều không phức tạp, và đáng làm trước khi bạn bắt đầu theo dõi bất kỳ thứ gì nhạy cảm.

Share: