# self-hosted push notification server (ntfy) { config, lib, ... }: let cfg = config.my.profiles.ntfy; hostName = config.networking.hostName; in { options.my.profiles.ntfy = with lib; { enable = mkEnableOption "ntfy notification server"; port = mkOption { type = types.port; default = 2586; description = "HTTP port ntfy listens on."; }; topic = mkOption { type = types.str; default = "ha"; description = "Topic Home Assistant publishes notifications to."; }; haIntegration.enable = mkOption { type = types.bool; default = true; description = "Wire a Home Assistant rest_command that publishes to ntfy."; }; }; config = lib.mkMerge [ (lib.mkIf cfg.enable { services.ntfy-sh = { enable = true; settings = { base-url = "http://${hostName}:${toString cfg.port}"; listen-http = ":${toString cfg.port}"; auth-file = "/var/lib/ntfy-sh/user.db"; auth-default-access = "deny-all"; }; }; networking.firewall.allowedTCPPorts = [ cfg.port ]; my.homepage.services = [ { group = "Services"; name = "ntfy"; description = "Push notifications"; href = "http://${hostName}:${toString cfg.port}"; icon = "ntfy.svg"; } ]; }) (lib.mkIf (cfg.enable && cfg.haIntegration.enable && config.my.profiles.home-assistant.enable) { services.home-assistant.config.rest_command.ntfy_send = { url = "http://${hostName}:${toString cfg.port}/${cfg.topic}"; method = "POST"; payload = "{{ message }}"; content_type = "text/plain"; username = "homeassistant"; password = "!secret ntfy_password"; headers = { Title = "{{ title | default('Home Assistant') }}"; Priority = "{{ priority | default('default') }}"; }; }; }) ]; }