vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / monitoring / gatus.nix
blob408115f5d514517a95be84d10f26930454ebe29c
2   pkgs,
3   lib,
4   config,
5   ...
6 }:
7 let
8   cfg = config.services.gatus;
10   settingsFormat = pkgs.formats.yaml { };
12   inherit (lib)
13     getExe
14     literalExpression
15     maintainers
16     mkEnableOption
17     mkIf
18     mkOption
19     mkPackageOption
20     ;
22   inherit (lib.types)
23     bool
24     int
25     nullOr
26     path
27     submodule
28     ;
31   options.services.gatus = {
32     enable = mkEnableOption "Gatus";
34     package = mkPackageOption pkgs "gatus" { };
36     configFile = mkOption {
37       type = path;
38       default = settingsFormat.generate "gatus.yaml" cfg.settings;
39       defaultText = literalExpression ''
40         let settingsFormat = pkgs.formats.yaml { }; in settingsFormat.generate "gatus.yaml" cfg.settings;
41       '';
42       description = ''
43         Path to the Gatus configuration file.
44         Overrides any configuration made using the `settings` option.
45       '';
46     };
48     environmentFile = mkOption {
49       type = nullOr path;
50       default = null;
51       description = ''
52         File to load as environment file.
53         Environmental variables from this file can be interpolated in the configuration file using `''${VARIABLE}`.
54         This is useful to avoid putting secrets into the nix store.
55       '';
56     };
58     settings = mkOption {
59       type = submodule {
60         freeformType = settingsFormat.type;
61         options = {
62           web.port = mkOption {
63             type = int;
64             default = 8080;
65             description = ''
66               The TCP port to serve the Gatus service at.
67             '';
68           };
69         };
70       };
72       default = { };
74       example = literalExpression ''
75         {
76           web.port = 8080;
77           endpoints = [{
78             name = "website";
79             url = "https://twin.sh/health";
80             interval = "5m";
81             conditions = [
82               "[STATUS] == 200"
83               "[BODY].status == UP"
84               "[RESPONSE_TIME] < 300"
85             ];
86           }];
87         }
88       '';
90       description = ''
91         Configuration for Gatus.
92         Supported options can be found at the [docs](https://gatus.io/docs).
93       '';
94     };
96     openFirewall = mkOption {
97       type = bool;
98       default = false;
99       description = ''
100         Whether to open the firewall for the Gatus web interface.
101       '';
102     };
103   };
105   config = mkIf cfg.enable {
106     systemd.services.gatus = {
107       description = "Automated developer-oriented status page";
108       after = [ "network.target" ];
109       wantedBy = [ "multi-user.target" ];
111       serviceConfig = {
112         DynamicUser = true;
113         User = "gatus";
114         Group = "gatus";
115         Type = "simple";
116         Restart = "on-failure";
117         ExecStart = getExe cfg.package;
118         StateDirectory = "gatus";
119         SyslogIdentifier = "gatus";
120         EnvironmentFile = lib.optional (cfg.environmentFile != null) cfg.environmentFile;
121       };
123       environment = {
124         GATUS_CONFIG_PATH = cfg.configFile;
125       };
126     };
128     networking.firewall.allowedTCPPorts = lib.optionals cfg.openFirewall [ cfg.settings.web.port ];
129   };
131   meta.maintainers = with maintainers; [ pizzapim ];