Shopware 6 Produktions- und Staging-Umgebung (1/2)

Vollständiger Leitfaden für Setup und automatisches Deployment

Inhaltsverzeichnis

Bei der Recherche zum Aufbau einer Produktionsumgebung für Shopware6 stellte ich fest, dass es überraschend wenig systematisch zusammengefasste Informationen gibt. Daher habe ich beschlossen, meine Erfahrungen beim Aufbau einer Shopware6-Produktions- und Staging-Umgebung sowie der Implementierung eines automatischen Deployment-Systems mit GitHub Actions in reproduzierbarer Form zusammenzufassen.

Dieser Artikel erklärt detailliert die konkreten Schritte vom Server-Setup bis zur Implementierung des automatischen Deployments, um eine funktionsfähige Umgebung aufzubauen. Nach dem Lesen dieses Artikels ist es möglich, eine Shopware6-Produktionsumgebung von Grund auf zu erstellen.

Dieser Leitfaden ist in zwei Teile gegliedert:

  • Teil 1: Server-Umgebung Setup (Produktion & Staging) - Grundlegende Infrastruktur
  • Teil 2: Entwicklungsumgebung und automatisches Deployment - CI/CD-Pipeline

Technische Übersicht

Der Technologie-Stack für die zu erstellende Umgebung:

  • OS: Ubuntu 24.04 LTS (Stabilität und Langzeit-Support)
  • Webserver: Caddy (automatische HTTPS-Zertifikate, einfache Konfiguration)
  • PHP: 8.3 (neueste Shopware6-Anforderungen)
  • Datenbank: MySQL 8.0 (Shopware6-Standard)
  • Deployment-Tool: Deployer (spezialisiert auf PHP-Anwendungen)
  • CI/CD: GitHub Actions (kostenlos nutzbar)
  • Entwicklungsumgebung: Dockware (spezieller Docker-Container für Shopware6)

Diese Konfiguration ermöglicht sowohl Stabilität der Produktionsumgebung als auch Effizienz beim Deployment.

Teil 1: Server-Umgebung Setup (Produktion & Staging)

Teil 1 erklärt die Schritte zum Aufbau der Shopware6-Produktions- und Staging-Umgebung. Die nachstehenden Inhalte umfassen das Server-Setup, die Installation der notwendigen Software bis hin zu den Sicherheitseinstellungen.

Voraussetzungen

  • Ubuntu 24.04 LTS Server (VPS oder Cloud-Instanz)
  • Root-Berechtigung oder sudo-Berechtigung
  • Domain-Name erworben und DNS-Einstellungen abgeschlossen
  • Grundkenntnisse in Linux-Befehlen

1. Grundlegende Sicherheitseinstellungen

Wichtigkeit der Firewall-Konfiguration

Shopware6 benötigt HTTP (80) und HTTPS (443) Ports für Web-Zugriff.

# Aktuellen Status prüfen
sudo ufw status verbose

# HTTP/HTTPS Ports öffnen
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Firewall aktivieren
sudo ufw enable

# Einstellungen überprüfen
sudo ufw status verbose

2. PHP 8.3 Installation und Konfiguration

PHP 8.3 Installation

Notwendiges Repository hinzufügen und PHP installieren:

# PPA-Repository hinzufügen (Ondřej Surýs hochwertige PHP-Pakete)
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

# PHP 8.3 und erforderliche Erweiterungen installieren
sudo apt-get install -y php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-xml php8.3-zip php8.3-opcache php8.3-mbstring php8.3-intl php8.3-cli

PHP-Konfiguration optimieren

Shopware6 ist eine relativ speicherintensive Anwendung. Besonders bei Websites mit vielen Produkten oder komplexen Plugins können die Standard-Einstellungen unzureichend sein.

PHP-Konfiguration optimieren. /etc/php/8.3/fpm/php.ini bearbeiten:

sudo nano /etc/php/8.3/fpm/php.ini

Folgende Einstellungen ändern:

memory_limit = 512M           ; Shopware6 empfohlener Wert (Standard ist 128M)
max_execution_time = 30       ; Skript-Ausführungszeit-Limit
upload_max_filesize = 20M     ; Upload-Dateigröße-Obergrenze
post_max_size = 20M           ; POST-Datengröße-Obergrenze

PHP-FPM Pool-Konfiguration

PHP-FPM Pool-Einstellungen anpassen. /etc/php/8.3/fpm/pool.d/www.conf bearbeiten:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Folgende Einstellungen überprüfen/ändern:

listen = /run/php/php8.3-fpm.sock
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Diese Konfiguration ermöglicht die Kommunikation zwischen Caddy und PHP-FPM über Unix-Sockets, was schneller als TCP ist.

3. Composer Installation

PHP-Abhängigkeitsverwaltungs-Tool Composer installieren:

sudo wget https://getcomposer.org/download/latest-stable/composer.phar -O /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer

# Installation überprüfen
composer --version

4. Node.js Installation

Node.js 22 installieren:

curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh
sudo -E bash nodesource_setup.sh
sudo apt-get install -y nodejs

# Installation überprüfen
node --version
npm --version

5. Caddy Webserver Installation

Caddy mit automatischer Let’s Encrypt HTTPS-Zertifikatsbeschaffung installieren:

# Erforderliche Pakete installieren
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# Caddy GPG-Schlüssel hinzufügen
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# Caddy Repository hinzufügen
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# Caddy installieren
sudo apt update
sudo apt install caddy

6. Caddy Konfiguration

/etc/caddy/Caddyfile bearbeiten und für Shopware6 konfigurieren:

sudo nano /etc/caddy/Caddyfile

Durch folgenden Inhalt ersetzen (Domain-Namen entsprechend ändern):

# Produktionsumgebung-Konfiguration
yourdomain.com www.yourdomain.com {
  # Sicherheits-Header
  header {
    X-Frame-Options DENY
    Referrer-Policy no-referrer-when-downgrade
  }

  # Sicherheitseinstellungen für SVG-Dateien
  @svg {
    file
    path *.svg
  }
  header @svg Content-Security-Policy "script-src 'none'"

  # Matcher für statische Dateien ausschließen
  @default {
    not path /theme/* /media/* /thumbnail/* /bundles/* /css/* /fonts/* /js/* /recovery/* /sitemap/*
  }

  # Document Root
  root * /var/www/shopware-prod/current/public
  php_fastcgi unix//run/php/php8.3-fpm.sock
  encode zstd gzip
  file_server
}

# Staging-Umgebung-Konfiguration
staging.yourdomain.com {
  # Sicherheits-Header
  header {
    X-Frame-Options DENY
    Referrer-Policy no-referrer-when-downgrade
  }

  # Sicherheitseinstellungen für SVG-Dateien
  @svg {
    file
    path *.svg
  }
  header @svg Content-Security-Policy "script-src 'none'"

  # Matcher für statische Dateien ausschließen
  @default {
    not path /theme/* /media/* /thumbnail/* /bundles/* /css/* /fonts/* /js/* /recovery/* /sitemap/*
  }

  # Document Root
  root * /var/www/shopware-staging/current/public
  php_fastcgi unix//run/php/php8.3-fpm.sock
  encode zstd gzip
  file_server
}

7. MySQL 8.0 Installation und Konfiguration

Datenbankserver installieren:

sudo apt update
sudo apt install -y mysql-server

# Sicherheitskonfiguration ausführen
sudo mysql_secure_installation

Bei der Sicherheitskonfiguration grundsätzlich bei allem “yes” wählen.

Datenbank und Benutzer erstellen

In MySQL einloggen und Datenbank und Benutzer für Shopware erstellen:

sudo mysql -u root -p

Folgende SQL ausführen (Passwort entsprechend ändern):

-- Datenbanken erstellen
CREATE DATABASE shopware CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE shopware_staging CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Benutzer erstellen und Berechtigungen gewähren
CREATE USER 'shopware'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON shopware.* TO 'shopware'@'localhost';
GRANT ALL PRIVILEGES ON shopware_staging.* TO 'shopware'@'localhost';

-- Paketgröße einstellen
SET GLOBAL max_allowed_packet = 33554432;
FLUSH PRIVILEGES;
EXIT;

MySQL-Konfigurationsdatei optimieren

MySQL-Performance optimieren. /etc/mysql/mysql.conf.d/mysqld.cnf bearbeiten:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Folgende Einstellungen hinzufügen:

max_allowed_packet = 32M              # Unterstützung für große Datenverarbeitung
innodb_buffer_pool_size = 1G          # Speicher-Cache-Größe (70-80% des Server-Speichers empfohlen)
innodb_log_file_size = 256M           # Transaktionslog-Größe

MySQL neu starten, um Einstellungen anzuwenden:

sudo systemctl restart mysql

8. Deployment-Verzeichnisstruktur erstellen

Deployer-Verzeichnisstruktur-Designphilosophie

Deployer realisiert Zero-Downtime-Deployment mit folgender Struktur:

/var/www/shopware-prod/
├── current -> releases/3                # Symbolischer Link zur aktuellen Version
├── releases/                            # Speichert jede Release
│   ├── 1/                               # Erste Release
│   ├── 2/                               # Zweite Release
│   └── 3/                               # Neueste Release (derzeit aktiv)
└── shared/                              # Daten, die zwischen Deployments beibehalten werden
    ├── .env.local                       # Umgebungskonfiguration
    ├── files/                           # Upload-Dateien
    ├── var/log/                         # Log-Dateien
    ├── config/jwt/                      # JWT-Zertifikate
    └── public/media/                    # Produktbilder etc.

Diese Struktur ermöglicht nahezu null Ausfallzeit, da der symbolische Link erst nach Abschluss des neuen Versions-Deployments umgeschaltet wird.

Verzeichnisstruktur für Deployer erstellen:

# Produktionsumgebung
sudo mkdir -p /var/www/shopware-prod/{releases,shared}
sudo mkdir -p /var/www/shopware-prod/shared/{files,var/log,config/jwt}
sudo mkdir -p /var/www/shopware-prod/shared/public/{media,thumbnail,sitemap}

# Staging-Umgebung
sudo mkdir -p /var/www/shopware-staging/{releases,shared}
sudo mkdir -p /var/www/shopware-staging/shared/{files,var/log,config/jwt}
sudo mkdir -p /var/www/shopware-staging/shared/public/{media,thumbnail,sitemap}

# Besitz an www-data übertragen
sudo chown -R www-data:www-data /var/www/shopware-prod
sudo chown -R www-data:www-data /var/www/shopware-staging

# Angemessene Berechtigungen setzen
sudo chmod -R 755 /var/www/shopware-prod
sudo chmod -R 775 /var/www/shopware-prod/shared
sudo chmod -R 755 /var/www/shopware-staging
sudo chmod -R 775 /var/www/shopware-staging/shared

Wichtigkeit der Berechtigung-Einstellungen

Gründe für Berechtigung-Einstellungen:

  • 755: Für allgemeine Verzeichnisse und Dateien (lesbar/ausführbar, nur Besitzer kann schreiben)
  • 775: Für geteilte Verzeichnisse (sowohl Webserver als auch Deployer können schreiben)
  • www-data: Gemeinsamer Benutzer für Webserver und Deployment-Prozess

9. JWT-Zertifikat generieren

Rolle der JWT-Zertifikate

Zertifikate für Shopware6 API-Authentifizierung und Session-Management:

  • API-Authentifizierung: Kommunikation zwischen Admin-Panel und Storefront
  • Session-Management: Verwaltung des Benutzer-Login-Status
  • Sicherheit: Unabhängige Zertifikate für jede Umgebung gewährleisten Sicherheit

JWT-Zertifikate für Shopware6 API-Authentifizierung generieren:

sudo -u www-data bash

# Produktionsumgebung
cd /var/www/shopware-prod/shared/config/jwt
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem

# Staging-Umgebung
cd /var/www/shopware-staging/shared/config/jwt
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem

exit

10. Umgebungskonfigurationsdateien erstellen

Wichtigkeit der Umgebungskonfigurationsdateien

Die .env.local-Datei verwaltet umgebungsspezifische Einstellungen:

  • Sicherheit: Verschiedene geheime Schlüssel für Produktion und Staging
  • Datenbank-Trennung: Unabhängige Datenbank für jede Umgebung
  • Debug-Einstellungen: Deaktiviert in Produktion, aktiviert in Staging
  • Cache-Einstellungen: Performance-Optimierung

Staging-Umgebung-Konfiguration

sudo -u www-data nano /var/www/shopware-staging/shared/.env.local

Folgenden Inhalt eingeben (Passwort und Secret entsprechend ändern):

APP_ENV=staging
SHOPWARE_STAGING=1
APP_SECRET=your-staging-secret-32-chars-long
DATABASE_URL=mysql://shopware:your_secure_password@localhost:3306/shopware_staging
APP_URL=https://staging.yourdomain.com
MAILER_DSN=null://null
SHOPWARE_HTTP_CACHE_ENABLED=1
SHOPWARE_ES_ENABLED=0

Produktionsumgebung-Konfiguration

sudo -u www-data nano /var/www/shopware-prod/shared/.env.local

Folgenden Inhalt eingeben:

APP_ENV=prod
APP_SECRET=your-production-secret-32-chars-long
DATABASE_URL=mysql://shopware:your_secure_password@localhost:3306/shopware
APP_URL=https://yourdomain.com
MAILER_DSN=null://null
SHOPWARE_HTTP_CACHE_ENABLED=1
SHOPWARE_ES_ENABLED=0

11. SSH-Konfiguration und Deployment-Benutzer vorbereiten

Design-Überlegungen für Deployment-Benutzer

Für eine Balance zwischen Sicherheit und Betriebseffizienz wird folgendes Design übernommen:

  • www-data verwenden: Gleicher Benutzer für Webserver und Deployer vermeidet Berechtigungsprobleme
  • SSH-Schlüssel-Authentifizierung: SSH-Schlüssel-Authentifizierung ist sicherer als Passwort-Authentifizierung
  • Dedizierter Schlüssel: Dedizierte SSH-Schlüssel für Deployment generieren und Zweck klarstellen

SSH-Zugriff für www-data-Benutzer erlauben:

# Shell von www-data ändern
sudo chsh -s /bin/bash www-data

# SSH-Schlüssel-Verzeichnis erstellen
sudo -u www-data mkdir -p /var/www/.ssh
sudo chmod 700 /var/www/.ssh

Wichtig: Durch Ändern der Shell des www-data-Benutzers wird Server-Zugriff von Deployer ermöglicht.

12. Services starten

Grundlagen des Service-Managements

Service-Management mit systemd:

  • enable: Automatischer Start beim Systemstart konfigurieren
  • start: Service sofort starten
  • status: Betriebsstatus des Services überprüfen
# PHP-FPM starten und aktivieren
sudo systemctl enable php8.3-fpm
sudo systemctl start php8.3-fpm

# Caddy starten und aktivieren
sudo systemctl enable caddy
sudo systemctl start caddy

# MySQL neu starten
sudo systemctl restart mysql

# Service-Status überprüfen
sudo systemctl status php8.3-fpm caddy mysql

Was kommt als nächstes?

In Teil 2 werden wir die lokale Entwicklungsumgebung mit Dockware einrichten und ein automatisches Deployment-System mit GitHub Actions implementieren. Die nächsten Schritte umfassen:

  • Lokale Entwicklungsumgebung: Setup mit Docker und Dockware
  • Deployer-Konfiguration: Zero-Downtime-Deployment konfigurieren
  • GitHub Actions: CI/CD-Pipeline für automatisches Deployment
  • Branch-Strategie: Staging- und Produktions-Workflows

Mit der in diesem Teil aufgebauten Server-Infrastruktur können wir in Teil 2 ein vollständig automatisiertes Deployment-System realisieren.


Referenzen