No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Christian Säum 4a85238d33
All checks were successful
CI – Validate & Release / validate (push) Successful in 9s
CI – Validate & Release / mirror (push) Successful in 3s
CI – Validate & Release / release (push) Has been skipped
Merge pull request 'chore(license): AGPL-3.0-or-later + Copyright-Hinweis' (#1) from chore/add-license into main
2026-09-02 19:47:37 +00:00
.forgejo/workflows fix(ci): retry Codeberg pushes on 502/504, prefer compose v2 (dockerfile_inline) 2026-06-21 18:13:20 +02:00
.idea feat(shopware6): reusable SW6 stack with autoheal, cron & backup cleanup 2026-06-13 14:49:39 +02:00
configs feat(shopware6): reusable SW6 stack with autoheal, cron & backup cleanup 2026-06-13 14:49:39 +02:00
.env feat(shopware6): reusable SW6 stack with autoheal, cron & backup cleanup 2026-06-13 14:49:39 +02:00
.gitignore chore(gitignore): ignore dist/ (CI build artifacts) 2026-06-21 14:30:14 +02:00
AGENTS.md feat(shopware6): reusable SW6 stack with autoheal, cron & backup cleanup 2026-06-13 14:49:39 +02:00
CICD-Actions.md docs(ci): align docs with hardened pipeline (compose v2 runner image, Codeberg 502/504 retry) 2026-06-21 18:57:48 +02:00
CLAUDE.md feat(shopware6): reusable SW6 stack with autoheal, cron & backup cleanup 2026-06-13 14:49:39 +02:00
docker-compose.yml Anpassung für Healthcheck weil App ständig restart. 2026-06-13 22:12:32 +02:00
LICENSE chore(license): add AGPL-3.0-or-later license and copyright notice 2026-09-02 21:32:48 +02:00
Projekt.md feat(shopware6): reusable SW6 stack with autoheal, cron & backup cleanup 2026-06-13 14:49:39 +02:00
README.md chore(license): add AGPL-3.0-or-later license and copyright notice 2026-09-02 21:32:48 +02:00

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: .env enthä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 compose immer 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üft http://localhost:8000/admin. Liefert die App dauerhaft 5xx (z. B. ausstehende Migration beim Erst-Deploy), kann Autoheal den app-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_version existiert nicht mehr – nicht setzen.
  • opcache-blacklist.txt wird nach /etc/opcache-blacklist.txt gemountet (von shopware.ini referenziert, 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 auf main + Tags): docker compose config -q, yamllint (relaxed) und gitleaks (nur Working-Tree). Es wird docker compose v2 genutzt (Runner-Image catthehacker/ubuntu:act-latest; nötig u. a. für v2-Keys wie dockerfile_inline), apt nur als Fallback – kein 64-MB-github-Download.
  • mirror (nur Push, needs: validate): spiegelt main + Tags erst nach grünen Checks nach Codeberg (Org Docker-Stacks), mit Retry gegen transiente 502/504. Forgejos eingebauten Push-Mirror dafür nicht zusätzlich aktivieren.
  • release (nur Tag v*): 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.