Skip to main content
Run changedetection.io as a standalone Docker container. This is the simplest installation method for single-server deployments.

Quick Start

1

Pull the Docker image

Download the latest stable release:
docker pull ghcr.io/dgtlmoon/changedetection.io
Use :latest for the stable release or :dev for the bleeding edge master branch.
2

Run the container

Start changedetection.io with basic configuration:
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io
3

Access the web interface

Open your browser and navigate to:
http://127.0.0.1:5000

Port Configuration

The default port is 5000. You can customize the port mapping:
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io
Mac users should avoid port 5000 as it conflicts with Airplay services. Use port 5050 instead.

Volume Configuration

Your data is stored in the /datastore directory. Choose between a named volume or bind mount:
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io

Environment Variables

Customize your installation with environment variables:
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  -e PORT=5000 \
  -e LOGGER_LEVEL=INFO \
  -e BASE_URL=https://example.com \
  -e FETCH_WORKERS=10 \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io

Common Environment Variables

VariableDefaultDescription
PORT5000Web interface listening port
LOGGER_LEVELDEBUGLog level: TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL
BASE_URL-Base URL for notifications
FETCH_WORKERS10Number of parallel fetchers
MINIMUM_SECONDS_RECHECK_TIME3Minimum recheck interval in seconds
TZ-Timezone (e.g., America/Los_Angeles)
DISABLE_VERSION_CHECKfalseDisable telemetry

Proxy Configuration

docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  -e HTTP_PROXY=socks5h://10.10.1.10:1080 \
  -e HTTPS_PROXY=socks5h://10.10.1.10:1080 \
  -e NO_PROXY="localhost,192.168.0.0/24" \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io

SSL/HTTPS Configuration

To enable HTTPS, mount certificate files:
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  -v ./cert.pem:/app/cert.pem \
  -v ./privkey.pem:/app/privkey.pem \
  -e SSL_CERT_FILE=cert.pem \
  -e SSL_PRIVKEY_FILE=privkey.pem \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io

Plugin Installation

Install additional Python packages using the EXTRA_PACKAGES variable:
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  -e EXTRA_PACKAGES="changedetection.io-osint-processor another-plugin" \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io
Packages are installed on first run and cached. See plugins documentation for available plugins.

Updating

1

Pull the latest image

docker pull ghcr.io/dgtlmoon/changedetection.io
2

Stop and remove the old container

docker kill $(docker ps -a -f name=changedetection.io -q)
docker rm $(docker ps -a -f name=changedetection.io -q)
3

Start the new container

docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io
Your data persists in the volume, so no data is lost during updates.

Alternative Image Registry

You can also pull from Docker Hub:
docker pull dgtlmoon/changedetection.io
docker run -d --restart always \
  -p "127.0.0.1:5000:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  dgtlmoon/changedetection.io

Troubleshooting

Container won’t start

Check the logs:
docker logs changedetection.io

Permission issues with bind mounts

Ensure the host directory has correct permissions:
sudo chown -R 1000:1000 /path/on/host

Port already in use

Either stop the conflicting service or use a different port:
docker run -d --restart always \
  -p "127.0.0.1:8080:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io

Can’t access from other machines

Change the binding from 127.0.0.1 to 0.0.0.0 or your server’s IP:
docker run -d --restart always \
  -p "0.0.0.0:5000:5000" \
  -v datastore-volume:/datastore \
  --name changedetection.io \
  ghcr.io/dgtlmoon/changedetection.io
Binding to 0.0.0.0 exposes the service to all network interfaces. Use a reverse proxy with authentication for production deployments.

Next Steps

Docker Compose

Set up with browser automation support

Configuration

Configure advanced features

Build docs developers (and LLMs) love