normcap: fix on GNOME wayland when used via keybind or alt-f2 (#351763)
[NixPkgs.git] / nixos / modules / services / networking / nats.nix
blob0ab9d9f015c200ca799920dda1b3489d5e778a32
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 with lib;
10 let
12   cfg = config.services.nats;
14   format = pkgs.formats.json { };
16   configFile = format.generate "nats.conf" cfg.settings;
18   validateConfig =
19     file:
20     pkgs.runCommand "validate-nats-conf"
21       {
22         nativeBuildInputs = [ pkgs.nats-server ];
23       }
24       ''
25         nats-server --config "${configFile}" -t
26         ln -s "${configFile}" "$out"
27       '';
31   ### Interface
33   options = {
34     services.nats = {
35       enable = mkEnableOption "NATS messaging system";
37       user = mkOption {
38         type = types.str;
39         default = "nats";
40         description = "User account under which NATS runs.";
41       };
43       group = mkOption {
44         type = types.str;
45         default = "nats";
46         description = "Group under which NATS runs.";
47       };
49       serverName = mkOption {
50         default = "nats";
51         example = "n1-c3";
52         type = types.str;
53         description = ''
54           Name of the NATS server, must be unique if clustered.
55         '';
56       };
58       jetstream = mkEnableOption "JetStream";
60       port = mkOption {
61         default = 4222;
62         type = types.port;
63         description = ''
64           Port on which to listen.
65         '';
66       };
68       dataDir = mkOption {
69         default = "/var/lib/nats";
70         type = types.path;
71         description = ''
72           The NATS data directory. Only used if JetStream is enabled, for
73           storing stream metadata and messages.
75           If left as the default value this directory will automatically be
76           created before the NATS server starts, otherwise the sysadmin is
77           responsible for ensuring the directory exists with appropriate
78           ownership and permissions.
79         '';
80       };
82       settings = mkOption {
83         default = { };
84         type = format.type;
85         example = literalExpression ''
86           {
87             jetstream = {
88               max_mem = "1G";
89               max_file = "10G";
90             };
91           };
92         '';
93         description = ''
94           Declarative NATS configuration. See the
95           [
96           NATS documentation](https://docs.nats.io/nats-server/configuration) for a list of options.
97         '';
98       };
99     };
100   };
102   ### Implementation
104   config = mkIf cfg.enable {
105     services.nats.settings = {
106       server_name = cfg.serverName;
107       port = cfg.port;
108       jetstream = optionalAttrs cfg.jetstream { store_dir = cfg.dataDir; };
109     };
111     systemd.services.nats = {
112       description = "NATS messaging system";
113       wantedBy = [ "multi-user.target" ];
114       after = [ "network.target" ];
116       serviceConfig = mkMerge [
117         (mkIf (cfg.dataDir == "/var/lib/nats") {
118           StateDirectory = "nats";
119           StateDirectoryMode = "0750";
120         })
121         {
122           Type = "simple";
123           ExecStart = "${pkgs.nats-server}/bin/nats-server -c ${validateConfig configFile}";
124           ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
125           ExecStop = "${pkgs.coreutils}/bin/kill -SIGINT $MAINPID";
126           Restart = "on-failure";
128           User = cfg.user;
129           Group = cfg.group;
131           # Hardening
132           CapabilityBoundingSet = "";
133           LimitNOFILE = 800000; # JetStream requires 2 FDs open per stream.
134           LockPersonality = true;
135           MemoryDenyWriteExecute = true;
136           NoNewPrivileges = true;
137           PrivateDevices = true;
138           PrivateTmp = true;
139           PrivateUsers = true;
140           ProcSubset = "pid";
141           ProtectClock = true;
142           ProtectControlGroups = true;
143           ProtectHome = true;
144           ProtectHostname = true;
145           ProtectKernelLogs = true;
146           ProtectKernelModules = true;
147           ProtectKernelTunables = true;
148           ProtectProc = "invisible";
149           ProtectSystem = "strict";
150           ReadOnlyPaths = [ ];
151           ReadWritePaths = [ cfg.dataDir ];
152           RestrictAddressFamilies = [
153             "AF_INET"
154             "AF_INET6"
155           ];
156           RestrictNamespaces = true;
157           RestrictRealtime = true;
158           RestrictSUIDSGID = true;
159           SystemCallFilter = [
160             "@system-service"
161             "~@privileged"
162           ];
163           UMask = "0077";
164         }
165       ];
166     };
168     users.users = mkIf (cfg.user == "nats") {
169       nats = {
170         description = "NATS daemon user";
171         isSystemUser = true;
172         group = cfg.group;
173         home = cfg.dataDir;
174       };
175     };
177     users.groups = mkIf (cfg.group == "nats") { nats = { }; };
178   };