uwsgi-service: Add user/group for uwsgi service. Also add a uwsgi directory under /run (defaulting to /run/uwsgi) where the uwsgi user can place sockets.

Changed files
+37 -7
nixos
modules
misc
services
web-servers
+2
nixos/modules/misc/ids.nix
···
ripple-rest = 198;
nix-serve = 199;
tvheadend = 200;
+
uwsgi = 201;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
···
#ripple-rest = 198; #unused
#nix-serve = 199; #unused
#tvheadend = 200; #unused
+
uwsgi = 201;
# When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal
+35 -7
nixos/modules/services/web-servers/uwsgi.nix
···
options = {
services.uwsgi = {
-
+
enable = mkOption {
type = types.bool;
default = false;
description = "Enable uWSGI";
};
+
runDir = mkOption {
+
type = types.string;
+
default = "/run/uwsgi";
+
description = "Where uWSGI communication sockets can live";
+
};
+
instance = mkOption {
type = types.attrs;
default = {
···
moin = {
type = "normal";
python2Packages = self: with self; [ moinmoin ];
-
socket = "/run/uwsgi.sock";
+
socket = "${config.services.uwsgi.runDir}/uwsgi.sock";
};
};
}
···
description = "Plugins used with uWSGI";
};
-
};
+
user = mkOption {
+
type = types.str;
+
default = "uwsgi";
+
description = "User account under which uwsgi runs.";
+
};
+
group = mkOption {
+
type = types.str;
+
default = "uwsgi";
+
description = "Group account under which uwsgi runs.";
+
};
+
};
};
config = mkIf cfg.enable {
-
systemd.services.uwsgi = {
wantedBy = [ "multi-user.target" ];
-
+
preStart = ''
+
mkdir -p ${cfg.runDir}
+
chown ${cfg.user}:${cfg.group} ${cfg.runDir}
+
'';
serviceConfig = {
Type = "notify";
-
ExecStart = "${uwsgi}/bin/uwsgi --json ${pkgs.writeText "uwsgi.json" (buildCfg cfg.instance)}";
+
ExecStart = "${uwsgi}/bin/uwsgi --uid ${cfg.user} --gid ${cfg.group} --json ${pkgs.writeText "uwsgi.json" (buildCfg cfg.instance)}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
ExecStop = "${pkgs.coreutils}/bin/kill -INT $MAINPID";
NotifyAccess = "main";
KillSignal = "SIGQUIT";
};
+
};
-
};
+
users.extraUsers = optionalAttrs (cfg.user == "uwsgi") (singleton
+
{ name = "uwsgi";
+
group = cfg.group;
+
uid = config.ids.uids.uwsgi;
+
});
+
+
users.extraGroups = optionalAttrs (cfg.group == "uwsgi") (singleton
+
{ name = "uwsgi";
+
gid = config.ids.gids.uwsgi;
+
});
};
}