feat: Docker-, Kubernetes- und Gitea-Actions-Deployment-Pipeline
Docker Image bauen und veroeffentlichen / build-and-push (push) Waiting to run

Dockerfile (Multi-Stage, "output: standalone"), docker-compose.yml mit
Caddy als einzigem nach aussen offenem Reverse-Proxy (verhindert
X-Forwarded-For-Faelschung fuer das App-eigene Rate-Limiting), Gitea
Actions Workflow der bei jedem Push zwei Image-Tags in die Gitea-
Container-Registry baut (schlankes Laufzeit-Image + ein Migrations-
Image mit Prisma-CLI), sowie rohe Kubernetes-Manifeste (Namespace,
ConfigMap, Secret-Vorlage, Postgres-/MySQL-StatefulSet, Migrations-Job,
App-Deployment, Ingress) fuer den Cluster-Betrieb. Siehe k8s/README.md
fuer den vollstaendigen Einrichtungs-/Deployment-Ablauf.
This commit is contained in:
Nick Szaunig
2026-08-17 14:30:46 +02:00
parent c7927f2883
commit 5889f58da7
15 changed files with 727 additions and 1 deletions
+67
View File
@@ -0,0 +1,67 @@
# image: unten mit der tatsaechlichen Registry/Tag aus der Gitea-Actions-
# Pipeline ersetzen (das schlanke Laufzeit-Image, NICHT ":migrate-...").
# Vor dem ersten Rollout einmal den Migrations-Job (04-migrate-job.yaml)
# erfolgreich durchlaufen lassen, sonst startet die App gegen eine leere,
# ungemigrateet Datenbank.
apiVersion: apps/v1
kind: Deployment
metadata:
name: wabenhain-app
namespace: wabenhain
spec:
# ACHTUNG bevor du hochskalierst: lib/rate-limit.ts haelt Login-/2FA-/
# Checkout-Limits aktuell im Prozessspeicher, nicht in einem gemeinsamen
# Store. Mit replicas > 1 verteilt sich derselbe Nutzer per Load-Balancing
# auf mehrere Prozesse mit je eigenem Zaehler — das Limit wird effektiv um
# den Skalierungsfaktor schwaecher (2 Replicas = 2x mehr Versuche moeglich),
# ohne dass das im Frontend sichtbar waere. Fuer replicas > 1 zuerst
# lib/rate-limit.ts auf einen gemeinsamen Store (z.B. Redis) umstellen.
replicas: 1
selector:
matchLabels:
app: wabenhain-app
template:
metadata:
labels:
app: wabenhain-app
spec:
containers:
- name: app
image: git.example.com/OWNER/wabenhain:latest
ports:
- containerPort: 3000
envFrom:
- configMapRef:
name: wabenhain-config
- secretRef:
name: wabenhain-secrets
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 20
periodSeconds: 30
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: wabenhain-app
namespace: wabenhain
spec:
selector:
app: wabenhain-app
ports:
- port: 80
targetPort: 3000