@@ -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";
+ };
+ };
+}