← Blog

changedetection.io selbst hosten, um Webseiten zu beobachten

Railyard

28. Juli 2026 · 7 Min. Lesezeit

Folge dem auf deinem eigenen Server. Kostenlos starten, keine Karte nötig

Die meisten Webseiten, die sich zu beobachten lohnen, haben keinen Feed, keine API, keine Möglichkeit zu fragen “hat sich das geändert”, außer sie selbst zu laden und zu vergleichen. changedetection.io beobachtet jede Seite, oder ein bestimmtes Element darauf, das du visuell auswählst, und sagt dir, wenn sie sich ändert: eine Preissenkung, etwas wieder auf Lager, eine aktualisierte Behördenseite, die Preisseite eines Konkurrenten, die sich bewegt. Die Alternative ist, für ein Change-Monitoring-SaaS-Tool zu bezahlen oder ein eigenes Scraper-und-Cron-Skript zu schreiben, das beim ersten Markup-Wechsel der Seite bricht. Am Ende dieser Anleitung läuft deine eigene changedetection.io-Instanz auf einem 6-€/Monat-Server, über HTTPS auf deiner eigenen Domain erreichbar, mit gesicherter History und einem Upgrade-Pfad, der deine Watches nicht verliert.

Was du brauchst

  • Einen Server. DigitalOceans Basic Droplet für 6,00 $/Monat liefert 1 vCPU, 1 GB RAM und 25 GB SSD, mehr als genug für diese Single-Container-App plus einen Reverse-Proxy. Jeder Ubuntu-24.04-VPS eines anderen Anbieters funktioniert genauso.
  • Einen Domainnamen (oder eine Subdomain einer, die du schon besitzt), mit Zugriff auf die DNS-Einstellungen.
  • Docker und das Docker-Compose-Plugin auf dem Server installiert (behandelt in Schritt 2).
  • Ein Terminal und SSH-Zugang zum Server.

Schritt 1: Den Server anlegen und eine Domain darauf zeigen lassen

Starte einen Ubuntu-24.04-Droplet auf DigitalOceans 6-$/Monat-Basic-Plan (1 vCPU, 1 GB RAM, 25 GB SSD). Notiere seine öffentliche IP-Adresse.

Füge in den DNS-Einstellungen deiner Domain einen A-Record hinzu, der eine Subdomain, zum Beispiel watch.yourdomain.com, auf diese IP zeigen lässt:

Type: A
Name: watch
Value: <your server's IP>
TTL: 300

Die DNS-Propagierung kann wenige Minuten bis einige Stunden dauern. dig watch.yourdomain.com +short sollte die IP deines Servers zurückgeben, bevor du weitermachst, da die nächsten Schritte davon abhängen.

Schritt 2: Docker installieren

Verbinde dich per SSH mit dem Server und installiere Docker Engine plus das Compose-Plugin:

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

Melde dich ab und wieder an, damit die Gruppenänderung wirksam wird, und prüfe, dass beide Teile vorhanden sind:

docker --version
docker compose version

Du solltest eine Docker-Version und eine Compose-Version ausgegeben sehen, ohne “command not found”-Fehler.

Schritt 3: Das Projektverzeichnis anlegen

Lege ein Verzeichnis für den Stack an:

mkdir -p ~/changedetection && cd ~/changedetection

Das ist an dieser Stelle tatsächlich schon alles an Secrets. changedetection.io braucht keinen Account, keinen API-Key und kein Datenbank-Passwort, um Seiten zu beobachten. Wenn du ein Login-Passwort hinzufügen möchtest, damit die Instanz nicht für jeden offen ist, der die URL findet, ist das eine Einstellung in der App selbst, auf ihrer Settings-Seite, sobald sie läuft, nicht etwas, das du vorab konfigurierst. Lohnt sich, wenn dieser Server für mehr als nur dich erreichbar ist; überspringbar, wenn nicht.

Schritt 4: Die Docker-Compose-Datei schreiben

changedetection.io hält alles, seine Watch-Konfiguration, Seiten-History und Snapshots, auf der Festplatte in einem einzigen Volume, daher gibt es keinen separaten Datenbankdienst zu betreiben. Lege docker-compose.yml an:

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:

Ein paar Entscheidungen, die eine Erklärung wert sind:

  • Das Image ist auf 0.60.9 gepinnt statt auf latest zu laufen. Du entscheidest, wann du zu einem neueren Release wechselst, behandelt in Schritt 7.
  • Nur Caddy veröffentlicht Ports zum Host. changedetection.io selbst ist nicht direkt ins Internet exponiert, sondern nur im internen Docker-Netzwerk erreichbar, auf seinem Standardport 5000.

Bevor du irgendetwas startest, validiere, dass die Datei parst:

docker compose -f docker-compose.yml config

Ein saubener Lauf gibt die vollständig aufgelöste Konfiguration ohne Fehler zurück.

Schritt 5: Die Caddyfile schreiben und alles starten

Caddy kümmert sich automatisch um das TLS-Zertifikat von Let’s Encrypt, solange DNS schon auf den Server zeigt und die Ports 80 und 443 aus dem Internet erreichbar sind. Lege Caddyfile im selben Verzeichnis an:

watch.yourdomain.com {
	reverse_proxy changedetection:5000
}

Validiere sie vor dem Start:

docker run --rm -v $(pwd)/Caddyfile:/etc/caddy/Caddyfile caddy:2 caddy validate --config /etc/caddy/Caddyfile

Ein saubener Lauf meldet die Konfiguration als gültig. Starte dann den Stack:

docker compose up -d

Beobachte, wie er hochkommt, und prüfe, dass Caddy tatsächlich ein Zertifikat bekommen hat:

docker compose logs -f caddy

Du solltest eine Zeile sehen, die ein erhaltenes Zertifikat für deine Domain erwähnt.

Schritt 6: Deinen ersten Watch hinzufügen

Öffne https://watch.yourdomain.com. Es gibt keinen Account-Erstellungsschritt, kein Anmeldeformular: Der erste Bildschirm lässt dich eine URL einfügen und sie direkt als Watch hinzufügen. Füge eine Seite hinzu, die du wirklich verfolgen willst, schränke sie optional mit dem visuellen Selector auf ein Element ein, falls die Seite viel Rauschen rund um den Teil hat, der dich interessiert, und speichere.

Wenn diese Instanz für mehr als nur dich erreichbar ist, geh in der App zu Settings und setze ein Login-Passwort. Es ist optional, nicht zwingend zum Starten, aber lohnt sich in dem Moment, in dem die URL nicht mehr nur dir gehört.

Ein paar Einstellungen, die man von Anfang an kennen sollte, ohne sie jetzt schon anfassen zu müssen: LOGGER_LEVEL steuert, wie geschwätzig die Logs des Containers selbst sind (TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL, standardmäßig DEBUG), und das Beobachten von Seiten, die ihren echten Inhalt nur per JavaScript rendern, braucht eine zusätzliche Headless-Browser-Komponente, die das Projekt sockpuppetbrowser nennt, einen separaten Container, der außerhalb des Umfangs dieses Basis-Setups liegt. Die eigene Dokumentation des Projekts behandelt das Hinzufügen, falls du es später brauchst.

Schritt 7: Deine Watches und History sichern

Das eine benannte Volume, changedetection-data, hält alles: jeden konfigurierten Watch, seine volle History und jeden gespeicherten Snapshot. Sichere es genauso wie jedes andere Docker-Volume, mit einem Tarball, der vom Server fernbleibt:

docker run --rm -v changedetection_changedetection-data:/data -v $(pwd):/backup alpine \
  tar czf /backup/changedetection-backup-$(date +%F).tar.gz -C /data .

Pack das in einen Cron-Job und kopiere das Ergebnis irgendwohin außerhalb dieses Servers, einen Object-Storage-Bucket, eine andere Maschine, irgendwohin, das nicht dieser Droplet ist. Ein Backup, das nur auf dem Server liegt, den es sichert, überlebt nicht den Ausfallmodus, der einen Server tatsächlich zerstört.

Schritt 8: Upgraden, ohne deine Watches zu verlieren

Prüfe die aktuell laufende Version, und erhöhe dann den gepinnten Tag in docker-compose.yml:

image: dgtlmoon/changedetection.io:<new-version>

Ziehe nur diesen Dienst und starte ihn neu:

docker compose pull changedetection
docker compose up -d changedetection

Prüfe die Logs auf einen sauberen Start:

docker compose logs changedetection

Bestätige dann, dass deine bestehenden Watches und ihre History noch da sind, wenn du die App öffnest. Sieht etwas falsch aus, ist dein Backup aus Schritt 7 der Weg zurück.

Die Abkürzung: mit Railyard

Alles oben, ein persistentes /datastore-Volume und bereits verdrahtetes HTTPS, ist auch eine Vorlage mit einem Klick:

https://app.railyard.run/deploy?template=changedetection

Railyard baut diese aus dem eigenen Dockerfile des Projekts in dessen GitHub-Repository, derselbe Ansatz wie das manuelle Setup oben, nur automatisiert, statt ein fertig gebautes Image zu ziehen. Keine Addons: keine Datenbank, kein zusätzlicher Dienst, da changedetection.io auch für dieses Basis-Setup keinen braucht.

Wenn du eher allgemein mit Railyard starten willst, bevor du dich speziell für changedetection.io entscheidest, behandelt der Quickstart die Grundlagen, und Datenbanken und Backups erklärt, wie Backups über alle Vorlagen hinweg funktionieren, nicht nur diese. Deploy-Button behandelt das ?template=-Link-Format selbst, falls du einen anderswo einbetten willst. Railyards Free-Plan deckt einen Server plus einen Datenbankserver und 3 Apps ohne Kartenangabe ab; Pro kostet 19 $/Monat pro Team, Team 49 $/Monat pro Team für größere Setups.

Troubleshooting

Caddy bekommt nie ein Zertifikat, oder der Browser zeigt eine Zertifikatswarnung. Das ist fast immer DNS, nicht Caddy. Führe dig watch.yourdomain.com +short von deiner eigenen Maschine aus und bestätige, dass es die IP des Servers zurückgibt, nicht eine alte, und nicht nichts. Let’s Encrypt braucht für die initiale Validierung auch Port 80 aus dem Internet erreichbar, prüfe also, ob die Firewall oder Security Group deines Cloud-Anbieters eingehend 80 und 443 erlaubt, nicht nur 443.

docker compose up schlägt mit “port is already allocated” fehl. Etwas anderes auf der Box ist schon an 80 oder 443 gebunden, häufig eine Standard-Nginx- oder Apache-Installation. Finde es mit sudo ss -tlnp | grep -E ':80|:443' und stoppe diesen Dienst, oder ändere, welche Ports Caddy veröffentlicht, falls du wirklich beide brauchst.

Ein Watch zeigt veralteten oder leeren Inhalt auf einer Seite, die sich nachweislich geändert hat. Wenn die Seite ihren echten Inhalt nur per JavaScript rendert, sieht ein einfacher Fetch nur die leere Hülle, die der Browser normalerweise füllen würde. Dieses Setup enthält nicht die Headless-Browser-Komponente, die changedetection.io für JavaScript-schwere Seiten nutzt; schau in die eigene Dokumentation des Projekts, um das als separaten Container hinzuzufügen, falls ein bestimmter Watch das braucht.

Ein Watch meldet ständig eine Änderung auf einer Seite, die für dich identisch aussieht. Irgendetwas auf der Seite ändert sich bei jedem Laden, auch wenn der Inhalt, der dich interessiert, gleich bleibt, ein Zeitstempel, eine rotierende Werbung, ein Session-Token im Markup. Schränke den Watch mit dem visuellen Selector auf ein bestimmtes Element ein, oder füge einen Filter hinzu, der den störenden Teil entfernt, statt die ganze Seite zu diffen.

FAQ

Braucht das eine Datenbank? Nein. Das eine /datastore-Volume hält Watch-Konfiguration, History und Snapshots zusammen; in diesem Setup gibt es keinen separaten Datenbankdienst.

Kann es Seiten beobachten, die ein Login erfordern? changedetection.io unterstützt das Übergeben von Cookies oder Browser-Session-Daten für Watches hinter einer Login-Sperre; schau in die eigene Dokumentation für den aktuellen Weg, das zu konfigurieren, da es von der jeweiligen Seite und deren Session-Funktionsweise abhängt.

Wie benachrichtigt es mich, wenn sich etwas ändert? changedetection.io liefert eine Reihe von Benachrichtigungs-Integrationen, E-Mail, Slack, Discord, generische Webhooks und mehr, konfiguriert pro Watch oder global. Schau in die eigene Dokumentation für die aktuelle Liste und das Setup für jede.

Was kostet der Betrieb? Der Server kostet 6 €/Monat. changedetection.io selbst ist freie, Open-Source-Software ohne Gebühr pro Watch oder Check.

Ist Railyards Vorlage dieselbe Architektur wie dieses manuelle Setup? Ja. Ein Container, dasselbe persistente /datastore-Volume, HTTPS davor, keine Addons. Railyard baut es aus dem eigenen Dockerfile des Projekts statt aus einem fertig gebauten Image, aber was tatsächlich läuft, ist genau das, was du bekommst, wenn du den Schritten oben folgst.

Beide Wege führen zum selben Ergebnis: eine Seite, die du früher selbst im Blick halten musstest, kontrolliert sich jetzt selbst und sagt dir in dem Moment Bescheid, in dem es etwas Sehenswertes gibt.

Warum Leute sich dafür Railyard entscheiden

  • Dein eigenes Cloud-Konto. Deploye auf DigitalOcean, Hetzner, Vultr, AWS, OVHcloud oder jedem Linux-Server per SSH, direkt von deinem Anbieter abgerechnet, ohne Aufschlag.
  • Ein fester Preis pro Team. Free ist für immer kostenlos: ein Server plus ein Datenbankserver, drei Apps, keine Karte. Pro kostet 19 $ im Monat für bis zu fünf Server und unbegrenzte Apps. Team kostet 49 $ im Monat mit unbegrenzten Servern. Keine Kosten pro App, pro Deployment, pro Sitz oder pro Gigabyte.
  • Templates mit einem Klick. Deploye Open-Source-Apps, wie Datenbanken, Analytics und Dev-Tools, mit einem Klick auf deinem eigenen Server.
  • Verwaltete Datenbanken. Postgres, MySQL und Redis mit geplanten, wiederherstellungsgeprüften Backups und Point-in-Time-Recovery.
  • Push-to-Deploy. Deploye von GitHub, GitLab oder der CLI, mit automatischem HTTPS und Releases ohne Ausfallzeit.

Server-Setup überspringen

Starte die verifizierte changedetection.io-Vorlage auf Railyard mit einem Klick und bekomme eine laufende Instanz mit bereits verdrahtetem HTTPS.

Kostenloser Plan, keine Kreditkarte, und 14 Tage Pro für jedes neue Team. Ein fester Preis pro Team.