Auto-héberger changedetection.io pour surveiller des pages web
Suivez ça sur votre propre serveur. Commencer gratuitement, sans carte
La plupart des pages web qui vaudraient la peine d’être surveillées n’ont ni flux, ni API, ni aucun moyen de savoir si elles ont changé autrement qu’en les chargeant soi-même et en comparant. changedetection.io surveille n’importe quelle page, ou un élément précis de celle-ci que vous choisissez visuellement, et vous avertit quand elle change : une baisse de prix, un article qui revient en stock, un avis gouvernemental mis à jour, la page de prix d’un concurrent qui bouge. L’alternative, c’est payer pour un outil de surveillance de changement en SaaS, ou écrire votre propre script de scraping sur cron qui se casse dès que le balisage de la page change un peu. À la fin de ce guide, vous aurez votre propre instance changedetection.io qui tourne sur un serveur à 6 $/mois, accessible en HTTPS sur votre propre domaine, avec son historique sauvegardé et un chemin de mise à jour qui ne vous fait pas perdre vos surveillances.
Ce qu’il vous faut
- Un serveur. Le Basic Droplet de DigitalOcean à 6,00 $/mois donne 1 vCPU, 1 Go de RAM et 25 Go de SSD, largement suffisant pour cette application à un seul conteneur plus un reverse proxy. Un serveur privé virtuel Ubuntu 24.04 chez un autre fournisseur fonctionne de la même façon.
- Un nom de domaine (ou un sous-domaine d’un domaine que vous possédez déjà), avec accès à ses paramètres DNS.
- Docker et le plugin Docker Compose installés sur le serveur (couvert à l’étape 2).
- Un terminal et un accès SSH au serveur.
Étape 1 : créer le serveur et pointer un domaine vers lui
Déployez un droplet Ubuntu 24.04 sur le plan Basic à 6 $/mois de DigitalOcean (1 vCPU, 1 Go de RAM, 25 Go de SSD). Notez son adresse IP publique.
Dans les paramètres DNS de votre domaine, ajoutez un enregistrement A pointant un sous-domaine, par exemple watch.votredomaine.com, vers cette IP :
Type: A
Name: watch
Value: <l'IP de votre serveur>
TTL: 300
La propagation DNS peut prendre de quelques minutes à quelques heures. Vous devriez voir dig watch.votredomaine.com +short retourner l’IP de votre serveur avant de poursuivre, puisque les étapes suivantes en dépendent.
Étape 2 : installer Docker
Connectez-vous en SSH au serveur et installez Docker Engine ainsi que le plugin Compose :
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
Déconnectez-vous et reconnectez-vous pour que le changement de groupe prenne effet, puis vérifiez que les deux composants sont bien présents :
docker --version
docker compose version
Vous devriez voir une version de Docker et une version de Compose s’afficher, sans erreur de type « command not found ».
Étape 3 : préparer le dossier du projet
Créez un dossier pour la pile de services :
mkdir -p ~/changedetection && cd ~/changedetection
C’est vraiment tout pour les secrets à ce stade. changedetection.io n’exige ni compte, ni clé d’API, ni mot de passe de base de données pour commencer à surveiller des pages. Si vous voulez ajouter un mot de passe de connexion pour que l’instance ne soit pas ouverte à quiconque trouve l’URL, c’est un paramètre à l’intérieur de l’application elle-même, sur sa page Settings, une fois qu’elle tourne, pas quelque chose à configurer d’avance. Ça vaut la peine si ce serveur est accessible à plus que vous seul; vous pouvez sauter cette étape sinon.
Étape 4 : écrire le fichier Docker Compose
changedetection.io garde tout, sa configuration de surveillance, l’historique des pages et les captures, sur disque dans un seul volume, donc il n’y a pas de service de base de données séparé à faire tourner. Créez docker-compose.yml :
services:
changedetection:
image: dgtlmoon/changedetection.io:0.60.9
container_name: changedetection
hostname: changedetection
restart: unless-stopped
volumes:
- changedetection-data:/datastore
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- changedetection
volumes:
changedetection-data:
caddy_data:
caddy_config:
Quelques choix méritent une explication :
- L’image est fixée à
0.60.9plutôt que laissée surlatest. Vous choisissez vous-même quand passer à une version plus récente, voir l’étape 8. - Seul Caddy publie des ports vers l’hôte. changedetection.io lui-même n’est pas exposé directement à Internet, il n’est accessible que sur le réseau Docker interne, sur son port par défaut 5000.
Avant de démarrer quoi que ce soit, validez que le fichier s’analyse correctement :
docker compose -f docker-compose.yml config
Une exécution propre réaffiche la configuration résolue en entier, sans erreur.
Étape 5 : écrire le Caddyfile et tout démarrer
Caddy gère automatiquement le certificat TLS de Let’s Encrypt, tant que le DNS pointe déjà vers le serveur et que les ports 80 et 443 sont accessibles depuis Internet. Créez Caddyfile dans le même dossier :
watch.votredomaine.com {
reverse_proxy changedetection:5000
}
Validez-le avant de démarrer :
docker run --rm -v $(pwd)/Caddyfile:/etc/caddy/Caddyfile caddy:2 caddy validate --config /etc/caddy/Caddyfile
Une exécution propre indique que la configuration est valide. Démarrez ensuite la pile de services :
docker compose up -d
Observez son démarrage et vérifiez que Caddy a bien obtenu un certificat :
docker compose logs -f caddy
Vous devriez voir une ligne mentionnant un certificat obtenu pour votre domaine.
Étape 6 : ajouter votre première surveillance
Visitez https://watch.votredomaine.com. Il n’y a aucune étape de création de compte, aucun formulaire d’inscription : le premier écran vous laisse coller une URL et l’ajouter directement comme surveillance. Ajoutez une page que vous voulez réellement suivre, en la réduisant au besoin à un seul élément avec le sélecteur visuel si la page contient beaucoup de bruit autour de la partie qui vous intéresse, puis sauvegardez.
Si cette instance est accessible à d’autres que vous, allez dans Settings à l’intérieur de l’application et définissez un mot de passe de connexion. C’est optionnel, pas requis pour démarrer, mais ça vaut la peine dès que l’URL n’est plus seulement la vôtre.
Quelques réglages à connaître dès le départ, sans avoir besoin d’y toucher tout de suite : LOGGER_LEVEL contrôle à quel point les journaux du conteneur lui-même sont bavards (TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL, par défaut DEBUG), et surveiller des pages qui ne rendent leur vrai contenu que via JavaScript exige un composant de navigateur sans interface supplémentaire, que le projet appelle sockpuppetbrowser, un conteneur séparé, ce qui dépasse le cadre de cette configuration de base. La documentation du projet couvre l’ajout de ce composant si vous en avez besoin plus tard.
Étape 7 : sauvegarder vos surveillances et leur historique
Le seul volume nommé, changedetection-data, contient tout : chaque surveillance que vous avez configurée, son historique complet, et chaque capture enregistrée. Sauvegardez-le de la même façon que n’importe quel autre volume Docker, avec une archive gardée ailleurs que sur le serveur :
docker run --rm -v changedetection_changedetection-data:/data -v $(pwd):/backup alpine \
tar czf /backup/changedetection-backup-$(date +%F).tar.gz -C /data .
Mettez ça dans une tâche cron et copiez le résultat ailleurs que sur ce droplet, un espace de stockage objet, une autre machine, n’importe où sauf ce serveur. Une sauvegarde qui ne vit que sur le serveur qu’elle sauvegarde ne survit pas au scénario de panne qui détruit justement un serveur.
Étape 8 : mettre à jour sans perdre vos surveillances
Vérifiez la version que vous faites actuellement tourner, puis changez le tag fixé dans docker-compose.yml :
image: dgtlmoon/changedetection.io:<new-version>
Récupérez et redémarrez seulement ce service :
docker compose pull changedetection
docker compose up -d changedetection
Vérifiez les journaux pour un démarrage propre :
docker compose logs changedetection
Confirmez ensuite que vos surveillances existantes et leur historique sont toujours là en ouvrant l’application. Si quelque chose semble anormal, votre sauvegarde de l’étape 7 est le chemin de retour.
Le raccourci : le faire avec Railyard
Tout ce qui précède, un volume /datastore persistant et le HTTPS déjà en place, existe aussi comme gabarit en un clic :
https://app.railyard.run/deploy?template=changedetection
Railyard construit celui-ci à partir du Dockerfile propre au projet dans son dépôt GitHub, la même approche que la configuration manuelle ci-dessus, simplement automatisée, plutôt que de récupérer une image préconstruite. Aucun module additionnel : pas de base de données, pas de service supplémentaire, puisque changedetection.io n’en a pas besoin non plus pour cette configuration de base.
Si vous préférez commencer par Railyard en général avant de trancher pour changedetection.io en particulier, le guide de démarrage couvre les bases, et bases de données et sauvegardes explique comment les sauvegardes fonctionnent à travers tous les gabarits, pas seulement celui-ci. Bouton de déploiement couvre le format du lien ?template= lui-même si vous voulez en intégrer un ailleurs. Le plan gratuit de Railyard couvre un serveur plus un serveur de base de données et 3 applications, sans carte requise; le plan Pro est à 19 $/mois par équipe, le plan Team à 49 $/mois par équipe pour les installations plus grandes.
Dépannage
Caddy n’obtient jamais de certificat, ou le navigateur affiche un avertissement de certificat. C’est presque toujours une question de DNS, pas de Caddy. Lancez dig watch.votredomaine.com +short depuis votre propre machine et confirmez que ça retourne bien l’IP du serveur, pas une ancienne IP, et pas rien du tout. Let’s Encrypt a aussi besoin que le port 80 soit accessible depuis Internet pour la validation initiale, alors vérifiez que le pare-feu ou le groupe de sécurité de votre fournisseur autorise bien les connexions entrantes sur 80 et 443, pas seulement 443.
docker compose up échoue avec « port is already allocated ». Quelque chose d’autre sur la machine est déjà lié au port 80 ou 443, souvent une installation par défaut de Nginx ou Apache. Trouvez-le avec sudo ss -tlnp | grep -E ':80|:443' et arrêtez ce service, ou changez les ports publiés par Caddy si vous avez vraiment besoin des deux en même temps.
Une surveillance affiche un contenu périmé ou vide sur une page que vous savez avoir changé. Si la page ne rend son vrai contenu que via JavaScript, une requête de base ne voit que la coquille vide que le navigateur remplirait normalement. Cette configuration n’inclut pas le composant de navigateur sans interface que changedetection.io utilise pour les pages fortement dépendantes de JavaScript; consultez la documentation du projet pour l’ajouter comme conteneur séparé si une surveillance précise en a besoin.
Une surveillance signale sans cesse un changement sur une page qui, à vos yeux, semble identique. Quelque chose sur la page change à chaque chargement même quand le contenu qui vous intéresse n’a pas bougé : un horodatage, une publicité rotative, un jeton de session intégré dans le balisage. Réduisez la surveillance à un élément précis avec le sélecteur visuel, ou ajoutez un filtre qui retire la partie bruyante, plutôt que de comparer la page entière.
Foire aux questions
Est-ce que ça exige une base de données? Non. Le seul volume /datastore contient ensemble la configuration des surveillances, l’historique et les captures; il n’y a pas de service de base de données séparé dans cette configuration.
Peut-il surveiller des pages qui exigent une connexion? changedetection.io permet de fournir des cookies ou des données de session de navigateur pour des surveillances derrière un mur de connexion; consultez sa propre documentation pour la façon actuelle de configurer ça, puisque ça dépend du site précis et de la façon dont sa session fonctionne.
Comment ça m’avertit quand quelque chose change? changedetection.io offre toute une gamme d’intégrations de notification, courriel, Slack, Discord, webhooks génériques et plus, configurables par surveillance ou globalement. Consultez sa propre documentation pour la liste actuelle et la configuration de chacune.
Combien ça coûte réellement, au final? Le serveur coûte 6 $/mois. changedetection.io lui-même est un logiciel open source gratuit, sans frais par surveillance ni par vérification.
Le gabarit de Railyard a-t-il la même architecture que cette configuration manuelle? Oui. Un seul conteneur, le même volume /datastore persistant, le HTTPS devant, aucun module additionnel. Railyard le construit à partir du Dockerfile propre au projet plutôt qu’à partir d’une image préconstruite, mais ce qui tourne réellement est la même chose que ce que vous obtiendriez en suivant les étapes ci-dessus.
Les deux chemins mènent au même résultat : une page qu’il fallait autrefois penser à revisiter se surveille maintenant elle-même, et vous prévient dès qu’elle a quelque chose qui vaut la peine d’être regardé.
Pourquoi les gens choisissent Railyard pour ça
- Votre propre compte infonuagique. Déployez sur DigitalOcean, Hetzner, Vultr, AWS, OVHcloud, ou n'importe quel serveur Linux par SSH, facturé directement par votre fournisseur, sans majoration.
- Un prix fixe par équipe. L'offre gratuite est gratuite pour toujours : un serveur plus un serveur de base de données, trois applications, sans carte. Pro coûte 19 $ par mois pour jusqu'à cinq serveurs et un nombre illimité d'applications. Team coûte 49 $ par mois avec des serveurs illimités. Aucuns frais par application, par déploiement, par siège ou par gigaoctet.
- Des gabarits en un clic. Déployez des applications open source, comme des bases de données, des outils d'analyse et des outils de développement, sur votre propre serveur en un clic.
- Des bases de données gérées. Postgres, MySQL et Redis, avec des sauvegardes planifiées, vérifiées par restauration, et la récupération à un point dans le temps.
- Déploiement par push. Déployez depuis GitHub, GitLab ou la CLI, avec HTTPS automatique et des mises en production sans interruption.