Remove n0emis as direct maintainer (#365023)
[NixPkgs.git] / nixos / modules / services / monitoring / karma.nix
blob50b8d384a4a368ccf8df134b59aebec98c156df1
2   config,
3   pkgs,
4   lib,
5   ...
6 }:
7 let
8   cfg = config.services.karma;
9   yaml = pkgs.formats.yaml { };
12   options.services.karma = {
13     enable = lib.mkEnableOption "the Karma dashboard service";
15     package = lib.mkPackageOption pkgs "karma" { };
17     configFile = lib.mkOption {
18       type = lib.types.path;
19       default = yaml.generate "karma.yaml" cfg.settings;
20       defaultText = "A configuration file generated from the provided nix attributes settings option.";
21       description = ''
22         A YAML config file which can be used to configure karma instead of the nix-generated file.
23       '';
24       example = "/etc/karma/karma.conf";
25     };
27     environment = lib.mkOption {
28       type = with lib.types; attrsOf str;
29       default = { };
30       description = ''
31         Additional environment variables to provide to karma.
32       '';
33       example = {
34         ALERTMANAGER_URI = "https://alertmanager.example.com";
35         ALERTMANAGER_NAME = "single";
36       };
37     };
39     openFirewall = lib.mkOption {
40       type = lib.types.bool;
41       default = false;
42       description = ''
43         Whether to open ports in the firewall needed for karma to function.
44       '';
45     };
47     extraOptions = lib.mkOption {
48       type = with lib.types; listOf str;
49       default = [ ];
50       description = ''
51         Extra command line options.
52       '';
53       example = [
54         "--alertmanager.timeout 10s"
55       ];
56     };
58     settings = lib.mkOption {
59       type = lib.types.submodule {
60         freeformType = yaml.type;
62         options.listen = {
63           address = lib.mkOption {
64             type = lib.types.str;
65             default = "127.0.0.1";
66             description = ''
67               Hostname or IP to listen on.
68             '';
69             example = "[::]";
70           };
72           port = lib.mkOption {
73             type = lib.types.port;
74             default = 8080;
75             description = ''
76               HTTP port to listen on.
77             '';
78             example = 8182;
79           };
80         };
81       };
82       default = {
83         listen = {
84           address = "127.0.0.1";
85         };
86       };
87       description = ''
88         Karma dashboard configuration as nix attributes.
90         Reference: <https://github.com/prymitive/karma/blob/main/docs/CONFIGURATION.md>
91       '';
92       example = {
93         listen = {
94           address = "192.168.1.4";
95           port = "8000";
96           prefix = "/dashboard";
97         };
98         alertmanager = {
99           interval = "15s";
100           servers = [
101             {
102               name = "prod";
103               uri = "http://alertmanager.example.com";
104             }
105           ];
106         };
107       };
108     };
109   };
111   config = lib.mkIf cfg.enable {
112     systemd.services.karma = {
113       description = "Alert dashboard for Prometheus Alertmanager";
114       wantedBy = [ "multi-user.target" ];
115       environment = cfg.environment;
116       serviceConfig = {
117         Type = "simple";
118         DynamicUser = true;
119         Restart = "on-failure";
120         ExecStart = "${pkgs.karma}/bin/karma --config.file ${cfg.configFile} ${lib.concatStringsSep " " cfg.extraOptions}";
121       };
122     };
123     networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [ cfg.settings.listen.port ];
124   };