Kapitel 2

Komponenten

Acht Bausteine, jeder mit einer klaren Aufgabe. Dieses Kapitel geht sie einzeln durch: was der Baustein tut, worauf er läuft, womit er spricht — und was passiert, wenn er ausfällt.

Cockpit

Das Cockpit ist die Arbeitsoberfläche der Winzerin. Es läuft unter cockpit.raspb.eu als SvelteKit-Anwendung mit adapter-node im Docker-Container. Angemeldet wird sich über die Medusa Admin API; danach arbeitet die Oberfläche als Single-Page-Anwendung weiter.

Was darin verwaltet wird

  • Weinbuch — Produkte, Jahrgänge, Preise, Bestände, Artikelnummern
  • Bestellungen — Positionen, Kundendaten, Status, Rechnungs-PDF
  • Content — Beiträge, Lagen, Rebsorten, Winzer-Profil
  • Medienpool — Bilder mit Verwendungsprüfung vor dem Löschen
  • Einstellungen — Profil, Logo, Benachrichtigungen, Zahlungen

Technische Besonderheiten

Rechnungs-PDFs entstehen im Cockpit selbst: Ein HTML-Template wird von Puppeteer in einem mitgelieferten Chromium gerendert. Deshalb ist das Cockpit-Image deutlich größer als ein reines Node-Image. Bild-Uploads laufen nicht direkt gegen MinIO, sondern über die Medusa-API — so gilt für Dateien dieselbe Authentifizierung wie für alles andere.

Storefronts

Pro Weingut läuft eine eigene Storefront in einem eigenen Container. Alle stammen aus demselben Template unter storefronts/template/ und unterscheiden sich in zwei Dingen: den Umgebungsvariablen des Mandanten und dem Branding.

Umgebungsvariablen pro Mandant
TENANT_BASE_URL=https://medusa.raspb.eu
TENANT_PUBLISHABLE_KEY=pk_…
TENANT_SALES_CHANNEL_ID=sc_…
TENANT_REGION_ID=reg_…
TENANT_SHOP_DOMAIN=shop-<slug>.raspb.eu
TENANT_SHOP_NAME="Weingut <Name>"
TENANT_STRIPE_ACCOUNT_ID=acct_…

Die Seiten werden serverseitig gerendert — die erste Antwort enthält bereits das fertige HTML samt Produktdaten. Das ist für Suchmaschinen wichtig und macht den ersten Seitenaufbau schnell, auch auf dem Handy im Weinberg.

Was eine Storefront enthält

  • Startseite, Katalog mit Filtern, Produktdetailseite, Suche
  • Warenkorb, Checkout mit eingebettetem Stripe, Merkzettel
  • Content-Seiten: Winzer-Portrait, Lagen, Rebsorten, Beiträge
  • Gutschein-Kauf und Gutschein-Einlösung im Checkout
  • Rechtliches: Impressum, Datenschutz, Widerruf, Versand

Medusa

Medusa v2 ist das Commerce-Backend und die einzige Komponente mit Datenbankzugriff. Es liefert Produkte, Varianten, Warenkörbe, Bestellungen, Kunden und Sales Channels — und darüber hinaus die Module, die diese Plattform zu einer Weinplattform machen.

Registrierte Module
ModulZweck
contentBeiträge, News und Termine des Weinguts
lageWeinbergslagen mit Bodenart, Exposition und Beschreibung
rebsorteRebsorten-Steckbriefe
winzerWinzer-Profil mit Historie, Team und Werten
product-reviewProduktbewertungen inklusive Aggregat
gift-cardGeschenkgutscheine mit Code-Einlösung und PDF
@medusajs/medusa/fileDatei-Ablage über den S3-Provider (MinIO)
@medusajs/medusa/paymentZahlungen über Stripe (Connect)

Jedes eigene Modul bringt Datenmodell, Service und API-Routen mit: Admin-Routen für das Cockpit, Store-Routen für die Storefronts. Die Store-Routen verlangen den Header x-publishable-api-key, über den die Mandantenzugehörigkeit aufgelöst wird.

PostgreSQL

Die Datenbank läuft im Image pgvector/pgvector:pg17. Die Vektor-Erweiterung wird derzeit nicht genutzt; das Image ist historisch gewachsen und schadet nicht. Hauptdatenbank ist medusa_db.

Wichtige Tabellen
TabellenInhalt
product, product_variant, product_optionWeine, Jahrgänge, Gebindegrößen
order, order_item, return, claimBestellwesen
customer, customer_groupKundschaft
sales_channelMandantengrenze
content_postBeiträge, News, Termine
lage, rebsorteLagen und Rebsorten
winzer, team_member, timeline_entry, winzer_valueWinzer-Profil
review, review_aggregateBewertungen
gift_card, gift_card_transactionGutscheine und ihre Einlösungen

Der Port ist nicht mehr auf dem Host geöffnet — die Datenbank ist ausschließlich aus dem internen Docker-Netz erreichbar. Gesichert wird nächtlich per pg_dump mit Ablage außerhalb des Servers.

Redis

Redis übernimmt zwei Aufgaben für Medusa: Es ist der Event-Bus, über den Subscriber wie die Bestellbestätigung oder die Lagerbestand-Warnung ausgelöst werden, und es hält die Sessions. Es läuft im alpine-Image, passwortgeschützt und gebunden an 127.0.0.1.

MinIO / S3

MinIO ist der Medienspeicher: Produktbilder, Content-Bilder und Logos liegen im Bucket medusa. Medusa spricht MinIO über das File-Modul mit S3-Provider an — es kennt also gar kein MinIO, sondern nur „ein S3“.

Ausgeliefert werden die Bilder unter s3.raspb.eu, die Verwaltungskonsole liegt auf minio.raspb.eu. Weil die Schnittstelle S3-kompatibel ist, lässt sich der Speicher später ohne Codeänderung zu einem Cloud-Anbieter verschieben — nur die Zugangsdaten und der Endpunkt ändern sich.

Stripe

Bezahlt wird über Stripe, eingebettet direkt in den Checkout. Es gibt keine Weiterleitung auf eine fremde Seite — die Kundschaft bleibt im Shop des Weinguts.

Stripe Connect

Jedes Weingut hat sein eigenes Stripe-Konto, das über Stripe Connect mit der Plattform verbunden wird. Genutzt wird Standard-OAuth, nicht Express-Accounts: Das Weingut behält vollen Zugriff auf sein eigenes Stripe-Dashboard, sieht seine Auszahlungen selbst und kann die Verbindung jederzeit lösen. Das Geld fließt direkt an das Weingut; die Plattform behält nichts ein.

Traefik

Traefik nimmt allen Verkehr an, leitet Port 80 auf 443 um, holt und erneuert die Let’s-Encrypt-Zertifikate und verteilt anhand des Hostnamens. Die Konfiguration kommt aus zwei Quellen: Docker-Labels an den Containern und statischen Dateirouten für alles, was nicht als Container läuft.

Für den Betrieb heißt das: Ein neuer Shop-Container mit den richtigen Labels ist nach dem Start automatisch erreichbar und automatisch mit Zertifikat versorgt. Es gibt keinen Schritt „Proxy konfigurieren“.

Zusammenspiel

Wer den Stack von Hand hochfährt oder einen Ausfall einordnen will, braucht die Abhängigkeiten.

Startreihenfolge und Ausfallverhalten
DienstBrauchtVerhalten
PostgreSQLMuss zuerst laufen. Ohne DB startet Medusa nicht.
RedisMuss vor Medusa laufen (Event-Bus).
MinIOUnabhängig. Fällt es aus, fehlen Bilder, der Shop läuft weiter.
MedusaPostgreSQL, Redis, MinIOHerzstück. Ohne Medusa zeigen Shops Fehlerzustände.
CockpitMedusaLogin läuft über die Medusa Admin API.
StorefrontsMedusaServerseitiges Rendering holt alle Daten aus der Store API.
TraefikKann jederzeit laufen; erkennt neue Container automatisch.