main
 1{lib, ...}: {
 2  den.aspects.services.navidrome = {
 3    settings = {
 4      external = lib.mkEnableOption "Whether to expose Navidrome service to public internet";
 5      domain = lib.mkOption {
 6        type = lib.types.str;
 7      };
 8      address = lib.mkOption {
 9        type = lib.types.str;
10        default = "127.0.0.1";
11      };
12      port = lib.mkOption {
13        type = lib.types.port;
14        default = 4533;
15      };
16    };
17
18    persist = {
19      directories = [
20        {
21          directory = "/var/lib/navidrome/artwork";
22          user = "navidrome";
23          group = "navidrome";
24          mode = "0711";
25        }
26        {
27          directory = "/var/lib/navidrome/music";
28          user = "navidrome";
29          group = "navidrome";
30          mode = "0775";
31        }
32      ];
33      files = [
34        {
35          file = "/var/lib/navidrome/navidrome.db";
36          parentDirectory = {
37            user = "navidrome";
38            group = "navidrome";
39            mode = "0755";
40          };
41        }
42      ];
43    };
44
45    cache = {
46      directories = [
47        {
48          directory = "/var/lib/navidrome/cache";
49          user = "navidrome";
50          group = "navidrome";
51          mode = "0700";
52        }
53      ];
54    };
55
56    reverseProxy = {host, ...}: let
57      cfg = host.settings.services.navidrome;
58    in
59      lib.optionalAttrs (cfg.external) {
60        ${cfg.domain} = {
61          port = cfg.port;
62        };
63      };
64
65    reverseProxyTailscale = {host, ...}: let
66      cfg = host.settings.services.navidrome;
67    in
68      lib.optionalAttrs (!cfg.external) {
69        ${cfg.domain} = {
70          port = cfg.port;
71        };
72      };
73
74    nixos = {host, ...}: let
75      cfg = host.settings.services.navidrome;
76    in {
77      services.navidrome = {
78        enable = true;
79        settings = {
80          Address = cfg.address;
81          Port = cfg.port;
82        };
83      };
84    };
85
86    user = {user, ...}: {
87      extraGroups = lib.optional (lib.elem "admins" user.groups) "navidrome";
88    };
89  };
90}