caddy support multi domain
This commit is contained in:
parent
f15e521895
commit
fdcc829acf
13 changed files with 344 additions and 141 deletions
|
|
@ -14,53 +14,81 @@ in
|
|||
options.my.networking.caddy = {
|
||||
enable = lib.mkEnableOption "Enable caddy as reverse proxy";
|
||||
|
||||
domain = lib.mkOption {
|
||||
default = "example.com";
|
||||
type = lib.types.str;
|
||||
domainsList = lib.mkOption {
|
||||
type = lib.types.listOf (lib.types.attrsOf lib.types.str);
|
||||
description = ''
|
||||
The domain where Caddy is reachable
|
||||
A list of sets, each containing three parameters of type string: domain, email, and cloudflareApiKeyFile.
|
||||
'';
|
||||
default = [
|
||||
{
|
||||
domain = "example.com";
|
||||
email = "user@domain.com";
|
||||
cloudflareApiKeyFile = "/path/to/cloudflare/api/key";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
email = lib.mkOption {
|
||||
default = "user@domain.com";
|
||||
type = lib.types.str;
|
||||
description = ''
|
||||
Email for Certbot
|
||||
'';
|
||||
};
|
||||
# claudflareApiKeyFile = lib.mkOption {
|
||||
# default = "";
|
||||
# type = lib.types.str;
|
||||
# description = ''
|
||||
# Cloudflare API key file
|
||||
# '';
|
||||
# };
|
||||
|
||||
# domain = lib.mkOption {
|
||||
# default = "example.com";
|
||||
# type = lib.types.str;
|
||||
# description = ''
|
||||
# The domain where Caddy is reachable
|
||||
# '';
|
||||
# };
|
||||
|
||||
# email = lib.mkOption {
|
||||
# default = "user@domain.com";
|
||||
# type = lib.types.str;
|
||||
# description = ''
|
||||
# Email for Certbot
|
||||
# '';
|
||||
# };
|
||||
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
age.secrets = {
|
||||
cloudflare-tegola-apiKey = {
|
||||
file = ../../secrets/cloudflare-tegola-apiKey.age;
|
||||
owner = config.services.caddy.user;
|
||||
group = config.services.caddy.group;
|
||||
};
|
||||
};
|
||||
|
||||
# Insted on relying on caddy to provide TLS, we use certbot to get a certificate
|
||||
# https://aottr.dev/posts/2024/08/homelab-setting-up-caddy-reverse-proxy-with-ssl-on-nixos/
|
||||
security.acme = {
|
||||
acceptTerms = true;
|
||||
defaults.email = cfg.email;
|
||||
|
||||
# TESTING ONLY!
|
||||
# defaults.server = "https://acme-staging-v02.api.letsencrypt.org/directory";
|
||||
|
||||
certs."${cfg.domain}" = {
|
||||
group = config.services.caddy.group;
|
||||
certs = lib.mkMerge (
|
||||
map (domainConfig: {
|
||||
"${domainConfig.domain}" = {
|
||||
group = config.services.caddy.group;
|
||||
email = domainConfig.email;
|
||||
domain = domainConfig.domain;
|
||||
extraDomainNames = [ "*.${domainConfig.domain}" ];
|
||||
dnsProvider = "cloudflare";
|
||||
dnsResolver = "1.1.1.1:53";
|
||||
dnsPropagationCheck = true;
|
||||
environmentFile = domainConfig.cloudflareApiKeyFile;
|
||||
};
|
||||
}) cfg.domainsList
|
||||
);
|
||||
|
||||
domain = "${cfg.domain}";
|
||||
extraDomainNames = [ "*.${cfg.domain}" ];
|
||||
dnsProvider = "cloudflare";
|
||||
dnsResolver = "1.1.1.1:53";
|
||||
dnsPropagationCheck = true;
|
||||
environmentFile = config.age.secrets.cloudflare-tegola-apiKey.path;
|
||||
};
|
||||
# certs."${cfg.domain}" = {
|
||||
# group = config.services.caddy.group;
|
||||
|
||||
# domain = "${cfg.domain}";
|
||||
# extraDomainNames = [ "*.${cfg.domain}" ];
|
||||
# dnsProvider = "cloudflare";
|
||||
# dnsResolver = "1.1.1.1:53";
|
||||
# dnsPropagationCheck = true;
|
||||
# environmentFile = cfg.claudflareApiKeyFile;
|
||||
# };
|
||||
};
|
||||
|
||||
services.caddy = {
|
||||
|
|
@ -72,17 +100,33 @@ in
|
|||
}
|
||||
'';
|
||||
|
||||
extraConfig =
|
||||
let
|
||||
certPath = config.security.acme.certs."${cfg.domain}".directory;
|
||||
in
|
||||
''
|
||||
(cloudflare) {
|
||||
tls ${certPath}/cert.pem ${certPath}/key.pem {
|
||||
protocols tls1.3
|
||||
extraConfig = lib.concatStringsSep "\n" (
|
||||
map (
|
||||
domainConfig:
|
||||
let
|
||||
certPath = config.security.acme.certs."${domainConfig.domain}".directory;
|
||||
in
|
||||
''
|
||||
(cloudflare_${domainConfig.domain}) {
|
||||
tls ${certPath}/cert.pem ${certPath}/key.pem {
|
||||
protocols tls1.3
|
||||
}
|
||||
}
|
||||
}
|
||||
'';
|
||||
''
|
||||
) cfg.domainsList
|
||||
);
|
||||
|
||||
# extraConfig =
|
||||
# let
|
||||
# certPath = config.security.acme.certs."${cfg.domain}".directory;
|
||||
# in
|
||||
# ''
|
||||
# (cloudflare) {
|
||||
# tls ${certPath}/cert.pem ${certPath}/key.pem {
|
||||
# protocols tls1.3
|
||||
# }
|
||||
# }
|
||||
# '';
|
||||
};
|
||||
|
||||
systemd.services.caddy.serviceConfig = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue