Install (Docker Compose)
ChannelWatch ships as a multi-arch Docker image and is designed to run as a single container managed by Docker Compose. This page covers everything you need to go from zero to a running instance.
Prerequisites
Section titled “Prerequisites”- Docker Engine 24+ and Docker Compose v2 (the
docker composeplugin, not the legacydocker-composebinary) - A running Channels DVR server reachable from the Docker host
- A local directory to store ChannelWatch configuration and logs (e.g.
/opt/channelwatch/config)
Supported architectures
Section titled “Supported architectures”The coderluii/channelwatch:latest image is a multi-platform manifest that automatically selects the right variant for your hardware:
| Architecture | Typical hardware |
|---|---|
linux/amd64 | Standard x86-64 servers, NAS devices, PCs |
linux/arm64 | Raspberry Pi 4/5, Apple Silicon (via Rosetta), modern ARM servers |
linux/arm/v7 | Older Raspberry Pi (32-bit OS), some NAS devices |
No flags or extra steps are needed. docker compose pull picks the correct image automatically.
Compose file
Section titled “Compose file”Create a docker-compose.yml in a directory of your choice:
name: ChannelWatchservices: channelwatch: image: coderluii/channelwatch:latest container_name: channelwatch init: true network_mode: host volumes: - /your/local/path:/config environment: TZ: "America/New_York" restart: unless-stoppedReplace /your/local/path with the absolute path to your config directory. The TZ value should match your local timezone (IANA format, e.g. America/Chicago, Europe/London).
Start the container
Section titled “Start the container”docker compose up -dThen open http://your-server-ip:8501 in a browser. The first-run wizard will guide you through adding your Channels DVR server.
View logs
Section titled “View logs”docker logs -f channelwatchHost vs bridge networking
Section titled “Host vs bridge networking”The default compose file uses network_mode: host, which lets ChannelWatch reach your Channels DVR server using localhost or any LAN IP without extra configuration. This is the simplest option for most home lab setups.
If you prefer bridge networking (for network isolation or port remapping), replace the network_mode line with explicit port mapping:
# Remove: network_mode: host ports: - "8501:8501"Volume mounts
Section titled “Volume mounts”ChannelWatch stores all persistent data under /config inside the container. The directory you mount there will contain:
| Path | Contents |
|---|---|
/config/settings.json | All configuration (DVR servers, alert toggles, notification providers) |
/config/channelwatch.db | SQLite activity history database |
/config/encryption.key | Auto-generated key for encrypting stored credentials (chmod 0600, do not delete) |
/config/logs/ | Application logs |
/config/backups/ | Automatic pre-migration backups |
/config/plugins/ | Optional notification provider plugins |
Optional environment variables
Section titled “Optional environment variables”Most settings live in the web UI. A small set of environment variables are available for automation or headless deployments:
environment: TZ: "America/New_York"
# User/group IDs (match your host user to avoid permission issues) # PUID: "1000" # PGID: "1000"
# Log verbosity: 0=minimal, 1=standard (default), 2=verbose # CW_LOG_LEVEL: "1"
# Notification providers (can also be set in the web UI) # CW_APPRISE_DISCORD: "webhook_id/token" # CW_APPRISE_PUSHOVER: "user_key@api_token" # CW_APPRISE_TELEGRAM: "bot_token/chat_id" # CW_APPRISE_SLACK: "token_a/token_b/token_c" # CW_APPRISE_GOTIFY: "hostname/token" # CW_APPRISE_EMAIL: "user:pass@smtp.example.com" # CW_APPRISE_EMAIL_TO: "recipient@example.com" # CW_APPRISE_MATRIX: "user:pass@hostname/#room" # CW_APPRISE_CUSTOM: "apprise://custom-url"
# Alert toggles (all enabled by default) # CW_ALERT_CHANNEL_WATCHING: "true" # CW_ALERT_VOD_WATCHING: "true" # CW_ALERT_DISK_SPACE: "true" # CW_ALERT_RECORDING_EVENTS: "true"
# Disk space thresholds # CW_DS_THRESHOLD_PERCENT: "10" # CW_DS_THRESHOLD_GB: "50" # CW_DS_ALERT_COOLDOWN: "3600"DNS configuration
Section titled “DNS configuration”If your Channels DVR server is reachable by a short hostname (e.g. media-server instead of a full IP), you can configure DNS search domains:
dns_search: localdomain # Tailscale users: add your Tailnet domain # dns_search: localdomain tail12345.ts.netIf DNS resolution fails entirely, override the DNS servers directly:
dns: - 1.1.1.1 - 8.8.8.8Upgrading
Section titled “Upgrading”Pull the latest image and restart:
docker compose pulldocker compose up -dChannelWatch automatically migrates your configuration on startup. A backup of your previous settings is written to /config/backups/ before any migration step runs. See Migrating from v0.7 for details on the v0.7 to v1.0 upgrade path.
Security hardening (optional)
Section titled “Security hardening (optional)”To prevent supervisor credentials from ever touching disk, mount /run/channelwatch as a tmpfs:
tmpfs: - /run/channelwatch:mode=0750,uid=0,gid=1000Next steps
Section titled “Next steps”- First-Run Configuration — add your Channels DVR server and configure alerts
- Multi-DVR Setup — monitor multiple Channels DVR servers from one instance
- Notification Providers — set up Pushover, Discord, Telegram, and more