Cómo vigilar cambios en webs con changedetection.io en Docker
Índice de contenidos
- Puntos clave
- ¿Qué es changedetection.io y para qué sirve?
- ¿Cómo es el docker-compose.yml (con navegador Playwright opcional)?
- ¿Cómo crear una vigilancia y afinarla con filtros CSS o XPath?
- ¿Cómo enviar notificaciones con ntfy o Gotify?
- ¿Para qué se usa en la práctica (precios, stock, avisos)?
- Preguntas frecuentes
- ¿Necesito el contenedor de navegador Playwright?
- ¿Cada cuánto revisa las páginas y consume muchos recursos?
- ¿Es seguro exponer changedetection.io a Internet?
- Conclusión
- Fuentes
changedetection.io es una herramienta de código abierto que vigila páginas web y te avisa cuando cambian: precios, stock, versiones o avisos oficiales. Esta guía la instala con Docker Compose, añade un contenedor de navegador Playwright para webs con JavaScript, crea vigilancias con filtros CSS o XPath y envía notificaciones a ntfy o Gotify.
Muchas veces la información que necesitas vive en una web que no ofrece ni notificaciones ni RSS: el precio de un producto, el stock de una entrada, la fecha de un trámite o la última versión de un software. changedetection.io resuelve justo eso: vigila una página cada cierto tiempo, detecta cuándo cambia el texto que te importa y te avisa. En esta guía lo levantas con Docker Compose, le añades un contenedor de navegador Playwright para las webs que dependen de JavaScript, creas tu primera vigilancia con filtros CSS o XPath y encaminas los avisos a ntfy o Gotify. La misma explicación está disponible en inglés.
Puntos clave
- changedetection.io es una aplicación de código abierto con licencia Apache-2.0 y unas 32.300 estrellas en GitHub; su repositorio se define como "la mejor y más sencilla herramienta para detectar cambios en webs, monitorizar páginas y avisar de esos cambios".
- Está escrita en Python (Flask) y se distribuye como la imagen oficial
ghcr.io/dgtlmoon/changedetection.io; la última versión estable es la 0.55.8, publicada el 13 de julio de 2026. - La interfaz web escucha en el puerto 5000 y guarda toda su configuración y su historial en un único directorio de datos montado en
/datastore. - Para webs que solo cargan su contenido con JavaScript, añades un segundo contenedor de navegador (
dgtlmoon/sockpuppetbrowser) que escucha en el puerto 3000 y al que changedetection.io se conecta con la variablePLAYWRIGHT_DRIVER_URL. - Los avisos se envían con Apprise, que soporta más de 80 servicios: además de ntfy y Gotify, tienes Telegram, Discord, correo, webhooks y muchos más, todos configurados con una simple URL.
¿Qué es changedetection.io y para qué sirve?
changedetection.io es un servicio de vigilancia de páginas web: le indicas una URL, cada cuánto quieres que la revise y qué parte de la página te interesa, y él se encarga de descargarla periódicamente, comparar el resultado con la versión anterior y avisarte solo cuando algo cambia. Frente a un lector de RSS, no necesita que la web publique nada especial: funciona sobre cualquier página, porque compara el propio contenido renderizado.
Internamente guarda un historial de cada revisión. Además de avisarte de que algo ha cambiado, te muestra un diff con exactamente qué texto se ha añadido o eliminado, igual que un control de versiones. Puedes acotar la comparación a una zona concreta de la página (el precio, el número de existencias, un titular) para que un banner de cookies o un anuncio rotatorio no te disparen falsos avisos. Ese es su gran valor: convertir cualquier web estática en una fuente de notificaciones fiable.
El proyecto es software libre bajo licencia Apache-2.0 y muy activo. Existe una versión de pago en la nube que financia el desarrollo, pero la edición autoalojada que instalamos aquí es completa y gratuita, y al ejecutarla en tu servidor controlas tú los datos y la frecuencia de las comprobaciones sin límites de terceros.
¿Cómo es el docker-compose.yml (con navegador Playwright opcional)?
Vamos a levantar dos servicios: la propia aplicación y un navegador Chromium para las webs con JavaScript. La aplicación no necesita base de datos externa; le basta un volumen con nombre para /datastore, donde guarda la configuración, el historial y los avisos. Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Fija la versión 0.55.8 en lugar de :latest, porque una etiqueta flotante puede saltar a otra versión en un reinicio y cambiarte el comportamiento sin avisar:
services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io:0.55.8
container_name: changedetection
restart: unless-stopped
environment:
BASE_URL: https://vigilancia.tudominio.com
PLAYWRIGHT_DRIVER_URL: ws://browser-chrome:3000
volumes:
- changedetection-data:/datastore
ports:
- "127.0.0.1:5000:5000"
depends_on:
- browser-chrome
healthcheck:
test: ["CMD-SHELL", "python3 -c \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:5000/').status==200 else 1)\""]
interval: 60s
timeout: 10s
retries: 3
start_period: 30s
browser-chrome:
image: dgtlmoon/sockpuppetbrowser:0.0.2
container_name: changedetection-browser
hostname: browser-chrome
restart: unless-stopped
cap_add:
- SYS_ADMIN
environment:
SCREEN_WIDTH: "1920"
SCREEN_HEIGHT: "1024"
SCREEN_DEPTH: "16"
MAX_CONCURRENT_CHROME_PROCESSES: "10"
volumes:
changedetection-data:
Dos detalles importantes. El puerto se publica como 127.0.0.1:5000:5000, es decir, solo escucha en el propio servidor: la interfaz de changedetection.io no trae contraseña por defecto, así que nunca debe quedar expuesta directamente a Internet. Para acceder desde fuera, ponla detrás de un proxy inverso con HTTPS y autenticación, como se explica en la guía de cómo instalar Traefik con Docker Compose, y ajusta BASE_URL a esa URL pública para que los enlaces de los avisos apunten al sitio correcto.
El segundo servicio, browser-chrome, es opcional. Solo lo necesitas para vigilar webs que construyen su contenido con JavaScript (tiendas modernas, aplicaciones de una sola página). La variable PLAYWRIGHT_DRIVER_URL le dice a changedetection.io que use ese navegador con el método de descarga Chromium; el contenedor sockpuppetbrowser necesita el permiso SYS_ADMIN para arrancar el sandbox de Chrome. Si solo vas a vigilar webs sencillas, borra el servicio browser-chrome, la línea PLAYWRIGHT_DRIVER_URL y el bloque depends_on, y funcionará igual con el método de descarga rápido por HTTP.
Arranca los servicios y comprueba que responden:
mkdir -p changedetection && cd changedetection
docker compose up -d
docker compose ps
docker compose logs -f changedetection
Cuando el estado del contenedor pase a healthy, abre http://IP-DEL-SERVIDOR:5000 (o tu dominio si ya lo has puesto tras el proxy) y verás la interfaz vacía, lista para añadir tu primera vigilancia. Si necesitas repasar la instalación del motor, tienes la guía de cómo instalar Docker en Ubuntu 24.04.
¿Cómo crear una vigilancia y afinarla con filtros CSS o XPath?
En la interfaz, pega la URL que quieres vigilar en el campo superior y pulsa Watch. changedetection.io descargará la página, guardará una primera instantánea y, a partir de ahí, la revisará según el intervalo que configures (por defecto cada pocas horas; puedes bajarlo a minutos o subirlo a días). La primera comprobación no dispara aviso: solo establece la línea base con la que se compararán las siguientes.
El problema de vigilar una página entera es el ruido: fechas, contadores de visitas, anuncios o banners cambian constantemente y te llenarían de falsos positivos. Por eso entras en los ajustes de la vigilancia (pestaña Filters & Triggers) y acotas exactamente qué parte comparar. Tienes tres formas de hacerlo:
- Selector CSS, por ejemplo
#precioo.product-price, para quedarte solo con ese elemento. - XPath, como
//span[@id="stock"], útil cuando el CSS no basta. - El selector visual, que te muestra la página renderizada y te deja hacer clic en el bloque que te interesa; changedetection.io deduce el selector por ti.
Puedes además ignorar líneas que contengan ciertas palabras, activar disparadores solo cuando aparezca o desaparezca un texto ("En stock", "Agotado") y elegir el método de descarga: el rápido por HTTP para webs estáticas o Playwright/Chromium (el contenedor browser-chrome) para las que necesitan JavaScript. Con estos filtros, un aviso deja de ser "algo ha cambiado en la página" y pasa a ser "el precio ha bajado" o "vuelve a haber existencias".
¿Cómo enviar notificaciones con ntfy o Gotify?
Detectar cambios no sirve de nada si no te enteras. changedetection.io usa la librería Apprise, que habla con más de 80 servicios de notificación mediante URLs con un formato propio. Puedes definir las notificaciones de forma global (en Settings) o por vigilancia. En el campo Notification URL List pegas una URL por línea; estas son las de las dos herramientas más habituales en un homelab:
ntfys://vigilancia.tudominio.com/changedetection
gotifys://gotify.tudominio.com/AbCdEf012345
La primera envía el aviso a un tema llamado changedetection de tu servidor ntfy por HTTPS (ntfys://); si tu servidor exige autenticación, la URL admite usuario y contraseña con ntfys://usuario:clave@host/tema. La segunda entrega el mensaje a Gotify, donde el último segmento (AbCdEf012345) es el token de la aplicación que hayas creado. Usa siempre la variante segura (ntfys://, gotifys://) cuando el servicio esté tras HTTPS.
El cuerpo y el título del aviso se personalizan con tokens: {{watch_url}} inserta la URL vigilada, {{watch_title}} su nombre y {{diff}} el cambio exacto detectado. Así, en el móvil, en lugar de un genérico "hay cambios", recibes el enlace y el fragmento que ha cambiado. Antes de guardar, pulsa Send test notification para confirmar que la URL es correcta y que el aviso llega de verdad.
¿Para qué se usa en la práctica (precios, stock, avisos)?
Los casos de uso salen solos en cuanto lo tienes funcionando. El más popular es la vigilancia de precios: apuntas a la ficha de un producto, filtras por el selector del precio y recibes un aviso en cuanto baja, sin depender de comparadores externos. Muy relacionado está el control de existencias: vigilas una página con un disparador sobre el texto "Agotado" para enterarte en el instante en que un artículo, una entrada o un componente vuelve a estar disponible.
Fuera de las compras, es una herramienta excelente para seguir información oficial: la fecha de apertura de un plazo administrativo, los términos de servicio de una aplicación, el estado de un pedido o el aviso de una nueva versión en la página de descargas de un software que no publica un canal de novedades. Cualquier página que consultarías "a mano de vez en cuando" es candidata a convertirse en una vigilancia. Como cada resultado se guarda en el volumen /datastore, conviene incluir ese directorio en tus copias de seguridad; si necesitas repasar cómo persisten los datos en Docker, tienes la guía de volúmenes y bind mounts en Docker.
Preguntas frecuentes
¿Necesito el contenedor de navegador Playwright?
Solo para webs con JavaScript. El método de descarga rápido por HTTP baja el HTML tal cual lo sirve el servidor, lo que funciona perfectamente en la mayoría de páginas y blogs. Pero muchas tiendas y aplicaciones modernas cargan el precio o el stock con JavaScript después de servir la página, y ahí el HTML crudo llega vacío. Para esos casos añades el contenedor dgtlmoon/sockpuppetbrowser, que renderiza la página en un Chrome real (a 1920×1024) igual que un navegador de verdad. Si no vigilas ninguna web de ese tipo, puedes prescindir de él y ahorrar memoria.
¿Cada cuánto revisa las páginas y consume muchos recursos?
Tú decides el intervalo, por vigilancia o de forma global, desde minutos hasta días. La aplicación en sí es muy ligera porque solo hace peticiones HTTP y compara texto; el consumo se dispara únicamente cuando usas el navegador Chromium, que abre un Chrome por comprobación. Por eso el contenedor sockpuppetbrowser limita los procesos simultáneos con MAX_CONCURRENT_CHROME_PROCESSES (10 por defecto). Para la mayoría de homelabs, un intervalo prudente y el método HTTP siempre que sea posible mantienen el uso de CPU y RAM en niveles mínimos.
¿Es seguro exponer changedetection.io a Internet?
No directamente. La interfaz no trae usuario ni contraseña de fábrica, así que en el docker-compose.yml la publicamos solo en 127.0.0.1. Para acceder desde fuera, ponla siempre detrás de un proxy inverso que añada HTTPS y una capa de autenticación, y activa además la contraseña interna que ofrece la propia aplicación en sus ajustes. Así evitas que cualquiera pueda ver, editar o borrar tus vigilancias.
Conclusión
changedetection.io convierte cualquier web en una fuente de notificaciones: vigilas la página, filtras justo el dato que te importa con un selector CSS o XPath y recibes un aviso con el cambio exacto en tu móvil. Con un docker-compose.yml de dos servicios levantas la aplicación y, cuando hace falta, un navegador Playwright para las webs con JavaScript, sin más dependencias que un volumen para /datastore. El siguiente paso natural es cerrarlo tras un proxy con HTTPS, encaminar los avisos a ntfy o Gotify y crear tus primeras vigilancias de precios, stock y avisos oficiales.
Fuentes
Código fuente
Accede a todo el código fuente de este artículo en GitHub.
Ver en GitHub