{ config, lib, pkgs, domain, ... }: with lib; let cfg = config.infra.gatus; in { options.infra.gatus = { enable = mkEnableOption "Gatus status page behind nginx"; hostname = mkOption { type = types.str; default = "status.${domain}"; description = "Virtual host name serving the Gatus status page"; }; port = mkOption { type = types.port; default = 8081; description = "Port Gatus listens on locally"; }; title = mkOption { type = types.str; default = "Status"; description = "Title shown in the Gatus UI"; }; endpoints = mkOption { type = types.listOf types.attrs; default = [ ]; description = '' Gatus endpoint definitions. See https://gatus.io/docs/configure-endpoints ''; }; extraSettings = mkOption { type = types.attrs; default = { }; description = "Extra settings merged into services.gatus.settings"; }; }; config = mkIf cfg.enable { services.gatus = { enable = true; settings = mkMerge [ { web.port = cfg.port; storage = { type = "sqlite"; path = "/var/lib/gatus/data.db"; }; ui.title = cfg.title; endpoints = cfg.endpoints; } cfg.extraSettings ]; }; services.nginx = { enable = true; virtualHosts.${cfg.hostname}.locations."/".proxyPass = "http://127.0.0.1:${toString cfg.port}"; }; networking.firewall.allowedTCPPorts = [ 80 443 ]; }; }