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) <[email protected]>
47 lines
2.4 KiB
YAML
47 lines
2.4 KiB
YAML
# Nicht-geheime Konfiguration. Geheimnisse (Passwoerter, API-Keys) gehoeren
|
|
# in 02-secret.yaml (aus 02-secret.example.yaml kopiert), NIE hierher.
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: wabenhain-config
|
|
namespace: wabenhain
|
|
data:
|
|
# "postgresql" oder "mysql" — muss zum Service passen, den du unter
|
|
# 03-postgres.yaml/03-mysql.yaml tatsaechlich ausrollst, UND zum
|
|
# DATABASE_URL-Host in 02-secret.yaml. Ein einzelnes Image traegt beide
|
|
# Prisma-Client-Varianten, siehe src/lib/prisma.ts.
|
|
DATABASE_PROVIDER: "postgresql"
|
|
NODE_ENV: "production"
|
|
# Oeffentliche URL des Shops (fuer absolute Links in E-Mails/Sitemaps/CSP).
|
|
# 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 <[email protected]>"
|
|
# Optional, siehe README-Abschnitte "Google-Rezensionen"/"CAPTCHA" — leer
|
|
# lassen, wenn nicht genutzt, die App faellt automatisch zurueck.
|
|
#
|
|
# 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,
|
|
# siehe app/api/admin/upload/route.ts) — MUSS exakt dem mountPath des
|
|
# "uploads"-Volumes in 05-app-deployment.yaml entsprechen. Die App selbst
|
|
# weiss nicht, was fuer ein Volume dort gemountet ist; siehe .env.example.
|
|
UPLOAD_DIR: "/app/uploads"
|