Netdata gives you per-second metrics across CPU, memory, disk, network, and hundreds of application plugins — with zero configuration for most use cases. For remote teams managing distributed infrastructure, it cuts mean time to detect from minutes to seconds.
This guide covers installation, configuration, alerting, and exposing Netdata securely for remote access.
Install Netdata
The quickest path on Debian/Ubuntu:
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry
For RHEL/Rocky/Alma:
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry --dont-start-it
systemctl enable netdata && systemctl start netdata
Docker deployment for containers-first teams:
# docker-compose.yml
version: "3.8"
services:
netdata:
image: netdata/netdata:stable
container_name: netdata
pid: host
network_mode: host
restart: unless-stopped
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /:/host/root:ro,rslave
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
environment:
- NETDATA_CLAIM_TOKEN=your_claim_token
- NETDATA_CLAIM_URL=https://app.netdata.cloud
- NETDATA_CLAIM_ROOMS=your_room_id
volumes:
netdataconfig:
netdatalib:
netdatacache:
Core Configuration
Netdata’s main config is at /etc/netdata/netdata.conf. Edit it with the helper:
/etc/netdata/edit-config netdata.conf
Key settings to tune:
[global]
# How many seconds of data to keep in RAM (default: 3600)
history = 7200
# Update frequency in seconds (1 = per-second metrics)
update every = 1
# Memory mode: ram, map, save, dbengine
memory mode = dbengine
[web]
# Bind only to localhost if using a reverse proxy
bind to = 127.0.0.1
port = 19999
[plugins]
# Disable plugins you don't need to reduce overhead
fping = no
xenstat = no
Set the hostname so dashboards are readable when managing multiple servers:
# /etc/netdata/netdata.conf
[global]
hostname = prod-web-01
Configure Health Alerts
Netdata ships with hundreds of built-in alerts. Override them in /etc/netdata/health.d/. Create a custom alert file:
/etc/netdata/edit-config health.d/custom-disk.conf
# Alert when disk space on / exceeds 80%
alarm: disk_space_root
on: disk.space
hosts: *
lookup: average -1m percentage of used
units: %
every: 1m
warn: $this > 80
crit: $this > 90
info: Disk usage on root filesystem is high
to: sysadmin
# Alert when load average exceeds CPU count * 2
alarm: load_15
on: system.load
hosts: *
lookup: average -15m sum of load15
units: load
every: 1m
warn: $this > (($system_cores is nan) ? 4 : ($system_cores * 2))
crit: $this > (($system_cores is nan) ? 8 : ($system_cores * 4))
info: 15-minute load average is very high
to: sysadmin
Set Up Email and Slack Alerts
Configure notification channels at /etc/netdata/health_alarm_notify.conf:
/etc/netdata/edit-config health_alarm_notify.conf
For email:
# Enable email notifications
SEND_EMAIL="YES"
DEFAULT_RECIPIENT_EMAIL="ops@yourcompany.com"
# Use sendmail or postfix
sendmail="/usr/sbin/sendmail"
For Slack:
SEND_SLACK="YES"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/T.../B.../..."
DEFAULT_RECIPIENT_SLACK="#alerts"
# Optionally route critical to a different channel
role_recipients_slack[sysadmin]="#ops-critical"
Test the notification setup:
sudo -u netdata /usr/libexec/netdata/plugins.d/alarm-notify.sh test
Enable Persistent Storage (dbengine)
By default Netdata uses RAM for storage. For longer retention, use the database engine:
# /etc/netdata/netdata.conf
[global]
memory mode = dbengine
[db]
# Tiers define retention at different resolutions
# Tier 0: per-second data
dbengine multihost disk space MB = 1024
# Tier 1: per-minute averages (auto-managed)
dbengine tier 1 multihost disk space MB = 512
Check how much space Netdata is using:
du -sh /var/cache/netdata/dbengine/
Expose Dashboard Securely with Nginx
Never expose Netdata’s port 19999 directly. Put it behind Nginx with basic auth or SSO:
# /etc/nginx/sites-available/netdata
upstream netdata {
server 127.0.0.1:19999;
keepalive 64;
}
server {
listen 443 ssl http2;
server_name monitoring.yourcompany.com;
ssl_certificate /etc/letsencrypt/live/monitoring.yourcompany.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monitoring.yourcompany.com/privkey.pem;
auth_basic "Netdata Monitoring";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://netdata;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Required for Netdata's streaming protocol
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Create the htpasswd file:
htpasswd -c /etc/nginx/.htpasswd netdata-user
nginx -t && systemctl reload nginx
Stream Metrics to a Parent Node
For remote teams with multiple servers, stream all metrics to one parent Netdata instance rather than maintaining N dashboards.
On each child node (/etc/netdata/stream.conf):
[stream]
enabled = yes
destination = parent-netdata.yourcompany.com:19999
api key = aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
timeout seconds = 60
buffer size bytes = 1048576
reconnect delay seconds = 5
initial clock resync iterations = 60
On the parent node (/etc/netdata/stream.conf):
[aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee]
enabled = yes
# Where to store data for this child
default memory mode = dbengine
health enabled by default = auto
allow from = *
Restart both nodes:
systemctl restart netdata
The parent dashboard at https://monitoring.yourcompany.com now shows all hosts in the left sidebar.
Monitor Docker Containers
Netdata auto-detects Docker if the socket is accessible. For the Docker deployment, the socket is already mounted. For bare-metal installs:
usermod -aG docker netdata
systemctl restart netdata
Verify containers appear:
curl -s http://127.0.0.1:19999/api/v1/charts | python3 -m json.tool | grep '"id":.*docker'
To limit which containers are tracked, edit /etc/netdata/docker.conf:
[plugin:cgroups]
# Disable cgroup memory accounting (reduces overhead)
enable memory limits in alarms = no
# Whitelist containers by name pattern
# Leave empty to track all
cgroup include only = prod-*
Netdata Cloud for Team Dashboards
Netdata Cloud (free tier available) lets remote teams share dashboards without managing access to individual servers.
# Claim a node to Netdata Cloud
netdata-claim.sh \
-token=YOUR_CLAIM_TOKEN \
-rooms=YOUR_ROOM_ID \
-url=https://app.netdata.cloud
Get your claim token from: Netdata Cloud > Space Settings > Nodes > Connect Nodes
Once claimed, the node appears in your cloud space and is accessible to all team members with room access — no VPN or SSH tunnels required.
Useful Diagnostic Commands
# Check Netdata service status
systemctl status netdata
# View live logs
journalctl -u netdata -f
# Test a specific plugin
sudo -u netdata /usr/libexec/netdata/charts.d/postgres.chart.sh
# Check what's consuming Netdata CPU
netdata-claim.sh --check-claiming-status
# Dump all collected metrics to JSON
curl -s "http://127.0.0.1:19999/api/v1/allmetrics?format=json" | jq '.'
# List all active alarms
curl -s "http://127.0.0.1:19999/api/v1/alarms?all" | jq '.alarms | to_entries[] | .value | {name, status, value}'
Related Reading
- How to Set Up Traefik Reverse Proxy
- How to Automate Database Backup Verification
- How to Set Up Portainer for Docker Management
- How to Set Up Ansible for Remote Server Management
Related Articles
- WireGuard Team VPN: Multi-User Setup Guide
- How to Set Up Portainer for Docker Management
- How to Set Up Ansible for Remote Server Management
- Prometheus Monitoring Setup for Remote Infrastructure
- Linux Server Hardening Guide for Remote Developers
Built by theluckystrike — More at zovo.one