From 4293c51090c8aadcf5ae5e6ab7c135d0241252fd Mon Sep 17 00:00:00 2001
From: zowoq <59103226+zowoq@users.noreply.github.com>
Date: Sun, 13 Aug 2023 09:08:18 +1000
Subject: [PATCH] modules/nixos/monitoring: add grafana

---
 docs/monitoring.md                   |  1 +
 hosts/web02/secrets.yaml             |  6 ++-
 modules/nixos/monitoring/default.nix |  5 ++
 modules/nixos/monitoring/grafana.nix | 73 ++++++++++++++++++++++++++++
 4 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 modules/nixos/monitoring/grafana.nix

diff --git a/docs/monitoring.md b/docs/monitoring.md
index b8eeaf1..4dc6d33 100644
--- a/docs/monitoring.md
+++ b/docs/monitoring.md
@@ -1,2 +1,3 @@
 - [monitoring.nix-community.org/alertmanager](https://monitoring.nix-community.org/alertmanager)
+- [monitoring.nix-community.org/grafana](https://monitoring.nix-community.org/grafana)
 - [monitoring.nix-community.org/prometheus](https://monitoring.nix-community.org/prometheus)
diff --git a/hosts/web02/secrets.yaml b/hosts/web02/secrets.yaml
index 10b6d75..76f11ab 100644
--- a/hosts/web02/secrets.yaml
+++ b/hosts/web02/secrets.yaml
@@ -1,5 +1,7 @@
 ssh_host_ed25519_key: ENC[AES256_GCM,data:mp33XErF8FL7/rxKUsXiVijkCcDlSmtopkxTA/tDpcVx1ft6e9/YIoGYvLwxMhwowlEjktuANnZXo0tPHoCaiRdsFL2XMlNhbMHz5PKdIwpQyGysbqJKzVSa81F8RS1IG0sY8YGaCXsOfWPBbNJFTapT+9Xb6niRwiQkwwPAxBN9zdS+nMvllNHEZSv4RQ84uKzvyaLPB9N3GU7GHPq5UzBYNO1eH0eHoDEvv3JI6W/C8dws4liAwCSoCOF0RTdBpVKZvlf2DMYCKEZYWlnyBvq/NVJr2JujNDhtKOozL0tVLCkh8QQrLiWucN1yCMiy+1VS5yqmvqa6Gvc4P9hgmMHRjA37oJtDrik4SWQZq0VfxJ00oC3ByGmH6mR4AZY/BTPMnRAgF/m3rjryEd4hCjlQ1jJhdWmRTchruK7oSz/FrZmtCp/fVsRulcJ2JmU2gEQF0rfP9+eq/LWLD0FPvsp9ytf18wPMAY6fYj7vQGj5dx9ZB6oJ0RxlgAhPFhjAztjmMQD43oSsNnm9FKISS5Vv07tQDQBUHe3d,iv:Z6SfUFsjfRaVc23CNM1NE4/c92MLmbdEXilPJomX9qM=,tag:xknd9rqBVvUg69ICvhXHcA==,type:str]
 nix-community-matrix-bot-token: ENC[AES256_GCM,data:CHL3h0ttoBjj5xGfvQ9k4kYDMFdKV9V5DV9KOtz84LotVjZ7MRP9LDjvxfchO8T3kU1OMPWqBVYOS04da3xMLyRQRa1phkkGwjigjQ==,iv:pGyD4w4LLYfZmyZol52DTKeWMOniG96TX0aoF/4/uxM=,tag:Hw/eCheMjiUBj9bDTz0Ysw==,type:str]
+grafana-admin-password: ENC[AES256_GCM,data:imowUQJxi03QyhYBvMx8nWo6VvblOSaQ3YozWyl4w86cEQ==,iv:Pop10QAd9rSwwyXzhvfmIr+bCKOCEaVGTcvg7VH5BTo=,tag:eRJ8N9M/iaIC2rx5MFfsEw==,type:str]
+grafana-client-secret: ENC[AES256_GCM,data:ET2/XYYDTPuZtmQvvmxqFSVini+z4ap3hQfdkLKOMikFvHNzhEgHzw==,iv:JLM490Da0bDohB4Rm38c1eeKYlM4ODL+Loth9i/RPC8=,tag:3uepHgyot9EgUKPQqYWHBQ==,type:str]
 sops:
     kms: []
     gcp_kms: []
@@ -60,8 +62,8 @@ sops:
             QnJZZzN1a1M5b1dwa3hvL3ZHYkpxQUkK1g9sQB0UHl9coaznjIn4WDpQv21Y8cl9
             LNqnv0Q6KrxNliq2JEJoEpjD5+xTcqV/5FgylKhtdNWUZ0eAX8taog==
             -----END AGE ENCRYPTED FILE-----
-    lastmodified: "2023-08-15T22:00:57Z"
-    mac: ENC[AES256_GCM,data:caG26hmL2TlFVhufXG2lkhrKK0CtseYj+5HWnWYIaBo28jGesWONp9o3r3/eKa+7ZlBnQu1Xt+ctQmIOiyqavQtfTWYjlS8Pb2yvfjAKrKSYwg8gxRXnD+vqCzFAFsvlCdWV5uPdLmO6YuDWjO8QCccDQaJuo9ChAGDryngNPqY=,iv:cbS1zpaZFUr/HP4eDSOJe90IJ2IqxFzQdkBGfaHt6Uc=,tag:soKRVwIBbusdrcYLjA4B0w==,type:str]
+    lastmodified: "2023-09-17T00:19:44Z"
+    mac: ENC[AES256_GCM,data:hu48nar/2Z2HrBopQ2cbeucqq+rbE4OqBVCaLNdldIukJza0GWD7kMkBNXciM6J8BkfxFwcFSDBnieth9N/4tEu8ssorCZmnG9VUioNL/dbNVMTAgBTSc+BTgcNg9jTRea0y82OCEqAAxzEFSwDi2uAkzuecoFu6de3sVmYOUsc=,iv:O9V9c6EW942bn4IIfX+UFU/2cYu2eKCOxQ3PFcXSEYA=,tag:IplW3Em3yulcKQeySzP3LQ==,type:str]
     pgp: []
     unencrypted_suffix: _unencrypted
     version: 3.7.3
diff --git a/modules/nixos/monitoring/default.nix b/modules/nixos/monitoring/default.nix
index e3e101b..7bb310d 100644
--- a/modules/nixos/monitoring/default.nix
+++ b/modules/nixos/monitoring/default.nix
@@ -1,5 +1,6 @@
 {
   imports = [
+    ./grafana.nix
     ./matrix-hook.nix
     ./prometheus.nix
     ./telegraf.nix
@@ -10,6 +11,10 @@
     forceSSL = true;
     locations."/".return = "302 https://nix-community.org/monitoring";
     locations."/alertmanager/".proxyPass = "http://localhost:9093/";
+    locations."/grafana/" = {
+      proxyPass = "http://localhost:3000/";
+      proxyWebsockets = true;
+    };
     locations."/prometheus/".proxyPass = "http://localhost:9090/";
   };
 }
diff --git a/modules/nixos/monitoring/grafana.nix b/modules/nixos/monitoring/grafana.nix
new file mode 100644
index 0000000..8a038ae
--- /dev/null
+++ b/modules/nixos/monitoring/grafana.nix
@@ -0,0 +1,73 @@
+{ config, ... }:
+{
+  systemd.services.grafana.after = [ "prometheus.service" ];
+
+  services.grafana = {
+    enable = true;
+    settings = {
+      analytics.reporting_enabled = false;
+      analytics.feedback_links_enabled = false;
+
+      "auth.anonymous".enabled = true;
+
+      # https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/github/
+      "auth.github" = {
+        enabled = true;
+        client_id = "ea6aa36488df8b2dede6";
+        client_secret = "$__file{${config.sops.secrets.grafana-client-secret.path}}";
+        auth_url = "https://github.com/login/oauth/authorize";
+        token_url = "https://github.com/login/oauth/access_token";
+        api_url = "https://api.github.com/user";
+        allow_sign_up = true;
+        auto_login = false;
+        allowed_organizations = [ "nix-community" ];
+        role_attribute_strict = true;
+        allow_assign_grafana_admin = true;
+        role_attribute_path = "contains(groups[*], '@nix-community/admin') && 'GrafanaAdmin' || 'Editor'";
+      };
+
+      server = {
+        root_url = "https://monitoring.nix-community.org/grafana/";
+        domain = "monitoring.nix-community.org";
+        enforce_domain = true;
+        enable_gzip = true;
+      };
+
+      database = {
+        type = "postgres";
+        name = "grafana";
+        host = "/run/postgresql";
+        user = "grafana";
+      };
+
+      security.admin_password = "$__file{${config.sops.secrets.grafana-admin-password.path}}";
+    };
+
+    provision.datasources.settings.datasources = [
+      {
+        name = "prometheus";
+        type = "prometheus";
+        isDefault = true;
+        url = "http://localhost:9090";
+      }
+    ];
+  };
+
+  services.telegraf.extraConfig.inputs.prometheus.urls = [
+    "http://localhost:3000/metrics"
+  ];
+
+  sops.secrets.grafana-admin-password.owner = "grafana";
+  sops.secrets.grafana-client-secret.owner = "grafana";
+
+  services.postgresql = {
+    enable = true;
+    ensureDatabases = [ "grafana" ];
+    ensureUsers = [
+      {
+        name = "grafana";
+        ensurePermissions = { "DATABASE grafana" = "ALL PRIVILEGES"; };
+      }
+    ];
+  };
+}