| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  | # A FLOSS self-hosted, subsonic compatible music server | 
					
						
							|  |  |  | { config, lib, pkgs, ... }: | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   cfg = config.my.services.navidrome; | 
					
						
							| 
									
										
										
										
											2023-11-07 23:13:51 +01:00
										 |  |  |   inherit (config.networking) domain; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  | in | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   options.my.services.navidrome = with lib; { | 
					
						
							|  |  |  |     enable = mkEnableOption "Navidrome Music Server"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     settings = mkOption { | 
					
						
							| 
									
										
										
										
											2023-11-07 23:13:51 +01:00
										 |  |  |       inherit (pkgs.formats.json { }) type; | 
					
						
							| 
									
										
										
										
											2023-06-01 00:56:51 +02:00
										 |  |  |       default = { | 
					
						
							|  |  |  |         EnableSharing = true; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  |       example = { | 
					
						
							|  |  |  |         "LastFM.ApiKey" = "MYKEY"; | 
					
						
							|  |  |  |         "LastFM.Secret" = "MYSECRET"; | 
					
						
							|  |  |  |         "Spotify.ID" = "MYKEY"; | 
					
						
							|  |  |  |         "Spotify.Secret" = "MYSECRET"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Additional settings. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     port = mkOption { | 
					
						
							|  |  |  |       type = types.port; | 
					
						
							|  |  |  |       default = 4533; | 
					
						
							|  |  |  |       example = 8080; | 
					
						
							|  |  |  |       description = "Internal port for webui"; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     musicFolder = mkOption { | 
					
						
							|  |  |  |       type = types.str; | 
					
						
							|  |  |  |       example = "/mnt/music/"; | 
					
						
							|  |  |  |       description = "Music folder"; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = lib.mkIf cfg.enable { | 
					
						
							| 
									
										
										
										
											2023-11-12 23:36:30 +01:00
										 |  |  |     services = { | 
					
						
							|  |  |  |       navidrome = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-12 23:36:30 +01:00
										 |  |  |         settings = cfg.settings // { | 
					
						
							|  |  |  |           Port = cfg.port; | 
					
						
							|  |  |  |           Address = "127.0.0.1"; | 
					
						
							|  |  |  |           MusicFolder = cfg.musicFolder; | 
					
						
							|  |  |  |           LogLevel = "info"; | 
					
						
							|  |  |  |           Prometheus.Enabled = config.services.prometheus.enable; | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-12 23:36:30 +01:00
										 |  |  |       prometheus = { | 
					
						
							|  |  |  |         scrapeConfigs = [ | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             job_name = "navidrome"; | 
					
						
							|  |  |  |             static_configs = [ | 
					
						
							|  |  |  |               { | 
					
						
							|  |  |  |                 targets = [ "127.0.0.1:${toString cfg.port}" ]; | 
					
						
							|  |  |  |                 labels = { | 
					
						
							|  |  |  |                   instance = config.networking.hostName; | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             ]; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       grafana.provision = { | 
					
						
							|  |  |  |         dashboards.settings.providers = [ | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name = "Navidrome"; | 
					
						
							|  |  |  |             options.path = pkgs.grafana-dashboards.navidrome; | 
					
						
							|  |  |  |             disableDeletion = true; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2023-06-01 00:56:51 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2023-04-13 21:06:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-18 22:53:01 +02:00
										 |  |  |     my.services.prometheus.rules = { | 
					
						
							|  |  |  |       navidrome_not_enough_albums = { | 
					
						
							|  |  |  |         condition = ''http_navidrome_album_count != 1''; | 
					
						
							|  |  |  |         description = "navidrome: not enough albums as expected: {{$value}}"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-12 23:36:30 +01:00
										 |  |  |     my.services.nginx.virtualHosts = [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         subdomain = "music"; | 
					
						
							|  |  |  |         inherit (cfg) port; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  |     webapps.apps.navidrome = { | 
					
						
							|  |  |  |       dashboard = { | 
					
						
							| 
									
										
										
										
											2022-12-25 12:20:20 +01:00
										 |  |  |         name = "Music"; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  |         category = "media"; | 
					
						
							|  |  |  |         icon = "music"; | 
					
						
							| 
									
										
										
										
											2023-11-12 20:39:44 +01:00
										 |  |  |         url = "https://music.${domain}/app/#/login"; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:17:30 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |