Während Monaten habe ich versucht mir ein Testsystem für Shopware 6 zuzulegen. Mit XAMP auf meinem lokalen Windows Computer wurde ich nie wirklich glücklich. Während Versionen unter 6.4.X noch halbwegs (allerdings mit vielen Problemen) noch liefen, ging spätestens mit Version 6.5.X überhaupt nichts mehr. Es musste also etwas anderes her. Am liebsten wäre mir schon immer eine Installation auf meiner Synology NAS gewesen. Denn die läuft sowieso den ganzen Tag und ich kann praktisch von überall auf der Welt über VPN auf meine Daten zugreifen. Allerdings finden sich kaum Anleitungen im Netz und mir wurde von diversen Seiten auch immer wieder davon abgeraten, da die NAS einfach nicht genügend Power habe. Das mit der Leistung machte mir schon etwas Gedanken, denn mit meiner schon in die Jahre gekommenen Synology DS218+ habe ich natürlich nicht gerade die ultimative Rakete. Aber meiner Meinung nach müsste es eigentlich gehen.
Vor 3-Wochen startete ich also ein neues Projekt mit dem Ziel, Shopware 6 als Testsystem auf meiner Synology zu installieren. Synology ist Linux basierend und bietet für kleinere Projekte auch die integrierte Web Station an. Blogs wie Wordpress lassen sich so problemlos innert Minuten installieren. Bei Shopware ist das jedoch eine etwas andere Sache. Shopware 5 habe ich damals noch mit ach und krach zum Laufen gebracht, jedoch mit einer derart dürftigen Performance, dass es nicht wirklich Freude machte. Bei Shopware 6 scheiterte es jedoch bereits bei der Installation, da diverse Server Protokolle einfach fehlen und nicht nachinstalliert werden können. Ich habe nach stundenlangem experimentieren schliesslich aufgegeben.
Dann wurde ich jedoch auf Docker aufmerksam. Bei Synology lässt sich dieser über das Paket-Zentrum unter dem Namen «Container Manager» installieren. Um es kurz zu halten, die Installation über Docker funktioniert tatsächlich! Sogar die Perfomance von Shopware 6 lässt sich absolut zeigen. Ich habe Ladezeiten von ca. 2-3 Sekunden, was für die Entwicklung und Tests absolut reicht. Allerdings ist die Installation etwas, was mir fast einen Herzinfarkt beschert hätte. Schlussendlich hatte ich ca. 3 Wochen, und unzählige Nachtschichten, bis ich endlich alles so konfiguriert hatte, dass es funktionierte wie es funktionieren sollte. Ich möchte dieses Wissen hiermit gerne weitergeben, denn ein Forum lebt ja schliesslich nicht nur von Fragen, sondern auch von Antworten.
Also dann geht’s jetzt los:
Was Du brauchst:
Eine Synology (DS) ist natürlich Voraussetzung. Ich habe wie erwähnt eine DS218+. Ob das Ganze auch mit einer leistungsschwächeren DS funktioniert, weiss ich nicht. Alles was mindestens der Leistung einer DS218+ entspricht, sollte allerdings kein Problem darstellen.
Also los geht’s!
Gehe in Deiner DS ins Paket-Zentrum und installiere dort den «Container Manager»
Nebst der App „Container Manager“ solltet Ihr auch einen neuen Ordner mit dem Namen «docker» in der „File Station“ finden. Suche den Ordner und erstelle darin folgende zwei Unterordner:
«shopware» und «mariadb»
Gehe nun zurück ins Paket-Zentrum und öffne dort den «Container Manager»
-
Klicke im Menü auf «Netzwerk» / Hinzufügen
-
Trage unter Netzwerkname z.B. «shopware_netzwerk» ein. Wichtig! Nur Kleinbuchstaben verwenden.
-
Wähle bei IPv4-Konfiguration «Automatisch»
-
Den Rest kannst Du so belassen wie es ist. Klicke nun auf «Übernehmen»
-
Gehe zurück ins Menü und klicke dort auf „Projekt“ → „Erstellen“ und fülle die Felder wie folgt aus:
-
Projektname: z.B: «mariadb» (wichtig Kleinbuchstaben)
-
Pfad: Klicke auf «Pfad» docker/mariadb (einer der Ordner welchen wir unter Punkt 2 soeben angelegt haben
-
Quelle: wähle «docker-compose.yml erstellen
Ergänze Angaben wie MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD etc. und kopiere den Code in das Konfigurationsfeld:
version: '3'
1.
2. services:
3. mariadb:
4. container_name: mariadb10
5. image: mariadb:latest
6. restart: always
7. environment:
8. MYSQL_ROOT_PASSWORD: root
9. MYSQL_DATABASE: name_deiner_datenbank
10. MYSQL_USER: root
11. MYSQL_PASSWORD: root
12. volumes:
13. - /volume1/docker/mariadb:/var/lib/mysql
14. networks:
15. - shopware_netzwerk
16.
17. phpmyadmin:
18. container_name: phpmyadmin
19. image: phpmyadmin/phpmyadmin
20. restart: always
21. environment:
22. PMA_HOST: mariadb
23. PMA_USER: root
24. PMA_PASSWORD: root
25. ports:
26. - "8081:80"
27. depends_on:
28. - mariadb
29. networks:
30. - shopware_netzwerk
31.
32. networks:
33. shopware_netzwerk:
34. external:
35. name: shopware_netzwerk
Klicke nun 2 x auf «Weiter» und bestätige die Zusammenfassung mit «Fertig»
Erklärung:
Der Docker erstellt nun zwei Container
- Es wird die Datenbank MariaDB10 und phpMyAdmin installiert. Nun fragt Ihr Euch vielleicht, weshalb ich separat die Datenbank installiere, wenn die doch im nachfolgend erwähnten Image-Paket «Dockware» bereits enthalten ist. Richtig, allerdings habt Ihr so viel mehr Möglichkeiten die Datenbank zu überwachen und auch zu optimieren. Ich hatte mit der Integrierten Version nur Probleme. Und was phpMyAdmin betrifft: Eigentlich erhält man mit der Shopware Entwickler Version auch gleich den Adminer installiert. Ich verwende allerdings phpMyAdmin seit Jahren und wollte diesen unbedingt mit an Board haben. Falls Ihr den nicht benötigt, löscht einfach den Teil ab „phpmyadmin:“ raus, lasst aber „networks:“ und alles darunter unbedingt bestehen.
Ok, nun haben wir die Datenbank also bereits angelegt und möchten nun Shopware installieren. Dafür gibt’s von Dockware fix fertige Images welche ihr nutzen könnt. Ich habe mich für das Image «dockware/dev» - also die Entwickler Version entschieden, weil dort am meisten on board ist.
- Zur Installation:
- Gehe nun erneut im Menü auf «Projekt» → «Erstellen» und fülle die Felder wie folgt aus:
- Projektname: z.B: «shopware» (wichtig Kleinbuchstaben)
- Pfad: Klicke auf «Pfad» docker/shopware (einer der Ordner welchen wir unter Punkt 2 angelegt haben
- Quelle: wähle «docker-compose.yml» erstellen und trage dort folgendes ein:
version: '3'
services:
shop:
container_name: shopware
image: dockware/dev:latest
ports:
- "2222:22" # SSH
- "8080:80" # Apache2
- "4433:443" # Apache2 HTTPS
- "8888:8888" # Watch Admin
- "9998:9998" # Watch Storefront Proxy
- "9999:9999" # Watch Storefront
volumes:
- "/volume1/docker/shopware:/var/www/html"
environment:
- PHP_VERSION=8.2
- XDEBUG_ENABLED=1
networks:
- shopware_netzwerk
networks:
shopware_netzwerk:
external:
name: shopware_netzwerk
Klicke nun 2 x auf «Weiter» und bestätige die Zusammenfassung mit «Fertig»
Was passiert: Docker installiert nun Shopware 6, allerdings noch in der integrierten mysql Datenbank. Die zuvor installierte MariaDB10 wird also erst im nächsten Schritt verwendet. Dann nämlich, wenn Du Deine Datenbank des live Shops nach MariaDB importiert hast. Wie das geht, zeige ich Dir im nächsten Schritt.
Nun geht’s etwas tiefer ins System. Über die GUI von Synology geht’s nun leider nicht mehr weiter. Wir benötigen SSH Zugang und zwar mit Hilfe des kostenlosen Tools «PUTTY». Suche in Google nach puTTY und installiere Dir das Tool für dein System.
PuTTY ist wie erwähnt ein Verbindungstool mit welchem Du SSH Zugang erhältst. Und genau das benötigen wir nun.
Zunächst brauchen wir einen Datenbank-Dump Deines live Shops, falls noch nicht vorhanden. Diesen kannst Du entweder direkt bei Deinem Provider anfordern, oder wie folgt erstellen. Ich nutze dafür immer die Console (also Putty). Natürlich benötigst Du auch die Zugangsdaten deines Providers.
Konkret also:
Benutzername: z.B. Benutzername
Passwort: z.B. meinpasswort
HOST: meinhoster-net.de
Trage diese Daten in Putty wie folgt ein:
Im Feld "Host Name (or IP address): user@meinhoster-net.de
Port: Normalfall 22
Connection-Type: SSH
Klicke dann auf „Open“
Du wirst nun nach Deinem Passwort gefragt. Beachte: Während der Eingabe wirst Du keinerlei Buchstaben oder Sternchen sehen. Das Passwort wird aber unsichtbar hinterlegt. Drücke nach der Eingabe einfach Enter und das System meldet Dich am Terminal an.
Über den Befehl „ls“ kannst Du alle Deine Ordner auflisten. Über cd Ordnername (manchmal auch cd /ordnername) kommst Du in den gewünschten Ordner. Bist Du in Deinem gewünschten Ordner angekommen, startest Du das Backup über folgenden Befehl:
mysqldump -u Benutzername -p Datenbankname > backup.dump
Hinweis:
Solltest Du eine Meldung aufgrund ungenügender Berechtigungen erhalten, melde Dich als Administrator am Terminal an:
sudo -i
anschliessend musst Du nochmals Dein Passwort bestätigen.
Beachte: Der Dump wird im aktuellen Arbeitsverzeichnis gespeichert, von dem aus der Befehl ausgeführt wurde. Du kannst diesen dann z.B. mit Deinem ftp Client (z.B. FileZilla etc.) auf Deinen Rechner laden.
Ich persönlich habe mir auf meiner Synology unter docker ein Ordner mit dem Namen „backups“ erstellt. Dort speichere ich dann die heruntergeladenen Dumps (z.B. backup.dump).
Nun geht’s wieder zurück zur Synology. Dieses mal benutzen wir puTTY allerdings um in die Synology einzuloggen. Bevor das passieren kann, benötigst Du jedoch SSH Zugang zu Deiner Synology. Ist dieser noch nicht freigeschaltet, musst dies vorgehend noch geschehen.
Logge Dich in deine DS ein und navigiere zur Systemsteuerung. Wähle dort den Menüpunkt «Terminal & SNMP» an. Aktiviere die Kästchen «Telnet-Dienst aktivieren» und «SSH-Dienst aktivieren». Der Standard Port ist 22, Du kannst aber auch einen anderen wie z.B. 2299 oder ähnliches eintragen.
Klicke dann auf «Übernehmen»
Nun geht’s wieder zu puTTY.
Erstelle eine neue Verbindung:
Trage bei Host Name folgendes ein:
„DEIN-DS-Login-Name“@„DIE-IP-DEINER-DS“ (Anführungszeichen entfernen!)
Port: Trage den Port ein, welchen Du in Deiner Synology freigeschaltet hast
Connection Type: Natürlich SSH
Klicke dann auf «OPEN»
Nun geht ein Terminal auf und Du wirst nach Deinem Passwort gefragt. Trage dieses ein, wundere Dich aber nicht, dass Du keine Sternchen oder ähnliches siehst. Das Passwort wird unsichtbar eingetragen. Bestätige mit Enter.
Falls alles geklappt hat, solltest Du nun sowas sehen:
Using terminal commands to modify system configs, execute external binary
files, add files, or install unauthorized third-party apps may lead to system
damages or unexpected behavior, or cause data loss. Make sure you are aware of
the consequences of each command and proceed at your own risk.
Warning: Data should only be stored in shared folders. Data stored elsewhere
may be deleted when the system is updated/restarted.
USERNAME@DS218:~$
Gratulation, Du bist nun per SSH auf Deiner Synology. Damit wir Admin Rechte erhalten tragst Du nun folgendes ein:
sudo i-
Du wirst erneut nach Deinem Admin Passwort gefragt. Gleiches Spiel also wie zuvor und mit Enter bestätigen.
Stelle nun sicher, dass Deine Datenbank im Docker läuft. Du kannst auf Deiner Synology kurz in den „Container Manager“ wechseln und unter «Container» nachschauen, ob Deine Datenbank läuft. Falls sie läuft, hats ein grünes Lämpchen davor.
Nun gehst Du wieder in Dein Terminalfenster und tragst dort folgendes ein:
docker ps
Das Ergebnis sieht dann in etwa so aus:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a11133cce00 dockware/dev:latest "/bin/bash /entrypoi…" 20 hours ago Up 2 hours 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp, 0.0.0.0:9998-9999->9998-9999/tcp, :::9998-9999->9998-9999/tcp, 0.0.0.0:2222->22/tcp, :::2222->22/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:4433->443/tcp, :::4433->443/tcp shopware
da7b3abeeff4 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 21 hours ago Up 21 hours 0.0.0.0:8081->80/tcp, :::8081->80/tcp phpmyadmin
0804140ef224 mariadb:latest "docker-entrypoint.s…" 21 hours ago Up 11 hours 3306/tcp mariadb10
Uns interessiert nun vor allem die mariadb. Wir benötigen dort nämlich die Container-ID. In meinem Fall also die 0804140ef224
Und damit sind wir bereits beim nächsten Befehl:
Nun wollen wir die gespeicherte Datenbank unseres Live Shops in unsere MariaDB Datenbank importieren. Dafür erstellen wir zunächst eine leere Datenbank in der Kollation „utf8mb4_general_ci“
docker exec -i <id-des-mariadb-containers> mariadb -u <benutzer> -p'<passwort>' -e "CREATE DATABASE <meine-datenbank> CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
Hinweis: Setze Deine Daten zwischen die <…> ein. Die Klammern müssen danach entfernt werden. Die ‚‘ beim Passwort bleiben bestehen (wichtig bei Passwörtern mit Sonderzeichen)
Und importieren danach die Datenbank:
docker exec -i <id-des-mariadb-containers> mariadb -u <benutzer> -p'<Passwort>' <meine-datenbank> < /volume1/docker/import/backup.dump
Hinweis: Das < hinter bleibt bestehen. Falls Ihr Docker auf Eurer Synology auf einem anderen Volume betreibt, ändert sich natürlich auch der Pfad.
Sobald Ihr den Befehl ausgeführt hat, wird Eure Datenbank importiert. Je nach dem wie gross diese ist, kann es von ein paar Minuten bis zu ein paar Stunden dauern. Wenn der Import abgeschlossen ist, werdet ihr wieder das Prompt Zeichen
sehen:
z.B. root@DS218:/#
Damit habt Ihr schon den grössten Schritt getan. Was also als nächstes? Ich denke wir verknüpfen die Datenbank mal mit Eurer Shopware installation. Und dafür benötigen wir natürlich die Datei .env
Nun ist es aber sehr mühsam, wenn ihr jedesmal per PuTTY über SSH in Euren Container einloggen müsst, um dort eine Datei zu ändern oder Ordner zu kopieren. Docker hat genau für dieses „Problem“ die mounted Volumes erfunden.
D.h. es wird quasi eine Kopie aller Eurer Verzeichnisse im Container paralell auch im Docker-Ordner auf Eurer Synology abgelegt. Das hat gleich zwei Vorteile. Ihr könnt Dateien nicht nur bequem mit dem Editor bearbeiten und speichern, sondern
habt gleichzeitig auch ein Backup, wenn euer Container mal stoppen oder abstürzen sollte. Ohne diese Massnahme würden nämlich sämtliche gespeicherten Daten nach dem beenden des Containers verloren gehen.
In der docker-compose.yml von dockware haben wir ja bereits das Volume angegeben:
volumes:
- „/volume1/docker/shopware:/var/www/html“
Das alleine reicht jedoch noch nicht, um alle Ordner und Dateien in den /docker/shopware Ordner zu importieren. Wechsle dafür wieder zu puTTY und schaue dass Du im Root Deiner Synology angemeldet bist:
z.B.
root@DS218:/#
Trage nun folgenden Befehl ein:
Docker PS
Erneut werden Dir alle laufenden Container mit der jeweiligen ID aufgelistet:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a11133cce00 dockware/dev:latest "/bin/bash /entrypoi…" 20 hours ago Up 2 hours 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp, 0.0.0.0:9998-9999->9998-9999/tcp, :::9998-9999->9998-9999/tcp, 0.0.0.0:2222->22/tcp, :::2222->22/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:4433->443/tcp, :::4433->443/tcp shopware
da7b3abeeff4 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 21 hours ago Up 21 hours 0.0.0.0:8081->80/tcp, :::8081->80/tcp phpmyadmin
0804140ef224 mariadb:latest "docker-entrypoint.s…" 21 hours ago Up 11 hours 3306/tcp
Wir brauchen nun die ID von dockware/dev, also in meinem Fall die 0a11133cce00 und loggen wie folgt in den Container ein:
docker exec -it 0a11133cce00 bash
sobald eingelogt, starten wir den Kopiervorgang über folgenden Befehl:
docker cp dockware/dev:/var/www/html/. ./volume1/docker/shopware
Sämtliche Ordner und Dateien werden nun in Euren Docker Ordner „shopware“ kopiert.
Nun verwendet dockware neu die Dateien und Ordner in diesem Verzeichnis. Da die Dateien und Ordner jedoch eine falsche Schreibberechtigung haben, müssen wir diese nun noch anpassen (Danke an User @AlexGalax für den Tipp)
Hierfür führt ihr die folgenden Befehle innerhalb eures Dockware Ordners aus:
sudo chown -R www-data:www-data /var/www/html/*
sudo chmod -R 775 /var/www/html
cd /var/www/scripts/shopware6 && php create_jwt.php
cd /var/www/html/config/jwt && sudo chown www-data:www-data *
Fertig? Leider noch nicht ganz. Nun bearbeiten wir noch die .env Datei, welche Ihr nun in Eurem Docker Ordner /docker/shopware/.env finden solltet. Bearbeitet diese Datei (vor allem wenn Ihr Windows User seid) unbedingt mit einem
Editor wie z.B. Notepad++, damit es beim Speichern der Datei zu keinen Problemen kommt.
In der .env interessieren uns vor allem folgende Zeilen:
APP_URL= (hier tragt ihr die IP Eurer Synology ein)
DATABASE_URL=mysql://Benutzer:Passwort@mariadb:3306/Datenbankname (Hier bitte die Logindaten Eurer Datenbank eintragen)
Nebenbei könnt Ihr auch gleich folgende Zeilen ändern:
OPENSEARCH_URL=http://ip-deiner-synology:9200
STOREFRONT_PROXY_URL=ip-deiner-synology
Speichern nicht vergessen!
Ok. Die Datenbank wäre nun also verbunden. Ihr könnt nun also bereits mal einen Test fahren, indem ihr http://ip-eurer-synology:8080 im Browser eintragt. Wurde alles korrekt konfiguriert, solltet ihr nun Eure Seite oder eine Fehlermeldung sehen.
Wahrscheinlich ist letzteres eher der Fall. Grund: Ihr habt bestimmt diverse Plugins installiert, welche in Eurer Synology installation nun natürlich noch fehlen. Kopiert also per ftp unbeding den Ordner /custom/plugins und ersetzt diesen in Eurem Docker Verzeichnis.
Und Bilder wären natürlich auch ganz nett. Ich habe dafür gleich den ganzen /public Ordner kopiert. Hier ist aber unbedingt darauf zu achten, dass ihr die .htaccess im /public Ordner nicht überschreibt. Am besten auch gleich die .htaccess.dist
beibehalten (weiss ehrlich gesagt nicht genau für was die ist)
Nachdem ihr diesen Schritt abgeschlossen habt, werdet ihr wahrscheinlich noch immer nicht wirklich glücklich sein. Denn die Bilder müssen zunächst noch neu generiert werden.
Hierfür bitte nochmals mit puTTY in der Synology einloggen und in den Container von dockware (siehe Anleitung oben) einloggen.
Führt nun folgenden Befehl aus:
bin/console media:generate-thumbnails
Nun werden alle Bilder neu generiert, was wohl eine Weile dauern wird. Paralell könnt ihr ja bereits mal versuchen über den Browser in den Admin Bereich einzuloggen.
http://synology-ip:8080/admin
Sollte dies klappen, geht ihr mal in euren Verkaufskanal. Dort scrollt ihr nach unten bis zum Bereich „Domains“. Klickt hinten auf die drei … und dann auf „Domain bearbeiten“
Natürlich stimmt nun die URL nicht mehr, da Shopware nun ja unter Deiner Synology gehostet wird. Also muss dort folglich auch die IP inkl. des Ports Deiner Synology rein.
Also z.B. 192.168.1.25:8080
Achtet bitte darauf ob ihr über http oder https Eure Synology aufruft. Ich verwende lokal kein Zertifikat, weshalb ich vorne auf das Schlösschen klicke und https somit entferne.
Speichere die neue Einstellung.
Nun sollte eigentlich die Frontseite bei der eingabe http://synology-ip:8080 geladen werden.
In meinem Fall gabs allerdings probleme mit der Stylesheet, da ich das Theme von ThemeWare verwende. Sollte dies bei Euch auch passieren, geht ihr unter „Erweiterungen“ / „Themes“ und klickt auf die drei … „Erweiterung öffnen“
Nun muss man einfach nochmals auf Speichern klicken, womit wieder alle Styles geladen werden.
Im Normalfall sollte nun Shopware fehlerfrei geladen werden.
Was jedoch wenn ich auf der Frontpage nach wie vor Fehlermeldungen vorfinde? Nun, auch dies war eines meiner Probleme. In diesem Fall spielt wahrscheinlich eine Erweiterung (Plugin) einen Streich.
Aber keine Angst, dafür haben wir ja phpMyAdmin zur Hand.
Wählt Euch über die IP http://synology-ip:8081 einfach über phpMyAdmin auf Eure Datenbank. Passwort und Benutzer ist root root
Nun klickt ihr oben im Menü auf SQL und tragt in das Feld folgendes ein:
UPDATE plugin SET active = 0;
Damit setzt Du alle Plugins auf inaktiv, womit auch die meisten Fehler behoben sein müssten. Anschliessend kannst Du diese dann einfach wieder über den Adminbereich aktivieren. Meistens kommt es dann nicht nochmals zu einem
Fehler.
Puh, ich hoffe ich habe Dich mit dieser Monsteranleitung nicht gelangweilt. Für mich waren es 3 Wochen Horror und ich wollte das dabei gesammelte Wissen einfach gerne weiterreichen. Falls Du Fragen hast, schreibe diese einfach
hier in den Thread. Beachte bitte, dass ich selber auch kein Programmierer oder Datenbank-Experte bin. Sollte ich also einen Fehler hier gemacht haben, freue ich mich über einen entsprechenden Feedback.
LG Patrik