caddy: Add file-server capabilities

This commit is contained in:
SebastianStork 2025-11-08 22:11:45 +01:00
parent 8c138d274f
commit dfeb11dfbd
Signed by: SebastianStork
SSH key fingerprint: SHA256:tRrGdjYOwgHxpSc/wTOZQZEjxcb15P0tyXRsbAfd+2Q

View file

@ -20,13 +20,23 @@ let
]; ];
mkVirtualHost = mkVirtualHost =
{ domain, port, ... }: {
domain,
port,
files,
...
}:
lib.nameValuePair domain { lib.nameValuePair domain {
logFormat = "output file ${config.services.caddy.logDir}/${domain}.log { mode 640 }"; logFormat = "output file ${config.services.caddy.logDir}/${domain}.log { mode 640 }";
extraConfig = '' extraConfig = lib.concatLines [
${lib.optionalString (lib'.isTailscaleDomain domain) "bind tailscale/${lib'.subdomainOf domain}"} (lib.optionalString (lib'.isTailscaleDomain domain) "bind tailscale/${lib'.subdomainOf domain}")
reverse_proxy localhost:${toString port} (lib.optionalString (port != null) "reverse_proxy localhost:${toString port}")
''; (lib.optionalString (files != null) ''
root * ${files}
encode
file_server
'')
];
}; };
in in
{ {
@ -49,7 +59,11 @@ in
default = name; default = name;
}; };
port = lib.mkOption { port = lib.mkOption {
type = lib.types.port; type = lib.types.nullOr lib.types.port;
default = null;
};
files = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null; default = null;
}; };
}; };
@ -63,6 +77,11 @@ in
config = lib.mkIf (virtualHosts != [ ]) ( config = lib.mkIf (virtualHosts != [ ]) (
lib.mkMerge [ lib.mkMerge [
{ {
assertions = lib.singleton {
assertion = virtualHosts |> lib.all ({ port, files, ... }: lib.xor (port != null) (files != null));
message = "Each caddy virtual host must set exactly one of `port` or `files`";
};
meta.ports.tcp.list = [ cfg.metricsPort ]; meta.ports.tcp.list = [ cfg.metricsPort ];
services.caddy = { services.caddy = {