Research-Stack/4-Infrastructure/k3s-flake/k3s-server.nix
2026-05-25 16:24:21 -05:00

118 lines
2.9 KiB
Nix

{ config, pkgs, lib, hostName, serverAddr, domain, ... }:
{
##########################################################################
# EDIT HERE — set your domain
# The domain below is used for TLS certificates via Porkbun DNS challenge.
# Set PORKBUN_API_KEY and PORKBUN_SECRET_KEY in /etc/caddy/porkbun.env
# (sops-injected via porkbun-env.age).
##########################################################################
sops.secrets.porkbun-env = {
sopsFile = ./secrets/porkbun-env.age;
format = "yaml";
path = "/etc/caddy/porkbun.env";
};
sops.secrets.authentik-secrets = {
sopsFile = ./secrets/authentik-secrets.age;
format = "yaml";
};
services.k3s = {
enable = true;
role = "server";
clusterInit = true;
extraFlags = [
"--disable=traefik"
"--tls-san=100.102.173.61"
"--tls-san=researchstack.info"
"--tls-san=nixos-laptop"
"--advertise-address=100.102.173.61"
"--node-ip=100.102.173.61"
"--flannel-iface=tailscale0"
];
};
systemd.services.caddy.serviceConfig.EnvironmentFile = [ "/etc/caddy/porkbun.env" ];
services.caddy = {
enable = true;
package = pkgs.caddy;
globalConfig = ''
auto_https off
'';
extraConfig = ''
http://auth.${domain} {
reverse_proxy 100.85.244.73:30080
}
http://status.${domain} {
reverse_proxy 127.0.0.1:30801
}
http://apps.${domain} {
reverse_proxy 127.0.0.1:30802
}
http://home.${domain} {
reverse_proxy 127.0.0.1:30803
}
http://pulse.${domain} {
reverse_proxy 127.0.0.1:30804
}
http://dash.${domain} {
reverse_proxy 127.0.0.1:30805
}
http://media.${domain} {
reverse_proxy 127.0.0.1:30810
}
http://vault.${domain} {
reverse_proxy 10.43.130.188:80
}
http://books.${domain} {
reverse_proxy 127.0.0.1:30807
}
http://music.${domain} {
reverse_proxy 127.0.0.1:30809
}
http://mail.${domain} {
reverse_proxy 127.0.0.1:30808
}
http://webmail.${domain} {
reverse_proxy 127.0.0.1:30808
}
http://${domain} {
respond "k3s unified topology Research Stack"
}
'';
};
systemd.services.deploy-k3s-services = {
description = "Deploy k3s topology services";
after = [ "k3s.service" "tailscaled.service" "network-online.target" ];
wants = [ "k3s.service" "tailscaled.service" "network-online.target" ];
wantedBy = [ "multi-user.target" ];
path = with pkgs; [ kubectl ];
environment = {
KUBECONFIG = "/etc/rancher/k3s/k3s.yaml";
AUTHENTIK_SECRETS = "${config.sops.secrets.authentik-secrets.path}";
};
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
Restart = "on-failure";
RestartSec = 10;
ExecStart = "${pkgs.bash}/bin/bash ${./scripts/deploy-services.sh}";
};
};
}