Konfiguration und Secrets
Das Repository trennt öffentliche Deployment-Metadaten von verschlüsselten Credentials:
variables.nixenthält die eingecheckten Standard-Infrastrukturwerte.variables-local.nixenthält lokale Overrides und ist git-ignoriert.secrets/*.ageenthält mit agenix verschlüsselte Credentials.
Infrastrukturparameter
variables-local.nix im Root des NixOS-Konfigurationsrepos anlegen:
{ ... }:
{
domain = "example.org";
domain2 = "example.net";
adminEmail = "admin@example.org";
ldapBaseDN = "dc=example,dc=org";
publicIPv4 = "203.0.113.10";
tailnetIPs = {
blunix = "100.64.0.1";
pinix = "100.64.0.2";
dietpi = "100.64.0.3";
};
}
Die lokale Datei wird automatisch geladen, wenn sie existiert. Sie ist für Domains, IP-Adressen, E-Mail-Adressen und LDAP-Benennung gedacht. Das sind Deployment-Parameter, keine Secrets.
Verschlüsselte Credentials
Niemals Passwörter, API-Tokens, private Keys oder OIDC-Client-Secrets in
variables-local.nix oder einem Nix-String ablegen. Sie gehören in
verschlüsselte *.age-Dateien.
Das aktive Inventar:
| Secret | Genutzt von | Klartextformat |
|---|---|---|
bindPW.age |
Prosody LDAP | Prosody-Lua-Konfiguration |
dns-challenge.age |
Traefik ACME | Cloudflare-systemd-Environment-Datei |
go-sendxmpp.age |
pinix-Webhooks | rohes XMPP-Passwort |
headscalePreAuthKey.age |
Tailscale-Clients | roher Headscale-Pre-Auth-Key |
lldapAdmin.age |
LLDAP, Dex, Radicale | rohes LLDAP-Administratorpasswort |
mailPW.age |
aerc und msmtp | rohes Mailbox-Passwort |
motd.age |
Prosody | Prosody-Lua-Konfiguration |
oauth2Cookie.age |
oauth2-proxy | rohes Cookie-Verschlüsselungs-Secret |
oidc*.age |
Dex und die genannte Anwendung | rohes OIDC-Client-Secret |
oidcGTSEnv.age |
GoToSocial | GTS_OIDC_CLIENT_SECRET=... |
resticPW.age |
Restic | rohes Repository-Passwort |
traefikBasicAuth.age |
Traefik-Dashboard | htpasswd-Zeile user:password-hash |
webdav.age |
WebDAV | ENV_USERNAME=... und ENV_PASSWORD=... |
wirelessSecretsFile.age |
wpa_supplicant | key=value-Zeilen, referenziert über ext:key |
oidcGTS.age und oidcGTSEnv.age enthalten dasselbe OIDC-Secret in zwei
Formaten und müssen zusammen rotiert werden.
oidcOauth2.age und oauth2Cookie.age: oauth2-proxy nutzte sie, um
0ff.space mit Dex/LLDAP-Login zu schützen — seit 29.07.2026
deaktiviert (0ff.space ist offen erreichbar), oauth2-proxy selbst
läuft weiter und der Schutz lässt sich in
hosts/blunix/localServices/launcher.nix mit einer Zeile
reaktivieren. Audiobookshelf und Quantum laufen auf fastpi
(eigenständig betriebenes DietPi-Gerät im Tailnet, siehe Übersicht) —
das lief zwischenzeitlich, ist aber seit 29.07.2026 wieder
eingeschaltet; ihre rotierten OIDC-Secrets sind entsprechend
einzutragen, falls das noch nicht geschehen ist.
Für das vollständige Inventar inklusive vorbereiteter und veralteter
Dateien siehe
secrets/README.md.
Agenix-Workflow
Empfänger-SSH-Public-Keys sind in secrets/secrets.nix registriert.
# Verschlüsselte Datei bearbeiten oder anlegen
agenix -e secrets/<name>.age
# Registrierte Dateien nach Empfänger-Änderungen neu verschlüsseln
agenix -r
# Nach versehentlich committetem Klartext suchen
nix run nixpkgs#gitleaks -- dir --redact .
Wenn ein Empfänger den Zugriff verliert, verhindert Rekeying künftige Entschlüsselung, kann aber bereits entschlüsselte Kopien nicht zurückholen. Das zugrunde liegende Passwort oder Token zusätzlich rotieren.
Nach dem Bearbeiten von Parametern oder Secrets den betroffenen Host vor dem Deployment evaluieren:
nix eval --raw \
.#nixosConfigurations.<hostname>.config.system.build.toplevel.drvPath