diff options
Diffstat (limited to 'modules/monitoring/module.nix')
-rw-r--r-- | modules/monitoring/module.nix | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/modules/monitoring/module.nix b/modules/monitoring/module.nix new file mode 100644 index 0000000..60e396d --- /dev/null +++ b/modules/monitoring/module.nix @@ -0,0 +1,106 @@ +{ lib, config, ... }: +let + mkStringOption = + description: + lib.mkOption { + type = lib.types.str; + default = null; + description = description; + }; + cfg = config.monitoring; +in +{ + imports = [ + # crutches due to nix limitations: + ./crutches/synapse.nix + + # modules + ./system.nix + ./postgres.nix + ./synapse.nix + ]; + options.monitoring = { + monitorAll = lib.mkEnableOption "Monitor all services"; + localPrometheus = lib.mkEnableOption "Local Prometheus"; + exposePrometheus = lib.mkEnableOption "Expose Prometheus"; + localGrafana = lib.mkEnableOption "Local Grafana"; + exposeGrafana = lib.mkEnableOption "Expose Grafana"; + + nginxHost = mkStringOption "The virtual host name"; + nginxSsl = lib.mkEnableOption "Enable SSL for Nginx"; + prometheusScrapeIntervals = lib.mkOption { + type = lib.types.listOf lib.types.int; + default = [ + 1 + 2 + 5 + 15 + ]; + description = "Scrape intervals for Prometheus"; + }; + }; + + config = lib.mkIf (cfg.monitorAll) { + services = { + prometheus = lib.mkIf (cfg.localPrometheus) { + enable = true; + listenAddress = "127.0.0.1"; + }; + grafana = lib.mkIf (cfg.localGrafana) { + enable = true; + settings = { + server = { + domain = cfg.nginxHost; + enable_gzip = true; + protocol = "socket"; + socket_mode = "0666"; + }; + }; + provision = { + datasources.settings = { + apiVersion = 1; + # datasources = [ + # { + # name = "Prometheus"; + # type = "prometheus"; + # access = "proxy"; + # url = "http://127.0.0.1:${toString config.services.prometheus.port}"; + # isDefault = true; + # } + # ]; + + datasources = lib.map (interval: { + name = "Prometheus-${toString interval}"; + type = "prometheus"; + access = "proxy"; + url = "http://127.0.0.1:${toString config.services.prometheus.port}"; + #isDefault = true; + jsonData.timeInterval = "${toString interval}s"; + }) cfg.prometheusScrapeIntervals; + }; + }; + }; + nginx.virtualHosts = { + "${cfg.nginxHost}" = { + enableACME = cfg.nginxSsl; + addSSL = cfg.nginxSsl; + http3 = cfg.nginxSsl; + http3_hq = cfg.nginxSsl; + kTLS = cfg.nginxSsl; + locations = { + "/" = if cfg.exposeGrafana then { proxyPass = "http://unix:${config.services.grafana.settings.server.socket}"; } else { return = "200 'OK'"; }; + }; + }; + + "prometheus.${cfg.nginxHost}" = lib.mkIf (cfg.exposePrometheus) { + enableACME = cfg.nginxSsl; + addSSL = cfg.nginxSsl; + http3 = cfg.nginxSsl; + http3_hq = cfg.nginxSsl; + kTLS = cfg.nginxSsl; + locations."/".proxyPass = "http://127.0.0.1:${toString config.services.prometheus.port}"; + }; + }; + }; + }; +} |