vps cluster docs

0004. One Cloudflare Origin CA certificate served through a Traefik TLSStore (no cert-manager)

Context

Every public hostname on this cluster is Cloudflare-proxied, so Cloudflare terminates the client-facing TLS connection and the origin only ever needs to satisfy Cloudflare itself. Traditionally that still meant ACME certificate management on the origin: cert-manager, an issuer, a Certificate per host, a renewal loop, and a failure mode that shows up as a certificate expiring because a renewal silently failed.

There is also a hard constraint on this cluster: it is a single node. An expired certificate cannot be worked around the way a failed deployment can, and there is no second node to serve traffic while the renewal is fixed.

The immediate trigger for this decision was worse than an expired certificate. A private key that was actively being served had been committed to git on 2026-05-10 and stayed there for four and a half months, unnoticed, until a gitleaks scan found it — while a per-host Certificate resource was simultaneously pointing at hand-made secrets. The TLS setup had more moving parts than the situation needed, which is what made that invisible.

Decision

One Cloudflare Origin CA wildcard certificate, served as Traefik’s default certificate. No ACME, no per-app certificates, no cert-manager.

Alternatives rejected

Consequences

Evidence

k8s/platform/traefik/{tlsstore.yaml,secrets.sops.yaml,traefik-config.yaml}, docs/certificates.md (including the two-level-hostname limitation), and the S7 entries in changelog/2026-09.md that record the re-issue, the revocation and the gitleaks finding.