Betrieb im eigenen RKE2-Cluster mit Traefik, cert-manager und persistentem Speicher; mehrere Replikate ohne Zustand im Prozessspeicher.
Umgesetzt
Flache Manifeste k8s/00-namespace.yaml bis k8s/09-db-backup-cronjob.yaml nach dem Muster von Wabenhain und ApiCore (91791b7, a0ba921)
Namespace artista mit Pod Security baseline (erzwungen) und restricted (gemeldet); alle eigenen Pods non-root, ohne Capabilities, seccomp RuntimeDefault (32a5b8e)
PostgreSQL 18.6 als StatefulSet auf SMB (bewusste Ausnahme mit hard, cache=strict, seal, 120 s Herunterfahren), Medien-Volume schreibgeschützt (24939b5, 7a60af9, c84eb1e, 98d1f76)
App-Deployment mit 2 Replikaten, Migration als initContainer, Readiness /api/health/ready, Liveness /api/health, nur Limits, keine Reservierungen (d3a7f8b)
Ingress für Traefik mit cert-manager (letsencrypt-prod), HTTP-01-Challenge im selben Ingress (28663cd), Umleitung auf HTTPS
NetworkPolicies: Datenbank nur für Pods mit db-client=true, App nur von Traefik in kube-system (d813d56, 66247cf)
Images auf CI-Build gepinnt (sha-<commit>, IfNotPresent) statt latest, Rollout per kubectl set image (f2b548c, 12.10.2026)
Im Cluster liegen alle SMB-Volumes auf der Hetzner Storage Box. Die Cluster-Härtung vom 12.10.2026 hat zusätzlich default-deny-ingress, allow-same-namespace und allow-from-traefik im Namespace angelegt; diese Policies liegen nicht in diesem Repo, sondern im Ordner rke2-cluster (ohne Git).
Im selben Namespace läuft Artista-Telefonie (Repo Artista-TeleTracking) mit eigener Datenbank telefonie in artista-modelcamp-postgres.
Nach SMB-Unterbrechungen kann Postgres „Bad file descriptor“ melden; Abhilfe rollout restart sts/artista-modelcamp-postgres.
Grundlage
k8s/README.md, docs/BETRIEB.md Abschnitte 2 und 3. Aktueller Rollout-Stand: #21.
Status
Code: ja · Geprüft: ja · Gemergt: ja · Produktiv: ja
Stand: 2026-10-16 (Quelle: git origin/main 9785eb2, Gitea-CI-Läufe und Registry, Memory der Sessions)
## Ziel
Betrieb im eigenen RKE2-Cluster mit Traefik, cert-manager und persistentem Speicher; mehrere Replikate ohne Zustand im Prozessspeicher.
## Umgesetzt
- [x] Flache Manifeste `k8s/00-namespace.yaml` bis `k8s/09-db-backup-cronjob.yaml` nach dem Muster von Wabenhain und ApiCore (`91791b7`, `a0ba921`)
- [x] Namespace `artista` mit Pod Security `baseline` (erzwungen) und `restricted` (gemeldet); alle eigenen Pods non-root, ohne Capabilities, seccomp RuntimeDefault (`32a5b8e`)
- [x] PostgreSQL 18.6 als StatefulSet auf SMB (bewusste Ausnahme mit `hard`, `cache=strict`, `seal`, 120 s Herunterfahren), Medien-Volume schreibgeschützt (`24939b5`, `7a60af9`, `c84eb1e`, `98d1f76`)
- [x] App-Deployment mit 2 Replikaten, Migration als initContainer, Readiness `/api/health/ready`, Liveness `/api/health`, nur Limits, keine Reservierungen (`d3a7f8b`)
- [x] Ingress für Traefik mit cert-manager (`letsencrypt-prod`), HTTP-01-Challenge im selben Ingress (`28663cd`), Umleitung auf HTTPS
- [x] NetworkPolicies: Datenbank nur für Pods mit `db-client=true`, App nur von Traefik in `kube-system` (`d813d56`, `66247cf`)
- [x] Images auf CI-Build gepinnt (`sha-<commit>`, `IfNotPresent`) statt `latest`, Rollout per `kubectl set image` (`f2b548c`, 12.10.2026)
- [x] Live unter https://modelcamp.artistasphotography.de (DNS-only bei Cloudflare, deshalb ohne `cloudflare-only`-Middleware)
## Hinweise zum Betrieb
- Im Cluster liegen alle SMB-Volumes auf der Hetzner Storage Box. Die Cluster-Härtung vom 12.10.2026 hat zusätzlich `default-deny-ingress`, `allow-same-namespace` und `allow-from-traefik` im Namespace angelegt; diese Policies liegen nicht in diesem Repo, sondern im Ordner `rke2-cluster` (ohne Git).
- Im selben Namespace läuft Artista-Telefonie (Repo `Artista-TeleTracking`) mit eigener Datenbank `telefonie` in `artista-modelcamp-postgres`.
- Nach SMB-Unterbrechungen kann Postgres „Bad file descriptor“ melden; Abhilfe `rollout restart sts/artista-modelcamp-postgres`.
## Grundlage
`k8s/README.md`, `docs/BETRIEB.md` Abschnitte 2 und 3. Aktueller Rollout-Stand: #21.
## Status
Code: ja · Geprüft: ja · Gemergt: ja · Produktiv: ja
Stand: 2026-10-16 (Quelle: git origin/main 9785eb2, Gitea-CI-Läufe und Registry, Memory der Sessions)
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.
Ziel
Betrieb im eigenen RKE2-Cluster mit Traefik, cert-manager und persistentem Speicher; mehrere Replikate ohne Zustand im Prozessspeicher.
Umgesetzt
k8s/00-namespace.yamlbisk8s/09-db-backup-cronjob.yamlnach dem Muster von Wabenhain und ApiCore (91791b7,a0ba921)artistamit Pod Securitybaseline(erzwungen) undrestricted(gemeldet); alle eigenen Pods non-root, ohne Capabilities, seccomp RuntimeDefault (32a5b8e)hard,cache=strict,seal, 120 s Herunterfahren), Medien-Volume schreibgeschützt (24939b5,7a60af9,c84eb1e,98d1f76)/api/health/ready, Liveness/api/health, nur Limits, keine Reservierungen (d3a7f8b)letsencrypt-prod), HTTP-01-Challenge im selben Ingress (28663cd), Umleitung auf HTTPSdb-client=true, App nur von Traefik inkube-system(d813d56,66247cf)sha-<commit>,IfNotPresent) stattlatest, Rollout perkubectl set image(f2b548c, 12.10.2026)cloudflare-only-Middleware)Hinweise zum Betrieb
default-deny-ingress,allow-same-namespaceundallow-from-traefikim Namespace angelegt; diese Policies liegen nicht in diesem Repo, sondern im Ordnerrke2-cluster(ohne Git).Artista-TeleTracking) mit eigener Datenbanktelefonieinartista-modelcamp-postgres.rollout restart sts/artista-modelcamp-postgres.Grundlage
k8s/README.md,docs/BETRIEB.mdAbschnitte 2 und 3. Aktueller Rollout-Stand: #21.Status
Code: ja · Geprüft: ja · Gemergt: ja · Produktiv: ja
Stand: 2026-10-16 (Quelle: git origin/main
9785eb2, Gitea-CI-Läufe und Registry, Memory der Sessions)