2025-12-06 16:35:30 +01:00
|
|
|
{
|
|
|
|
|
config,
|
|
|
|
|
lib,
|
|
|
|
|
...
|
|
|
|
|
}:
|
|
|
|
|
with lib; let
|
|
|
|
|
cfg = config.mySystem.services.traefik;
|
|
|
|
|
in {
|
|
|
|
|
options.mySystem.services.traefik = {
|
|
|
|
|
enable = mkEnableOption "Enable Traefik";
|
2026-02-08 00:20:44 +01:00
|
|
|
email = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
default = "";
|
|
|
|
|
};
|
2025-12-06 16:35:30 +01:00
|
|
|
dataDir = mkOption {
|
|
|
|
|
type = types.path;
|
|
|
|
|
default = "/tank/traefik";
|
2026-02-08 00:20:44 +01:00
|
|
|
example = "/path/to/traefik/data";
|
2025-12-06 16:35:30 +01:00
|
|
|
};
|
2026-02-08 00:20:44 +01:00
|
|
|
environmentFiles = mkOption {
|
|
|
|
|
type = types.listOf types.path;
|
|
|
|
|
example = ["/var/traefik/traefik.env"];
|
|
|
|
|
default = [];
|
|
|
|
|
};
|
|
|
|
|
dynamicConfigFile = mkOption {
|
|
|
|
|
type = types.path;
|
|
|
|
|
default = "${cfg.dataDir}/traefik.yaml";
|
|
|
|
|
example = "/var/traefik/dynamic.yaml";
|
2025-12-06 16:35:30 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
config.services.traefik = {
|
2026-02-08 00:20:44 +01:00
|
|
|
inherit (cfg) enable dynamicConfigFile environmentFiles;
|
2025-12-06 16:35:30 +01:00
|
|
|
staticConfigOptions = {
|
|
|
|
|
api.dashboard = true;
|
|
|
|
|
log = {
|
|
|
|
|
level = "INFO";
|
|
|
|
|
filePath = "${cfg.dataDir}/traefik.log";
|
|
|
|
|
format = "json";
|
|
|
|
|
};
|
|
|
|
|
accessLog.filePath = "${cfg.dataDir}/access.log";
|
|
|
|
|
entryPoints = {
|
2026-02-08 00:20:44 +01:00
|
|
|
web = {
|
2025-12-06 16:35:30 +01:00
|
|
|
address = ":80";
|
|
|
|
|
asDefault = true;
|
|
|
|
|
http.redirections.entrypoint = {
|
2026-02-08 00:20:44 +01:00
|
|
|
to = "websecure";
|
2025-12-06 16:35:30 +01:00
|
|
|
scheme = "https";
|
|
|
|
|
};
|
|
|
|
|
};
|
2026-02-08 00:20:44 +01:00
|
|
|
websecure = {
|
2025-12-06 16:35:30 +01:00
|
|
|
address = ":443";
|
|
|
|
|
asDefault = true;
|
2026-02-08 00:20:44 +01:00
|
|
|
httpChallenge.entryPoint = "websecure";
|
2025-12-06 16:35:30 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
providers.docker = {
|
|
|
|
|
endpoint = "unix:///var/run/docker.sock";
|
|
|
|
|
exposedByDefault = false;
|
|
|
|
|
};
|
|
|
|
|
certificatesResolvers.cloudflare.acme = {
|
|
|
|
|
inherit (cfg) email;
|
|
|
|
|
storage = "${cfg.dataDir}/acme.json";
|
|
|
|
|
dnsChallenge = {
|
|
|
|
|
provider = "cloudflare";
|
|
|
|
|
resolvers = ["1.1.1.1:53" "1.0.0.1:53"];
|
2026-02-08 00:20:44 +01:00
|
|
|
propagation.delayBeforeChecks = 60;
|
2025-12-06 16:35:30 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
}
|