Files
Wabenhain/k8s/02-secret.example.yaml
T
Nick SzaunigandClaude Opus 5 990a16e654 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) <[email protected]>
2026-09-17 02:20:34 +02:00

76 lines
3.6 KiB
YAML

# Vorlage OHNE echte Geheimnisse — analog zu .env.example. Kopieren nach
# 02-secret.yaml (per .gitignore ausgeschlossen, NIE committen), Werte
# ausfuellen, dann "kubectl apply -f k8s/02-secret.yaml".
#
# Alternative ohne Datei mit Klartext-Secrets auf der Platte:
# kubectl create secret generic wabenhain-secrets -n wabenhain \
# --from-literal=DATABASE_URL='postgresql://wabenhain:CHANGE-ME@wabenhain-postgres:5432/wabenhain?schema=public' \
# --from-literal=DB_PASSWORD='CHANGE-ME' \
# --from-literal=SESSION_SECRET="$(openssl rand -base64 32)" \
# --from-literal=ADMIN_EMAIL='[email protected]' \
# --from-literal=ADMIN_PASSWORD="$(openssl rand -base64 24 | tr -d '=+/' | head -c 28)" \
# --from-literal=STRIPE_SECRET_KEY='' \
# --from-literal=STRIPE_PUBLISHABLE_KEY='' \
# --from-literal=STRIPE_WEBHOOK_SECRET='' \
# --from-literal=SMTP_HOST='' --from-literal=SMTP_USER='' --from-literal=SMTP_PASSWORD='' \
# --from-literal=TURNSTILE_SECRET_KEY=''
apiVersion: v1
kind: Secret
metadata:
name: wabenhain-secrets
namespace: wabenhain
type: Opaque
stringData:
# Host "wabenhain-postgres" bzw. "wabenhain-mysql" passend zum Service aus
# 03-postgres.yaml/03-mysql.yaml waehlen; Port 5432 (Postgres) bzw. 3306
# (MySQL). Muss zu DATABASE_PROVIDER in 01-configmap.yaml passen.
# WICHTIG: das Passwort hier MUSS URL-encodiert sein (Sonderzeichen wie
# @ : / % # ? & sonst ungueltig bzw. falsch geparst) — DB_PASSWORD unten
# bleibt dagegen roh/unencodiert. Encodieren z.B. mit:
# node -e "console.log(encodeURIComponent('DEIN-PASSWORT'))"
DATABASE_URL: "postgresql://wabenhain:CHANGE-ME@wabenhain-postgres:5432/wabenhain?schema=public"
# Dasselbe Passwort wie oben in DATABASE_URL — wird vom Postgres-/MySQL-
# StatefulSet (je nachdem, welches du anwendest) zum Anlegen des
# Datenbank-Nutzers verwendet.
DB_PASSWORD: "CHANGE-ME"
# Mindestens 32 Zeichen, z.B.: openssl rand -base64 32
SESSION_SECRET: "CHANGE-ME-min-32-zeichen-zufaelliger-string"
# Unvorhersehbar waehlen (nicht "admin@..."), siehe README "Admin-Zugang" —
# sonst koennte sich jemand die erwartete Adresse vorregistrieren.
ADMIN_EMAIL: "[email protected]"
ADMIN_PASSWORD: "CHANGE-ME"
STRIPE_SECRET_KEY: ""
STRIPE_PUBLISHABLE_KEY: ""
STRIPE_WEBHOOK_SECRET: ""
SMTP_HOST: ""
SMTP_USER: ""
SMTP_PASSWORD: ""
TURNSTILE_SECRET_KEY: ""
# DHL-Versandmarken (Admin -> Bestellung -> "DHL-Versandmarke"), siehe
# .env.example fuer die vollstaendige Einrichtungsanleitung. Leer lassen,
# bis vorhanden — der Button zeigt dann "noch nicht konfiguriert" statt
# zu crashen.
DHL_API_KEY: ""
DHL_API_SECRET: ""
DHL_GKP_USERNAME: ""
DHL_GKP_PASSWORD: ""
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: https://wabenhain.com/api/auth/entra/callback
ENTRA_TENANT_ID: ""
ENTRA_CLIENT_ID: ""
ENTRA_CLIENT_SECRET: ""
ENTRA_REDIRECT_URI: ""
# 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: ""