Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I071c766ba98ed03e0b10928c25af0d0b6a6a6964
5 KiB
Configuration
Watchdog supports multiple configuration sources with the following precedence (highest to lowest):
- Command-line flags
- Environment variables
- Configuration file
- Defaults
Configuration File
The primary configuration method is via YAML file. By default, Watchdog looks for:
./config.yaml(current directory)/etc/watchdog/config.yaml(system-wide)
Specify a custom location:
# Provide your configuration YAML file with --config
$ watchdog --config /path/to/config.yaml
See config.example.yaml for all available options.
Environment Variables
All configuration options can be set via environment variables with the
WATCHDOG_ prefix.
Nested fields use underscore separators. For example:
# site.domains
$ export WATCHDOG_SITE_DOMAINS="example.com,blog.example.com"
# server.listen_addr
$ export WATCHDOG_SERVER_LISTEN_ADDR="127.0.0.1:8080"
# site.collect.pageviews
$ export WATCHDOG_SITE_COLLECT_PAGEVIEWS=true
# limits.max_paths
$ export WATCHDOG_LIMITS_MAX_PATHS=10000
Common Environment Variables
# Server
WATCHDOG_SERVER_LISTEN_ADDR="127.0.0.1:8080"
WATCHDOG_SERVER_METRICS_PATH="/metrics"
WATCHDOG_SERVER_INGESTION_PATH="/api/event"
WATCHDOG_SERVER_STATE_PATH="/var/lib/watchdog/hll.state"
# Site
WATCHDOG_SITE_DOMAINS="example.com" # comma-separated for multiple
WATCHDOG_SITE_SALT_ROTATION="daily"
WATCHDOG_SITE_SAMPLING=1.0
# Collection
WATCHDOG_SITE_COLLECT_PAGEVIEWS=true
WATCHDOG_SITE_COLLECT_COUNTRY=true
WATCHDOG_SITE_COLLECT_DEVICE=true
WATCHDOG_SITE_COLLECT_REFERRER="domain"
WATCHDOG_SITE_COLLECT_DOMAIN=false
# Limits
WATCHDOG_LIMITS_MAX_PATHS=10000
WATCHDOG_LIMITS_MAX_SOURCES=500
WATCHDOG_LIMITS_MAX_CUSTOM_EVENTS=100
WATCHDOG_LIMITS_MAX_EVENTS_PER_MINUTE=10000
# Security
WATCHDOG_SECURITY_CORS_ENABLED=false
WATCHDOG_SECURITY_METRICS_AUTH_ENABLED=false
WATCHDOG_SECURITY_METRICS_AUTH_USERNAME="admin"
WATCHDOG_SECURITY_METRICS_AUTH_PASSWORD="changeme"
Command-Line Flags
Command-line flags override both config file and environment variables:
# Override server address
watchdog --listen-addr :9090
# Override metrics path
watchdog --metrics-path /prometheus/metrics
# Override ingestion path
watchdog --ingestion-path /api/v1/event
# Combine multiple overrides
watchdog --config prod.yaml --listen-addr :9090 --metrics-path /metrics
Available flags:
--config string- Path to config file--listen-addr string- Server listen address--metrics-path string- Metrics endpoint path--ingestion-path string- Ingestion endpoint path
Configuration Precedence Example
Given:
config.yaml:
server:
listen_addr: ":8080"
metrics_path: "/metrics"
Environment:
export WATCHDOG_SERVER_LISTEN_ADDR=":9090"
Command:
watchdog --metrics-path "/prometheus/metrics"
Result:
listen_addr::9090(from environment variable)metrics_path:/prometheus/metrics(from CLI flag)
Systemd Integration
Environment variables work seamlessly with systemd:
[Service]
Environment="WATCHDOG_SERVER_LISTEN_ADDR=127.0.0.1:8080"
Environment="WATCHDOG_SITE_DOMAINS=example.com"
Environment="WATCHDOG_LIMITS_MAX_PATHS=10000"
ExecStart=/usr/local/bin/watchdog --config /etc/watchdog/config.yaml
Or use EnvironmentFile:
[Service]
EnvironmentFile=/etc/watchdog/env
ExecStart=/usr/local/bin/watchdog
/etc/watchdog/env:
WATCHDOG_SERVER_LISTEN_ADDR=127.0.0.1:8080
WATCHDOG_SITE_DOMAINS=example.com
WATCHDOG_LIMITS_MAX_PATHS=10000
NixOS Integration
NixOS configuration automatically converts to the correct format:
{
services.watchdog = {
enable = true;
settings = {
site.domains = [ "example.com" ];
server.listen_addr = "127.0.0.1:8080";
limits.max_paths = 10000;
};
};
}
This is equivalent to setting environment variables or using a config file.
Validation
Configuration is validated on startup. Invalid values will cause Watchdog to exit with an error:
$ watchdog
Error: config validation failed: site.domains is required
Common validation errors:
site.domains is required- No domains configuredlimits.max_paths must be greater than 0- Invalid cardinality limitsite.collect.referrer must be 'off', 'domain', or 'url'- Invalid referrer modesite.sampling must be between 0.0 and 1.0- Invalid sampling rate
Best Practices
- Use config file for base configuration - Easier to version control and review
- Use environment variables for secrets - Don't commit passwords to config files
- Use CLI flags for testing/overrides - Quick temporary changes without editing files
Example hybrid approach:
config.yaml:
site:
domains:
- example.com
collect:
pageviews: true
device: true
limits:
max_paths: 10000
Environment (secrets):
export WATCHDOG_SECURITY_METRICS_AUTH_PASSWORD="$SECRET_PASSWORD"
CLI (testing):
watchdog --listen-addr :9090 # Test on different port