Commit 0756258

HPCesia <me@hpcesia.com>
2026-06-20 09:45:16
Add Navidrome service
1 parent 3cb2915
Changed files (2)
modules
hosts
mobius
services
services
modules/hosts/mobius/services/services.nix
@@ -3,6 +3,9 @@
     settings = {
       services.webserver.external = false;
 
+      services.navidrome = {
+        domain = "navidrome.net.trin.one";
+      };
       services.woodpecker.agent.agents = {
         codeberg = {
           server = "grpc.ci.codeberg.org:443";
@@ -18,7 +21,9 @@
   den.aspects.mobius = {
     includes = with den.aspects; [
       services.webserver
+      services.tailscale-nginx-auth
 
+      services.navidrome
       services.woodpecker.agent
     ];
   };
modules/services/navidrome.nix
@@ -0,0 +1,90 @@
+{lib, ...}: {
+  den.aspects.services.navidrome = {
+    settings = {
+      external = lib.mkEnableOption "Whether to expose Navidrome service to public internet";
+      domain = lib.mkOption {
+        type = lib.types.str;
+      };
+      address = lib.mkOption {
+        type = lib.types.str;
+        default = "127.0.0.1";
+      };
+      port = lib.mkOption {
+        type = lib.types.port;
+        default = 4533;
+      };
+    };
+
+    persist = {
+      directories = [
+        {
+          directory = "/var/lib/navidrome/artwork";
+          user = "navidrome";
+          group = "navidrome";
+          mode = "0711";
+        }
+        {
+          directory = "/var/lib/navidrome/music";
+          user = "navidrome";
+          group = "navidrome";
+          mode = "0775";
+        }
+      ];
+      files = [
+        {
+          file = "/var/lib/navidrome/navidrome.db";
+          parentDirectory = {
+            user = "navidrome";
+            group = "navidrome";
+            mode = "0755";
+          };
+        }
+      ];
+    };
+
+    cache = {
+      directories = [
+        {
+          directory = "/var/lib/navidrome/cache";
+          user = "navidrome";
+          group = "navidrome";
+          mode = "0700";
+        }
+      ];
+    };
+
+    reverseProxy = {host, ...}: let
+      cfg = host.settings.services.navidrome;
+    in
+      lib.optionalAttrs (cfg.external) {
+        ${cfg.domain} = {
+          port = cfg.port;
+        };
+      };
+
+    reverseProxyTailscale = {host, ...}: let
+      cfg = host.settings.services.navidrome;
+    in
+      lib.optionalAttrs (!cfg.external) {
+        ${cfg.domain} = {
+          port = cfg.port;
+        };
+      };
+
+    nixos = {host, ...}: let
+      cfg = host.settings.services.navidrome;
+    in {
+      services.navidrome = {
+        enable = true;
+        settings = {
+          Address = cfg.address;
+          Port = cfg.port;
+        };
+      };
+    };
+
+    user = {user, ...}: {
+      extraGroups = lib.optional (lib.elem "admins" user.groups) "navidrome";
+    };
+  };
+}