aboutsummaryrefslogtreecommitdiff
path: root/nixos/modules/monitoring.nix
blob: abeba2dc0e81e8ccc73519ef38c66dadc8e2cf45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
{ config, lib, pkgs, ... }:

with lib;

let

cnf = config.cynerd.monitoring;
hostName = config.networking.hostName;
isHost = cnf.host == hostName;

in {
  options.cynerd.monitoring = {
    enable = mkOption {
      type = types.bool;
      default = true;
      description = "If monitoring should be used";
    };
    hw = mkOption {
      type = types.bool;
      default = true;
      description = "If hardware should be reported";
    };

    host = mkOption {
      type = types.str;
      description = "Host name of the monitoring hosting system";
      readOnly = true;
    };
  };

  config = mkMerge [
    { cynerd.monitoring.host = "errol"; }

    (mkIf cnf.enable {
      # Telegraf configuration
      services.telegraf = {
        enable = true;
        environmentFiles = ["/run/secrets/telegraf.env"];
        extraConfig = {
          agent = {};
          outputs.influxdb_v2 = [{
            urls = ["http://errol:8086"];
            token = "$INFLUX_TOKEN";
            organization = "personal";
            bucket = "monitoring";
            tagdrop.source = ["bigclown"]; # See home-assistant.nix
          }];
          inputs = {
            cpu = [{
              percpu = true;
              totalcpu = true;
            }];
            mem = [{}];
            swap = [{}];
            disk = [{
              ignore_fs = [
                "tmpfs" "devtmpfs" "devfs" "iso9660" "overlay" "aufs" "squashfs"
              ];
            }];
            diskio = [{}];
            net = [{}];
            system = [{}];
            processes = [{}];
            systemd_units = [{}];
            wireguard = [{}];
          } // (optionalAttrs cnf.hw {
            sensors = [{}];
            smart = [{
              path_smartctl = "${pkgs.smartmontools}/bin/smartctl";
              use_sudo = true;
            }];
            wireless = [{}];
          });
        };
      };
      systemd.services.telegraf.path = with pkgs; [
        "/run/wrappers"
      ] ++ (optionals cnf.hw [
        lm_sensors smartmontools nvme-cli
      ]);
      security.sudo.extraRules = [
        {
          users = ["telegraf"];
          commands = [{
            command = "${pkgs.smartmontools}/bin/smartctl";
            options = ["NOPASSWD"];
          }];
        }
      ];
    })

    (mkIf isHost {
      # InfluxDB
      services.influxdb2.enable = mkIf isHost true;
      services.telegraf.extraConfig.inputs.prometheus = {
        urls = ["http://localhost:8086/metrics"];
      };
      # Grafana
      services.grafana = mkIf isHost {
        enable = true;
        settings = {
          users.allow_sign_up = false;
          security = {
            admin_user = "cynerd";
            admin_password = "$__file{/run/secrets/grafana.admin.pass}";
          };
          server = {
            http_addr = "";
            http_port = 3000;
          };
        };
      };
      networking.firewall.allowedTCPPorts = [8086 3000];
    })

  ];
}