Self-Host Netdata: Real-Time Server Monitoring 2026
TL;DR
Netdata (GPL 3.0, ~72K GitHub stars) is a zero-configuration real-time monitoring agent that automatically detects and monitors everything running on your server — OS metrics, Docker containers, databases, web servers, Nginx, Redis, PostgreSQL, and 800+ other services. Collects metrics at 1-second resolution. Runs as a lightweight daemon (~100MB RAM). Pair it with Netdata Parents for multi-host aggregation, or export to Prometheus/Grafana. Replace DataDog/New Relic for self-hosted infrastructure monitoring.
Key Takeaways
- Netdata: GPL 3.0, ~72K stars — zero-config, 1-second metrics, auto-discovery
- 800+ integrations: Nginx, Apache, Docker, PostgreSQL, MySQL, Redis, and more — auto-detected
- Alerts built-in: 700+ pre-configured alert conditions, Slack/email/PagerDuty notifications
- Parent-Child: Stream metrics from many agents to one parent node for multi-host view
- Resource use: ~100MB RAM, ~1–2% CPU per node
- Grafana export: Export to Prometheus and visualize in Grafana with all the flexibility
Netdata vs Alternatives
| Feature | Netdata | Prometheus + Grafana | DataDog | Zabbix |
|---|---|---|---|---|
| License | GPL 3.0 | Apache 2.0 / AGPL | Proprietary | AGPL |
| Cost | Free | Free | $15+/host/mo | Free |
| Setup complexity | Zero-config | High (manual config) | Agent install | Complex |
| Metric resolution | 1 second | Configurable | 15-30s (free) | 1 min |
| Auto-discovery | Yes | No (manual targets) | Yes | Yes |
| Built-in alerts | 700+ rules | None (manual) | Yes | Yes |
| Multi-host UI | Parent node | Grafana dashboards | Yes | Yes |
| GitHub Stars | ~72K | ~56K / ~64K | — | — |
Part 1: Docker Setup
# docker-compose.yml
services:
netdata:
image: netdata/netdata:latest
container_name: netdata
restart: unless-stopped
pid: host
network_mode: host
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /etc/localtime:/etc/localtime:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- NETDATA_CLAIM_TOKEN=${NETDATA_CLAIM_TOKEN:-} # Optional: connect to Netdata Cloud
- NETDATA_CLAIM_URL=https://app.netdata.cloud
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
netdataconfig:
netdatalib:
netdatacache:
docker compose up -d
Visit http://your-server:19999 — the dashboard is immediately populated with metrics.
Part 2: HTTPS with Caddy
metrics.yourdomain.com {
reverse_proxy localhost:19999
}
Add basic auth to protect the dashboard:
metrics.yourdomain.com {
basicauth {
admin $2a$14$hash_here # Use: caddy hash-password
}
reverse_proxy localhost:19999
}
Part 3: What Netdata Auto-Detects
On a typical server, Netdata immediately collects:
System metrics (always collected):
CPU: per-core utilization, frequency, interrupts
RAM: usage, swap, page faults
Disk: I/O, latency, utilization per disk
Network: bandwidth, packets, errors per interface
Processes: CPU/RAM per process, forks, context switches
Auto-detected services (examples):
Docker containers: CPU, RAM, network, disk per container
Nginx: requests/s, connections, status codes
Apache: requests/s, workers, scoreboard
PostgreSQL: queries/s, cache hit ratio, locks, vacuum
MySQL/MariaDB: queries, threads, InnoDB buffers
Redis: operations/s, memory, hit rate, clients
MongoDB: operations, connections, memory
Node.js: npm processes detected automatically
Check what's detected on your system:
# List all active collectors:
docker exec netdata netdatacli collectors
Part 4: Configure Alerts
Netdata comes with 700+ pre-configured alert conditions. To customize:
# Enter the container to edit alert config:
docker exec -it netdata /bin/bash
# Alert configs are in /etc/netdata/health.d/
ls /etc/netdata/health.d/
# cpu.conf, ram.conf, disk.conf, mysql.conf, nginx.conf, ...
Custom Alert Example
# /etc/netdata/health.d/custom.conf
alarm: disk_space_warning
on: disk.space
lookup: average -5m percentage used
units: %
warn: $this > 80
crit: $this > 90
delay: down 5m multiplier 1.5 max 1h
info: Disk space usage on disk $label:device
Alert Notifications
Configure in /etc/netdata/health_alarm_notify.conf:
# Slack:
SEND_SLACK="YES"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK"
DEFAULT_RECIPIENT_SLACK="#alerts"
# Email:
SEND_EMAIL="YES"
EMAIL_SENDER="netdata@yourdomain.com"
DEFAULT_RECIPIENT_EMAIL="ops@yourdomain.com"
# ntfy (self-hosted push):
SEND_NTFY="YES"
NTFY_SERVER="https://ntfy.yourdomain.com"
NTFY_TOPIC="netdata-alerts"
Part 5: Multi-Host Streaming (Parent-Child)
Stream metrics from multiple servers to one central Netdata Parent:
On the parent (receiver):
# /etc/netdata/stream.conf (in parent container volume)
[11111111-2222-3333-4444-555555555555] # Child's machine GUID
enabled = yes
history = 3600
default memory mode = dbengine
health enabled by default = auto
allow from = *
On the child (sender):
# /etc/netdata/stream.conf
[stream]
enabled = yes
destination = parent.yourdomain.com:19999
api key = 11111111-2222-3333-4444-555555555555
Now the parent's dashboard shows all child nodes in one view.
Part 6: Prometheus Export for Grafana
Export Netdata metrics to Prometheus:
Add to Prometheus scrape_configs:
scrape_configs:
- job_name: "netdata"
metrics_path: "/api/v1/allmetrics"
params:
format: ["prometheus"]
static_configs:
- targets:
- "localhost:19999"
- "server2.yourdomain.com:19999"
Then use Grafana with the Prometheus data source. Netdata has pre-built Grafana dashboards:
- Grafana → + → Import → Dashboard ID:
7107(Netdata Overview) - Select your Prometheus data source → Import
Part 7: Kubernetes and Docker Monitoring
Netdata automatically collects Docker container metrics via the Docker socket. For Kubernetes:
# Install Netdata on Kubernetes via Helm:
helm repo add netdata https://netdata.github.io/helmchart/
helm install netdata netdata/netdata \
--namespace netdata --create-namespace \
--set persistence.enabled=true
For Docker — container stats are auto-collected. View per-container CPU/RAM/network in the dashboard under Docker Containers.
Part 8: Database Monitoring
PostgreSQL
# /etc/netdata/go.d/postgres.conf
jobs:
- name: local
dsn: postgresql://netdata:netdata_password@localhost:5432/postgres
Create the monitoring user:
CREATE USER netdata WITH PASSWORD 'netdata_password';
GRANT pg_monitor TO netdata;
Redis
# /etc/netdata/go.d/redis.conf
jobs:
- name: local
address: redis://localhost:6379
Netdata shows: ops/s, hit rate, memory, connected clients, keyspace.
Performance Tuning
# /etc/netdata/netdata.conf
[global]
# Retention period (in seconds):
history = 86400 # 1 day (default), increase for longer retention
# Memory mode (for longer retention):
memory mode = dbengine
page cache size = 32 # MB
[web]
# Disable remote access (if using reverse proxy):
bind to = localhost
[plugins]
# Disable unused plugins to reduce CPU:
apps = no # Per-process metrics (CPU intensive on large servers)
Maintenance
# Update Netdata:
docker compose pull
docker compose up -d
# Logs:
docker compose logs -f netdata
# Check collector status:
docker exec netdata netdatacli collectors
# Run health check:
docker exec netdata netdatacli cmd_version
See all open source monitoring tools at OSSAlt.com/categories/monitoring.