{ lib, config, inputs, ... }: let proxyReverseServices = [ "bazarr" "firefox-syncserver" "flame" "flameSecret" "isso" "kavita" "linkwarden" "maloja" "mealie" "metube" "microbin" "multi-scrobbler" "nix-serve" "plausible" "shiori" "vaultwarden" "yamtrack" ]; proxyReverseFixServices = [ "atticd" "audiobookshelf" "gitea" "lidarr" "ombi" "radarr" "sonarr" ]; proxyReversePrivateServices = [ "homepage" "prowlarr" "stash" ]; mkServiceConfig = type: services: lib.listToAttrs (map (name: lib.nameValuePair name { inherit type; }) services); standardProxyServices = (mkServiceConfig "proxyReverse" proxyReverseServices) // (mkServiceConfig "proxyReverseFix" proxyReverseFixServices) // (mkServiceConfig "proxyReversePrivate" proxyReversePrivateServices); generateProxyConfig = serviceName: serviceConfig: let cfg = config.my.servers.${serviceName}; proxyFunc = if serviceConfig.type == "proxyReverse" then inputs.self.lib.proxyReverse else if serviceConfig.type == "proxyReverseFix" then inputs.self.lib.proxyReverseFix else if serviceConfig.type == "proxyReversePrivate" then inputs.self.lib.proxyReversePrivate else throw "Unknown proxy type: ${serviceConfig.type}"; in lib.nameValuePair cfg.host (lib.mkIf cfg.enableProxy (proxyFunc cfg)); in { config = lib.mkIf config.my.enableProxy { services.nginx.virtualHosts = lib.mapAttrs' generateProxyConfig standardProxyServices; }; }