Run changedetection.io as a standalone Docker container. This is the simplest installation method for single-server deployments.
Quick Start
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.
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
Access the web interface
Open your browser and navigate to:
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
| Variable | Default | Description |
|---|
PORT | 5000 | Web interface listening port |
LOGGER_LEVEL | DEBUG | Log level: TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL |
BASE_URL | - | Base URL for notifications |
FETCH_WORKERS | 10 | Number of parallel fetchers |
MINIMUM_SECONDS_RECHECK_TIME | 3 | Minimum recheck interval in seconds |
TZ | - | Timezone (e.g., America/Los_Angeles) |
DISABLE_VERSION_CHECK | false | Disable 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
Updating
Pull the latest image
docker pull ghcr.io/dgtlmoon/changedetection.io
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)
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