Add access to traefik dashboard with basic auth

This commit is contained in:
JuliusFreudenberger 2026-07-19 00:07:02 +02:00
parent 377c7dd09a
commit 4343a3d231
4 changed files with 38 additions and 5 deletions

8
flake.lock generated
View file

@ -476,11 +476,11 @@
"secrets": { "secrets": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1781738124, "lastModified": 1784411728,
"narHash": "sha256-fff++SWoSeZJk9wwns/XzCHGU5ZOTDie821At68gH9I=", "narHash": "sha256-gC9WWL9FBGG2wm+cmeeYLuHmhfaj7Py15iSkKkeSWLE=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "fdf7619e52d6bea25224f19da87b6946a6f23cf7", "rev": "2cf90c5c7ad4d13f2116ae7e77febfe64b717850",
"revCount": 41, "revCount": 42,
"type": "git", "type": "git",
"url": "ssh://git@git.jfreudenberger.de/JuliusFreudenberger/nix-private.git" "url": "ssh://git@git.jfreudenberger.de/JuliusFreudenberger/nix-private.git"
}, },

View file

@ -31,7 +31,7 @@
services = { services = {
traefik-docker = { traefik-docker = {
enable = true; enable = true;
dashboardUrl = "traefik.netbird.jfreudenberger.de"; dashboardUrl = "traefik.srv03.jfreudenberger.de";
dnsChallengeProvider = "inwx"; dnsChallengeProvider = "inwx";
dnsSecrets = [ dnsSecrets = [
config.age.secrets.inwx config.age.secrets.inwx

View file

@ -5,5 +5,6 @@
pocket-id.file = "${inputs.secrets}/secrets/srv03/pocket-id"; pocket-id.file = "${inputs.secrets}/secrets/srv03/pocket-id";
netbird-server.file = "${inputs.secrets}/secrets/srv03/netbird-server"; netbird-server.file = "${inputs.secrets}/secrets/srv03/netbird-server";
netbird-proxy.file = "${inputs.secrets}/secrets/srv03/netbird-proxy"; netbird-proxy.file = "${inputs.secrets}/secrets/srv03/netbird-proxy";
traefik-basic-auth.file = "${inputs.secrets}/secrets/srv03/traefik-basic-auth";
}; };
} }

View file

@ -64,6 +64,13 @@ in {
"traefik" "traefik"
"docker-socket" "docker-socket"
]; ];
labels = {
"traefik.enable" = "true";
"traefik.http.routers.dashboard.rule" = "Host(`${cfg.dashboardUrl}`)";
"traefik.http.routers.dashboard.entrypoints" = "websecure";
"traefik.http.routers.dashboard.service" = "api@internal";
"traefik.http.routers.dashboard.middlewares" = "auth@file";
};
environmentFiles = lib.forEach cfg.dnsSecrets (secret: secret.path); environmentFiles = lib.forEach cfg.dnsSecrets (secret: secret.path);
volumes = let volumes = let
traefik-providers-config = (pkgs.formats.yaml {}).generate "traefik-providers-config" { traefik-providers-config = (pkgs.formats.yaml {}).generate "traefik-providers-config" {
@ -72,6 +79,7 @@ in {
in [ in [
"/var/run/docker.sock:/var/run/docker.sock" "/var/run/docker.sock:/var/run/docker.sock"
"${traefik-providers-config}:/dynamic-config/providers.yaml:ro" "${traefik-providers-config}:/dynamic-config/providers.yaml:ro"
"/run/traefik/basicAuth.yaml:/dynamic-config/basicAuth.yaml:ro"
]; ];
extraOptions = [ extraOptions = [
''--mount=type=volume,source=certs,target=/certs,volume-driver=local'' ''--mount=type=volume,source=certs,target=/certs,volume-driver=local''
@ -110,6 +118,30 @@ in {
]; ];
}; };
systemd.services.generate-traefik-config = {
description = "Generate Traefik basic auth config";
wantedBy = [ "multi-user.target" ];
before = [ "docker-traefik.service" ];
serviceConfig.Type = "oneshot";
script = ''
set -eu
mkdir -p /run/traefik
BASIC_AUTH="$(cat ${config.age.secrets.traefik-basic-auth.path})"
cat > /run/traefik/basicAuth.yaml <<EOF
http:
middlewares:
auth:
basicAuth:
users:
- "$BASIC_AUTH"
EOF
'';
};
systemd.services."docker-network-traefik" = { systemd.services."docker-network-traefik" = {
path = [ pkgs.docker_29 ]; path = [ pkgs.docker_29 ];
serviceConfig = { serviceConfig = {