Zum Inhalt springen
~/jeremy-thelen
Live-Demo Selbst hostbares Shopsystem · E-Commerce

SymfoShop

Ausgangslage

Wer einen Online-Shop betreiben will, landet oft bei einem Mietshop: laufende Gebühren, wenig Kontrolle über Daten und Code und kaum Spielraum für eigene Abläufe. Gleichzeitig braucht ein Shop weit mehr als Produktseiten – Warenkorb, Checkout, Zahlungen, Versand- und Steuerregeln, Rechnungen und ein Backend, in dem sich alles ohne Entwickler pflegen lässt, und das Ganze mehrsprachig.

Lösung

SymfoShop ist ein Shopsystem zum Selbsthosten auf Symfony 7.4: Betreiber installieren es auf ihrem eigenen Server – per Docker oder klassisch – und behalten Daten und Installation in der eigenen Hand. Mit dabei: Varianten, Gutscheine und Wunschliste, workflow-basierter Bestellprozess mit Stripe und PayPal, länderbasierte Mehrwertsteuer, PDF-Rechnungen, asynchroner Mailversand, ein Admin-Backend mit Theme-Editor und eine REST-API mit OpenAPI-Doku – auf Deutsch, Englisch und Französisch.

Architektur

So greifen die Teile ineinander – von der Oberfläche bis zu den externen Diensten.

Oberflächen
ShopTwig · Alpine.js · Tailwind
Admin-BackendRollen · 2FA · Audit-Log
REST-APIAPI-Schlüssel · OpenAPI
Anwendung · Symfony 7.4
  • Katalog & Varianten
  • Warenkorb & Checkout
  • Bestell-Workflow
  • Zahlungen
  • Lager & Reservierungen
  • Steuern
  • Rechnungen (PDF)
  • Support & Retouren
  • Theme-Editor
Daten & Hintergrund
MySQLDoctrine ORM · Migrations
MessengerMails & Erinnerungen asynchron
CronjobsReservierungen freigeben
Externe Dienste
Stripe · PayPal · KlarnaWebhooks, genau einmal verarbeitet
E-MailSMTP

Vorgehen

Im Mittelpunkt stand die Frage, wie ein Shopsystem gebaut sein muss, damit Betreiber es selbst installieren, an ihre Marke anpassen und im Alltag zuverlässig betreiben können – auch wenn eine Zahlung hängt, die Ware knapp wird oder mehrere Leute gleichzeitig im Backend arbeiten.

  • Für Betreiber gebaut: Installation per Docker Compose oder klassisch mit einem Makefile (Datenbank, Migrationen, Admin-Konto), Branding über den Theme-Editor ohne Code, Updates direkt aus dem Admin-Dashboard.
  • Bestellungen als Zustandsautomat (Symfony Workflow): Jede Bestellung durchläuft fest definierte Schritte von „neu“ über „bezahlt“ bis „versendet“ und „abgeschlossen“. Unerlaubte Sprünge sind technisch ausgeschlossen.
  • Austauschbare Zahlungsanbieter: Stripe, PayPal, Klarna und eine Test-Bank hängen an einer gemeinsamen Schnittstelle. Webhooks werden genau einmal verarbeitet, auch wenn ein Anbieter sie mehrfach schickt.
  • Lager mit Reservierungen: Im Checkout wird die Ware reserviert und erst nach der Zahlung verbucht. Abgelaufene Reservierungen gibt ein Cronjob automatisch wieder frei.
  • Steuern und Rechnungen: Mehrwertsteuer nach Lieferland inklusive steuerfreier Ausfuhrlieferungen, fortlaufende Rechnungsnummern pro Jahr und PDF-Rechnungen im Design des Shops.
  • Arbeit im Hintergrund: Bestellbestätigungen, Warenkorb-Erinnerungen und „Wieder verfügbar“-Mails laufen über Symfony Messenger und können per Warteschlange vom Checkout entkoppelt werden.
  • Backend für ein ganzes Team: Rollen für Admin, Support und Lager, Login mit Zwei-Faktor-Authentifizierung, Audit-Log, Support-Postfach sowie Retouren und Erstattungen.
  • Abgesichert durch Tests: 61 PHPUnit-Testklassen, Ende-zu-Ende-Tests mit Playwright und automatische Prüfung in GitHub Actions.

Ergebnis

Eine öffentliche Referenzinstallation läuft auf meinem Server: Auf der Login-Seite meldet man sich mit einem Klick als Kunde oder als Admin an und kann alles selbst ausprobieren – bestellen, mit der Test-Bank bezahlen, Rechnungen herunterladen und Bestellungen im Backend bearbeiten. Jede Stunde setzt sich die Installation auf einen sauberen Stand zurück.

  • Kompletter Bestellprozess vom Warenkorb bis zur PDF-Rechnung
  • Admin-Dashboard mit Kennzahlen, offenen Aufgaben und eigener Ansicht fürs Handy
  • Dreisprachig (Deutsch, Englisch, Französisch) im Shop, in E-Mails und auf Rechnungen
  • REST-API mit API-Schlüsseln und OpenAPI-Dokumentation

Der Quellcode ist auf GitHub einsehbar – als Referenz dafür, wie ich Projekte strukturiere, teste und dokumentiere.

Im Produktivbetrieb

SymfoShop ist dafür gemacht, beim Betreiber auf dem eigenen Server zu laufen. So sieht das in der Praxis aus – am Beispiel meiner öffentlichen Referenzinstallation:

  • Installation: per Docker Compose oder klassisch mit PHP und MySQL; ein Makefile richtet Datenbank, Migrationen und das erste Admin-Konto ein.
  • Server der Referenzinstallation: Ubuntu 24.04 LTS mit Apache, PHP 8.3 und MySQL 8; HTTPS über Let’s Encrypt mit automatischer Verlängerung.
  • Updates: Betreiber holen neue Versionen direkt im Admin-Dashboard oder per Befehl – Code aus GitHub, Migrationen und Cache in einem Schritt. Auf meinem Server wird davor automatisch die Datenbank gesichert, und am Ende steht der Befehl für den Rücksprung.
  • Hintergrundaufgaben per Cron: abgelaufene Lager-Reservierungen alle fünf Minuten freigeben, abgelaufene Passwort-Links nachts löschen.
  • Demo, die aufgeräumt bleibt: Die Referenzinstallation setzt sich jede Stunde auf einen sauberen Stand zurück, nur die Test-Bank ist als Zahlungsart aktiv, und es gehen keine echten E-Mails raus. Messenger läuft dort synchron; im Echtbetrieb stellt man per Umgebungsvariable auf eine Warteschlange mit Worker um.
  • Admin-Zugang mit Zwei-Faktor-Authentifizierung und getrennten Rollen für Admin, Support und Lager.

Zurück zu den Projekten