Points public DNS for the shared Gateway's names at the home WAN instead of the RFC1918 Gateway VIP. The WAN 80/443 forward to 192.168.2.20 is already in place.
Change
platform/gateway/gateway.yaml: adds external-dns.alpha.kubernetes.io/target: wan.${BASE_DOMAIN} to the shared Gateway. Every Gateway-published name becomes CNAME wan.home.keithjackson.dev.
platform/externaldns/ddns.yaml (new): a favonia/cloudflare-ddns:1.17.1 Deployment that keeps wan.home.keithjackson.dev an A record at the current WAN IP (IPv4, unproxied, checked every 5m). It reuses the existing cloudflare-api-token. external-dns has no registry TXT for this record, so it never owns or deletes it.
The comment block in the external-dns HelmRelease, the README and decisions/2026-10-03-public-dns-wan-target.md now record the operator decision that every Gateway-published name goes public. That includes the admin UIs, not only the five exposure: public apps.
Unchanged: internal routes (controller: none) still publish nothing. The service-source L4 names (crafty-mc, unifi) still publish their LB VIPs.
Gate (pinned toolbox, DEV_KUBECONFIG=/dev/null)
rc=3: spec-immutability, decisions-log, lint, l0, render-golden, l1 and approval-policy all pass. gitea-settings was skipped because there is no SETTINGS_API_TOKEN on the workstation. conformance (L2/L3) did not run. No sensitive paths are touched.
Known risk: kubectl OIDC SSO
The nodes resolve through public DNS, so the apiserver's issuer keycloak.home.keithjackson.dev will resolve to the WAN IP. A LAN probe of 136.51.115.252:443 returned a self-signed placeholder cert, not the Gateway's LE wildcard, which suggests the router does not hairpin. kubectl SSO may break until there is a node /etc/hosts pin or NAT reflection. The cert-based admin kubeconfig is unaffected.
Points public DNS for the shared Gateway's names at the home WAN instead of the RFC1918 Gateway VIP. The WAN 80/443 forward to `192.168.2.20` is already in place.
## Change
- **`platform/gateway/gateway.yaml`**: adds `external-dns.alpha.kubernetes.io/target: wan.${BASE_DOMAIN}` to the shared Gateway. Every Gateway-published name becomes `CNAME wan.home.keithjackson.dev`.
- **`platform/externaldns/ddns.yaml`** (new): a `favonia/cloudflare-ddns:1.17.1` Deployment that keeps `wan.home.keithjackson.dev` an A record at the current WAN IP (IPv4, unproxied, checked every 5m). It reuses the existing `cloudflare-api-token`. external-dns has no registry TXT for this record, so it never owns or deletes it.
- The comment block in the external-dns HelmRelease, the README and `decisions/2026-10-03-public-dns-wan-target.md` now record the operator decision that every Gateway-published name goes public. That includes the admin UIs, not only the five `exposure: public` apps.
Unchanged: `internal` routes (`controller: none`) still publish nothing. The service-source L4 names (crafty-mc, unifi) still publish their LB VIPs.
## Gate (pinned toolbox, `DEV_KUBECONFIG=/dev/null`)
`rc=3`: spec-immutability, decisions-log, lint, **l0**, render-golden, l1 and approval-policy all **pass**. `gitea-settings` was skipped because there is no `SETTINGS_API_TOKEN` on the workstation. `conformance` (L2/L3) did not run. No sensitive paths are touched.
## Known risk: kubectl OIDC SSO
The nodes resolve through public DNS, so the apiserver's issuer `keycloak.home.keithjackson.dev` will resolve to the WAN IP. A LAN probe of `136.51.115.252:443` returned a self-signed placeholder cert, not the Gateway's LE wildcard, which suggests the router does not hairpin. kubectl SSO may break until there is a node `/etc/hosts` pin or NAT reflection. The cert-based admin kubeconfig is unaffected.
## After merge, verify
- `kubectl -n external-dns logs deploy/cloudflare-ddns`
- `dig +short @1.1.1.1 plex.home.keithjackson.dev` should return `wan.home.keithjackson.dev.` and then the WAN IP
- Load the site from outside the LAN (e.g. a phone on cellular)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Gateway-published records now CNAME to wan.${BASE_DOMAIN}, which a
favonia/cloudflare-ddns Deployment keeps at the home WAN's current public
IP. Operator decision: every Gateway-published name goes public; internal
services (controller: none) remain unpublished.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Points public DNS for the shared Gateway's names at the home WAN instead of the RFC1918 Gateway VIP. The WAN 80/443 forward to
192.168.2.20is already in place.Change
platform/gateway/gateway.yaml: addsexternal-dns.alpha.kubernetes.io/target: wan.${BASE_DOMAIN}to the shared Gateway. Every Gateway-published name becomesCNAME wan.home.keithjackson.dev.platform/externaldns/ddns.yaml(new): afavonia/cloudflare-ddns:1.17.1Deployment that keepswan.home.keithjackson.devan A record at the current WAN IP (IPv4, unproxied, checked every 5m). It reuses the existingcloudflare-api-token. external-dns has no registry TXT for this record, so it never owns or deletes it.decisions/2026-10-03-public-dns-wan-target.mdnow record the operator decision that every Gateway-published name goes public. That includes the admin UIs, not only the fiveexposure: publicapps.Unchanged:
internalroutes (controller: none) still publish nothing. The service-source L4 names (crafty-mc, unifi) still publish their LB VIPs.Gate (pinned toolbox,
DEV_KUBECONFIG=/dev/null)rc=3: spec-immutability, decisions-log, lint, l0, render-golden, l1 and approval-policy all pass.gitea-settingswas skipped because there is noSETTINGS_API_TOKENon the workstation.conformance(L2/L3) did not run. No sensitive paths are touched.Known risk: kubectl OIDC SSO
The nodes resolve through public DNS, so the apiserver's issuer
keycloak.home.keithjackson.devwill resolve to the WAN IP. A LAN probe of136.51.115.252:443returned a self-signed placeholder cert, not the Gateway's LE wildcard, which suggests the router does not hairpin. kubectl SSO may break until there is a node/etc/hostspin or NAT reflection. The cert-based admin kubeconfig is unaffected.After merge, verify
kubectl -n external-dns logs deploy/cloudflare-ddnsdig +short @1.1.1.1 plex.home.keithjackson.devshould returnwan.home.keithjackson.dev.and then the WAN IP🤖 Generated with Claude Code
Gateway-published records now CNAME to wan.${BASE_DOMAIN}, which a favonia/cloudflare-ddns Deployment keeps at the home WAN's current public IP. Operator decision: every Gateway-published name goes public; internal services (controller: none) remain unpublished. Co-Authored-By: Claude Opus 5.5 <[email protected]>