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}