Files
argocd-apps/apps/base/watchstate/gateway-external.yaml
T
unkin-agent 47f7cd9c51
ci/woodpecker/pr/vector-test Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/kubeconform Pipeline was successful
watchstate: expose externally at watchstate.unkin.net
Add a public front door for the WatchState admin UI on watchstate.unkin.net
via the external (DMZ) Traefik, alongside the existing internal
watchstate.k8s.syd1.au.unkin.net gateway. oauth2-proxy fronts both hostnames.

- DNSRecord watchstate-dns-internal (bind-internal/authoritative, unkin.net
  zone) -> A 198.18.199.0, the traefik-external VIP (arrstack precedent).
- watchstate-external Gateway (traefik-external) + HTTPRoutes: http->https
  redirect and https -> watchstate-oauth2:80. TLS terminated with the
  Let's Encrypt *.unkin.net wildcard (wildcard-unkin-net-tls), so no
  cert-manager/external-dns annotations.
- oauth2-proxy: relative redirect-url (/oauth2/callback) so reverse-proxy mode
  derives scheme+host per request, making the callback work on BOTH hosts;
  cookie + whitelist domains cover both hostnames.
- Drop the no-op sync-wave: "0" annotation on the vaultauth default VaultAuth.

Dependencies:
- wildcard-unkin-net-tls reflection into the watchstate namespace (reflector
  allow-list, argocd-apps PR #418).
- Both callback URIs registered on the Authentik watchstate provider
  (terraform-authentik, separate PR).
2026-08-26 21:44:29 +10:00

41 lines
1.3 KiB
YAML

---
# External (DMZ) front for the WatchState admin UI, served on watchstate.unkin.net
# via the external Traefik (LB VIP 198.18.199.0). TLS is terminated with the real
# Let's Encrypt *.unkin.net wildcard (Certificate wildcard-unkin-net in the
# cert-manager namespace, reflected into this namespace as wildcard-unkin-net-tls
# by the emberstack reflector), so there is no cert-manager annotation here. The
# apex watchstate.unkin.net A record lives in the bind-operator unkin.net zone
# (bind-internal/authoritative), NOT external-dns, so no external-dns annotation
# either. The internal watchstate Gateway (watchstate.k8s.syd1.au.unkin.net) is
# untouched; oauth2-proxy fronts both hostnames.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
labels:
traefik.io/instance: external
name: watchstate-external
namespace: watchstate
spec:
gatewayClassName: traefik-external
listeners:
- name: http
port: 80
protocol: HTTP
hostname: watchstate.unkin.net
allowedRoutes:
namespaces:
from: Same
- name: https
port: 443
protocol: HTTPS
hostname: watchstate.unkin.net
allowedRoutes:
namespaces:
from: Same
tls:
mode: Terminate
certificateRefs:
- group: ""
kind: Secret
name: wildcard-unkin-net-tls