diff --git a/system/services/default.nix b/system/services/default.nix index 63deab3..db99f2f 100644 --- a/system/services/default.nix +++ b/system/services/default.nix @@ -1,6 +1,8 @@ { ... }: { imports = [ + ./telemetry + ./caddy.nix ./cockpit.nix ./forgejo.nix @@ -15,6 +17,5 @@ ./syncthing.nix ./wireguard.nix ./photoprism.nix - ./telemetry.nix ]; } diff --git a/system/services/telemetry/default.nix b/system/services/telemetry/default.nix new file mode 100644 index 0000000..a29d411 --- /dev/null +++ b/system/services/telemetry/default.nix @@ -0,0 +1,7 @@ +{ ... }: +{ + imports = [ + ./grafana.nix + ./loki.nix + ]; +} diff --git a/system/services/telemetry.nix b/system/services/telemetry/grafana.nix similarity index 84% rename from system/services/telemetry.nix rename to system/services/telemetry/grafana.nix index 01392b2..6711e10 100644 --- a/system/services/telemetry.nix +++ b/system/services/telemetry/grafana.nix @@ -1,6 +1,6 @@ { config, lib, pkgs, ... }: let - cfg = config.profile.services.telemetry; + cfg = config.profile.services.telemetry.grafana; inherit (lib) mkIf; grafanaDomain = "grafana.tigor.web.id"; in @@ -8,20 +8,23 @@ in config = mkIf cfg.enable { sops.secrets = let - opts = { sopsFile = ../../secrets/telemetry.yaml; owner = "grafana"; }; + opts = { + sopsFile = ../../../secrets/telemetry.yaml; + owner = "grafana"; + }; in - mkIf cfg.grafana.enable { + { "grafana/admin_user" = opts; "grafana/admin_password" = opts; "grafana/admin_email" = opts; "grafana/secret_key" = opts; }; - services.caddy.virtualHosts.${grafanaDomain}.extraConfig = mkIf cfg.grafana.enable '' + services.caddy.virtualHosts.${grafanaDomain}.extraConfig = '' reverse_proxy ${config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port} ''; - services.grafana = mkIf cfg.grafana.enable { + services.grafana = { enable = true; package = pkgs.grafana; settings = { diff --git a/system/services/telemetry/loki.nix b/system/services/telemetry/loki.nix new file mode 100644 index 0000000..89e36b2 --- /dev/null +++ b/system/services/telemetry/loki.nix @@ -0,0 +1,68 @@ +{ config, lib, ... }: +let + cfg = config.profile.services.telemetry.loki; + inherit (lib) mkIf; +in +{ + config = mkIf cfg.enable { + services.loki = + let + dataDir = config.services.loki.dataDir; + in + { + enable = true; + configuration = { + # https://grafana.com/docs/loki/latest/configure/examples/configuration-examples/ + auth_enabled = false; # Loki will not be exposed to the public internet + server = { + http_listen_address = "0.0.0.0"; + http_listen_port = 3100; + grpc_listen_port = 9095; + }; + + common = { + path_prefix = dataDir; + replication_factor = 1; + ring = { + instance_addr = "127.0.0.1"; + kvstore.store = "inmemory"; + }; + }; + + schema_config = { + configs = [ + { + from = "2024-08-29"; + store = "tsdb"; + object_store = "filesystem"; + schema = "v13"; + index = { + prefix = "index_"; + period = "24h"; + }; + } + ]; + }; + + storage_config = { + filesystem = { + directory = "${dataDir}/chunks"; + }; + }; + }; + }; + # https://grafana.com/docs/grafana/latest/datasources/loki/ + services.grafana.provision.datasources.settings.datasources = [ + { + name = "Loki"; + type = "loki"; + access = "proxy"; + url = "http://${config.services.loki.configuration.server.http_listen_address}:${toString config.services.loki.configuration.server.http_listen_port}"; + jsonData = { + timeout = 60; + maxLines = 1000; + }; + } + ]; + }; +}