{ ... }: let acmeDomainMap = { "jellyfin.grzb.de" = "jellyfin.vs.grzb.de"; "mail-1.grzb.de" = "mail-1.vs.grzb.de"; "matrix.nekover.se" = "matrix.vs.grzb.de"; "netbox.grzb.de" = "netbox.vs.grzb.de"; "grafana.grzb.de" = "metrics.vs.grzb.de"; "jackett.grzb.de" = "torrent.vs.grzb.de"; "jellyseerr.grzb.de" = "jellyseerr.vs.grzb.de"; "radarr.grzb.de" = "torrent.vs.grzb.de"; "searx.nekover.se" = "searx.vs.grzb.de"; "social.nekover.se" = "mastodon.vs.grzb.de"; "sonarr.grzb.de" = "torrent.vs.grzb.de"; "torrent.grzb.de" = "torrent.vs.grzb.de"; "turn.nekover.se" = "coturn.vs.grzb.de"; }; in { services.nginx.virtualHosts = (builtins.mapAttrs (domain: target: { listen = [{ addr = "0.0.0.0"; port = 80; }]; locations."^~ /.well-known/acme-challenge/" = { proxyPass = "http://${target}:80"; }; }) acmeDomainMap); }