Cross-section of the home server: public edge, split-horizon DNS, Traefik, Authelia, and every kubenix namespace on the cluster.
Dwg. ω-01 · rev. live tree
Cluster issuer · Cloudflare DNS-01
Default policy · two-factor
01 Process stack
LAN clients go straight to 192.168.8.100. Public HTTP is a relay: Cloudflare (orange) → Fly.io (flyio.wsosnowski.pl) → Tailscale → Traefik on omega. Traefik then hands off to Authelia, the SSO bridge, or the app’s own login.
LAN and cluster resolvers pin the home zones to 192.168.8.100. Public records live in Cloudflare and almost all CNAMEs go to flyio.wsosnowski.pl (proxied). Fly then reaches omega over Tailscale. Nested VM names are the exception: DNS-only A to 83.6.22.108, because a proxied Fly CNAME breaks those certificates.
Homepage and most homelab apps. Never wildcard all of wito.dev.
Wildcard + extraHosts
vm / local.wito.dev
Sandbox VMs. Extra hosts only: agent, kit, ssh, sso.
Public, not whole-zone
Cloudflare → Fly
Proxied CNAME to flyio.wsosnowski.pl. Registry stays DNS-only. Nested *.vm uses origin A.
CoreDNS serves the same zones inside the cluster and forwards everything else to 192.168.1.1. CI pods also get host_aliases for registry, gitlab, and minio so jobs that skip cluster DNS still hit omega.
03 Auth logic
Authelia owns two cookie domains. Apps on a third zone cannot see those cookies, so Traefik sends them through the SSO bridge: mint a session on techtailors, then set a cookie on wito.dev or slopkit.dev.
Same-zone ForwardAuth
Traefik chains authelia-proto then authelia forward-auth to :9091/api/authz/forward-auth.
Missing session → browser goes to auth.wsosnowski.pl or auth.techtailors.net.
File backend, argon2id, SMTP via Scaleway TEM. Default policy is two-factor. Auth hosts themselves bypass.
Session cookie is scoped to the parent domain. Used by homepage, Grafana, n8n, OpenCode.
Hermes, web-ssh, OpenHands. GitLab, Nextcloud, Plex and the *arr stack keep native logins.
04 Service catalog
Every kubenix registry entry, plus host-plane jobs that are not in the cluster. Click a plate for hostname, auth, and dependencies.
05 Dependencies
Runtime edges only: who talks to whom. Ingress to Traefik is implied for every public host and is omitted so the graph stays readable. Click a hub or a catalog plate to focus one service.
Needs
Focus
Needed by
06 Host plane
NixOS 26.05 stable, impermanence, doas. k3s waits on LUKS mounts. Storage classes are owned by kubenix, not the k3s local-storage addon.
NixOS on the metal
k3s server — --disable=local-storage, custom resolv.conf, wide node-port range.
mount-encrypted-disks — disko mount of /mnt/storage/{fast,slow}/essential before k3s.
Podman dockerCompat socket for GitLab CI image builds (no dind).
GitLab shell runner — Nix tag, shared with discworld.