Skip to main content

Self-Host Netdata: Real-Time Server Monitoring 2026

·OSSAlt Team
netdatamonitoringmetricsperformanceself-hostingdocker2026

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

FeatureNetdataPrometheus + GrafanaDataDogZabbix
LicenseGPL 3.0Apache 2.0 / AGPLProprietaryAGPL
CostFreeFree$15+/host/moFree
Setup complexityZero-configHigh (manual config)Agent installComplex
Metric resolution1 secondConfigurable15-30s (free)1 min
Auto-discoveryYesNo (manual targets)YesYes
Built-in alerts700+ rulesNone (manual)YesYes
Multi-host UIParent nodeGrafana dashboardsYesYes
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:

  1. Grafana → + → Import → Dashboard ID: 7107 (Netdata Overview)
  2. 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.

Comments