feat(k8s): terminate TLS in the cluster for a public domain (closes #177) #178
Open
not
wants to merge 3 commits from
feat/177-public-tls-edge into main
pull from: feat/177-public-tls-edge
merge into: :main
:main
:ci/175-deploy-on-merge
:feat/177-public-tls-edge
:ci/168-helm-chart-ci-gate
:docs/169-mkdocs-nav
:feat/25-helm-kubernetes-caddy
:fix/161-e2e-bounded-and-diagnosable
:feat/162-werkbak-live-refresh
:feat/132-medewerker-mfa
:fix/156-tempo-ingester-healthcheck
:feat/153-projection-sourced-from-objecten
:feat/152-objecten-publishes-to-nrc
:feat/149-acl-writes-registerrecord
:feat/141-registerrecord-objecttype
:perf/verify-stack-uwsgi-oz-nrc
:fix/144-verify-stack-uwsgi
:feat/140-objecten-up
:feat/139-objecttypen-up
:feat/131-default-fill-crud
:chore/136-ci-job-summaries
:fix/134-verify-stack-scheduling
:feat/130-beheer-catalogi
:feat/124-metrics-dashboards
:ci/127-parallel-jobs
:feat/123-distributed-traces
:feat/111-self-service-resume
:feat/113-acl-zaaktype-by-identificatie
:fix/110-compose-local-flow
:fix/115-e2e-single-worker
:docs/111-backlog-s26
:feat/106-close-zaak-on-timeout
:feat/103-diploma-upload-documenten
:feat/102-document-wait-timeout
:feat/14-dmn-diploma-eligibility
:feat/15-beoordeling-escalation
:fix/portal-nginx-resolver
:fix/local-eventsubscriber-acl
:feat/12-withdrawal-portal
:fix/91-local-compose-parity
:feat/12-withdrawal-bff
:feat/12-withdrawal-workflow
:feat/12-withdrawal
:feat/13-behandel-portal
:feat/13-behandel-decide
:feat/13-behandel-bff-auth-werkbak
:feat/13-workflow-user-tasks
:feat/13-behandel-decision-model
:chore/release-2026.07.0
:feat/78-reference-correlation
:feat/75-approval-flow
:feat/10-openbaar-portal
:chore/73-ci-speedups
:feat/68-e2e
:feat/67-self-service-form
:feat/66-api-client
:feat/65-nx-workspace
:feat/8-bff
:feat/6-domain-service
:feat/7-event-subscriber-projection
:feat/56-nrc-notification-wiring
:test/46-acl-openzaak-integration
:feat/47-acl-mutation-baseline
:ci/30-gitea-actions-ci
:feat/5-acl-open-zaak
:feat/4-flowable
:feat/3-keycloak
:feat/2-opennotificaties
:feat/2-catalogus-seed
:feat/10-openzaak-compose
:feat/32-docs-scaffold
:feat/31-contributor-workflow
:feat/30-gitea-actions-ci
:feat/29-bff-docker-compose
:chore/remove-bootstrap-scripts
:feat/28-bff-health
:docs/split-s00
3
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
399d110663 |
docs(arch): ADR-0035 and the runbook section for publishing the stack (refs #177)
CI / k8s (pull_request) Successful in 6s
CI / build (pull_request) Successful in 1m28s
CI / lint (pull_request) Successful in 1m51s
CI / unit (pull_request) Successful in 1m12s
CI / frontend (pull_request) Successful in 2m11s
CI / mutation (pull_request) Successful in 3m45s
CI / verify-stack (pull_request) Successful in 8m15s
The ADR records why the edge is in the cluster rather than on the Fedora host — routing and certificates should be state a `helm upgrade` can see — and the three costs that buys: the host forward nobody in the cluster can repair, the Let's Encrypt rate limit that makes `persistence.storageClass` non-optional, and publishing behandel and beheer to the internet behind synthetic accounts. Runbook §10 is the operational half: the five DNS records, the two firewalld rules (including the masquerade that makes the return path work), and the symptoms each missing piece produces. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
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> |
||
|
|
88fda30008 |
test(k8s): pin the issuer, the portal authority and the public edge (refs #177)
Keycloak pins one issuer and each portal is configured with one authority; when they drift the symptom lands three services away — a login that bounces back logged out, or a 401 from the BFF (ADR-0010) — so assert they are the same string. The same check states what publishing the stack has to mean: with `public.domain` set the five hostnames are served and both halves become `https://auth.<domain>`, and with it empty nothing of the edge renders, which is what compose, CI and a laptop cluster depend on. Red: the chart has no `public.domain`, so setting it changes nothing and no hostname is published. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |