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]>
76 lines
3.6 KiB
YAML
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: ""
|