{ config, inputs, lib, libNginx, this, ... }: with lib; let cfg = config.nixfiles.modules.prometheus; in { options.nixfiles.modules.prometheus = { enable = mkEnableOption "Prometheus"; port = mkOption { description = "Port."; type = with types; port; default = 30111; }; domain = mkOption { description = "Domain name sans protocol scheme."; type = with types; str; default = "prometheus.${config.networking.domain}"; }; }; config = mkIf cfg.enable { nixfiles.modules.nginx = with cfg; { enable = true; upstreams.prometheus.servers."127.0.0.1:${toString cfg.port}" = { }; virtualHosts.${domain} = { locations."/".proxyPass = "http://prometheus"; extraConfig = libNginx.config.internalOnly; }; }; services.prometheus = with cfg; { enable = true; enableReload = true; listenAddress = "127.0.0.1"; inherit port; extraFlags = [ "--web.external-url=https://${domain}" "--storage.tsdb.retention.size=50GB" "--storage.tsdb.retention.time=1y" "--storage.tsdb.wal-compression" ]; }; topology = with cfg; { nodes.${this.hostname}.services.prometheus = { name = "Prometheus"; icon = "${inputs.homelab-svg-assets}/assets/prometheus.svg"; info = domain; details.listen.text = "127.0.0.1:${toString port}"; }; }; }; }