{ config, lib, pkgs, ... }: let inherit (lib) mkEnableOption mkIf mkOption optional ; cfg = config.my.services.navidrome; domain = config.networking.domain; hostname = config.networking.hostName; fqdn = "${hostname}.${domain}"; in { options.my.services.navidrome = let inherit (lib) types; in { enable = mkEnableOption "Navidrome"; musicFolder = { path = mkOption { type = types.str; default = "./music"; }; backup = mkEnableOption "backup the music folder"; }; }; config = mkIf cfg.enable { services.navidrome = { enable = true; settings = { Address = "127.0.0.1"; Port = 4533; LastFM.Enabled = false; MusicFolder = cfg.musicFolder.path; }; }; my.services.restic-backup = { paths = ["/var/lib/navidrome"] ++ optional cfg.musicFolder.backup cfg.musicFolder.path; exclude = ["/var/lib/navidrome/cache"]; }; services.nginx.virtualHosts."music.${domain}" = { forceSSL = true; useACMEHost = fqdn; listen = [ # FIXME: hardcoded tailscale IP { addr = "100.115.172.44"; port = 443; ssl = true; } { addr = "100.115.172.44"; port = 80; ssl = false; } ]; locations."/" = { proxyPass = "http://127.0.0.1:${toString config.services.navidrome.settings.Port}/"; proxyWebsockets = true; }; }; security.acme.certs.${fqdn}.extraDomainNames = ["music.${domain}"]; }; }