From 990a16e65466f0839c9c43b5e75094d10cfd180e Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Thu, 17 Sep 2026 02:20:34 +0200 Subject: [PATCH] chore: Manifeste an den laufenden Cluster angleichen Die Manifeste in k8s/ trugen noch Platzhalter, waehrend im Cluster laengst die echten Werte stehen. Wer sie unveraendert anwendet, ueberschreibt damit funktionierende Einstellungen. - Domain: shop.example.com -> wabenhain.com, in 06-ingress.yaml (host und tls.hosts) und in 01-configmap.yaml (NEXT_PUBLIC_SITE_URL). Beide Stellen muessen uebereinstimmen; aus NEXT_PUBLIC_SITE_URL entstehen Sitemap, Canonical-Tags und jeder Link in jeder Bestellbestaetigung. - GOOGLE_PLACES_API_KEY von der ConfigMap ins Secret. Das ist ein abrechenbarer Zugangsschluessel, und eine ConfigMap ist unverschluesselt und in der Cluster-Oberflaeche im Klartext lesbar. Die zugehoerige GOOGLE_PLACE_ID ist oeffentlich und bleibt in der ConfigMap. Der Cluster handhabt das bereits so. - APICORE_API_URL vom Secret in die ConfigMap: eine Adresse ist kein Geheimnis. Auch das entspricht dem Cluster. - VIDEO_TRANSCODE_THREADS in die ConfigMap aufgenommen, damit die Threadbegrenzung des Video-Transcodes (siehe vorheriger Commit) auch ueber das Deployment einstellbar ist. Gegenprobe: die Vereinigung aller Schluessel aus ConfigMap und Secret deckt jetzt genau die Umgebungsvariablen ab, die der Code ueber process.env liest - keine fehlt. Die beiden Ueberhaenge sind beabsichtigt: DB_PASSWORD liest der Postgres-StatefulSet, STRIPE_PUBLISHABLE_KEY haelt die Konfiguration vollstaendig fuer eine kuenftige clientseitige Stripe-Einbindung. Der Hinweistext der Go-Live-Pruefung nannte shop.example.com als ausgelieferte Vorgabe; das stimmt nicht mehr. Die Pruefung selbst ist unveraendert. Co-Authored-By: Claude Opus 5 (1M context) --- k8s/01-configmap.yaml | 20 ++++++++++++++++++-- k8s/02-secret.example.yaml | 13 ++++++++++--- k8s/06-ingress.yaml | 4 ++-- k8s/README.md | 8 +++++--- scripts/preflight.ts | 2 +- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/k8s/01-configmap.yaml b/k8s/01-configmap.yaml index 728b073..6910dfd 100644 --- a/k8s/01-configmap.yaml +++ b/k8s/01-configmap.yaml @@ -13,14 +13,30 @@ data: DATABASE_PROVIDER: "postgresql" NODE_ENV: "production" # Oeffentliche URL des Shops (fuer absolute Links in E-Mails/Sitemaps/CSP). - NEXT_PUBLIC_SITE_URL: "https://shop.example.com" + # Muss zum "host" in 06-ingress.yaml passen, sonst zeigen Sitemap, + # Canonical-Tags und jeder Link in jeder Bestellbestaetigung ins Leere. + NEXT_PUBLIC_SITE_URL: "https://wabenhain.com" SMTP_PORT: "587" SMTP_FROM: "Wabenhain " # Optional, siehe README-Abschnitte "Google-Rezensionen"/"CAPTCHA" — leer # lassen, wenn nicht genutzt, die App faellt automatisch zurueck. - GOOGLE_PLACES_API_KEY: "" + # + # Nur die Place-ID steht hier: sie ist oeffentlich, sie steckt in jeder + # Google-Maps-Adresse des Eintrags. Der zugehoerige GOOGLE_PLACES_API_KEY + # ist dagegen ein abrechenbarer Zugangsschluessel und liegt im Secret — + # eine ConfigMap ist unverschluesselt und in der Cluster-Oberflaeche im + # Klartext lesbar. GOOGLE_PLACE_ID: "" NEXT_PUBLIC_TURNSTILE_SITE_KEY: "" + # Adresse der ApiCore-API fuer den Stammdaten-Sync (Ernten, Produkte, + # Chargen — siehe src/lib/apicore-client.ts). Nur die URL; die Zugangsdaten + # des Sync-Kontos liegen im Secret. + APICORE_API_URL: "" + # Threads fuer das Umrechnen hochgeladener Videos. Nicht gesetzt bedeutet 2. + # NICHT ohne Not erhoehen: ffmpeg teilt sich das Speicherlimit dieses Pods + # mit dem Node-Prozess, und jeder zusaetzliche Thread haelt eigene + # Bildpuffer (bei 4K rund 12 MB je Bild). Siehe src/lib/video-transcode.ts. + VIDEO_TRANSCODE_THREADS: "2" # "sandbox" bis DHL-Versandmarken getestet sind, danach "production". DHL_ENVIRONMENT: "sandbox" # Verzeichnis fuer hochgeladene Bilder (Inhalte-/Produkt-/Erntenfotos, diff --git a/k8s/02-secret.example.yaml b/k8s/02-secret.example.yaml index 38b66fe..016fb1e 100644 --- a/k8s/02-secret.example.yaml +++ b/k8s/02-secret.example.yaml @@ -57,12 +57,19 @@ stringData: DHL_ACCOUNT_NUMBER: "" # Entra-ID-SSO ("Mit Microsoft anmelden"), siehe .env.example fuer die # Einrichtung in Azure. ENTRA_REDIRECT_URI muss auf die echte, oeffentliche - # Domain zeigen (z.B. https://shop.example.com/api/auth/entra/callback). + # Domain zeigen: https://wabenhain.com/api/auth/entra/callback ENTRA_TENANT_ID: "" ENTRA_CLIENT_ID: "" ENTRA_CLIENT_SECRET: "" ENTRA_REDIRECT_URI: "" - # ApiCore-Ernten-Sync (Admin -> Ernten -> Sync), siehe .env.example. - APICORE_API_URL: "" + # Abrechenbarer Zugangsschluessel fuer die Google-Places-API (echte + # Google-Rezensionen auf der Startseite). Gehoert hierher und NICHT in + # 01-configmap.yaml: eine ConfigMap ist unverschluesselt und in der + # Cluster-Oberflaeche im Klartext lesbar. Die zugehoerige, oeffentliche + # GOOGLE_PLACE_ID steht dort. + GOOGLE_PLACES_API_KEY: "" + # Zugangsdaten des ApiCore-Sync-Kontos (Admin -> Ernten bzw. Produkte -> + # "ApiCore-Synchronisierung"), siehe .env.example. Die zugehoerige Adresse + # APICORE_API_URL ist nicht geheim und steht in 01-configmap.yaml. APICORE_SYNC_EMAIL: "" APICORE_SYNC_PASSWORD: "" diff --git a/k8s/06-ingress.yaml b/k8s/06-ingress.yaml index ae9f962..8aa7ae5 100644 --- a/k8s/06-ingress.yaml +++ b/k8s/06-ingress.yaml @@ -80,10 +80,10 @@ spec: ingressClassName: traefik tls: - hosts: - - shop.example.com + - wabenhain.com secretName: wabenhain-tls rules: - - host: shop.example.com + - host: wabenhain.com http: paths: - path: / diff --git a/k8s/README.md b/k8s/README.md index 930613e..be226ab 100644 --- a/k8s/README.md +++ b/k8s/README.md @@ -50,9 +50,11 @@ anwendbar. Nummerierung = empfohlene Reihenfolge. 6. `image:` in `05-app-deployment.yaml` zeigt bereits auf `git.encry.de/nick.rosenloecher/wabenhain` — nur noch den Tag pruefen - (`:latest` passt fuer den jeweils neuesten `main`-Build). In - `06-ingress.yaml` `shop.example.com` durch die echte Domain ersetzen - (zweimal: `host:` und `tls.hosts`). + (`:latest` passt fuer den jeweils neuesten `main`-Build). Die Domain steht + in `06-ingress.yaml` (`host:` und `tls.hosts`) und in `01-configmap.yaml` + (`NEXT_PUBLIC_SITE_URL`) bereits als `wabenhain.com` — beide Stellen + muessen uebereinstimmen, sonst zeigen Sitemap, Canonical-Tags und die + Links in allen Bestellbestaetigungen woandershin. ## Deployment diff --git a/scripts/preflight.ts b/scripts/preflight.ts index fc8896d..b387348 100644 --- a/scripts/preflight.ts +++ b/scripts/preflight.ts @@ -81,7 +81,7 @@ must( must( "NEXT_PUBLIC_SITE_URL ist die echte Domain, kein Platzhalter", !siteUrl.includes("example.com") && !siteUrl.includes("example.org"), - 'k8s/01-configmap.yaml und k8s/06-ingress.yaml liefern "shop.example.com" als Vorgabe aus. Bleibt der Wert stehen, zeigen Sitemap, Canonical-Tags und jeder Link in jeder Bestellbestaetigung auf eine fremde Domain.' + 'Die echte Domain steht in k8s/01-configmap.yaml (NEXT_PUBLIC_SITE_URL) und k8s/06-ingress.yaml (host/tls.hosts) und muss an beiden Stellen dieselbe sein. Steht hier eine Beispiel-Domain, zeigen Sitemap, Canonical-Tags und jeder Link in jeder Bestellbestaetigung auf eine fremde Domain.' ); // --- Zahlung ---------------------------------------------------------------