refactor: Kubernetes-Ressourcen und Images heissen artista-filmcamp
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 4m39s

Alle Ressourcen tragen den Praefix artista-filmcamp- (Deployment,
Service, StatefulSet, CronJobs, PVCs, ConfigMap, Secret, Ingress,
NetworkPolicies, Middleware) und liegen im Namespace artista. Die Images
heissen wieder <owner>/artista-filmcamp und <owner>/artista-filmcamp-tools,
passend zum Repo. DATABASE_URL-Host, Backup-Host und Betriebsdoku
entsprechend angepasst.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-09-27 14:15:12 +02:00
1 parent c18c628131
commit f9349144ea
11 files changed
+73 -73

No files matched your search

+12 -12
View File
@@ -16,8 +16,8 @@ Ein Release entsteht dann so: `git tag v0.1.0 && git push origin v0.1.0`, anschl
**Manuell:**
```bash
docker build --target runner -t git.encry.de/nick.rosenloecher/artista-modelcamp:0.1.0 .
docker build --target tools -t git.encry.de/nick.rosenloecher/artista-modelcamp-tools:0.1.0 .
docker build --target runner -t git.encry.de/nick.rosenloecher/artista-filmcamp:0.1.0 .
docker build --target tools -t git.encry.de/nick.rosenloecher/artista-filmcamp-tools:0.1.0 .
docker push … # beide Images, immer mit identischem Tag
```
@@ -35,8 +35,8 @@ Der Build braucht Internet für `next/font` (Schriften werden eingebettet), aber
5. **Migration** (siehe Abschnitt 3), danach das erste Admin-Konto:
```bash
kubectl -n artista run admin-create --rm -it --restart=Never --labels=artista/db-client=true \
--image=git.encry.de/nick.rosenloecher/artista-modelcamp-tools:0.1.0 \
--overrides='{"spec":{"containers":[{"name":"admin-create","image":"git.encry.de/nick.rosenloecher/artista-modelcamp-tools:0.1.0","command":["tsx","scripts/create-admin.ts","--email","[email protected]","--name","Dein Name"],"envFrom":[{"configMapRef":{"name":"artista-config"}},{"secretRef":{"name":"artista-secrets"}}]}]}}'
--image=git.encry.de/nick.rosenloecher/artista-filmcamp-tools:0.1.0 \
--overrides='{"spec":{"containers":[{"name":"admin-create","image":"git.encry.de/nick.rosenloecher/artista-filmcamp-tools:0.1.0","command":["tsx","scripts/create-admin.ts","--email","[email protected]","--name","Dein Name"],"envFrom":[{"configMapRef":{"name":"artista-filmcamp-config"}},{"secretRef":{"name":"artista-filmcamp-secrets"}}]}]}}'
```
Das einmalige Passwort wird ausgegeben. Bei der ersten Anmeldung unter `/admin` wird die 2FA eingerichtet.
@@ -47,10 +47,10 @@ Der Build braucht Internet für `next/font` (Schriften werden eingebettet), aber
kubectl apply -k k8s/overlays/production
# 2. Migration bewusst starten und abwarten
JOB=migrate-$(date +%Y%m%d%H%M)
kubectl -n artista create job $JOB --from=cronjob/artista-migrate
kubectl -n artista create job $JOB --from=cronjob/artista-filmcamp-migrate
kubectl -n artista wait --for=condition=complete job/$JOB --timeout=5m
# 3. Rollout beobachten
kubectl -n artista rollout status deploy/artista-app
kubectl -n artista rollout status deploy/artista-filmcamp-app
```
Migrationen sind vorwärtskompatibel zu schreiben (erst Spalten ergänzen, später entfernen), damit alte und neue Pods während des Rollouts parallel laufen können.
@@ -71,7 +71,7 @@ Migrationen sind vorwärtskompatibel zu schreiben (erst Spalten ergänzen, spät
## 6. Worker
Der CronJob `artista-worker` läuft alle 10 Minuten und kümmert sich um:
Der CronJob `artista-filmcamp-worker` läuft alle 10 Minuten und kümmert sich um:
- abgelaufene Reservierungen, vorher mit Rückfrage bei Stripe
- hängende Einzüge
- fällige Raten
@@ -83,18 +83,18 @@ Ein fehlgeschlagener Lauf erscheint als fehlgeschlagener Job (`kubectl -n artist
## 7. Sicherung und Wiederherstellung
- **Sicherung:** Der CronJob `artista-db-backup` erstellt täglich um 3:15 Uhr einen Dump im `pg_dump`-Custom-Format nach `artista-db-backup` und bewahrt ihn 30 Tage auf.
- **Sicherung:** Der CronJob `artista-filmcamp-db-backup` erstellt täglich um 3:15 Uhr einen Dump im `pg_dump`-Custom-Format nach `artista-filmcamp-db-backup` und bewahrt ihn 30 Tage auf.
- **Aus dem Cluster sichern (regelmäßig):**
```bash
POD=$(kubectl -n artista get pod -l app.kubernetes.io/name=artista-postgres -o name | head -1)
POD=$(kubectl -n artista get pod -l app.kubernetes.io/name=artista-filmcamp-postgres -o name | head -1)
kubectl -n artista exec $POD -- pg_dump -U artista -d artista --format=custom > artista-$(date +%F).dump
```
- **Wiederherstellen:**
1. App stoppen: `kubectl -n artista scale deploy/artista-app --replicas=0` und den Worker-CronJob pausieren: `kubectl -n artista patch cronjob artista-worker -p '{"spec":{"suspend":true}}'`
1. App stoppen: `kubectl -n artista scale deploy/artista-filmcamp-app --replicas=0` und den Worker-CronJob pausieren: `kubectl -n artista patch cronjob artista-filmcamp-worker -p '{"spec":{"suspend":true}}'`
2. Einspielen: `kubectl -n artista exec -i $POD -- pg_restore -U artista -d artista --clean --if-exists < artista-YYYY-MM-DD.dump`
3. Migration laufen lassen (Abschnitt 3), App wieder hochskalieren, Worker fortsetzen.
4. Abgleich: Zahlungen, die nach dem Sicherungszeitpunkt eingingen, im Stripe-Dashboard prüfen. Stripe stellt Webhooks bis zu drei Tage erneut zu (Dashboard → Webhooks → „Erneut senden“).
- **Medien:** Das Volume `artista-media` separat sichern, z. B. mit Volume-Snapshots oder der Sicherung des Speichersystems.
- **Medien:** Das Volume `artista-filmcamp-media` separat sichern, z. B. mit Volume-Snapshots oder der Sicherung des Speichersystems.
- **Wiederherstellung üben:** mindestens einmal vor dem Live-Verkauf in einen Test-Namespace.
## 8. Stornierung und Erstattung
@@ -108,7 +108,7 @@ Die Software trifft keine Storno-Entscheidung, sie setzt sie nur nachvollziehbar
## 9. Medien
Dateien (jpg, png, webp, avif, mp4, webm) in das Volume `artista-media` kopieren:
Dateien (jpg, png, webp, avif, mp4, webm) in das Volume `artista-filmcamp-media` kopieren:
```bash
kubectl -n artista cp villa-aussen.jpg <app-pod>:/app/media/villa-aussen.jpg # Volume ist im App-Pod read-only → einen Hilfs-Pod mit Schreibzugriff nutzen