fluffychat: 1.22.1 -> 1.23.0 (#364091)
[NixPkgs.git] / nixos / modules / services / misc / ntfy-sh.nix
blobdb857a3f147271fba26da7d1495baf2c818f1d21
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.ntfy-sh;
5   settingsFormat = pkgs.formats.yaml { };
6 in
9   options.services.ntfy-sh = {
10     enable = lib.mkEnableOption "[ntfy-sh](https://ntfy.sh), a push notification service";
12     package = lib.mkPackageOption pkgs "ntfy-sh" { };
14     user = lib.mkOption {
15       default = "ntfy-sh";
16       type = lib.types.str;
17       description = "User the ntfy-sh server runs under.";
18     };
20     group = lib.mkOption {
21       default = "ntfy-sh";
22       type = lib.types.str;
23       description = "Primary group of ntfy-sh user.";
24     };
26     settings = lib.mkOption {
27       type = lib.types.submodule {
28         freeformType = settingsFormat.type;
29         options = {
30           base-url = lib.mkOption {
31             type = lib.types.str;
32             example = "https://ntfy.example";
33             description = ''
34               Public facing base URL of the service
36               This setting is required for any of the following features:
37               - attachments (to return a download URL)
38               - e-mail sending (for the topic URL in the email footer)
39               - iOS push notifications for self-hosted servers
40                 (to calculate the Firebase poll_request topic)
41               - Matrix Push Gateway (to validate that the pushkey is correct)
42             '';
43           };
44         };
45       };
47       default = { };
49       example = lib.literalExpression ''
50         {
51           listen-http = ":8080";
52         }
53       '';
55       description = ''
56         Configuration for ntfy.sh, supported values are [here](https://ntfy.sh/docs/config/#config-options).
57       '';
58     };
59   };
61   config =
62     let
63       configuration = settingsFormat.generate "server.yml" cfg.settings;
64     in
65     lib.mkIf cfg.enable {
66       # to configure access control via the cli
67       environment = {
68         etc."ntfy/server.yml".source = configuration;
69         systemPackages = [ cfg.package ];
70       };
72       services.ntfy-sh.settings = {
73         auth-file = lib.mkDefault "/var/lib/ntfy-sh/user.db";
74         listen-http = lib.mkDefault "127.0.0.1:2586";
75         attachment-cache-dir = lib.mkDefault "/var/lib/ntfy-sh/attachments";
76         cache-file = lib.mkDefault "/var/lib/ntfy-sh/cache-file.db";
77       };
79       systemd.services.ntfy-sh = {
80         description = "Push notifications server";
82         wantedBy = [ "multi-user.target" ];
83         after = [ "network.target" ];
85         serviceConfig = {
86           ExecStart = "${cfg.package}/bin/ntfy serve -c ${configuration}";
87           User = cfg.user;
88           StateDirectory = "ntfy-sh";
90           DynamicUser = true;
91           AmbientCapabilities = "CAP_NET_BIND_SERVICE";
92           PrivateTmp = true;
93           NoNewPrivileges = true;
94           CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
95           ProtectSystem = "full";
96           ProtectKernelTunables = true;
97           ProtectKernelModules = true;
98           ProtectKernelLogs = true;
99           ProtectControlGroups = true;
100           PrivateDevices = true;
101           RestrictSUIDSGID = true;
102           RestrictNamespaces = true;
103           RestrictRealtime = true;
104           MemoryDenyWriteExecute = true;
105           # Upstream Recommandation
106           LimitNOFILE = 20500;
107         };
108       };
110       users.groups = lib.optionalAttrs (cfg.group == "ntfy-sh") {
111         ntfy-sh = { };
112       };
114       users.users = lib.optionalAttrs (cfg.user == "ntfy-sh") {
115         ntfy-sh = {
116           isSystemUser = true;
117           group = cfg.group;
118         };
119       };
120     };