cryodev/docs/services/netdata.md
steffen 5ba78886d2 Add SD image pipeline, documentation overhaul, and fix module issues
- Add automatic SD image builds for Raspberry Pi via Forgejo Actions
- Enable binfmt emulation on cryodev-main for aarch64 cross-builds
- Add sd-image.nix module to cryodev-pi configuration
- Create comprehensive docs/ structure with installation guides
- Split installation docs into: first-install (server), reinstall, new-client (Pi)
- Add lib/utils.nix and apps/rebuild from synix
- Fix headplane module for new upstream API (tale/headplane)
- Fix various module issues (mailserver stateVersion, option conflicts)
- Add placeholder secrets.yaml files for both hosts
- Remove old INSTRUCTIONS.md (content moved to docs/)
2026-03-11 08:41:58 +01:00

3.7 KiB

Netdata Monitoring

Netdata provides real-time performance monitoring with parent/child streaming.

Architecture

┌─────────────────┐     Stream over      ┌─────────────────┐
│  cryodev-pi     │  ───────────────────>│  cryodev-main   │
│  (Child Node)   │     Tailscale VPN    │  (Parent Node)  │
└─────────────────┘                      └─────────────────┘
                                                  │
                                                  v
                                         https://netdata.cryodev.xyz

References

Parent Node (cryodev-main)

DNS

Set a CNAME record for netdata.cryodev.xyz pointing to your main domain.

Generate Stream API Key

uuidgen

Configuration

# hosts/cryodev-main/services/netdata.nix
{ config, ... }:
{
  sops.secrets."netdata/stream-api-key" = { };
  
  sops.templates."netdata-stream.conf" = {
    content = ''
      [${config.sops.placeholder."netdata/stream-api-key"}]
      enabled = yes
      default history = 3600
      default memory mode = ram
      health enabled by default = auto
      allow from = *
    '';
    owner = "netdata";
  };
  
  services.netdata = {
    enable = true;
    configDir."stream.conf" = config.sops.templates."netdata-stream.conf".path;
  };
}

Child Node (cryodev-pi)

Generate Child UUID

uuidgen

Add to Secrets

sops hosts/cryodev-pi/secrets.yaml
netdata:
  stream:
    child-uuid: "your-generated-uuid"

Note: The stream API key must match the parent's key. You can either:

  1. Share the same secret between hosts (complex with SOPS)
  2. Hardcode a known API key in both configurations

Configuration

# hosts/cryodev-pi/services/netdata.nix
{ config, constants, ... }:
{
  sops.secrets."netdata/stream/child-uuid" = { };
  
  sops.templates."netdata-stream.conf" = {
    content = ''
      [stream]
      enabled = yes
      destination = ${constants.hosts.cryodev-main.ip}:19999
      api key = YOUR_STREAM_API_KEY
      send charts matching = *
    '';
    owner = "netdata";
  };
  
  services.netdata = {
    enable = true;
    configDir."stream.conf" = config.sops.templates."netdata-stream.conf".path;
  };
}

Email Alerts

Configure Netdata to send alerts via the mailserver:

{
  services.netdata.configDir."health_alarm_notify.conf" = pkgs.writeText "notify.conf" ''
    SEND_EMAIL="YES"
    EMAIL_SENDER="netdata@cryodev.xyz"
    DEFAULT_RECIPIENT_EMAIL="admin@cryodev.xyz"
  '';
}

Usage

Access Dashboard

Open https://netdata.cryodev.xyz in your browser.

View Child Nodes

Child nodes appear in the left sidebar under "Nodes".

Check Streaming Status

On parent:

curl -s http://localhost:19999/api/v1/info | jq '.hosts'

On child:

curl -s http://localhost:19999/api/v1/info | jq '.streaming'

Troubleshooting

Check Service Status

sudo systemctl status netdata

View Logs

sudo journalctl -u netdata -f

Child Not Streaming

  1. Verify network connectivity:

    tailscale ping cryodev-main
    nc -zv <parent-ip> 19999
    
  2. Check API key matches between parent and child

  3. Verify firewall allows port 19999 on parent

High Memory Usage

Adjust history settings in netdata.conf:

[global]
history = 1800  # seconds to retain
memory mode = ram