gateway: per-vhost public flag, private listen addresses, and IPv6 listeners
This commit is contained in:
parent
74754d1584
commit
fbbdf26a19
1 changed files with 364 additions and 25 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# Renders `services.hyperhive.gateway.vhosts` into
|
||||
# `services.nginx.virtualHosts`: each declared vhost keeps what its module
|
||||
# wrote and gets the gateway's `listen`, the TLS attributes for its name and
|
||||
# the security headers.
|
||||
# wrote and gets the gateway's `listen` (the private one when it sets
|
||||
# `public = false`), the TLS attributes for its name and the security headers.
|
||||
#
|
||||
# Its own module rather than part of ./default.nix because the
|
||||
# "declared while the gateway is off" assertion has to hold when
|
||||
|
|
@ -9,6 +9,7 @@
|
|||
{ lib, config, ... }:
|
||||
let
|
||||
cfg = config.services.hyperhive.gateway;
|
||||
listen = import ./listen.nix { inherit lib; };
|
||||
|
||||
# What the gateway owns on a vhost. A declared vhost naming one of these
|
||||
# fails the eval.
|
||||
|
|
@ -26,12 +27,16 @@ let
|
|||
name: map (attr: "${name}.${attr}") (lib.filter (a: cfg.vhosts.${name} ? ${a}) gatewayOwned)
|
||||
) (lib.attrNames cfg.vhosts);
|
||||
|
||||
privateOnly = lib.filter (name: !cfg.vhosts.${name}.public) (lib.attrNames cfg.vhosts);
|
||||
wildcardPrivate = lib.filter listen.isWildcard cfg.privateListenAddresses;
|
||||
|
||||
render =
|
||||
name: declared:
|
||||
let
|
||||
own = removeAttrs declared [
|
||||
"_module"
|
||||
"certificate"
|
||||
"public"
|
||||
"securityHeaders"
|
||||
];
|
||||
base =
|
||||
|
|
@ -48,7 +53,7 @@ let
|
|||
tls
|
||||
// own
|
||||
// {
|
||||
listen = cfg.lib.listen;
|
||||
listen = if declared.public then cfg.lib.listen else cfg.lib.privateListen;
|
||||
extraConfig =
|
||||
lib.optionalString declared.securityHeaders cfg.lib.securityHeaders + (own.extraConfig or "");
|
||||
}
|
||||
|
|
@ -83,6 +88,26 @@ in
|
|||
`certificate` on the vhost.
|
||||
'';
|
||||
}
|
||||
{
|
||||
assertion = privateOnly == [ ] || cfg.privateListenAddresses != [ ];
|
||||
message = ''
|
||||
services.hyperhive.gateway.vhosts sets `public = false` on
|
||||
${lib.concatStringsSep ", " privateOnly}
|
||||
while services.hyperhive.gateway.privateListenAddresses is empty,
|
||||
so these vhosts would listen nowhere. Set the addresses they
|
||||
should answer on, or drop `public = false`.
|
||||
'';
|
||||
}
|
||||
{
|
||||
assertion = wildcardPrivate == [ ];
|
||||
message = ''
|
||||
services.hyperhive.gateway.privateListenAddresses holds
|
||||
${lib.concatStringsSep ", " wildcardPrivate}, which is every address
|
||||
of the host, not a private one: the vhosts with `public = false`
|
||||
would answer on the public address too. List the host's private
|
||||
addresses (a WireGuard interface's, say).
|
||||
'';
|
||||
}
|
||||
];
|
||||
}
|
||||
(lib.mkIf cfg.enable {
|
||||
|
|
|
|||
Loading…
Reference in a new issue