main
 1{den, ...}: {
 2  # Example:
 3  #
 4  # reverseProxy = {
 5  #   "example.com" = {
 6  #     # address = "127.0.0.1"
 7  #     port = 12345;
 8  #     https = true;
 9  #     aliases = ["example.org"];
10  #   }
11  # }
12  den.quirks.reverseProxy.description = "Reverse proxies for web services";
13
14  # Mirrors reverseProxy, but these services are never exposed publicly: caddy
15  # only serves them on the owning host's own Tailscale interface, and headscale
16  # publishes them as Magic DNS records pointing at that host's Tailscale IP.
17  den.quirks.reverseProxyTailscale.description = "Reverse proxies for web services exposed only over Tailscale";
18
19  den.aspects.services.webserver.reverse-proxy-processer = {
20    __isPolicy = true;
21    fn = _: let
22      inherit (den.lib.policy) pipe;
23    in [
24      (pipe.from den.quirks.reverseProxy [
25        (pipe.collect ({host, ...}: true))
26        pipe.withProvenance
27      ])
28    ];
29  };
30
31  den.aspects.services.webserver.reverse-proxy-tailscale-processer = {
32    __isPolicy = true;
33    fn = _: let
34      inherit (den.lib.policy) pipe;
35    in [
36      (pipe.from den.quirks.reverseProxyTailscale [
37        (pipe.collect ({host, ...}: true))
38        pipe.withProvenance
39      ])
40    ];
41  };
42}