Halloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan NowHalloween DealsAmazon USOctober picks are moving - compare before checkoutAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk12 min

How to Self-Host changedetection.io on a VPS (Docker, HTTPS, JavaScript Pages, and Backups)

A practical VPS guide to running changedetection.io with Docker: persistent watches, localhost binding, Nginx HTTPS, JavaScript rendering, notifications, tuning and safe upgrades.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The shortest supported VPS deployment for changedetection.io is a Docker container with a persistent /datastore volume, bound to localhost and published through a TLS-terminating reverse proxy. Start with the HTTP-only container, then add the project’s Playwright/browser service only for pages that need JavaScript rendering or browser actions. This layout keeps watches and history across container updates while avoiding direct exposure of the application port.

What you are building

changedetection.io is a self-hosted website-change monitoring service. A watch stores a URL, the fetching method, comparison rules, schedule, and notification destinations. The application fetches the page at the interval you choose, compares the new result with the previous state, and sends an alert when the selected content changes.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

On a VPS, the practical architecture has four parts:

  • Docker Engine and Compose support: the runtime that starts and restarts the service.
  • changedetection.io: the main web application and HTTP fetcher.
  • A persistent datastore: the mounted /datastore directory containing watches, snapshots, and application state.
  • A reverse proxy: Nginx, Caddy, Traefik, or an equivalent proxy that accepts public HTTPS traffic and forwards it to 127.0.0.1:5000.

JavaScript-heavy targets add a fifth part: the Playwright/browser-fetcher service documented by the project. Keep that service optional. It consumes more CPU and memory than ordinary HTTP fetching and increases the number of containers you must operate.

#1 Best Overall
Layla Noise Monitoring Device for Airbnb, Rental, Office & Home | Noise & Occupancy Sensor with Radar-Based Motion Detection | Privacy-Safe Security Monitor | No Subscription
  • REAL-TIME NOISE MONITORING DEVICE FOR AIRBNB & SHORT-TERM RENTALS: Privacy-safe decibel meter tracks sound 24/7 and sends instant alerts when noise crosses your threshold. Enforce quiet hours, stop parties, and avoid neighbor complaints and fines.
  • AI OCCUPANCY SENSOR & PARTY DETECTOR WITH RADAR MOTION DETECTION: 3rd-gen radar estimates head count and flags unusual activity, so you catch overcrowding early. Get intruder and motion alerts plus guest-counting and room-usage insights.
  • SMART DASHBOARD WITH DATA HISTORY & REMOTE ACCESS: Layla tracks room temperature and logs noise and occupancy trends over time. Review historical reports, spot peak-hour disturbances, enforce quiet hours, and manage properties remotely from one app.
  • PRIVACY-FIRST DESIGN, NO CAMERAS OR AUDIO RECORDING: Layla measures decibel levels only and never captures conversations or personal data, keeping you compliant with Airbnb, VRBO, and local rules. Privacy Shield mode disables motion on demand.
  • NO SUBSCRIPTION, NO HIDDEN FEES, PAY ONCE AND OWN YOUR DATA: Every feature unlocked forever, including AI insights, unlimited history, real-time alerts, and quiet-hours automation. Easy setup, works with Alexa & Google Home.

Choose HTTP-only or browser-enabled deployment

Begin with the smallest architecture that can fetch your targets. Many pages expose the data in their initial HTML and work with the standard HTTP fetcher. Enable a browser only when the page is assembled client-side, requires a login flow, needs clicking or scrolling, or otherwise cannot be evaluated correctly by a normal HTTP request.

Deployment Containers JavaScript rendering Screenshots and browser steps Resource and operational cost
HTTP-only One changedetection.io container Limited to content available from ordinary HTTP fetching Basic page comparison; no browser automation service Lowest CPU/RAM demand and simplest upgrades
Browser-enabled changedetection.io plus the project’s Playwright/browser service Yes, for watches configured to use the browser fetcher Supports browser-based rendering and documented browser actions Higher CPU/RAM demand, more moving parts, and additional logs to monitor

There is no authoritative minimum VPS size or universal watch-count guarantee published in the project’s canonical material. Actual demand depends on page weight, fetch frequency, browser usage, screenshots, and concurrent work. Treat any resource estimate as a test result for your workload, not a promise.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Prepare the VPS

Use a current Linux installation

Provision a current Linux VPS with a public hostname you control. The project’s deployment documentation assumes Docker or Python; it does not prescribe one distribution’s package commands. Install Docker Engine and Docker Compose support by following the official instructions for your VPS distribution, then confirm both commands work:

docker --version
docker compose version

If your distribution still provides the older standalone docker-compose command, use the syntax available on that system. The examples below use the current Docker Compose plugin form, docker compose.

Create a dedicated application directory

Keep the Compose file and operational notes in a directory that is easy to back up. For example:

sudo mkdir -p /opt/changedetection
sudo chown "$USER":"$USER" /opt/changedetection
cd /opt/changedetection

A named Docker volume is sufficient for the datastore. A host bind mount is also valid if you prefer to see the files directly. Whichever method you choose, back up the datastore before upgrades or migrations.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Point DNS at the VPS

Create an A or AAAA record for the public hostname you will use. Allow DNS to propagate before requesting a certificate. Keep the application itself private; the public listener should be the reverse proxy, not Docker’s port 5000 binding.

Rank #2
Sale
Norton 360 Deluxe 2027 Antivirus, 3 Devices, Auto-Renews [Download]
  • ONGOING PROTECTION Download instantly & install protection for 3 PCs, Macs, iOS or Android devices in minutes!
  • TOP-PERFORMING VPN Faster speeds, more server locations, and greater connection control to protect your privacy across all your devices, including Smart TVs.
  • ADVANCED SCAM PROTECTION Help spot hidden scams online. With the built-in Genie AI assistant, you’ll never wonder if a message or email is suspicious again.
  • REAL-TIME PROTECTION Advanced security protects against existing and emerging malware threats, including ransomware and viruses, and it won’t slow down your device performance.
  • DARK WEB MONITORING Identity thieves can buy or sell your information on websites and forums. We search the dark web and notify you should your information be found.

Install the official container

Standalone Docker command

The project documents this standalone invocation:

docker run -d --restart always 
  -p "127.0.0.1:5000:5000" 
  -v datastore-volume:/datastore 
  --name changedetection.io 
  dgtlmoon/changedetection.io

The 127.0.0.1:5000:5000 mapping is intentional. Docker publishes the container’s port 5000 only on the VPS loopback interface, so scanners on the internet cannot connect directly. The named volume mounted at /datastore is equally important: removing and recreating the container does not remove that volume, so watches and their state remain available.

Verify the container

docker ps
docker logs --tail=100 changedetection.io
curl -I http://127.0.0.1:5000/

You should see the container in a running state and an HTTP response from the local curl request. A redirect or an application-specific status is acceptable; a connection refusal means the container is not listening or has exited. Check the logs before changing configuration.

Use Docker Compose for repeatable upgrades

Compose makes restart policy, volumes, environment variables, and additional services explicit. A minimal HTTP-only file is:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
services:
  changedetection:
    image: dgtlmoon/changedetection.io
    container_name: changedetection.io
    restart: always
    ports:
      - "127.0.0.1:5000:5000"
    volumes:
      - datastore-volume:/datastore

volumes:
  datastore-volume:

Save it as /opt/changedetection/compose.yml, then start it:

cd /opt/changedetection
docker compose up -d
docker compose ps

Pin an image tag when your change-control process requires repeatable deployments; otherwise, record which image you deployed before each update. The project’s official Compose configuration is the authority for browser-service image names, variables, and dependency wiring. Copy that browser block rather than guessing at an image or endpoint, and keep the changedetection service on the same internal Compose network.

Update without losing watches

  1. Back up the datastore (instructions below).
  2. Pull the image used by your Compose file: docker compose pull.
  3. Recreate the service: docker compose up -d.
  4. Watch startup output with docker compose logs -f changedetection.
  5. Open the public URL and confirm a known watch, its history, and notification settings are present.

Do not run docker compose down -v during a routine update. The -v option removes named volumes and can erase the datastore.

Put Nginx or another reverse proxy in front

Terminate public TLS at a reverse proxy and forward requests to the loopback listener. This keeps certificate handling, HTTP-to-HTTPS redirects, and security headers outside the application container.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
McAfee Total Protection 2027 Antivirus Software for 3 Devices | Auto-Renews
  • THREAT DETECTION – Stay one step ahead. Suspicious links, risky sites, viruses, and scams, caught automatically before they reach you.
  • PERSONAL INFO PROTECTION – Keep your personal info safer. Identity monitoring watches for your exposed info and tells you what to do about it.
  • SECURE CONNECTIONS – Just a few easy clicks, and we'll automatically protect your info on public Wi‑Fi, every time you connect.
  • GUIDED ACTION – Know what matters and what to do next. Clear alerts and simple guidance make it easy to take action.
  • MORE THAN ANTIVIRUS – Scam protection, identity monitoring, VPN, web protection, and antivirus work together to protect you, all in one place.

Nginx proxy layout

Inside the HTTPS server block for your hostname, proxy to the local service:

server {
    listen 443 ssl;
    server_name monitor.example.com;

    # Configure ssl_certificate and ssl_certificate_key here.

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
    }
}

server {
    listen 80;
    server_name monitor.example.com;
    return 301 https://$host$request_uri;
}

Use your proxy’s normal certificate issuance and renewal procedure. The exact directives differ between Nginx, Caddy, Traefik, and other proxies, but the requirement is the same: the proxy must preserve the original host, protocol, and client-forwarding headers.

Set the public URL and forwarded-header handling

When notification messages contain links back to changedetection.io, set BASE_URL to the public HTTPS URL. Set USE_X_SETTINGS=1 so the application honors forwarded host, prefix, and protocol headers from the proxy. In Compose, add these under the changedetection service:

environment:
  BASE_URL: https://monitor.example.com
  USE_X_SETTINGS: "1"

Replace the hostname with the URL users actually open. If you serve the application under a path prefix rather than its own hostname, make sure the proxy forwards that prefix and configure it exactly as described in the project’s deployment documentation; an incorrect prefix produces broken links and redirects.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Test the proxy before sharing the URL

  • Open the HTTPS URL from a separate network, not only from the VPS itself.
  • Confirm the browser shows a valid certificate and no mixed-content warnings.
  • Check that a generated notification link uses the public HTTPS hostname rather than 127.0.0.1.
  • Review proxy and container logs for repeated 4xx, 5xx, or redirect loops.

Add JavaScript rendering only when a watch needs it

Ordinary HTTP fetching cannot see content that appears only after JavaScript executes in a browser. For those targets, add the Playwright/browser service from the project’s official Compose configuration and configure the changedetection container to use the documented browser endpoint. The official configuration also defines the service dependency so the application starts in the correct order.

Do not expose the browser service on a public interface. It should be reachable only over the private Compose network. Keep the application’s public port bound to localhost and let the reverse proxy remain the sole internet-facing entry point.

When to switch a watch to a browser

  • The initial HTML is an empty shell and the data appears after page scripts run.
  • The target requires clicking a tab, expanding a section, scrolling, or completing a browser step.
  • A screenshot or rendered visual state is the meaningful change you need to track.
  • HTTP mode returns a login page or a challenge while a permitted browser session can load the content.

Use browser mode selectively. Each browser page can consume substantially more memory than an HTTP request, and many concurrent browser watches can exhaust a small VPS. Start with one difficult watch, observe CPU and memory, then increase concurrency gradually.

Rank #4
Sale
Norton 360 Deluxe 2027 Antivirus, 5 Devices, Auto-Renews [Download]
  • ONGOING PROTECTION Download instantly & install protection for 5 PCs, Macs, iOS or Android devices in minutes!
  • TOP-PERFORMING VPN Faster speeds, more server locations, and greater connection control to protect your privacy across all your devices, including Smart TVs.
  • ADVANCED SCAM PROTECTION Help spot hidden scams online. With the built-in Genie AI assistant, you’ll never wonder if a message or email is suspicious again.
  • REAL-TIME PROTECTION Advanced security protects against existing and emerging malware threats, including ransomware and viruses, and it won’t slow down your device performance.
  • DARK WEB MONITORING Identity thieves can buy or sell your information on websites and forums. We search the dark web and notify you should your information be found.

Create and configure your first watch

  1. Sign in to the web interface through the HTTPS hostname.
  2. Choose Add a new watch and enter the complete target URL.
  3. Select the fetch method appropriate to the page. Leave simple pages on ordinary HTTP fetching; choose the browser/Playwright method only when rendering or browser interaction is required.
  4. Choose a selector, filter, or extraction rule that isolates the content that matters. Watching a stable price, availability element, or article region produces fewer false positives than comparing an entire page containing rotating timestamps or advertisements.
  5. Set a polling interval that respects the site and your VPS. The minimum interval is constrained by MINIMUM_SECONDS_RECHECK_TIME; do not schedule aggressive checks merely because the interface permits frequent polling.
  6. Save the watch, run an initial check, and inspect the recorded result before enabling notifications.

If the first result contains a cookie banner, random token, clock, or other changing decoration, refine the selector or filter before treating every check as a meaningful change.

Configure notifications

Notifications are set per watch. In the watch’s edit interface, add one or more notification URLs using the Apprise URL syntax supported by the project. The project’s installation documentation summarizes the workflow as setting one or more notification URLs in the watch’s edit tab.

For automation, API v1 exposes notification endpoints that also use Apprise notification syntax. Keep notification credentials out of shell history and public Compose files; use a protected environment file or a secrets mechanism supported by your deployment process.

Validate delivery

  • Save the notification URL on a low-risk test watch.
  • Trigger a known change or use the interface’s test facility if available.
  • Check the changedetection logs for connection, authentication, or formatting errors.
  • Verify that links in the message point to the configured BASE_URL.

Tune polling, limits, locale, and proxies

The official Compose configuration exposes several environment variables. The values below are documented defaults, not capacity guarantees or recommended settings for every VPS.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Variable Documented default or role What to consider
FETCH_WORKERS 10 workers by default More workers can process simultaneous checks faster but raise CPU, memory, and outbound-request pressure.
MINIMUM_SECONDS_RECHECK_TIME 3 seconds by default Sets the minimum recheck interval. Use a slower schedule where the target site or VPS workload requires it.
PAGE_WATCH_LIMIT 100 watches by default This is a configurable application default, not a published universal limit or performance promise.
TZ Timezone setting Choose the IANA timezone that makes schedules and timestamps understandable to your operators.
LC_ALL Locale setting Set a locale appropriate to the text normalization and display conventions you need.
SCREENSHOT_MAX_HEIGHT 16000 by default Large screenshots consume memory and storage. Lower the value if visual captures are oversized.
HTTP_PROXY, HTTPS_PROXY, NO_PROXY Optional outbound proxy controls Use these when requests must traverse a corporate or regional proxy; include internal hostnames in NO_PROXY as needed.

Set environment values in Compose, then apply them with docker compose up -d. Change one group of settings at a time and observe queue length, response times, container memory, and failed checks.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Back up the datastore and recover safely

The datastore is the part you must protect. It contains the watches and state that make monitoring useful. A container image can be downloaded again; an unbacked-up datastore cannot be reconstructed reliably.

Back up a named volume

Stop writes briefly for a consistent archive, then stream the volume to a compressed file:

cd /opt/changedetection
docker compose stop changedetection
docker run --rm 
  -v datastore-volume:/datastore:ro 
  -v "$PWD":/backup 
  alpine tar czf /backup/changedetection-datastore-$(date +%F).tar.gz -C / datastore
docker compose start changedetection

Replace datastore-volume with the actual volume name shown by docker volume ls. Copy the archive off the VPS and periodically test that it can be listed and extracted. If you use a host bind mount instead, stop the service and archive that directory with your normal backup tool.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Connected Caregiver Safety+ Gemini 4G Medical Alert System for Seniors: Advanced, Fall Detection, 24/7 Monitor, WiFi Locate, SOS Button, Small, Lightweight, (Call to Activate)
  • FIRST MONTH FREE + EASY ACTIVATION: Kickstart your Safety+ journey with a simple activation call before use. Get the first month's service absolutely free upon activation. Then, only $40/month all-inclusive subscription: 24/7 Monitoring, Fall Detection, GPS Location, Nationwide 4G Coverage, Mobile App, and access to Safety+'s exceptional features. FREE Activation, No hidden fees, 1st Month FREE. Subscription after the 1st free month subject to our Terms and Conditions
  • 24/7 NATIONWIDE EMERGENCY MONITORING: Our 4G mobile-enabled Safety+ Medical Alert provides constant security at home and on the go. Instantly connect to our US-based Emergency Monitoring Center by pressing the help button. Trained operators ensure swift assistance (less than 9 seconds average response time), sending help (if needed) to your exact location and notifying family. Caregivers, enjoy peace of mind and monitor activity via the app. Life alert system for seniors. Multi Language Support.
  • FALL DETECTION INCLUDED: The integrated fall detection feature enhances your safety. A potential detected fall sends an instant signal to our 24/7 emergency monitoring center. Monitoring Center then calls (avg response time under 9 seconds) the device to ask (via integrated speaker and microphone) if help is needed and dispatch if necessary. Ideal for seniors, individuals with mobility challenges, post-surgery recovery, or anyone 55 and above. Fall Detection is included.
  • CAREGIVER FEATURES VIA MOBILE APP: FREE Caregiver App keeps family (or others) informed about your safety. Our included mobile app boasts a comprehensive dashboard offering real-time insights into your location, morning activity, step count, and battery status. Activate push notifications for instant emergency alerts, ensuring family/caregivers stay informed and you stay safe. Create a Care Circle and Loved Ones and Caregivers can share information, tracking, and alerts.
  • MULTIPLE WAYS TO WEAR: Wear on the included lanyard around your neck or on the (sold separately)

Restore after a failed upgrade

  1. Stop the changedetection service.
  2. Preserve the current datastore by renaming or copying it; do not overwrite your only recovery point.
  3. Restore the archive into the mounted volume with ownership and permissions intact.
  4. Start the previously working image version and inspect the logs.
  5. Only after the watches load correctly should you retry the upgrade.

Secure the public service

  • Keep Docker’s application binding on 127.0.0.1; do not change it to 0.0.0.0 unless you have a specific, protected network design.
  • Allow only SSH and the reverse proxy’s HTTP/HTTPS ports through the VPS firewall. Restrict SSH by source where practical and use key authentication.
  • Use HTTPS for the public hostname and renew the certificate automatically.
  • Protect the changedetection interface with the authentication controls available in your deployed version and avoid sharing administrator credentials.
  • Keep Docker, the host operating system, the changedetection image, and the browser service updated on a planned schedule.
  • Review outbound proxy settings and notification URLs because they may contain credentials or permit access to internal destinations.
  • Monitor disk usage: snapshots and screenshots can grow the datastore even when CPU usage is low.

The project does not publish one universal hardened-VPS checklist. Apply the controls required by your threat model, organization, and hosting provider before making the hostname public.

Troubleshoot common failures

The page loads locally but not through HTTPS

Confirm the container is listening on 127.0.0.1:5000, the proxy points to that exact address, the firewall permits ports 80 and 443, and DNS resolves to the VPS. Check proxy error logs and docker compose logs changedetection for the first failing request.

Links redirect to localhost or the wrong scheme

Set BASE_URL to the public HTTPS URL and set USE_X_SETTINGS=1. Ensure the proxy sends Host and X-Forwarded-Proto headers. Recreate the container after changing environment variables.

Watches disappeared after an update

Inspect the volume mounted at /datastore. A new, empty volume or a changed mount path means the application is not using the original datastore. Restore the known volume or backup, and avoid docker compose down -v.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A JavaScript page is blank or incomplete

Verify that the browser service is running, that the changedetection container can reach its internal endpoint, and that the watch is configured for the browser fetcher. Review both service logs. If only one site fails, test its login, consent, navigation, and anti-bot requirements separately rather than increasing global concurrency.

Checks are delayed or the VPS is overloaded

Lower FETCH_WORKERS, lengthen watch intervals, reduce screenshot height, and disable browser mode for watches that do not need it. A high worker count is not automatically faster when CPU, memory, or the target site is saturated.

Notifications do not arrive

Recheck the Apprise URL syntax, credentials, and outbound DNS/connectivity. Trigger a test change, then inspect application logs. If the message contains a broken link, correct BASE_URL and forwarded-header handling first.

Operational checklist

  • Docker Engine and Compose support installed from your Linux distribution’s official instructions.
  • changedetection.io bound to 127.0.0.1:5000, not publicly exposed.
  • /datastore mounted on a named volume or backed-up host directory.
  • Reverse proxy serving a valid certificate and forwarding host and protocol headers.
  • BASE_URL set to the public HTTPS address when notification links need it.
  • USE_X_SETTINGS=1 enabled behind a proxy that supplies forwarded headers.
  • Playwright/browser service added only for watches that require JavaScript or browser actions.
  • Polling intervals, worker count, watch limit, timezone, locale, screenshot height, and proxy variables reviewed for the workload.
  • At least one tested datastore backup stored away from the VPS.
  • Restart, update, rollback, firewall, certificate-renewal, and notification checks documented.

For most VPS users, the reliable path is therefore: deploy the official Docker image with persistent storage, keep it private behind a TLS reverse proxy, and add the documented browser service only when a real watch demonstrates that HTTP fetching is insufficient. That arrangement preserves monitoring state through container recreation while keeping resource use and operational complexity under control.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
PC Slower Than It Used to Be?Free scan - under a minute

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.