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.
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.
| Modul | Zweck |
|---|---|
| content | Beiträge, News und Termine des Weinguts |
| lage | Weinbergslagen mit Bodenart, Exposition und Beschreibung |
| rebsorte | Rebsorten-Steckbriefe |
| winzer | Winzer-Profil mit Historie, Team und Werten |
| product-review | Produktbewertungen inklusive Aggregat |
| gift-card | Geschenkgutscheine mit Code-Einlösung und PDF |
| @medusajs/medusa/file | Datei-Ablage über den S3-Provider (MinIO) |
| @medusajs/medusa/payment | Zahlungen ü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.
| Tabellen | Inhalt |
|---|---|
| product, product_variant, product_option | Weine, Jahrgänge, Gebindegrößen |
| order, order_item, return, claim | Bestellwesen |
| customer, customer_group | Kundschaft |
| sales_channel | Mandantengrenze |
| content_post | Beiträge, News, Termine |
| lage, rebsorte | Lagen und Rebsorten |
| winzer, team_member, timeline_entry, winzer_value | Winzer-Profil |
| review, review_aggregate | Bewertungen |
| gift_card, gift_card_transaction | Gutscheine 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.
| Dienst | Braucht | Verhalten |
|---|---|---|
| PostgreSQL | — | Muss zuerst laufen. Ohne DB startet Medusa nicht. |
| Redis | — | Muss vor Medusa laufen (Event-Bus). |
| MinIO | — | Unabhängig. Fällt es aus, fehlen Bilder, der Shop läuft weiter. |
| Medusa | PostgreSQL, Redis, MinIO | Herzstück. Ohne Medusa zeigen Shops Fehlerzustände. |
| Cockpit | Medusa | Login läuft über die Medusa Admin API. |
| Storefronts | Medusa | Serverseitiges Rendering holt alle Daten aus der Store API. |
| Traefik | — | Kann jederzeit laufen; erkennt neue Container automatisch. |