1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7
8with lib;
9
10let
11 cfg = config.services.merecat;
12 format = pkgs.formats.keyValue {
13 mkKeyValue = generators.mkKeyValueDefault {
14 mkValueString =
15 v:
16 # In merecat.conf, booleans are "true" and "false"
17 if builtins.isBool v then if v then "true" else "false" else generators.mkValueStringDefault { } v;
18 } "=";
19 };
20 configFile = format.generate "merecat.conf" cfg.settings;
21
22in
23{
24
25 options.services.merecat = {
26
27 enable = mkEnableOption "Merecat HTTP server";
28
29 settings = mkOption {
30 inherit (format) type;
31 default = { };
32 description = ''
33 Merecat configuration. Refer to {manpage}`merecat(8)` for details on supported values.
34 '';
35 example = {
36 hostname = "localhost";
37 port = 8080;
38 virtual-host = true;
39 directory = "/srv/www";
40 };
41 };
42
43 };
44
45 config = mkIf cfg.enable {
46
47 systemd.services.merecat = {
48 description = "Merecat HTTP server";
49 after = [ "network.target" ];
50 wantedBy = [ "multi-user.target" ];
51 serviceConfig = {
52 DynamicUser = true;
53 ExecStart = "${pkgs.merecat}/bin/merecat -n -f ${configFile}";
54 AmbientCapabilities = lib.mkIf ((cfg.settings.port or 80) < 1024) [ "CAP_NET_BIND_SERVICE" ];
55 };
56 };
57
58 };
59
60}