/bestellung-verfolgen holt den Sendungsverlauf serverseitig ueber die DHL Shipment Tracking - Unified API und zeigt ihn im eigenen Layout an, statt Kundschaft auf dhl.de weiterzuleiten. - lib/dhl-tracking.ts: Abfrage mit API-Key, Zod-Validierung, Timeout, Cache pro Sendung (unterwegs 10 min, zugestellt 12 h, Fehler 2 min) - Abfrage erst nach erfolgreicher Pruefung von Bestellnummer + E-Mail, damit die Seite nicht als offener Proxy zu DHL dient - Ohne freigeschalteten Key bleibt die Seite unveraendert (Nummer + Link) - Optional DHL_TRACKING_API_KEY, falls das Tracking in eigener DHL-App liegt - Datenschutzerklaerung um die Statusabfrage bei DHL ergaenzt Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
137 lines
6.5 KiB
YAML
137 lines
6.5 KiB
YAML
# Geheime Konfiguration. Vorlage OHNE echte Werte — kopieren nach
|
|
# 02-secret.yaml (per .gitignore ausgeschlossen, NIE committen), ausfuellen,
|
|
# dann "kubectl apply -f k8s/02-secret.yaml".
|
|
#
|
|
# ANPASSEN: jeder Wert, der "CHANGE-ME" enthaelt. Die leeren Werte ("")
|
|
# gehoeren zu optionalen Funktionen und koennen leer bleiben — die App faellt
|
|
# dann nachvollziehbar zurueck (siehe Kommentar an der jeweiligen Stelle) und
|
|
# stuerzt nicht ab. Nichts hier darf FEHLEN: ein fehlender und ein leerer
|
|
# Schluessel sind fuer die App zwar dasselbe, aber ein vollstaendiges Secret
|
|
# macht sofort sichtbar, welche Funktionen es ueberhaupt gibt.
|
|
#
|
|
# Gegenprobe nach dem Ausrollen: "pnpm preflight" meldet jeden Wert, der fuer
|
|
# den Live-Betrieb fehlt, als Blocker — mit Begruendung, was ohne ihn kaputt
|
|
# geht.
|
|
apiVersion: v1
|
|
kind: Secret
|
|
metadata:
|
|
name: wabenhain-secrets
|
|
namespace: wabenhain
|
|
type: Opaque
|
|
stringData:
|
|
# ---------------------------------------------------------------------
|
|
# PFLICHT — ohne diese Werte ist kein Live-Betrieb moeglich
|
|
# ---------------------------------------------------------------------
|
|
|
|
# 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 MUSS hier URL-encodiert sein — Sonderzeichen wie
|
|
# @ : / % # ? & werden sonst als Trennzeichen der URL gelesen, und die
|
|
# Verbindung schlaegt mit einer irrefuehrenden Meldung fehl. DB_PASSWORD
|
|
# weiter unten bleibt dagegen roh. Encodieren mit:
|
|
# node -e "console.log(encodeURIComponent('DEIN-PASSWORT'))"
|
|
DATABASE_URL: "postgresql://wabenhain:CHANGE-ME@wabenhain-postgres:5432/wabenhain?schema=public"
|
|
|
|
# Dasselbe Passwort wie in DATABASE_URL, aber UNENCODIERT. Das
|
|
# Datenbank-StatefulSet legt damit den Datenbanknutzer an (03-postgres.yaml
|
|
# bzw. 03-mysql.yaml), und die Sicherung in 07-backup-cronjob.yaml meldet
|
|
# sich damit an. Die App selbst liest diesen Wert nicht — sie kennt nur
|
|
# DATABASE_URL.
|
|
DB_PASSWORD: "CHANGE-ME"
|
|
|
|
# Signiert die Login-Cookies. Mindestens 32 Zeichen, unvorhersehbar.
|
|
# Erzeugen mit: openssl rand -base64 32
|
|
# Wird dieser Wert bekannt, ist jede Sitzung faelschbar, auch die eines
|
|
# Admins. Ihn zu aendern meldet alle Kundinnen und Kunden ab, mehr nicht.
|
|
SESSION_SECRET: "CHANGE-ME-mindestens-32-zeichen-zufaellig"
|
|
|
|
# Erstes Admin-Konto, angelegt beim Start durch "prisma db seed".
|
|
# Unvorhersehbare Adresse waehlen, NICHT "admin@..." oder "info@...":
|
|
# sonst kann sich jemand die erwartete Adresse vorher selbst registrieren
|
|
# und das Konto belegen (siehe README "Admin-Zugang").
|
|
ADMIN_EMAIL: "[email protected]"
|
|
|
|
# Mindestens 12 Zeichen. Dieses Konto darf Rueckerstattungen ausloesen und
|
|
# alle Kundendaten einsehen. Erzeugen mit:
|
|
# openssl rand -base64 24 | tr -d '=+/' | head -c 28
|
|
ADMIN_PASSWORD: "CHANGE-ME"
|
|
|
|
# Stripe im LIVE-Modus (sk_live_...). Mit einem sk_test-Schluessel sehen
|
|
# Bestellungen erfolgreich aus, ohne dass Geld fliesst.
|
|
STRIPE_SECRET_KEY: "CHANGE-ME"
|
|
|
|
# Ohne Webhook-Secret wird keine Zahlung bestaetigt: Bestellungen bleiben
|
|
# auf "NEU" stehen, es gibt keine Rechnung und keine Bestaetigungsmail.
|
|
# Stammt aus dem Webhook-Endpunkt im Stripe-Dashboard, der auf
|
|
# https://wabenhain.com/api/checkout/webhook zeigt (whsec_...).
|
|
STRIPE_WEBHOOK_SECRET: "CHANGE-ME"
|
|
|
|
# Ohne SMTP werden E-Mails nur ins Server-Log geschrieben (src/lib/mail.ts):
|
|
# keine Bestellbestaetigung, keine Versandmeldung, keine
|
|
# Passwort-Zuruecksetzung. Funktioniert mit jedem SMTP-Anbieter; Port und
|
|
# Absenderadresse stehen als SMTP_PORT/SMTP_FROM in 01-configmap.yaml.
|
|
SMTP_HOST: "CHANGE-ME"
|
|
SMTP_USER: "CHANGE-ME"
|
|
SMTP_PASSWORD: "CHANGE-ME"
|
|
|
|
# ---------------------------------------------------------------------
|
|
# EMPFOHLEN — der Shop laeuft auch ohne, aber ungeschuetzt
|
|
# ---------------------------------------------------------------------
|
|
|
|
# Cloudflare Turnstile (CAPTCHA) fuer Registrierung, Newsletter und
|
|
# Firmenanfrage. Leer = kein CAPTCHA; die Formulare bleiben nutzbar, aber
|
|
# bei einem oeffentlichen Shop sammeln sich darueber schnell Bot-Eintraege.
|
|
# Der oeffentliche Gegenpart NEXT_PUBLIC_TURNSTILE_SITE_KEY steht in
|
|
# 01-configmap.yaml — beide setzen oder beide leer lassen.
|
|
TURNSTILE_SECRET_KEY: ""
|
|
|
|
# ---------------------------------------------------------------------
|
|
# OPTIONAL — leer lassen, solange die Funktion nicht genutzt wird
|
|
# ---------------------------------------------------------------------
|
|
|
|
# Google-Places-API fuer echte Google-Rezensionen auf der Startseite.
|
|
# Leer = die Startseite zeigt die statischen Beispiel-Stimmen.
|
|
#
|
|
# Der Schluessel gehoert hierher und NICHT in 01-configmap.yaml: er ist
|
|
# abrechenbar, und eine ConfigMap ist unverschluesselt und in der
|
|
# Cluster-Oberflaeche im Klartext lesbar. Die zugehoerige GOOGLE_PLACE_ID
|
|
# ist dagegen oeffentlich und steht dort.
|
|
GOOGLE_PLACES_API_KEY: ""
|
|
|
|
# Zugangsdaten des ApiCore-Sync-Kontos (Admin -> Ernten bzw. Produkte ->
|
|
# "ApiCore-Synchronisierung"). Leer = der Sync-Knopf meldet einen
|
|
# Konfigurationsfehler, statt still nichts zu tun.
|
|
#
|
|
# ApiCore kennt keinen API-Key-Mechanismus, nur E-Mail/Passwort-Login —
|
|
# deshalb hier ein eigenes, MFA-FREIES Service-Konto eintragen, nicht einen
|
|
# echten Admin-Zugang. Noetige Leserechte: harvests:read, products:read,
|
|
# extractions:read, bottling:read und optional apiaries:read. Die Adresse
|
|
# APICORE_API_URL ist nicht geheim und steht in 01-configmap.yaml.
|
|
APICORE_SYNC_EMAIL: ""
|
|
APICORE_SYNC_PASSWORD: ""
|
|
|
|
# DHL-Versandmarken (Admin -> Bestellung -> "DHL-Versandmarke"), siehe
|
|
# .env.example fuer die vollstaendige Einrichtung. Leer = der Knopf meldet
|
|
# "noch nicht konfiguriert", der Rest des Shops ist unberuehrt. Ob Sandbox
|
|
# oder Echtbetrieb, steuert DHL_ENVIRONMENT in 01-configmap.yaml.
|
|
DHL_API_KEY: ""
|
|
DHL_API_SECRET: ""
|
|
DHL_GKP_USERNAME: ""
|
|
DHL_GKP_PASSWORD: ""
|
|
DHL_ACCOUNT_NUMBER: ""
|
|
# Optional: eigener Key fuer die DHL-Sendungsverfolgung auf
|
|
# /bestellung-verfolgen. Leer = DHL_API_KEY wird verwendet.
|
|
DHL_TRACKING_API_KEY: ""
|
|
|
|
# Entra-ID-SSO ("Mit Microsoft anmelden"), siehe .env.example fuer die
|
|
# Einrichtung in Azure. Leer = der Anmeldeknopf erscheint gar nicht erst.
|
|
# ENTRA_REDIRECT_URI muss exakt der in Azure hinterlegten Adresse
|
|
# entsprechen und auf die echte Domain zeigen:
|
|
# https://wabenhain.com/api/auth/entra/callback
|
|
ENTRA_TENANT_ID: ""
|
|
ENTRA_CLIENT_ID: ""
|
|
ENTRA_CLIENT_SECRET: ""
|
|
ENTRA_REDIRECT_URI: ""
|