diff --git a/k8s/openclaw/openclaw-instance.secret.yaml b/k8s/openclaw/openclaw-instance.secret.yaml index e8fc0ef..72bb429 100644 Binary files a/k8s/openclaw/openclaw-instance.secret.yaml and b/k8s/openclaw/openclaw-instance.secret.yaml differ diff --git a/k8s/web/sasch40.yaml b/k8s/web/sasch40.yaml new file mode 100644 index 0000000..140efc5 --- /dev/null +++ b/k8s/web/sasch40.yaml @@ -0,0 +1,74 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: sasch40 + labels: + app: sasch40 + namespace: web +spec: + selector: + matchLabels: + app: sasch40 + replicas: 1 + template: + metadata: + labels: + app: sasch40 + spec: + imagePullSecrets: + - name: "registry-haumdaucher-de" + containers: + - image: registry.haumdaucher.de/sasch40:latest + imagePullPolicy: Always + name: sasch40 + ports: + - containerPort: 80 + resources: + requests: + cpu: 20m + memory: 32Mi + limits: + cpu: 100m + memory: 64Mi + +--- +apiVersion: v1 +kind: Service +metadata: + name: sasch40 + namespace: web +spec: + ports: + - port: 80 + targetPort: 80 + protocol: TCP + selector: + app: sasch40 + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: sasch40 + namespace: web + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-prod" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" +spec: + ingressClassName: traefik + tls: + - hosts: + - "sasch40.haumdaucher.de" + secretName: sasch40-haumdaucher-de-tls + rules: + - host: sasch40.haumdaucher.de + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: sasch40 + port: + number: 80 diff --git a/projects/sasch40/README.md b/projects/sasch40/README.md new file mode 100644 index 0000000..65a05b3 --- /dev/null +++ b/projects/sasch40/README.md @@ -0,0 +1,60 @@ +# Saschas Kronkorken Kreuzzug: 40 Jahre Bass & Gerstensaft 👑🍺🔊 + +Ein mobiles 2.5D Pixel-Art Web-Game zum 40. Geburtstag von König Sascha I. +Gehostet unter: `https://sasch40.haumdaucher.de` + +--- + +## 🌟 Spielinhalt & Akte +1. **Prolog (Schloss Haumdaucher Balkon)**: NAT berichtet als Hof-Chronist (mit Bridgerton-Referenzen) vom Verlust der 40 Kronkorken des Reiches. Mop der Erschaffer schaltet die Sprungfedern frei. +2. **Level 1 (Die Hopfen-Pfade)**: 60fps Casual-Jump&Run auf Dächern und Fässern zum Sammeln von Kronkorken und kühlem Hellen. +3. **Die Taverne 'Zum wummernden Ritter'**: Point & Click Adventure mit interaktiven Charakteren: + - Verena (*„Ich putze nach der Party fei ned!“*) + - Armend (schmiedet Kronkorken zum goldenen Subwoofer) + - Lutz im ZTUL-Shirt (Schornsteinfeger) + - Amy in Latzhose (*„Rave the Kingdom!“*) + - Mane (Wander- und Spieletipps) + - Pü (Lichtmeister mit Stroboskop-Fackeln) + - Der Zuluman-Zauberspiegel (Urlaubs-Easter-Egg) + - Bayerisches Beleidigungs-Gstanzl-Fechten +4. **Level 2 (Der Fest-Konvoi)**: Speed-Runner auf dem Bollerwagen mit 135-BPM-Techno und dem jubelnden Haumdaucher Gefolge (Hansi, Viktor, Albin, Fabian, Maier Flo, Guatemalteke, Markus & Nathalie). +5. **Finale & Krönung**: Thronsaal mit Konfetti-Explosion, Auswertung und druck-/screenshotbarer königlicher Urkunde. + +--- + +## 🖼️ Hot-Swappable Asset-Pipeline (Bilder austauschen) +Alle Charakter-Bilder und Sprites sind vollständig vom Code entkoppelt: + +* **Bilder-Ordner**: `projects/sasch40/frontend/public/assets/characters/` + * `sascha/portrait.jpg` (oder `.png`) + * `nat/portrait.jpg` + * `verena/portrait.jpg` + * `mop/portrait.jpg` + * `lutz/portrait.jpg` + * `armend/portrait.jpg` + * `amy/portrait.jpg` +* **Originalfotos**: Liegen in `projects/sasch40/source_photos/` +* **Zentrales Register**: Falls ein Dateipfad oder Name angepasst werden soll, geschieht das einfach in `projects/sasch40/frontend/src/config/characters.ts`. + +--- + +## 🚀 Lokale Entwicklung + +```bash +cd projects/sasch40/frontend +npm install +npm run dev +# Browser öffnen unter: http://localhost:3000 +``` + +--- + +## 🐳 Docker & Kubernetes Deployment + +```bash +cd projects/sasch40/frontend +make all # Baut und pusht registry.haumdaucher.de/sasch40:latest + +# Ingress & Deployment im Cluster anwenden: +kubectl apply -f ../../../k8s/web/sasch40.yaml +``` diff --git a/projects/sasch40/frontend/.gitignore b/projects/sasch40/frontend/.gitignore new file mode 100644 index 0000000..cd1edfd --- /dev/null +++ b/projects/sasch40/frontend/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +*.tsbuildinfo +.DS_Store +*.local diff --git a/projects/sasch40/frontend/Dockerfile b/projects/sasch40/frontend/Dockerfile new file mode 100644 index 0000000..dc424d7 --- /dev/null +++ b/projects/sasch40/frontend/Dockerfile @@ -0,0 +1,20 @@ +FROM node:22-alpine AS build + +WORKDIR /app + +COPY package.json package-lock.json* ./ + +RUN npm install + +COPY . . + +RUN npm run build + +FROM nginx:alpine + +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/projects/sasch40/frontend/Makefile b/projects/sasch40/frontend/Makefile new file mode 100644 index 0000000..7991028 --- /dev/null +++ b/projects/sasch40/frontend/Makefile @@ -0,0 +1,22 @@ +REGISTRY ?= registry.haumdaucher.de +IMAGE_NAME ?= sasch40 +TAG ?= latest +PLATFORM ?= linux/amd64 + +IMAGE ?= $(REGISTRY)/$(IMAGE_NAME):$(TAG) + +.PHONY: build tag push all dev + +all: build tag push + +dev: + npm run dev + +build: + docker build --platform $(PLATFORM) -t $(IMAGE_NAME):$(TAG) . + +tag: + docker tag $(IMAGE_NAME):$(TAG) $(IMAGE) + +push: + docker push $(IMAGE) diff --git a/projects/sasch40/frontend/index.html b/projects/sasch40/frontend/index.html new file mode 100644 index 0000000..5199459 --- /dev/null +++ b/projects/sasch40/frontend/index.html @@ -0,0 +1,21 @@ + + +
+ + + + + + + + + + + +
+ + Hiermit bekundet das gesamte Herzogtum Haumdaucher, dass +
++ die 40 Kronkorken des Reiches glorreich vereint und den Bass auf unsterbliche 135 BPM gehoben hat! +
+„Ich hab dich unendlich lieb mein Schatz... aber geputzt wird nach der Party fei trotzdem ned!“ 🧹
+
+
+ Hört, hört, wertes Feiervolk!
+ Du hast soeben über den königlichen QR-Code das offizielle Thronjubiläums-Spiel betreten!
+
+ Seit 40 Jahren regiert König Sascha das stolze Herzogtum Haumdaucher mit eiserner Hand, dunkler Sonnenbrille und wummernden 135-BPM-Techno-Bässen. Doch kurz vor dem heutigen Thron-Rave geschah das Unglück: +
++ Die Schatzkammer wurde geplündert! Sämtliche 40 geheiligten Kronkorken des Reiches sind über ganz Haumdaucher verstreut! + Ohne Kronkorken kein kühles Helles, ohne Helles kein Bass – und ohne Bass keine Feier! +
+„{{ currentNode().text }}“
+