caddy: Configure virtual hosts inside each web-service's module instead of in the host configs

This commit is contained in:
SebastianStork 2025-11-08 22:52:01 +01:00
parent dfeb11dfbd
commit c9f05a040e
Signed by: SebastianStork
SSH key fingerprint: SHA256:tRrGdjYOwgHxpSc/wTOZQZEjxcb15P0tyXRsbAfd+2Q
23 changed files with 130 additions and 170 deletions

View file

@ -133,9 +133,13 @@ in
};
custom = {
services.restic.backups.syncthing = lib.mkIf cfg.doBackups {
conflictingService = "syncthing.service";
paths = [ dataDir ];
services = {
caddy.virtualHosts.${cfg.gui.domain}.port = lib.mkIf (cfg.gui.domain != null) cfg.gui.port;
restic.backups.syncthing = lib.mkIf cfg.doBackups {
conflictingService = "syncthing.service";
paths = [ dataDir ];
};
};
persist.directories = [ dataDir ];

View file

@ -47,9 +47,13 @@ in
};
custom = {
services.restic.backups.actual = lib.mkIf cfg.doBackups {
conflictingService = "actual.service";
paths = [ dataDir ];
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.actual = lib.mkIf cfg.doBackups {
conflictingService = "actual.service";
paths = [ dataDir ];
};
};
persist.directories = [ dataDir ];

View file

@ -168,5 +168,7 @@ in
'';
};
};
custom.services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
}

View file

@ -53,9 +53,13 @@ in
};
custom = {
services.restic.backups.filebrowser = lib.mkIf cfg.doBackups {
conflictingService = "filebrowser.service";
paths = [ dataDir ];
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.filebrowser = lib.mkIf cfg.doBackups {
conflictingService = "filebrowser.service";
paths = [ dataDir ];
};
};
persist.directories = [ dataDir ];

View file

@ -119,9 +119,13 @@ in
'';
custom = {
services.restic.backups.forgejo = lib.mkIf cfg.doBackups {
conflictingService = "forgejo.service";
paths = [ config.services.forgejo.stateDir ];
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.forgejo = lib.mkIf cfg.doBackups {
conflictingService = "forgejo.service";
paths = [ config.services.forgejo.stateDir ];
};
};
persist.directories = [ config.services.forgejo.stateDir ];

View file

@ -44,9 +44,13 @@ in
};
custom = {
services.restic.backups.freshrss = lib.mkIf cfg.doBackups {
conflictingService = "freshrss-updater.service";
paths = [ dataDir ];
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.freshrss = lib.mkIf cfg.doBackups {
conflictingService = "freshrss-updater.service";
paths = [ dataDir ];
};
};
persist.directories = [ dataDir ];

View file

@ -103,37 +103,6 @@ in
RemoveIPC = true;
};
custom.services.gatus.endpoints =
let
defaultEndpoints =
self.nixosConfigurations
|> lib.mapAttrs (_: value: value.config.meta.domains.list)
|> lib.concatMapAttrs (
hostName: domains:
domains
|> lib.filter (domain: domain != cfg.domain)
|> lib.map (
domain:
lib.nameValuePair (lib'.subdomainOf domain) {
inherit domain;
group = hostName;
}
)
|> lib.listToAttrs
);
in
lib.mkIf cfg.generateDefaultEndpoints (
defaultEndpoints
// {
"healthchecks.io" = {
group = "external";
domain = "hc-ping.com";
path = "/\${HEALTHCHECKS_PING_KEY}/${config.networking.hostName}-gatus-uptime?create=1";
interval = "2h";
};
}
);
services.gatus = {
enable = true;
package = pkgs-unstable.gatus; # Unstable for the new UI
@ -206,6 +175,43 @@ in
systemd.services.gatus.environment.GATUS_DELAY_START_SECONDS = "5";
custom.persist.directories = [ dataDir ];
custom = {
services = {
gatus.endpoints =
let
defaultEndpoints =
self.nixosConfigurations
|> lib.mapAttrs (_: value: value.config.meta.domains.list)
|> lib.concatMapAttrs (
hostName: domains:
domains
|> lib.filter (domain: domain != cfg.domain)
|> lib.map (
domain:
lib.nameValuePair (lib'.subdomainOf domain) {
inherit domain;
group = hostName;
}
)
|> lib.listToAttrs
);
in
lib.mkIf cfg.generateDefaultEndpoints (
defaultEndpoints
// {
"healthchecks.io" = {
group = "external";
domain = "hc-ping.com";
path = "/\${HEALTHCHECKS_PING_KEY}/${config.networking.hostName}-gatus-uptime?create=1";
interval = "2h";
};
}
);
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
persist.directories = [ dataDir ];
};
};
}

View file

@ -170,5 +170,7 @@ in
);
};
};
custom.services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
}

View file

@ -14,23 +14,11 @@ in
type = lib.types.nonEmptyStr;
default = "";
};
port = lib.mkOption {
type = lib.types.port;
default = 8787;
};
};
config = lib.mkIf cfg.enable {
meta = {
domains.list = [ cfg.domain ];
ports.tcp.list = [ cfg.port ];
};
meta.domains.list = [ cfg.domain ];
services.static-web-server = {
enable = true;
listen = "[::]:${toString cfg.port}";
root = "${pkgs.it-tools}/lib";
configuration.general.health = true;
};
custom.services.caddy.virtualHosts.${cfg.domain}.files = "${pkgs.it-tools}/lib";
};
}

View file

@ -55,9 +55,13 @@ in
};
custom = {
services.restic.backups.memos = lib.mkIf cfg.doBackups {
conflictingService = "memos.service";
paths = [ dataDir ];
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.memos = lib.mkIf cfg.doBackups {
conflictingService = "memos.service";
paths = [ dataDir ];
};
};
persist.directories = [ dataDir ];

View file

@ -30,5 +30,7 @@ in
web-root = "disable";
};
};
custom.services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
}

View file

@ -26,5 +26,7 @@ in
ports = [ "127.0.0.1:${toString cfg.port}:3000" ];
pull = "newer";
};
custom.services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
}

View file

@ -73,13 +73,17 @@ in
inherit (config.services.outline) user;
in
{
services.restic.backups.outline = lib.mkIf cfg.doBackups {
conflictingService = "outline.service";
paths = [ dataDir ];
extraConfig.backupPrepareCommand = ''
${lib.getExe pkgs.sudo} --user=${user} ${lib.getExe' config.services.postgresql.package "pg_dump"} outline --format=custom --file=${dataDir}/db.dump
'';
restoreCommand.postRestore = "sudo --user=${user} pg_restore --clean --if-exists --dbname outline ${dataDir}/db.dump";
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.outline = lib.mkIf cfg.doBackups {
conflictingService = "outline.service";
paths = [ dataDir ];
extraConfig.backupPrepareCommand = ''
${lib.getExe pkgs.sudo} --user=${user} ${lib.getExe' config.services.postgresql.package "pg_dump"} outline --format=custom --file=${dataDir}/db.dump
'';
restoreCommand.postRestore = "sudo --user=${user} pg_restore --clean --if-exists --dbname outline ${dataDir}/db.dump";
};
};
persist.directories = [

View file

@ -16,17 +16,10 @@ in
type = lib.types.nonEmptyStr;
default = "";
};
port = lib.mkOption {
type = lib.types.port;
default = 3890;
};
};
config = lib.mkIf cfg.enable {
meta = {
domains.list = [ cfg.domain ];
ports.tcp.list = [ cfg.port ];
};
meta.domains.list = [ cfg.domain ];
systemd.services.generate-blog = {
serviceConfig.Type = "oneshot";
@ -36,9 +29,6 @@ in
script = "nix build github:SebastianStork/blog --out-link ${dataDir} --refresh";
};
services.caddy.virtualHosts.":${toString cfg.port}".extraConfig = ''
root * ${dataDir}
file_server
'';
custom.services.caddy.virtualHosts.${cfg.domain}.files = dataDir;
};
}

View file

@ -52,5 +52,7 @@ in
inherit (cfg) port;
};
};
custom.services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
}

View file

@ -107,10 +107,15 @@ in
);
custom = {
services.restic.backups.radicale = lib.mkIf cfg.doBackups {
conflictingService = "radicale.service";
paths = [ dataDir ];
services = {
caddy.virtualHosts.${cfg.domain}.port = cfg.port;
restic.backups.radicale = lib.mkIf cfg.doBackups {
conflictingService = "radicale.service";
paths = [ dataDir ];
};
};
persist.directories = [ dataDir ];
};
};

View file

@ -44,5 +44,7 @@ in
UI_HOMEDESCRIPTION = cfg.branding.description;
};
};
custom.services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
};
}

View file

@ -26,6 +26,10 @@ in
settings.PORT = toString cfg.port;
};
custom.persist.directories = [ config.services.uptime-kuma.settings.DATA_DIR ];
custom = {
services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
persist.directories = [ config.services.uptime-kuma.settings.DATA_DIR ];
};
};
}

View file

@ -57,6 +57,10 @@ in
listenAddress = "localhost:${toString cfg.port}";
};
custom.persist.directories = [ "/var/lib/${config.services.victorialogs.stateDir}" ];
custom = {
services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
persist.directories = [ "/var/lib/${config.services.victorialogs.stateDir}" ];
};
};
}

View file

@ -62,6 +62,10 @@ in
];
};
custom.persist.directories = [ "/var/lib/${config.services.victoriametrics.stateDir}" ];
custom = {
services.caddy.virtualHosts.${cfg.domain}.port = cfg.port;
persist.directories = [ "/var/lib/${config.services.victoriametrics.stateDir}" ];
};
};
}