| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| .idea | ||
| configs | ||
| .env | ||
| .gitignore | ||
| AGENTS.md | ||
| CICD-Actions.md | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| LICENSE | ||
| Projekt.md | ||
| README.md | ||
Shopware 6 – WSC Standard Stack
Selbst gehosteter Shopware-6-Shop auf Basis des offiziellen ghcr.io/shopware/docker-base-Images,
mit OpenSearch, getrennten Redis-Instanzen (Cache + Messenger) und MariaDB.
Template-Hinweis:
.enventhält nur Platzhalter (CHANGE_ME,example.*). Vor dem Einsatz anpassen, Passwörter gemäß Anleitung im.env-Kopf erzeugen (openssl rand -hex 32). Werte, die je in Git lagen, gelten als kompromittiert → rotieren.
1. Voraussetzungen
- Docker + Docker Compose v2
- Externes Netz
traefik_proxy_network(Traefik-Stack) - Zentrale Stacks für die Integrationen:
docker-autoheal-neustart,docker-ofelia-cronjobs,docker-docker-backup-backups - Backup-Verzeichnis
${BACKUP_PATH}(Default/Daten/Backups) muss auf dem Host existieren - Die Volume-Ordner unter
./volumes/werden beim Start angelegt (Bind-Mounts)
2. Starten
Wichtig:
docker composeimmer aus diesem Stack-Verzeichnis starten (${PWD}-Mounts).
docker compose build
docker compose up -d
3. Shopware-Konfiguration (z-shopware.yaml)
configs/shopware/z-shopware.yaml enthält die Stack-spezifische Shopware-Config
(Redis-Cache/Session/Lock, Messenger-Transports, Monolog). Sie muss in den
Shopware-Projektcode unter config/packages/z-shopware.yaml deployed werden
(liegt zur Laufzeit in volumes/html/config/packages/).
Passende DATABASE_URL / Redis-DSNs werden über Env-Variablen gesetzt.
4. Integrationen
Autoheal (Self-Healing)
autoheal=true auf app, opensearch, redis-cache, redis-messenger, sql (alle mit
Healthcheck). worker/scheduler laufen bewusst ohne Autoheal – sie beenden sich per
--time-limit=300 zyklisch und werden über restart: unless-stopped neu gestartet.
⚠️ Der
app-Healthcheck prüfthttp://localhost:8000/admin. Liefert die App dauerhaft 5xx (z. B. ausstehende Migration beim Erst-Deploy), kann Autoheal denapp-Container in eine Restart-Schleife bringen → beim ersten Setup beobachten, ggf.autoheal-Label temporär raus.
CronJobs (Ofelia) – Schedule ist 6-Feld (mit Sekunden!)
Auf app (als ${CRONJOB_USER}): ES-Index Cleanup/Rebuild, Admin-Index, Theme-Compile,
Cache-Warmup, Sitemap, cache:clear:delayed.
DB-Backup (shyim/docker-backup) – Schedule 5-Feld
Label auf sql: type=mysql, BACKUP_SCHEDULE (Default alle 6 h), Retention BACKUP_RETENTION.
Landet unter /Daten/Backups/<sql-container>/db/….
Datei-Backup (Ofelia + backup-helper)
Da shyim nur named volumes sichert (eure Daten sind Bind-Mounts), läuft das Datei-Backup
über den idle backup-helper: Ofelia job-exec packt täglich 05:00 ein tar.gz von
/var/www/html nach ${BACKUP_PATH}/<projekt>/files/ (Retention 5 Tage).
5. Hinweise / Stolpersteine
- Ofelia vs. shyim Cron-Format: Ofelia = 6-Feld (
0 5 0 * * *), shyim = 5-Feld (5 0 * * *). Nicht verwechseln. - OpenSearch 3:
compatibility.override_main_response_versionexistiert nicht mehr – nicht setzen. opcache-blacklist.txtwird nach/etc/opcache-blacklist.txtgemountet (vonshopware.inireferenziert, hält Twig-Templates aus dem OPcache).- Datei-Backup-Command (Ofelia
sh -c+$(date)) auf dem Server gegentesten.
6. Nützliche Befehle
docker compose config -q # Konfiguration validieren
docker compose up -d
docker compose logs -f app
docker compose exec -u www-data app php bin/console <command>
docker compose down
7. Shopware Befehle
./bin/console messenger:setup-transports
8. CI/CD & Spiegelung
Die Pipeline (.forgejo/workflows/ci.yml) läuft self-hosted auf Forgejo, ganz ohne externe Actions (Checkout per git clone):
validate(jeder Push/PR aufmain+ Tags):docker compose config -q,yamllint(relaxed) undgitleaks(nur Working-Tree). Es wird docker compose v2 genutzt (Runner-Imagecatthehacker/ubuntu:act-latest; nötig u. a. für v2-Keys wiedockerfile_inline), apt nur als Fallback – kein 64-MB-github-Download.mirror(nur Push,needs: validate): spiegeltmain+ Tags erst nach grünen Checks nach Codeberg (OrgDocker-Stacks), mit Retry gegen transiente 502/504. Forgejos eingebauten Push-Mirror dafür nicht zusätzlich aktivieren.release(nur Tagv*): baut ein schlankes Deploy-ZIP und hängt es an ein Forgejo-Release und – als Backup – an ein Codeberg-Release (die Releases-Unit am Codeberg-Repo wird dabei automatisch aktiviert).
Release auslösen:
git tag v1.1
git push origin v1.1
Details siehe CICD-Actions.md.
Lizenz
Copyright (C) 2026 Christian Säum – web-seo-consulting.eu
Dieses Projekt steht unter der GNU Affero General Public License, Version 3
oder (nach deiner Wahl) einer späteren Version (AGPL-3.0-or-later). Der
vollständige Lizenztext steht in der Datei LICENSE.
Du darfst die Software nutzen, weitergeben und – auch kommerziell – verkaufen.
Gibst du eine veränderte Fassung weiter oder betreibst du sie über ein
Netzwerk (z. B. als Dienst), muss deren vollständiger Quellcode ebenfalls
unter der AGPL-3.0-or-later verfügbar sein. Der Copyright-Hinweis und die
Nennung des ursprünglichen Autors dürfen nicht entfernt werden.
Diese Angabe betrifft nur die in diesem Repository enthaltenen eigenen Dateien (Konfiguration, Skripte, Anpassungen). Eingebundene Fremdsoftware und Container-Images unterliegen weiterhin ihren eigenen Lizenzen.