Files
register-referentie/infra/helm/big-reference/templates/deployments.yaml
T
notandClaude Opus 5 56cba9c340 feat(k8s): terminate TLS in the cluster for a public domain (refs #177)
`public.domain` is the whole switch. Empty — the default, and what compose, CI
and a laptop cluster use — renders nothing new and leaves every manifest as it
was. Set it and templates/edge.yaml adds a Caddy deployment that gets its own
certificates from Let's Encrypt and proxies the five browser-facing hostnames to
the ClusterIP services, so a public deployment doesn't use their NodePorts at
all.

Caddy rather than an ingress controller because the four portals already run
caddy:2-alpine (ADR-0034, whose ceiling note called exactly this out): no new
dependency, no cert-manager, no CRDs, no Ingress objects for five hostnames that
never change. The Fedora host keeps only a layer-4 forward of 80/443, because
the public IP is there and nothing in the cluster can claim it.

KC_HOSTNAME and the portals' config.json now both come from `big.keycloakUrl`,
so the issuer a token carries and the authority the BFF discovers are one string
by construction (ADR-0010) rather than by two templates agreeing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:30:38 +02:00

40 lines
1.3 KiB
YAML

{{- range $name, $w := .Values.workloads }}
{{- if and (ne $w.enabled false) (not $w.job) }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ $name }}
labels:
{{- include "big.labels" (dict "root" $ "name" $name) | nindent 4 }}
spec:
replicas: 1
# Recreate, not RollingUpdate: single node, ReadWriteOnce volumes, and nothing
# here is HA — a second pod would just fight the first for the disk.
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: {{ $name }}
app.kubernetes.io/instance: {{ $.Release.Name }}
template:
metadata:
{{- /*
A ConfigMap mounted with subPath never picks up updates, so a portal whose
config.json content changed has to be rolled. Hashing only the values that
render it keeps the churn off the databases — an emptyDir database that is
recreated for no reason loses its data (see the runbook §6).
*/}}
{{- range $w.files }}
{{- if hasPrefix "portal-config-" .configMap }}
annotations:
checksum/portal-config: {{ include "big.keycloakUrl" $ | sha256sum }}
{{- end }}
{{- end }}
labels:
{{- include "big.labels" (dict "root" $ "name" $name) | nindent 8 }}
spec:
{{- include "big.podspec" (dict "root" $ "name" $name "w" $w) | nindent 6 }}
{{- end }}
{{- end }}