Research-Stack/4-Infrastructure/k3s-flake/k3s-server.nix
Brandon Schneider ac4e23dc9b Expand devcontainer with full Python stack, add MCP servers (Notion/AWS), strengthen Lean theorems
- .devcontainer/Dockerfile: add PostgreSQL client libs, OpenSSL/libffi headers, gfortran/BLAS for scipy, rclone; install full Python dependency set (boto3, psycopg2-binary, fastapi, uvicorn, notion-client, httpx, pytest, numpy, scipy, etc.) in uv-managed venv; add rclone S3 gateway init script as ENTRYPOINT
- .devcontainer/devcontainer.json: switch from build to pre-built image (localhost/research
2026-05-19 01:52:14 -05:00

117 lines
3 KiB
Nix

{ config, pkgs, lib, hostName, serverAddr, domain, ... }:
let
caddyWithPorkbun = pkgs.caddy.withPlugins {
plugins = [ "github.com/caddy-dns/porkbun@v0.3.1" ];
hash = "sha256-X11vSQRbBg25I1eSKF2O5QBRS7zGOtdGhLISiwrHclw=";
};
in {
##########################################################################
# 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;
path = "/etc/caddy/porkbun.env";
};
sops.secrets.authentik-secrets = {
sopsFile = ./secrets/authentik-secrets.age;
};
services.k3s = {
enable = true;
role = "server";
clusterInit = true;
extraFlags = [ "--disable=traefik" ];
};
systemd.services.caddy.serviceConfig.EnvironmentFile = [ "/etc/caddy/porkbun.env" ];
services.caddy = {
enable = true;
package = caddyWithPorkbun;
extraConfig = ''
auth.${domain} {
tls {
dns porkbun {
api_key {$PORKBUN_API_KEY}
api_secret_key {$PORKBUN_SECRET_KEY}
}
}
reverse_proxy 127.0.0.1:30800
}
status.${domain} {
tls {
dns porkbun {
api_key {$PORKBUN_API_KEY}
api_secret_key {$PORKBUN_SECRET_KEY}
}
}
reverse_proxy 127.0.0.1:30801
}
apps.${domain} {
tls {
dns porkbun {
api_key {$PORKBUN_API_KEY}
api_secret_key {$PORKBUN_SECRET_KEY}
}
}
reverse_proxy 127.0.0.1:30802
}
home.${domain} {
tls {
dns porkbun {
api_key {$PORKBUN_API_KEY}
api_secret_key {$PORKBUN_SECRET_KEY}
}
}
reverse_proxy 127.0.0.1:30803
}
pulse.${domain} {
tls {
dns porkbun {
api_key {$PORKBUN_API_KEY}
api_secret_key {$PORKBUN_SECRET_KEY}
}
}
reverse_proxy 127.0.0.1:30804
}
${domain} {
tls {
dns porkbun {
api_key {$PORKBUN_API_KEY}
api_secret_key {$PORKBUN_SECRET_KEY}
}
}
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 = {
AUTHENTIK_SECRETS = "${config.sops.secrets.authentik-secrets.path}";
};
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
Restart = "on-failure";
RestartSec = 10;
ExecStart = "${./scripts/deploy-services.sh}";
};
};
}