headscale: add OIDC login, stop overriding clients' local DNS

Two changes to the control server, plus the fallout on the hosts.

OIDC via Authentik, so `tailscale up --login-server ...` opens a browser
instead of needing a pre-auth key. This is a second Authentik application,
separate from headplane's, with headscale's own /oidc/callback redirect.
Headless hosts keep using pre-auth keys. Note that headscale runs OIDC
discovery at startup and a failure is FATAL -- pointing `issuer` at an
application that does not exist yet means the control server will not
boot, so verify the discovery document before deploying.

override_local_dns = false, because the upstream default of true replaces
resolv.conf with 100.100.100.100 on every node. That silently broke the
LAN's `.sol` names -- pihole serves those and the global nameservers
return NXDOMAIN for them -- and took ad blocking down with them. It also
made each node's entire DNS depend on tailscaled, which is what had
forced --accept-dns=false onto neptun and mercury individually; both of
those workarounds are now removed, and with MagicDNS resolving properly
again neptun no longer needs its hardcoded /etc/hosts pin for jupiter.

Also serves jellyfin and seerr from jupiter, matching the ports they
already use on its LAN vhosts, and rotates the tailnet pre-auth keys.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 21:12:31 +02:00
co-authored by Claude Opus 4.8
parent d70df14c8a
commit 564dfb16b8
7 changed files with 87 additions and 62 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
darman_password: ENC[AES256_GCM,data:iZQERcXtyH+91yUc3r7U6jnFYrGQPFeCPk/9ZDfxOhPLlGMX3/iEZ+SzZ7a7rDKUeUAaQUsrqANLDLclRYm4Ngo09EkbDxBx5x2GpQwlqSAS45LHnTen9LTzisWghdy79Xnilq322eaB3g==,iv:ozx/BPLR8nZTKHZroKrrh2z6ZlVCuLydQ3aNY4XvcIg=,tag:CSrq5ZipYxtXTT8RintuHQ==,type:str]
pihole_webpassword: ENC[AES256_GCM,data:5iOTqD0CcbOCnM1b4+RbajMTyAU=,iv:2ZRW7dshnPzWkuudrn6n92y4Z2n/6fdnBB7BO5/ypS4=,tag:8UZSqJM6dVECQgrF6v5Fuw==,type:str]
tailscale_authkey: ENC[AES256_GCM,data:CZe1wkh2DNF2g4wy30Wph0c4/3f1M2K9Up+3oAcLEVdZjJzLRJotAU/0Nw2PSGoDZTtqOSfDaEXsaa45DBIJj2EUvWKSYrkV4XkLCio6ZWoGhmxH9PYfkw==,iv:UqNZz7grRPT/d1a2Tv1PW4H2k5FeZCuDy/fK+jVou9E=,tag:cYbLk+7JqU/1by8j2ri0Xg==,type:str]
tailscale_authkey: ENC[AES256_GCM,data:Ogm5RTcbJl5lsL19qgTcqXLWK7ypxXrAHNYgriduQQSSRoRWvsnJ3A2Lbynb+r756WxJyFSFqY3WGr9pHaCYo8LAf5oD1MJE26I7JtsAVcHY0QS29b2MnQ==,iv:3H0YMk6llOBapqtMkxsdlY8wQhzIXa+6W4ZrWD0iq2M=,tag:3rPQS7FX8ODLAQK5gOL7lw==,type:str]
sops:
age:
- enc: |
@@ -21,7 +21,7 @@ sops:
x6FfYadcRfqvSX60l6+TGdzq6xDpxLIZOJ8q19qZsAvB0in50HW5gg==
-----END AGE ENCRYPTED FILE-----
recipient: age1cpty7zrgnn6l97upq00w5wa8zcvnkxkdt2jvhlj97jh83exure4slha43t
lastmodified: "2026-07-20T08:31:19Z"
mac: ENC[AES256_GCM,data:kdWGhCOENvnUAnwbLW58JH8Ur+g+f4Z1pr3seZGGOFa04xeXb5HOzegpIH+x7OT5OvsKZsMKWf7sBGgB/nx+m2ZKy4NLC39dLbV8V5hs18NhRKl5vKZBZHE1D2xAK4+REwRYT6LiXArQssPv9e2q5fcW6q3rtnlHMF0tUsWip9o=,iv:BkKv2ZBxZMX4agHTzF2Mcmasxpp+hqkiu9mH0mUeLS4=,tag:t0MeKRPikYR5MAmU8r77sg==,type:str]
lastmodified: "2026-07-20T18:41:59Z"
mac: ENC[AES256_GCM,data:Ay3JLVmJu9S5wlxyL5mrACgLv+jbAsKB5/5r8/z5m4fPjfaYnBQbn1b2s8G764yI0+L3JVWyAdvdy2Gqplrds87lWqlf+gpJKGOoargsiIZAfJmJEzZOYZLPT8YanvGMHniAJszeZ9CnL7Uf9fn0RpT4ObeT7didSqIds6xVeRs=,iv:whZ9L1+tMTkTZaVUdshghIsS9Gmde4RozMDe3XN1ek8=,tag:015mccmr9A/YW+7E+1CsGg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.1