docs: document configuration behaviour; notes on environment vars
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I071c766ba98ed03e0b10928c25af0d0b6a6a6964
This commit is contained in:
parent
dc6b6e0c0c
commit
531aafb094
1 changed files with 237 additions and 0 deletions
237
docs/configuration.md
Normal file
237
docs/configuration.md
Normal file
|
|
@ -0,0 +1,237 @@
|
||||||
|
# Configuration
|
||||||
|
|
||||||
|
Watchdog supports multiple configuration sources with the following precedence
|
||||||
|
(highest to lowest):
|
||||||
|
|
||||||
|
1. **Command-line flags**
|
||||||
|
2. **Environment variables**
|
||||||
|
3. **Configuration file**
|
||||||
|
4. **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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Provide your configuration YAML file with --config
|
||||||
|
$ watchdog --config /path/to/config.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
See [config.example.yaml](../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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
server:
|
||||||
|
listen_addr: ":8080"
|
||||||
|
metrics_path: "/metrics"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Environment:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export WATCHDOG_SERVER_LISTEN_ADDR=":9090"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[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`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Service]
|
||||||
|
EnvironmentFile=/etc/watchdog/env
|
||||||
|
ExecStart=/usr/local/bin/watchdog
|
||||||
|
```
|
||||||
|
|
||||||
|
**/etc/watchdog/env:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ watchdog
|
||||||
|
Error: config validation failed: site.domains is required
|
||||||
|
```
|
||||||
|
|
||||||
|
Common validation errors:
|
||||||
|
|
||||||
|
- `site.domains is required` - No domains configured
|
||||||
|
- `limits.max_paths must be greater than 0` - Invalid cardinality limit
|
||||||
|
- `site.collect.referrer must be 'off', 'domain', or 'url'` - Invalid referrer
|
||||||
|
mode
|
||||||
|
- `site.sampling must be between 0.0 and 1.0` - Invalid sampling rate
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Use config file for base configuration** - Easier to version control and
|
||||||
|
review
|
||||||
|
2. **Use environment variables for secrets** - Don't commit passwords to config
|
||||||
|
files
|
||||||
|
3. **Use CLI flags for testing/overrides** - Quick temporary changes without
|
||||||
|
editing files
|
||||||
|
|
||||||
|
Example hybrid approach:
|
||||||
|
|
||||||
|
**config.yaml:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
site:
|
||||||
|
domains:
|
||||||
|
- example.com
|
||||||
|
collect:
|
||||||
|
pageviews: true
|
||||||
|
device: true
|
||||||
|
|
||||||
|
limits:
|
||||||
|
max_paths: 10000
|
||||||
|
```
|
||||||
|
|
||||||
|
**Environment (secrets):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export WATCHDOG_SECURITY_METRICS_AUTH_PASSWORD="$SECRET_PASSWORD"
|
||||||
|
```
|
||||||
|
|
||||||
|
**CLI (testing):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
watchdog --listen-addr :9090 # Test on different port
|
||||||
|
```
|
||||||
Loading…
Add table
Add a link
Reference in a new issue