# Datenbank: "postgresql" (Standard) oder "mysql". Nach einer Aenderung # einmal `pnpm db:push` ausfuehren (schreibt prisma/schema.prisma neu und # generiert den passenden Treiber-Adapter-Client) — siehe README, Abschnitt # "Datenbank-Provider wechseln". DATABASE_PROVIDER=postgresql # PostgreSQL (Standard). Fuer docker compose siehe POSTGRES_* unten. DATABASE_URL="postgresql://wabenhain:wabenhain@localhost:5432/wabenhain?schema=public" # MySQL/MariaDB stattdessen: # DATABASE_URL="mysql://wabenhain:wabenhain@localhost:3306/wabenhain" # Postgres-Zugangsdaten fuer docker-compose.yml (Datenbank-Container) POSTGRES_USER=wabenhain POSTGRES_PASSWORD=change-me POSTGRES_DB=wabenhain # Nur noetig, wenn DATABASE_PROVIDER=mysql: Zugangsdaten fuer den # db-mysql-Container ("docker compose --profile mysql up -d db-mysql") MYSQL_USER=wabenhain MYSQL_PASSWORD=change-me MYSQL_DATABASE=wabenhain # Stripe (Test-Keys aus dem Stripe-Dashboard, https://dashboard.stripe.com/test/apikeys) STRIPE_SECRET_KEY=sk_test_xxxxxxxxxxxxxxxxxxxxxxxx STRIPE_PUBLISHABLE_KEY=pk_test_xxxxxxxxxxxxxxxxxxxxxxxx # Webhook-Secret aus `stripe listen` bzw. dem Stripe-Dashboard-Webhook-Endpoint STRIPE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxx # Admin-Zugang: Der interne /admin-Bereich wird NICHT per Basic-Auth # geschuetzt, sondern ueber das normale Kundenkonto-Login (/konto) und die # Rolle "ADMIN" am Konto (siehe README, Abschnitt "Admin-Zugang"). Diese # beiden Werte legt `prisma db seed` als initiales Admin-Konto an, falls es # noch nicht existiert. Eine UNVORHERSEHBARE E-Mail waehlen (nicht # "admin@..." o.ae.) — sonst koennte sich vor dem ersten Seed-Lauf jemand # genau diese Adresse selbst registrieren; prisma/seed.ts befoerdert ein # bereits bestehendes Nicht-Admin-Konto zwar nicht mehr automatisch, ein # unvorhersehbarer Wert ist trotzdem die robustere erste Verteidigungslinie. ADMIN_EMAIL=change-me@example.com ADMIN_PASSWORD=change-me # Geheimer Schluessel zum Signieren der Kundenkonto-JWTs (HS256). # In Produktion MINDESTENS 32 Zeichen (wird beim Start erzwungen). # Erzeugen z.B. mit: openssl rand -base64 32 SESSION_SECRET=change-me-to-a-long-random-string # Basis-URL der Seite (fuer absolute Links, z.B. in E-Mails/Sitemaps). # Lokale Entwicklung (pnpm dev): http://localhost:3000 (Standard hier). # Vollstaendiger Docker-Betrieb: http://localhost (Caddy laeuft auf Port 80, # siehe SITE_ADDRESS/Caddyfile unten) bzw. die echte Domain in Produktion. NEXT_PUBLIC_SITE_URL=http://localhost:3000 # Nur fuer den vollstaendigen Docker-Betrieb (docker-compose.yml, Caddyfile): # die oeffentliche Domain, unter der die Seite erreichbar sein soll. Leer # gelassen laeuft Caddy lokal per HTTP auf Port 80 ohne TLS — fuer eine # echte Domain mit automatischem HTTPS z.B. "wabenhain.com" eintragen. SITE_ADDRESS= # Google Rezensionen (optional). Ohne diese beiden Werte zeigt die Startseite # automatisch die statischen Beispiel-Stimmen als Fallback. # API-Key: Google-Cloud-Projekt mit aktivierter "Places API". # Place-ID: https://developers.google.com/maps/documentation/places/web-service/place-id GOOGLE_PLACES_API_KEY= GOOGLE_PLACE_ID= # Cloudflare Turnstile (optional). Ohne diese beiden Werte wird auf # Registrierung, Newsletter und Firmenanfrage kein CAPTCHA angezeigt und die # serverseitige Pruefung uebersprungen. Site-Key ist oeffentlich (NEXT_PUBLIC_), # Secret-Key bleibt privat. Einrichtung: https://dash.cloudflare.com/?to=/:account/turnstile TURNSTILE_SECRET_KEY= NEXT_PUBLIC_TURNSTILE_SITE_KEY= # SMTP fuer Transaktions-E-Mails (Bestellbestaetigung, Newsletter-Opt-in, # Passwort-Reset). Ohne diese drei Werte werden E-Mails nur geloggt statt # versendet — praktisch fuer lokale Entwicklung ohne Mail-Setup. # Funktioniert mit jedem SMTP-Anbieter (z.B. das E-Mail-Postfach eures # Domain-Hosters wie IONOS/Strato, oder ein Dienst wie Resend/Postmark im # SMTP-Modus). SMTP_HOST= SMTP_PORT=587 SMTP_USER= SMTP_PASSWORD= SMTP_FROM="Wabenhain " # ApiCore-Ernten-Synchronisierung (optional, admin/ernten -> "ApiCore- # Synchronisierung"). Ohne diese drei Werte zeigt der Sync-Button einen # Konfigurationsfehler statt eines Ergebnisses. ApiCore ist ein separates # Projekt (NestJS-Backend) mit reinem E-Mail/Passwort-Login (kein API-Key- # Mechanismus) — hier IDEALERWEISE die Zugangsdaten eines dedizierten, # MFA-freien Service-Kontos mit ausschliesslich den Berechtigungen # "harvests:read" (und optional "apiaries:read") eintragen, nicht die eines # echten Admin-Zugangs. Details siehe src/lib/apicore-client.ts. APICORE_API_URL= APICORE_SYNC_EMAIL= APICORE_SYNC_PASSWORD= # DHL Parcel DE Shipping API ("Post & Parcel Germany", developer.dhl.com) — # ermoeglicht das Erstellen von DHL-Versandmarken per Knopfdruck im # Admin-Bestelldetail (siehe src/lib/dhl.ts). Ohne diese fuenf Werte zeigt # der Button dort nur den Hinweis "DHL ist noch nicht konfiguriert". # # So kommt ihr an die Werte: # 1. Account anlegen auf https://developer.dhl.com und eine App registrieren, # die die API "Parcel DE Shipping" (Post & Parcel Germany) einbindet. # Die App liefert DHL_API_KEY (Consumer Key) und DHL_API_SECRET # (Consumer Secret). Fuer den Sandbox-Test reichen diese beiden Werte # plus die DHL-Testzugangsdaten unten. # 2. Fuer den PRODUKTIV-Betrieb zusaetzlich einen DHL-Geschaeftskundenvertrag # ("DHL Paket" Versandvertrag) abschliessen — Ansprechpartner ist der # DHL-Vertrieb bzw. https://www.dhl.de/de/geschaeftskunden/paket.html. # Darueber bekommt ihr: # - Zugangsdaten zum Geschaeftskundenportal (GKP) -> DHL_GKP_USERNAME/ # DHL_GKP_PASSWORD (dieselben Zugangsdaten, mit denen ihr euch auf # dhl.de/geschaeftskundenportal einloggt). # - Die EKP (10-stellige Kundennummer) plus Verfahren/Teilnahme fuer # das gebuchte Produkt (Standard-Inlandspaket V01PAK) -> zusammen # ergibt das die 14-stellige DHL_ACCOUNT_NUMBER (billingNumber). # 3. DHL_ENVIRONMENT auf "sandbox" lassen, bis alles funktioniert, dann auf # "production" umstellen (unterschiedliche Basis-URLs, siehe lib/dhl.ts). # # DHL-Sandbox-Testzugangsdaten (Stand der Recherche, koennen sich aendern — # im Zweifel im DHL-Developer-Portal unter der App nachschauen): # DHL_GKP_USERNAME=user-valid # DHL_GKP_PASSWORD=SandboxPasswort2023! DHL_API_KEY= DHL_API_SECRET= DHL_GKP_USERNAME= DHL_GKP_PASSWORD= # 14-stellig: EKP (10-stellig) + Verfahren (2-stellig) + Teilnahme (2-stellig) DHL_ACCOUNT_NUMBER= DHL_ENVIRONMENT=sandbox # Microsoft Entra ID SSO ("Mit Microsoft anmelden", siehe # src/app/api/auth/entra/). Ohne diese vier Werte zeigt der Button auf # /konto einen Hinweis, dass SSO noch nicht konfiguriert ist, statt # abzustuerzen. # # So richtet ihr es ein (Owner-Aufgabe im Azure-Portal, https://entra.microsoft.com): # 1. Entra ID -> App registrations -> "New registration". # - Name frei waehlbar, z.B. "Wabenhain Kundenlogin". # - "Supported account types": i.d.R. "Accounts in this organizational # directory only" (Single Tenant) fuer eine reine Firmen-SSO-Anbindung. # - Redirect URI: Plattform "Web", URL = /api/auth/entra/callback # (lokal: http://localhost:3000/api/auth/entra/callback). # 2. Nach dem Erstellen: "Application (client) ID" -> ENTRA_CLIENT_ID, # "Directory (tenant) ID" -> ENTRA_TENANT_ID (beide auf der Overview-Seite # der App-Registrierung sichtbar). # 3. "Certificates & secrets" -> "New client secret" erzeugen -> der # angezeigte WERT (nicht die Secret-ID!) -> ENTRA_CLIENT_SECRET. Nur # einmal sichtbar, bei Verlust ein neues Secret erzeugen. # 4. ENTRA_REDIRECT_URI = exakt dieselbe URL wie die in Schritt 1 hinterlegte # Redirect-URI (muss zeichengenau uebereinstimmen). # 5. "Enterprise applications" in Entra ID zeigt die App danach automatisch # als Unternehmensapplikation (wird beim App-Registration-Schritt # automatisch mit angelegt) — dort laesst sich optional der Nutzerkreis # (z.B. nur bestimmte Gruppen) einschraenken. ENTRA_TENANT_ID= ENTRA_CLIENT_ID= ENTRA_CLIENT_SECRET= ENTRA_REDIRECT_URI=http://localhost:3000/api/auth/entra/callback