Skip to content

fix(shopware/paas-meta): add CSP header to SVG and uploaded HTML files - #271

Merged
Jonas Elfering (keulinho) merged 1 commit into
shopware:mainfrom
vrobert78:paas-meta-csp-static-documents
Oct 16, 2026
Merged

Jonas Elfering (keulinho) merged 1 commit into
shopware:mainfrom
vrobert78:paas-meta-csp-static-documents

Conversation

@vrobert78

Copy link
Copy Markdown
Contributor

Problem

Shopware disclosed a medium-severity stored XSS: a user with media:upload rights can upload an SVG or HTML file containing JavaScript. When that file is served from the shop's own domain without a Content-Security-Policy header, the script runs in the shop's origin.

The recommended fix is to send a CSP header with these static documents (shopware/docs#2613). That docs PR covers Apache, Nginx and Caddy, and #270 applied it to the Apache .htaccess.dist and Fastly recipes. Shopware PaaS isn't covered: the shopware/paas-meta recipe sets no headers on static files at all, so every project built from it is exposed.

Changes

shopware/paas-meta/{6.4,6.5,6.6,6.7}/.platform/applications.yaml, web.locations."/".rules:

  • SVG ((?i)\.svg$): keeps expires: 4w and adds the CSP header.
  • HTML under /media/ and /thumbnail/ ((?i)^/(media|thumbnail)/.*\.html$): adds the CSP header.
  • Generic static assets: svg is removed from this regex so that no file matches two rules. This also fixes the svg? typo (it also matched .sv) and drops the duplicated cast|mp4|json|yaml|ttf|svg? entries.

The CSP value matches the Shopware docs and the Apache recipe from #270 exactly:

script-src 'none'; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'

The scope is the same as the Apache fix: every SVG, but HTML only under media/ and thumbnail/. Pages rendered by the application go through passthru to index.php, so the storefront and admin are not affected.

Validation

Tested on an Upsun project running Shopware 6.7, built from this recipe with this exact change.

Before:

  • /media/test/xss.svg and /media/test/xss.html ran console.log(document.domain) in the shop origin; no CSP header.

After:

  • Chrome blocks the script: "Executing inline script violates the following Content Security Policy directive 'script-src 'none''".
  • curl -I:
Request Result
/media/test/xss.svg 200, CSP present, cache-control: max-age=2419200 (4w kept)
/media/test/XSS.SVG 200, CSP present ((?i) works)
/thumbnail/test/xss.html CSP present, script blocked
/media/test/missing.html 404 from PHP, no CSP added
/ no CSP (storefront unaffected)
/admin only Shopware's own admin CSP, unchanged

Notes

  • Existing projects pick this up with composer recipes:update shopware/paas-meta.
  • 6.7/.platform/applications.yaml uses CRLF line endings; they are kept as they were, so the diff only touches the rules block.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Thanks for the PR 😍

How to test these changes in your application

  1. Add the Shopware flex endpoint in your composer.json to https://raw.githubusercontent.com/shopware/recipes/flex/pull-271/index.json.

    # When jq is installed
    jq '.extra.symfony.endpoint |= [ "https://raw.githubusercontent.com/shopware/recipes/flex/pull-271/index.json" ] + .' composer.json > composer.tmp && mv composer.tmp composer.json

    or manually

    "endpoint": [
        "https://raw.githubusercontent.com/shopware/recipes/flex/pull-271/index.json",
        "https://raw.githubusercontent.com/shopware/recipes/flex/main/index.json",
        "flex://defaults"
    ]
    # On Unix-like (BSD, Linux and macOS)
    export SYMFONY_ENDPOINT=https://raw.githubusercontent.com/shopware/recipes/flex/pull-271/index.json
    # On Windows
    SET SYMFONY_ENDPOINT=https://raw.githubusercontent.com/shopware/recipes/flex/pull-271/index.json
  2. Install the package(s) related to this recipe:

    composer req 'shopware/paas-meta:^6.7'

Diff between recipe versions

In order to help with the review stage, I'm in charge of computing the diff between the various versions of patched recipes.
I'm going keep this comment up to date with any updates of the attached patch.

shopware/paas-meta

6.4 vs 6.5
diff --git a/shopware/paas-meta/6.4/.platform/applications.yaml b/shopware/paas-meta/6.5/.platform/applications.yaml
index 1cd6b3b..23ca7bc 100644
--- a/shopware/paas-meta/6.4/.platform/applications.yaml
+++ b/shopware/paas-meta/6.5/.platform/applications.yaml
@@ -1,28 +1,22 @@
 -   name: app
-    type: php:8.2
+    type: php:8.3
     build:
-        flavor: composer
+        flavor: none
     variables:
         env:
-            # Tell Shopware to always install in production-mode.
             APP_ENV: prod
-            # Instance ID is empty by default, change to something unique in your project
-            INSTANCE_ID: ""
             # Enable HTTP Cache to get cache-control headers
             SHOPWARE_HTTP_CACHE_ENABLED: 1
-            # NVM and Node.js versions to install
-            NVM_VERSION: v0.39.0
-            NODE_VERSION: v18
-            # Improve admin build speed
-            DISABLE_ADMIN_COMPILATION_TYPECHECK: 1
-            # Only build extension. Shopware assets are pre built in the tags
-            SHOPWARE_ADMIN_BUILD_ONLY_EXTENSIONS: 1
+            NODE_VERSION: v20.18.0
+            SHOPWARE_CLI_VERSION: 0.4.62
             # Elasticsearch, see https://developer.shopware.com/docs/guides/hosting/infrastructure/elasticsearch#activating-and-first-time-indexing
             SHOPWARE_ES_ENABLED: 0
             SHOPWARE_ES_INDEXING_ENABLED: 0
             SHOPWARE_ES_INDEX_PREFIX: "sw6"
             # Disables the Shopware web installer
             SHOPWARE_SKIP_WEBINSTALLER: 1
+            # Performance optimization
+            COMPOSER_ROOT_VERSION: 1.0.0
         php:
             upload_max_filesize: 32M
             post_max_size: 32M
@@ -51,151 +45,60 @@
     hooks:
         build: |
             set -e
-            echo "==================================================="
-            echo "START BUILD SCRIPT"
-            echo "Beginning with the NVM and NodeJS setup"
-            echo "==================================================="
-            # install nvm
-            unset NPM_CONFIG_PREFIX
-            export NVM_DIR="$PLATFORM_APP_DIR/.nvm"
+            echo "Installing Node ${NODE_VERSION} and shopware-cli ${SHOPWARE_CLI_VERSION}"
 
-            # install.sh will automatically install NodeJS based on the presence of $NODE_VERSION
-            curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/$NVM_VERSION/install.sh | bash
-            [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+            mkdir -p /tmp/tools
 
-            # have nvm available and load the correct node version in your ssh session
-            echo 'unset NPM_CONFIG_PREFIX' >> .bash_profile
-            echo 'export NO_UPDATE_NOTIFIER=1' >> .bash_profile
-            echo 'export NVM_DIR="$PLATFORM_APP_DIR/.nvm"' >> .bash_profile
-            echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> .bash_profile
+            curl -qL -s -o node.tar.xz "https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz"
+            tar xf node.tar.xz -C /tmp/tools --strip-components=1
+            curl -qL -s -o shopware-cli.tar.gz https://github.com/shopware/shopware-cli/releases/download/${SHOPWARE_CLI_VERSION}/shopware-cli_Linux_x86_64.tar.gz
+            tar xf shopware-cli.tar.gz -C /tmp/tools shopware-cli
+            mv /tmp/tools/shopware-cli /tmp/tools/bin
 
-            # Disable UI installer
-            touch install.lock
+            rm node.tar.xz shopware-cli.tar.gz
 
-            echo "==================================================="
-            echo "REMOVE FASTLY WHEN NOT A PRODUCTION OR STAGE ENV"
-            echo "==================================================="
-            echo "The Environment has the following type: $PROJECT_ENVIRONMENT_TYPE"
-            if [ "$PROJECT_ENVIRONMENT_TYPE" = development ]; then
-                echo "remove fastly.yaml on environment type development"
-                rm -f config/packages/fastly.yaml
-            fi
-            echo "Fastly setup step done"
+            export PATH="/tmp/tools/bin:$PATH"
 
-            echo "==================================================="
-            echo "COPY THEME AND RUN JS BUILD"
-            echo "==================================================="
-            # compile theme and save config for later (will be moved to mount).
-            # warnings can be ignored (the process is trying to access Redis which is not yet available)
-            export CI=true
-            ./bin/build-js.sh
-            mkdir build-tmp
-            cp -R files/theme-config build-tmp
+            export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
 
-            # save plugin config for later (will be moved to mount)
-            cp var/plugins.json build-plugins.json
-        deploy: |
-            set -e
-            echo "==================================================="
-            echo "START DEPLOY SCRIPT"
-            echo "Beginning restoring theme-config files and plugin config"
-            echo "==================================================="
-            if [ -z "${JWT_PUBLIC_KEY}" ]; then
-                echo "~"
-                echo "~"
-                echo "~"
-                echo "Please initialize the JWT Tokens to proceed. https://developer.shopware.com/docs/products/paas/build-deploy"
-                echo "~"
-                echo "~"
-                echo "~"
-                exit 1;
-            fi
+            shopware-cli project ci .
 
-            # restore theme config from build to mount in case theme needs rebuilding during runtime
-            cp -R build-tmp/theme-config files/
+            # Moving files of the mounts to avoid warnings
+            mv $APP_CACHE_DIR ./RO-localCache
+            mv ./var ./RO-var
 
-            # restore plugin config to mount
-            cp build-plugins.json var/plugins.json
+        deploy: |
+            set -e
 
-            echo "==================================================="
-            echo "INITIALIZE SHOPWARE'S SITE DATA IF NOT ALREADY INSTALLED"
-            echo "==================================================="
-            # Initialize the Shopware site's data set if it's not already installed.
-            # (This is only for demo/first install and can be removed once Shopware is initialized)
-            if [ ! -f $PLATFORM_APP_DIR/installer/installed ]; then
-                # setup the environment
-                # create database with a basic setup (admin user and storefront sales channel).
-                # this will try to run theme:compile which cannot be disabled, so it will throw a bunch of warnings
-                # that can be ignored (we use stateless build anyway, so this is done already at this point)
-                echo "Running system:install (Warnings for theme:compile can be ignored)"
-                bin/console system:install --create-database --basic-setup --force
-                bin/console theme:change --all Storefront --no-compile
-                bin/console theme:dump
+            echo "Syncing files created during the build in the mounts"
+            rsync -av --delete "${PLATFORM_APP_DIR}/RO-localCache/" "${APP_CACHE_DIR}/"
+            rsync -av "${PLATFORM_APP_DIR}/RO-var/" "${PLATFORM_APP_DIR}/var/"
 
-                # Disable FRW
-                bin/console system:config:set core.frw.completedAt '2019-10-07T10:46:23+00:00'
+            echo "Create Dompdf working directories and sync fonts from the vendor folder"
+            if [ ! -d "${PLATFORM_APP_DIR}/var/dompdf/tempDir" ]; then
+                mkdir -p "${PLATFORM_APP_DIR}/var/dompdf/tempDir"
+            fi
+            if [ ! -d "${PLATFORM_APP_DIR}/var/dompdf/fontCache" ]; then
+                mkdir -p "${PLATFORM_APP_DIR}/var/dompdf/fontCache"
+            fi
+            rsync -av "${PLATFORM_APP_DIR}/vendor/dompdf/dompdf/lib/fonts" "${PLATFORM_APP_DIR}/var/dompdf/fontDir"
 
-                # mark system as installed
-                touch $PLATFORM_APP_DIR/installer/installed
-            fi;
+            php vendor/bin/shopware-deployment-helper run --skip-asset-install --skip-theme-compile
 
-            echo "==================================================="
-            echo "UPDATE SALES CHANNEL DOMAIN IF ENVIRONMENT TYPE IS NOT PRODUCTION"
-            echo "==================================================="
-            # Configure the sales channel domains automatically for non-production environments
             if [ "$PLATFORM_ENVIRONMENT_TYPE" != production ]; then
+                echo "==================================================="
+                echo "UPDATE SALES CHANNEL DOMAIN IF ENVIRONMENT TYPE IS NOT PRODUCTION"
+                echo "==================================================="
+
                 export FRONTEND_URL=`echo $PLATFORM_ROUTES | base64 --decode | jq -r 'to_entries[] | select(.value.id=="shopware") | .key'`
                 export FRONTEND_DOMAIN=`php -r 'echo parse_url($_SERVER["FRONTEND_URL"], PHP_URL_HOST);'`
                 bin/console sales-channel:update:domain "$FRONTEND_DOMAIN"
             fi
+        post_deploy: |
+            set -e
 
-            echo "==================================================="
-            echo "RUN MIGRATIONS"
-            echo "==================================================="
-            # optional: run migration automatically with deploy
-            bin/console database:migrate --all # Run Shopware core migrations
-            php bin/console plugin:refresh
-
-            list_plugins_not_installed=$(php bin/console plugin:list --json | jq 'map(select(.installedAt == null)) | .[].name' -r)
-
-            for plugin in $list_plugins_not_installed; do
-                echo "Installing Plugin $plugin ..."
-                php bin/console plugin:install --activate --skip-asset-build $plugin
-            done
-
-            list_with_updates=$(php bin/console plugin:list --json | jq 'map(select(.upgradeVersion != null)) | .[].name' -r)
-
-            for plugin in $list_with_updates; do
-                echo "Updating Plugin $plugin ..."
-                php bin/console plugin:update --skip-asset-build $plugin
-            done
-
-            echo "==================================================="
-            echo "CLEAR CACHES"
-            echo "==================================================="
-            # run cache clear commands, on grid environments this should run in the deploy hook,
-            # on dedicated generation 2, it will run as part of the pre_start hook (to be set up by Platform.sh support)
-            if [ -z "$PLATFORM_REGISTRY_NUMBER" ]; then
-                sh bin/prestart_cacheclear.sh
-            else
-                # on dedicated gen 2, we need to explictly clear the redis cache since redis is not available during pre_start
-                bin/console cache:pool:clear cache.object
-            fi
-
-            echo "==================================================="
-            echo "SETUP FASTLY AND CLEAR OPCACHE"
-            echo "==================================================="
-            if [ "$PLATFORM_ENVIRONMENT_TYPE" = "production" ] || [ "$PLATFORM_ENVIRONMENT_TYPE" = "stage" ]; then
-                if [ -e bin/setup-fastly.sh ]; then
-                    echo "Running setup-fastly.sh script"
-                    ./bin/setup-fastly.sh
-                else
-                    echo "setup-fastly.sh script not found"
-                fi
-            fi
+            php bin/console theme:compile
 
-            # Send USR2 signal to php-fpm to clear the opcache
-            pkill -f -USR2 -u web php-fpm
     # The relationships of the application with services or other applications.
     # The left-hand side is the name of the relationship as it will be exposed
     # to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand
@@ -224,26 +127,22 @@
             source: service
             service: fileshare
             source_path: "public/thumbnail"
-        "/config/secrets":
+        "/public/theme":
             source: service
             service: fileshare
-            source_path: "config/secrets"
+            source_path: "public/theme"
+        "/public/sitemap":
+            source: service
+            service: fileshare
+            source_path: "public/sitemap"
         "/var":
             source: service
             service: fileshare
             source_path: "var"
-        "/var/cache":
-            source: local
-            source_path: "var/cache"
-        "/installer":
+        "/localCache":
             source: local
-            source_path: "installer"
-        "/.global":
-            source: local
-            source_path: "global"
-        "/.cache":
-            source: local
-            source_path: ".cache"
+            source_path: "localCache"
+
     # The configuration of app when it is exposed to the web.
     web:
         locations:
@@ -267,9 +166,13 @@
         queue:
             disk: 128
             commands:
-                start: bin/console messenger:consume async low_priority failed --memory-limit=$(cat /run/config.json | jq .info.limits.memory)M --time-limit=295
+                pre_start: |
+                    export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
+                    rm -rf $APP_CACHE_DIR/var
+                    php $PLATFORM_APP_DIR/bin/console
+                start: APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache bin/console messenger:consume async low_priority failed --memory-limit=$(cat /run/config.json | jq .info.limits.memory)M --time-limit=295
 
     crons:
         scheduler:
             spec: '*/5 * * * *'
-            cmd: 'php bin/console scheduled-task:run --no-wait'
+            cmd: 'APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache php bin/console scheduled-task:run --no-wait'
diff --git a/shopware/paas-meta/6.4/.platform/services.yaml b/shopware/paas-meta/6.5/.platform/services.yaml
index 4c7c956..2a9c087 100644
--- a/shopware/paas-meta/6.4/.platform/services.yaml
+++ b/shopware/paas-meta/6.5/.platform/services.yaml
@@ -1,5 +1,5 @@
 db:
-    type: mariadb:10.6
+    type: mariadb:11.2
     disk: 2048
 cacheredis:
     type: redis:7.0
diff --git a/shopware/paas-meta/6.4/bin/prestart_cacheclear.sh b/shopware/paas-meta/6.4/bin/prestart_cacheclear.sh
deleted file mode 100755
index 8b3bc5a..0000000
--- a/shopware/paas-meta/6.4/bin/prestart_cacheclear.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env sh
-# This script is run as part of the .platform.app.yaml deployment step
-# On dedicated generation 2 clusters, this should be setup by Platform.sh team as part of pre_start hook
-
-set -e
-
-echo "removing var/cache/${APP_ENV}_*/*.*"
-rm -Rf var/cache/${APP_ENV}_*/*.*
-
-echo "clearing application cache"
-php bin/console cache:clear
-
-echo "done executing pre_start cache clear"
\ No newline at end of file
diff --git a/shopware/paas-meta/6.4/config/packages/paas.yaml b/shopware/paas-meta/6.5/config/packages/paas.yaml
index 62a004e..a67595d 100644
--- a/shopware/paas-meta/6.4/config/packages/paas.yaml
+++ b/shopware/paas-meta/6.5/config/packages/paas.yaml
@@ -1,12 +1,13 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/shopware/shopware/refs/heads/trunk/config-schema.json
 # This file contains all default configuration or PaaS
 
 framework:
     session:
-        handler_id: "%env(SESSION_REDIS_URL)%/0"
+        handler_id: "%env(SESSION_REDIS_URL)%/0?persistent=1"
     cache:
         app: cache.adapter.redis
         system: cache.adapter.redis
-        default_redis_provider: "%env(CACHE_URL)%/0"
+        default_redis_provider: "%env(CACHE_URL)%/0?persistent=1"
 
 shopware:
     api:
@@ -15,33 +16,32 @@ shopware:
             public_key_path: '%env(base64:JWT_PUBLIC_KEY)%'
     admin_worker:
         enable_admin_worker: false
+        enable_queue_stats_worker: false
     deployment:
         cluster_setup: true
+    dompdf:
+        options:
+            tempDir: '%kernel.project_dir%/var/dompdf/tempDir'
+            fontDir: '%kernel.project_dir%/var/dompdf/fontDir'
+            fontCache: '%kernel.project_dir%/var/dompdf/fontCache'
 
-when@prod:
-    monolog:
-        handlers:
-            main:
-                type: fingers_crossed
-                action_level: error
-                handler: nested
-                excluded_http_codes: [404, 405]
-                buffer_size: 50 # How many messages should be saved? Prevent memory leaks
-            nested:
-                type: stream
-                path: php://stderr
-                level: debug
-                formatter: monolog.formatter.json
-            console:
-                type: console
-                process_psr_3_messages: false
-                channels: ["!event", "!doctrine"]
-
-storefront:
-    theme:
-        config_loader_id: Shopware\Storefront\Theme\ConfigLoader\StaticFileConfigLoader
-        available_theme_provider: Shopware\Storefront\Theme\ConfigLoader\StaticFileAvailableThemeProvider
-        theme_path_builder_id: Shopware\Storefront\Theme\MD5ThemePathBuilder
+monolog:
+    handlers:
+        main:
+            type: fingers_crossed
+            action_level: error
+            handler: nested
+            excluded_http_codes: [404, 405]
+            buffer_size: 50
+        nested:
+            type: stream
+            path: php://stderr
+            level: debug
+            formatter: monolog.formatter.json
+        console:
+            type: console
+            process_psr_3_messages: false
+            channels: ["!event", "!doctrine"]
 
 elasticsearch:
     index_settings:
diff --git a/shopware/paas-meta/6.4/files/theme-config/6753315de5ae4e9081228ff9d6e7b802.json b/shopware/paas-meta/6.4/files/theme-config/6753315de5ae4e9081228ff9d6e7b802.json
deleted file mode 100644
index f96ebb6..0000000
--- a/shopware/paas-meta/6.4/files/theme-config/6753315de5ae4e9081228ff9d6e7b802.json
+++ /dev/null
@@ -1 +0,0 @@
-{"themeConfig":{"blocks":{"themeColors":{"label":{"en-GB":"Theme colours","de-DE":"Theme-Farben"}},"typography":{"label":{"en-GB":"Typography","de-DE":"Typografie"}},"eCommerce":{"label":{"en-GB":"E-Commerce","de-DE":"E-Commerce"}},"statusColors":{"label":{"en-GB":"Status messages","de-DE":"Status-Ausgaben"}},"media":{"label":{"en-GB":"Media","de-DE":"Medien"}},"unordered":{"label":{"en-GB":"Misc","de-DE":"Sonstige"}}},"fields":{"sw-color-brand-primary":{"label":{"en-GB":"Primary colour","de-DE":"Prim\u00e4rfarbe"},"type":"color","value":"#008490","editable":true,"block":"themeColors","order":100},"sw-color-brand-secondary":{"label":{"en-GB":"Secondary colour","de-DE":"Sekund\u00e4rfarbe"},"type":"color","value":"#526e7f","editable":true,"block":"themeColors","order":200},"sw-border-color":{"label":{"en-GB":"Border","de-DE":"Rahmen"},"type":"color","value":"#bcc1c7","editable":true,"block":"themeColors","order":300},"sw-background-color":{"label":{"en-GB":"Background","de-DE":"Hintergrund"},"type":"color","value":"#fff","editable":true,"block":"themeColors","order":400},"sw-color-success":{"label":{"en-GB":"Success","de-DE":"Erfolg"},"type":"color","value":"#3cc261","editable":true,"block":"statusColors","order":100},"sw-color-info":{"label":{"en-GB":"Information","de-DE":"Information"},"type":"color","value":"#26b6cf","editable":true,"block":"statusColors","order":200},"sw-color-warning":{"label":{"en-GB":"Notice","de-DE":"Hinweis"},"type":"color","value":"#ffbd5d","editable":true,"block":"statusColors","order":300},"sw-color-danger":{"label":{"en-GB":"Error","de-DE":"Fehler"},"type":"color","value":"#e52427","editable":true,"block":"statusColors","order":400},"sw-font-family-base":{"label":{"en-GB":"Fonttype text","de-DE":"Schriftart Text"},"type":"fontFamily","value":"'Inter', sans-serif","editable":true,"block":"typography","order":100},"sw-text-color":{"label":{"en-GB":"Text colour","de-DE":"Textfarbe"},"type":"color","value":"#4a545b","editable":true,"block":"typography","order":200},"sw-font-family-headline":{"label":{"en-GB":"Fonttype headline","de-DE":"Schriftart \u00dcberschrift"},"type":"fontFamily","value":"'Inter', sans-serif","editable":true,"block":"typography","order":300},"sw-headline-color":{"label":{"en-GB":"Headline colour","de-DE":"\u00dcberschriftfarbe"},"type":"color","value":"#4a545b","editable":true,"block":"typography","order":400},"sw-color-price":{"label":{"en-GB":"Price","de-DE":"Preis"},"type":"color","value":"#4a545b","editable":true,"block":"eCommerce","order":100},"sw-color-buy-button":{"label":{"en-GB":"Buy button","de-DE":"Kaufen-Button"},"type":"color","value":"#008490","editable":true,"block":"eCommerce","order":200},"sw-color-buy-button-text":{"label":{"en-GB":"Buy button text","de-DE":"Kaufen-Button Text"},"type":"color","value":"#fff","editable":true,"block":"eCommerce","order":300},"sw-logo-desktop":{"label":{"en-GB":"Desktop","de-DE":"Desktop"},"helpText":{"en-GB":"Displayed for viewports of above 991px","de-DE":"Wird \u00fcber einem Viewport von 991px angezeigt"},"type":"media","value":"790fc674240a45cbb4dc5dba98920fe8","editable":true,"block":"media","order":100,"fullWidth":true},"sw-logo-tablet":{"label":{"en-GB":"Tablet","de-DE":"Tablet"},"helpText":{"en-GB":"Displayed between a viewport of 767px to 991px","de-DE":"Wird zwischen einem viewport von 767px bis 991px angezeigt"},"type":"media","value":"790fc674240a45cbb4dc5dba98920fe8","editable":true,"block":"media","order":200,"fullWidth":true},"sw-logo-mobile":{"label":{"en-GB":"Mobile","de-DE":"Mobil"},"helpText":{"en-GB":"Displayed up to a viewport of 767px","de-DE":"Wird bis zu einem Viewport von 767px angezeigt"},"type":"media","value":"790fc674240a45cbb4dc5dba98920fe8","editable":true,"block":"media","order":300,"fullWidth":true},"sw-logo-share":{"label":{"en-GB":"App & share icon","de-DE":"App- & Share-Icon"},"type":"media","value":"","editable":true,"block":"media","order":400},"sw-logo-favicon":{"label":{"en-GB":"Favicon","de-DE":"Favicon"},"type":"media","value":"d095060a4539402a9c686948ff307a0b","editable":true,"block":"media","order":500}},"sw-color-brand-primary":{"name":"sw-color-brand-primary","label":{"en-GB":"Primary colour","de-DE":"Prim\u00e4rfarbe"},"helpText":null,"type":"color","value":"#008490","editable":true,"block":"themeColors","section":null,"tab":null,"order":100,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-brand-secondary":{"name":"sw-color-brand-secondary","label":{"en-GB":"Secondary colour","de-DE":"Sekund\u00e4rfarbe"},"helpText":null,"type":"color","value":"#526e7f","editable":true,"block":"themeColors","section":null,"tab":null,"order":200,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-border-color":{"name":"sw-border-color","label":{"en-GB":"Border","de-DE":"Rahmen"},"helpText":null,"type":"color","value":"#bcc1c7","editable":true,"block":"themeColors","section":null,"tab":null,"order":300,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-background-color":{"name":"sw-background-color","label":{"en-GB":"Background","de-DE":"Hintergrund"},"helpText":null,"type":"color","value":"#fff","editable":true,"block":"themeColors","section":null,"tab":null,"order":400,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-success":{"name":"sw-color-success","label":{"en-GB":"Success","de-DE":"Erfolg"},"helpText":null,"type":"color","value":"#3cc261","editable":true,"block":"statusColors","section":null,"tab":null,"order":100,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-info":{"name":"sw-color-info","label":{"en-GB":"Information","de-DE":"Information"},"helpText":null,"type":"color","value":"#26b6cf","editable":true,"block":"statusColors","section":null,"tab":null,"order":200,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-warning":{"name":"sw-color-warning","label":{"en-GB":"Notice","de-DE":"Hinweis"},"helpText":null,"type":"color","value":"#ffbd5d","editable":true,"block":"statusColors","section":null,"tab":null,"order":300,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-danger":{"name":"sw-color-danger","label":{"en-GB":"Error","de-DE":"Fehler"},"helpText":null,"type":"color","value":"#e52427","editable":true,"block":"statusColors","section":null,"tab":null,"order":400,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-font-family-base":{"name":"sw-font-family-base","label":{"en-GB":"Fonttype text","de-DE":"Schriftart Text"},"helpText":null,"type":"fontFamily","value":"'Inter', sans-serif","editable":true,"block":"typography","section":null,"tab":null,"order":100,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-text-color":{"name":"sw-text-color","label":{"en-GB":"Text colour","de-DE":"Textfarbe"},"helpText":null,"type":"color","value":"#4a545b","editable":true,"block":"typography","section":null,"tab":null,"order":200,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-font-family-headline":{"name":"sw-font-family-headline","label":{"en-GB":"Fonttype headline","de-DE":"Schriftart \u00dcberschrift"},"helpText":null,"type":"fontFamily","value":"'Inter', sans-serif","editable":true,"block":"typography","section":null,"tab":null,"order":300,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-headline-color":{"name":"sw-headline-color","label":{"en-GB":"Headline colour","de-DE":"\u00dcberschriftfarbe"},"helpText":null,"type":"color","value":"#4a545b","editable":true,"block":"typography","section":null,"tab":null,"order":400,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-price":{"name":"sw-color-price","label":{"en-GB":"Price","de-DE":"Preis"},"helpText":null,"type":"color","value":"#4a545b","editable":true,"block":"eCommerce","section":null,"tab":null,"order":100,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-buy-button":{"name":"sw-color-buy-button","label":{"en-GB":"Buy button","de-DE":"Kaufen-Button"},"helpText":null,"type":"color","value":"#008490","editable":true,"block":"eCommerce","section":null,"tab":null,"order":200,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-color-buy-button-text":{"name":"sw-color-buy-button-text","label":{"en-GB":"Buy button text","de-DE":"Kaufen-Button Text"},"helpText":null,"type":"color","value":"#fff","editable":true,"block":"eCommerce","section":null,"tab":null,"order":300,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-logo-desktop":{"name":"sw-logo-desktop","label":{"en-GB":"Desktop","de-DE":"Desktop"},"helpText":{"en-GB":"Displayed for viewports of above 991px","de-DE":"Wird \u00fcber einem Viewport von 991px angezeigt"},"type":"media","value":"https:\/\/pr-18-yjncdpi-p272hx6fwtpmm.eu-5.platformsh.site\/\/media\/4b\/7c\/5f\/1622109741\/demostore-logo.png","editable":true,"block":"media","section":null,"tab":null,"order":100,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":true,"extensions":[]},"sw-logo-tablet":{"name":"sw-logo-tablet","label":{"en-GB":"Tablet","de-DE":"Tablet"},"helpText":{"en-GB":"Displayed between a viewport of 767px to 991px","de-DE":"Wird zwischen einem viewport von 767px bis 991px angezeigt"},"type":"media","value":"https:\/\/pr-18-yjncdpi-p272hx6fwtpmm.eu-5.platformsh.site\/\/media\/4b\/7c\/5f\/1622109741\/demostore-logo.png","editable":true,"block":"media","section":null,"tab":null,"order":200,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":true,"extensions":[]},"sw-logo-mobile":{"name":"sw-logo-mobile","label":{"en-GB":"Mobile","de-DE":"Mobil"},"helpText":{"en-GB":"Displayed up to a viewport of 767px","de-DE":"Wird bis zu einem Viewport von 767px angezeigt"},"type":"media","value":"https:\/\/pr-18-yjncdpi-p272hx6fwtpmm.eu-5.platformsh.site\/\/media\/4b\/7c\/5f\/1622109741\/demostore-logo.png","editable":true,"block":"media","section":null,"tab":null,"order":300,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":true,"extensions":[]},"sw-logo-share":{"name":"sw-logo-share","label":{"en-GB":"App & share icon","de-DE":"App- & Share-Icon"},"helpText":null,"type":"media","value":"","editable":true,"block":"media","section":null,"tab":null,"order":400,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]},"sw-logo-favicon":{"name":"sw-logo-favicon","label":{"en-GB":"Favicon","de-DE":"Favicon"},"helpText":null,"type":"media","value":"https:\/\/pr-18-yjncdpi-p272hx6fwtpmm.eu-5.platformsh.site\/\/media\/ee\/67\/8a\/1622109741\/favicon.png","editable":true,"block":"media","section":null,"tab":null,"order":500,"sectionOrder":null,"blockOrder":null,"tabOrder":null,"custom":null,"scss":null,"fullWidth":null,"extensions":[]}},"technicalName":"Storefront","name":"Shopware default theme","previewMedia":"vendor\/shopware\/storefront\/Resources\/app\/storefront\/dist\/assets\/defaultThemePreview.jpg","author":"shopware AG","isTheme":true,"styleFiles":[{"filepath":"\/app\/vendor\/shopware\/storefront\/Resources\/app\/storefront\/src\/scss\/base.scss","resolveMapping":{"vendor":"\/app\/vendor\/shopware\/storefront\/Resources\/app\/storefront\/vendor"},"extensions":[]},{"filepath":"\/app\/vendor\/shopware\/storefront\/Resources\/app\/storefront\/src\/scss\/skin\/shopware\/_base.scss","resolveMapping":{"vendor":"\/app\/vendor\/shopware\/storefront\/Resources\/app\/storefront\/vendor"},"extensions":[]},{"filepath":"@Plugins","resolveMapping":[],"extensions":[]}],"scriptFiles":[{"filepath":"vendor\/shopware\/storefront\/Resources\/app\/storefront\/dist\/js\/vendor-node.js","resolveMapping":[],"extensions":[]},{"filepath":"vendor\/shopware\/storefront\/Resources\/app\/storefront\/dist\/js\/vendor-shared.js","resolveMapping":[],"extensions":[]},{"filepath":"vendor\/shopware\/storefront\/Resources\/app\/storefront\/dist\/js\/runtime.js","resolveMapping":[],"extensions":[]},{"filepath":"vendor\/shopware\/storefront\/Resources\/app\/storefront\/dist\/storefront\/js\/storefront.js","resolveMapping":[],"extensions":[]},{"filepath":"@Plugins","resolveMapping":[],"extensions":[]}],"storefrontEntryFilepath":"vendor\/shopware\/storefront\/Resources\/app\/storefront\/src\/main.js","basePath":"vendor\/shopware\/storefront\/Resources","assetPaths":["vendor\/shopware\/storefront\/Resources\/app\/storefront\/dist\/assets"],"viewInheritance":[],"iconSets":[],"extensions":[]}
diff --git a/shopware/paas-meta/6.4/files/theme-config/index.json b/shopware/paas-meta/6.4/files/theme-config/index.json
deleted file mode 100644
index d24533b..0000000
--- a/shopware/paas-meta/6.4/files/theme-config/index.json
+++ /dev/null
@@ -1 +0,0 @@
-{"a3b6618b39d549fc87c97fb2422d085f":"6753315de5ae4e9081228ff9d6e7b802"}
diff --git a/shopware/paas-meta/6.4/manifest.json b/shopware/paas-meta/6.5/manifest.json
index 2ba26a6..5fc5880 100644
--- a/shopware/paas-meta/6.4/manifest.json
+++ b/shopware/paas-meta/6.5/manifest.json
@@ -4,15 +4,13 @@
         ".platform/": ".platform/",
         "bin/": "%BIN_DIR%/",
         "config/": "%CONFIG_DIR%/",
-        "files/": "files/"
+        "files/": "files/",
+        "root/": ""
     },
     "container": {
         "default_redis_database": "0",
         "default_redis_host": "rediscache.internal",
         "default_redis_port": "6379",
         "env(CACHE_URL)": "redis://localhost"
-    },
-    "gitignore": [
-        "!/files/theme-config"
-    ]
+    }
 }
diff --git a/shopware/paas-meta/6.4/post-install.txt b/shopware/paas-meta/6.5/post-install.txt
index a7422d8..1bb25b1 100644
--- a/shopware/paas-meta/6.4/post-install.txt
+++ b/shopware/paas-meta/6.5/post-install.txt
@@ -1,3 +1,2 @@
-* After first installation the Storefront will miss some css files
-  * To fix this dump the current theme configuration using platform mount:download --mount 'files' --target 'files' -A app
-  * Add that files to your git repository and push to build the storefront
+* Before pushing the first time, make sure you did created the JWT keys and stored them as secrets:
+   * https://developer.shopware.com/docs/v6.5/products/paas/build-deploy.html#jwt-keys
diff --git a/shopware/paas-meta/6.5/root/.environment b/shopware/paas-meta/6.5/root/.environment
new file mode 100644
index 0000000..4c668b5
--- /dev/null
+++ b/shopware/paas-meta/6.5/root/.environment
@@ -0,0 +1 @@
+export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
diff --git a/shopware/paas-meta/6.5/root/.shopware-project.yaml b/shopware/paas-meta/6.5/root/.shopware-project.yaml
new file mode 100644
index 0000000..22acd5d
--- /dev/null
+++ b/shopware/paas-meta/6.5/root/.shopware-project.yaml
@@ -0,0 +1,3 @@
+deployment:
+    cache:
+        always_clear: true
6.5 vs 6.6
diff --git a/shopware/paas-meta/6.5/.platform/applications.yaml b/shopware/paas-meta/6.6/.platform/applications.yaml
index 23ca7bc..5deb28f 100644
--- a/shopware/paas-meta/6.5/.platform/applications.yaml
+++ b/shopware/paas-meta/6.6/.platform/applications.yaml
@@ -1,5 +1,5 @@
 -   name: app
-    type: php:8.3
+    type: php:8.4
     build:
         flavor: none
     variables:
@@ -17,6 +17,8 @@
             SHOPWARE_SKIP_WEBINSTALLER: 1
             # Performance optimization
             COMPOSER_ROOT_VERSION: 1.0.0
+            # Set the log directory to a path outside of the shared mount to avoid performance issues
+            APP_LOG_DIR: /app/localLog
         php:
             upload_max_filesize: 32M
             post_max_size: 32M
@@ -60,6 +62,7 @@
             export PATH="/tmp/tools/bin:$PATH"
 
             export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
+            export SHOPWARE_SKIP_ASSET_INSTALL_CACHE_INVALIDATION=1
 
             shopware-cli project ci .
 
@@ -97,7 +100,7 @@
         post_deploy: |
             set -e
 
-            php bin/console theme:compile
+            php bin/console theme:compile --sync
 
     # The relationships of the application with services or other applications.
     # The left-hand side is the name of the relationship as it will be exposed
@@ -142,6 +145,9 @@
         "/localCache":
             source: local
             source_path: "localCache"
+        "/localLog":
+            source: local
+            source_path: "localLog"
 
     # The configuration of app when it is exposed to the web.
     web:
diff --git a/shopware/paas-meta/6.5/.platform/services.yaml b/shopware/paas-meta/6.6/.platform/services.yaml
index 2a9c087..e59fcaa 100644
--- a/shopware/paas-meta/6.5/.platform/services.yaml
+++ b/shopware/paas-meta/6.6/.platform/services.yaml
@@ -1,23 +1,26 @@
 db:
-    type: mariadb:11.2
+    type: mariadb:11.4
     disk: 2048
+
 cacheredis:
-    type: redis:7.0
+    type: redis:7.2
     configuration:
         maxmemory_policy: volatile-lfu
+
 sessionredis:
-    type: redis-persistent:7.0
+    type: redis-persistent:7.2
     disk: 1024
     configuration:
         maxmemory_policy: allkeys-lru
+
 # comment if you want to disable rabbitmq
 rabbitmq:
-    type: rabbitmq:3.8
+    type: rabbitmq:3.13
     disk: 1024
 
 # uncomment if you want to use opensearch
 #opensearch:
-#    type: opensearch:1.2
+#    type: opensearch:2
 #    disk: 256
 
 # Change the disk space according to your needs for a.o. media files
diff --git a/shopware/paas-meta/6.5/config/packages/paas.yaml b/shopware/paas-meta/6.6/config/packages/paas.yaml
index a67595d..8c2ea01 100644
--- a/shopware/paas-meta/6.5/config/packages/paas.yaml
+++ b/shopware/paas-meta/6.6/config/packages/paas.yaml
@@ -12,8 +12,7 @@ framework:
 shopware:
     api:
         jwt_key:
-            private_key_path: '%env(base64:JWT_PRIVATE_KEY)%'
-            public_key_path: '%env(base64:JWT_PUBLIC_KEY)%'
+            use_app_secret: true
     admin_worker:
         enable_admin_worker: false
         enable_queue_stats_worker: false
diff --git a/shopware/paas-meta/6.5/post-install.txt b/shopware/paas-meta/6.5/post-install.txt
deleted file mode 100644
index 1bb25b1..0000000
--- a/shopware/paas-meta/6.5/post-install.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-* Before pushing the first time, make sure you did created the JWT keys and stored them as secrets:
-   * https://developer.shopware.com/docs/v6.5/products/paas/build-deploy.html#jwt-keys
6.6 vs 6.7
diff --git a/shopware/paas-meta/6.6/.platform/applications.yaml b/shopware/paas-meta/6.7/.platform/applications.yaml
index 5deb28f..9932daf 100644
--- a/shopware/paas-meta/6.6/.platform/applications.yaml
+++ b/shopware/paas-meta/6.7/.platform/applications.yaml
@@ -1,184 +1,184 @@
--   name: app
-    type: php:8.4
-    build:
-        flavor: none
-    variables:
-        env:
-            APP_ENV: prod
-            # Enable HTTP Cache to get cache-control headers
-            SHOPWARE_HTTP_CACHE_ENABLED: 1
-            NODE_VERSION: v20.18.0
-            SHOPWARE_CLI_VERSION: 0.4.62
-            # Elasticsearch, see https://developer.shopware.com/docs/guides/hosting/infrastructure/elasticsearch#activating-and-first-time-indexing
-            SHOPWARE_ES_ENABLED: 0
-            SHOPWARE_ES_INDEXING_ENABLED: 0
-            SHOPWARE_ES_INDEX_PREFIX: "sw6"
-            # Disables the Shopware web installer
-            SHOPWARE_SKIP_WEBINSTALLER: 1
-            # Performance optimization
-            COMPOSER_ROOT_VERSION: 1.0.0
-            # Set the log directory to a path outside of the shared mount to avoid performance issues
-            APP_LOG_DIR: /app/localLog
-        php:
-            upload_max_filesize: 32M
-            post_max_size: 32M
-            memory_limit: 512M
-            "zend.assertions": -1
-            "opcache.enable_file_override": 1
-            "opcache.interned_strings_buffer": 20
-            "opcache.validate_timestamps": 0
-            "zend.detect_unicode": 0
-            realpath_cache_ttl: 3600
-            "opcache.memory_consumption": 128M
-            "opcache.max_accelerated_files": 20000
-    # Specify additional PHP extensions that should be loaded.
-    runtime:
-        extensions:
-            - ctype
-            - dom
-            - iconv
-            - mbstring
-            - fileinfo
-            - intl
-            - redis
-            - sodium
-            - amqp
-    # The hooks that will be performed when the package is deployed.
-    hooks:
-        build: |
-            set -e
-            echo "Installing Node ${NODE_VERSION} and shopware-cli ${SHOPWARE_CLI_VERSION}"
-
-            mkdir -p /tmp/tools
-
-            curl -qL -s -o node.tar.xz "https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz"
-            tar xf node.tar.xz -C /tmp/tools --strip-components=1
-            curl -qL -s -o shopware-cli.tar.gz https://github.com/shopware/shopware-cli/releases/download/${SHOPWARE_CLI_VERSION}/shopware-cli_Linux_x86_64.tar.gz
-            tar xf shopware-cli.tar.gz -C /tmp/tools shopware-cli
-            mv /tmp/tools/shopware-cli /tmp/tools/bin
-
-            rm node.tar.xz shopware-cli.tar.gz
-
-            export PATH="/tmp/tools/bin:$PATH"
-
-            export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
-            export SHOPWARE_SKIP_ASSET_INSTALL_CACHE_INVALIDATION=1
-
-            shopware-cli project ci .
-
-            # Moving files of the mounts to avoid warnings
-            mv $APP_CACHE_DIR ./RO-localCache
-            mv ./var ./RO-var
-
-        deploy: |
-            set -e
-
-            echo "Syncing files created during the build in the mounts"
-            rsync -av --delete "${PLATFORM_APP_DIR}/RO-localCache/" "${APP_CACHE_DIR}/"
-            rsync -av "${PLATFORM_APP_DIR}/RO-var/" "${PLATFORM_APP_DIR}/var/"
-
-            echo "Create Dompdf working directories and sync fonts from the vendor folder"
-            if [ ! -d "${PLATFORM_APP_DIR}/var/dompdf/tempDir" ]; then
-                mkdir -p "${PLATFORM_APP_DIR}/var/dompdf/tempDir"
-            fi
-            if [ ! -d "${PLATFORM_APP_DIR}/var/dompdf/fontCache" ]; then
-                mkdir -p "${PLATFORM_APP_DIR}/var/dompdf/fontCache"
-            fi
-            rsync -av "${PLATFORM_APP_DIR}/vendor/dompdf/dompdf/lib/fonts" "${PLATFORM_APP_DIR}/var/dompdf/fontDir"
-
-            php vendor/bin/shopware-deployment-helper run --skip-asset-install --skip-theme-compile
-
-            if [ "$PLATFORM_ENVIRONMENT_TYPE" != production ]; then
-                echo "==================================================="
-                echo "UPDATE SALES CHANNEL DOMAIN IF ENVIRONMENT TYPE IS NOT PRODUCTION"
-                echo "==================================================="
-
-                export FRONTEND_URL=`echo $PLATFORM_ROUTES | base64 --decode | jq -r 'to_entries[] | select(.value.id=="shopware") | .key'`
-                export FRONTEND_DOMAIN=`php -r 'echo parse_url($_SERVER["FRONTEND_URL"], PHP_URL_HOST);'`
-                bin/console sales-channel:update:domain "$FRONTEND_DOMAIN"
-            fi
-        post_deploy: |
-            set -e
-
-            php bin/console theme:compile --sync
-
-    # The relationships of the application with services or other applications.
-    # The left-hand side is the name of the relationship as it will be exposed
-    # to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand
-    # side is in the form `<service name>:<endpoint name>`.
-    relationships:
-        database: "db:mysql"
-        rediscache: "cacheredis:redis"
-        redissession: "sessionredis:redis"
-        # comment to disable rabbitmq
-        rabbitmqqueue: "rabbitmq:rabbitmq"
-        # uncomment if you want to use opensearch/elasticsearch
-        # opensearch: "opensearch:opensearch"
-    # The size of the persistent disk of the application (in MB).
-    disk: 2048
-    # The mounts that will be performed when the package is deployed.
-    mounts:
-        "/files":
-            source: service
-            service: fileshare
-            source_path: "files"
-        "/public/media":
-            source: service
-            service: fileshare
-            source_path: "public/media"
-        "/public/thumbnail":
-            source: service
-            service: fileshare
-            source_path: "public/thumbnail"
-        "/public/theme":
-            source: service
-            service: fileshare
-            source_path: "public/theme"
-        "/public/sitemap":
-            source: service
-            service: fileshare
-            source_path: "public/sitemap"
-        "/var":
-            source: service
-            service: fileshare
-            source_path: "var"
-        "/localCache":
-            source: local
-            source_path: "localCache"
-        "/localLog":
-            source: local
-            source_path: "localLog"
-
-    # The configuration of app when it is exposed to the web.
-    web:
-        locations:
-            "/":
-                # The public directory of the app, relative to its root.
-                root: "public"
-                # The front-controller script to send non-static requests to.
-                passthru: "/index.php"
-                expires: 24h
-                rules:
-                    '(?i)\.svg$':
-                        expires: 4w
-                        headers:
-                            Content-Security-Policy: "script-src 'none'; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'"
-                    '(?i)^/(media|thumbnail)/.*\.html$':
-                        headers:
-                            Content-Security-Policy: "script-src 'none'; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'"
-                    \.(css|js|gif|jpe?g|png|ttf|eot|woff2?|otf|cast|mp4|json|yaml|ico)$:
-                        expires: 4w
-    workers:
-        queue:
-            disk: 128
-            commands:
-                pre_start: |
-                    export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
-                    rm -rf $APP_CACHE_DIR/var
-                    php $PLATFORM_APP_DIR/bin/console
-                start: APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache bin/console messenger:consume async low_priority failed --memory-limit=$(cat /run/config.json | jq .info.limits.memory)M --time-limit=295
-
-    crons:
-        scheduler:
-            spec: '*/5 * * * *'
-            cmd: 'APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache php bin/console scheduled-task:run --no-wait'
+-   name: app
+    type: php:8.4
+    build:
+        flavor: none
+    variables:
+        env:
+            APP_ENV: prod
+            # Enable HTTP Cache to get cache-control headers
+            SHOPWARE_HTTP_CACHE_ENABLED: 1
+            NODE_VERSION: v22.17.0
+            SHOPWARE_CLI_VERSION: 0.6.17
+            # Elasticsearch, see https://developer.shopware.com/docs/guides/hosting/infrastructure/elasticsearch#activating-and-first-time-indexing
+            SHOPWARE_ES_ENABLED: 0
+            SHOPWARE_ES_INDEXING_ENABLED: 0
+            SHOPWARE_ES_INDEX_PREFIX: "sw6"
+            # Disables the Shopware web installer
+            SHOPWARE_SKIP_WEBINSTALLER: 1
+            # Performance optimization
+            COMPOSER_ROOT_VERSION: 1.0.0
+            # Set the log directory to a path outside of the shared mount to avoid performance issues
+            APP_LOG_DIR: /app/localLog
+        php:
+            upload_max_filesize: 32M
+            post_max_size: 32M
+            memory_limit: 512M
+            "zend.assertions": -1
+            "opcache.enable_file_override": 1
+            "opcache.interned_strings_buffer": 20
+            "opcache.validate_timestamps": 0
+            "zend.detect_unicode": 0
+            realpath_cache_ttl: 3600
+            "opcache.memory_consumption": 128M
+            "opcache.max_accelerated_files": 20000
+    # Specify additional PHP extensions that should be loaded.
+    runtime:
+        extensions:
+            - ctype
+            - dom
+            - iconv
+            - mbstring
+            - fileinfo
+            - intl
+            - redis
+            - sodium
+            - amqp
+    # The hooks that will be performed when the package is deployed.
+    hooks:
+        build: |
+            set -e
+            echo "Installing Node ${NODE_VERSION} and shopware-cli ${SHOPWARE_CLI_VERSION}"
+
+            mkdir -p /tmp/tools
+
+            curl -qL -s -o node.tar.xz "https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz"
+            tar xf node.tar.xz -C /tmp/tools --strip-components=1
+            curl -qL -s -o shopware-cli.tar.gz https://github.com/shopware/shopware-cli/releases/download/${SHOPWARE_CLI_VERSION}/shopware-cli_Linux_x86_64.tar.gz
+            tar xf shopware-cli.tar.gz -C /tmp/tools shopware-cli
+            mv /tmp/tools/shopware-cli /tmp/tools/bin
+
+            rm node.tar.xz shopware-cli.tar.gz
+
+            export PATH="/tmp/tools/bin:$PATH"
+
+            export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
+            export SHOPWARE_SKIP_ASSET_INSTALL_CACHE_INVALIDATION=1
+
+            shopware-cli project ci .
+
+            # Moving files of the mounts to avoid warnings
+            mv $APP_CACHE_DIR ./RO-localCache
+            mv ./var ./RO-var
+
+        deploy: |
+            set -e
+
+            echo "Syncing files created during the build in the mounts"
+            rsync -av --delete "${PLATFORM_APP_DIR}/RO-localCache/" "${APP_CACHE_DIR}/"
+            rsync -av "${PLATFORM_APP_DIR}/RO-var/" "${PLATFORM_APP_DIR}/var/"
+
+            echo "Create Dompdf working directories and sync fonts from the vendor folder"
+            if [ ! -d "${PLATFORM_APP_DIR}/var/dompdf/tempDir" ]; then
+                mkdir -p "${PLATFORM_APP_DIR}/var/dompdf/tempDir"
+            fi
+            if [ ! -d "${PLATFORM_APP_DIR}/var/dompdf/fontCache" ]; then
+                mkdir -p "${PLATFORM_APP_DIR}/var/dompdf/fontCache"
+            fi
+            rsync -av "${PLATFORM_APP_DIR}/vendor/dompdf/dompdf/lib/fonts" "${PLATFORM_APP_DIR}/var/dompdf/fontDir"
+
+            php vendor/bin/shopware-deployment-helper run --skip-asset-install --skip-theme-compile
+
+            if [ "$PLATFORM_ENVIRONMENT_TYPE" != production ]; then
+                echo "==================================================="
+                echo "UPDATE SALES CHANNEL DOMAIN IF ENVIRONMENT TYPE IS NOT PRODUCTION"
+                echo "==================================================="
+
+                export FRONTEND_URL=`echo $PLATFORM_ROUTES | base64 --decode | jq -r 'to_entries[] | select(.value.id=="shopware") | .key'`
+                export FRONTEND_DOMAIN=`php -r 'echo parse_url($_SERVER["FRONTEND_URL"], PHP_URL_HOST);'`
+                bin/console sales-channel:update:domain "$FRONTEND_DOMAIN"
+            fi
+        post_deploy: |
+            set -e
+
+            php bin/console theme:compile --sync
+
+    # The relationships of the application with services or other applications.
+    # The left-hand side is the name of the relationship as it will be exposed
+    # to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand
+    # side is in the form `<service name>:<endpoint name>`.
+    relationships:
+        database: "db:mysql"
+        rediscache: "cacheredis:redis"
+        redissession: "sessionredis:redis"
+        # comment to disable rabbitmq
+        rabbitmqqueue: "rabbitmq:rabbitmq"
+        # uncomment if you want to use opensearch/elasticsearch
+        # opensearch: "opensearch:opensearch"
+    # The size of the persistent disk of the application (in MB).
+    disk: 2048
+    # The mounts that will be performed when the package is deployed.
+    mounts:
+        "/files":
+            source: service
+            service: fileshare
+            source_path: "files"
+        "/public/media":
+            source: service
+            service: fileshare
+            source_path: "public/media"
+        "/public/thumbnail":
+            source: service
+            service: fileshare
+            source_path: "public/thumbnail"
+        "/public/theme":
+            source: service
+            service: fileshare
+            source_path: "public/theme"
+        "/public/sitemap":
+            source: service
+            service: fileshare
+            source_path: "public/sitemap"
+        "/var":
+            source: service
+            service: fileshare
+            source_path: "var"
+        "/localCache":
+            source: local
+            source_path: "localCache"
+        "/localLog":
+            source: local
+            source_path: "localLog"
+
+    # The configuration of app when it is exposed to the web.
+    web:
+        locations:
+            "/":
+                # The public directory of the app, relative to its root.
+                root: "public"
+                # The front-controller script to send non-static requests to.
+                passthru: "/index.php"
+                expires: 24h
+                rules:
+                    '(?i)\.svg$':
+                        expires: 4w
+                        headers:
+                            Content-Security-Policy: "script-src 'none'; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'"
+                    '(?i)^/(media|thumbnail)/.*\.html$':
+                        headers:
+                            Content-Security-Policy: "script-src 'none'; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'"
+                    \.(css|js|gif|jpe?g|png|ttf|eot|woff2?|otf|cast|mp4|json|yaml|ico)$:
+                        expires: 4w
+    workers:
+        queue:
+            disk: 128
+            commands:
+                pre_start: |
+                    export APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache
+                    rm -rf $APP_CACHE_DIR/var
+                    php $PLATFORM_APP_DIR/bin/console
+                start: APP_CACHE_DIR=$PLATFORM_APP_DIR/localCache bin/console messenger:consume async low_priority failed --memory-limit=$(cat /run/config.json | jq .info.limits.memory)M --time-limit=295
+
+    crons:
+        scheduler:
+            spec: '*/5 * * * *'
+            cmd: 'APP_CACHE_DIR=/app/localCache php bin/console scheduled-task:run --no-wait'
diff --git a/shopware/paas-meta/6.6/.platform/routes.yaml b/shopware/paas-meta/6.7/.platform/routes.yaml
index 401da87..362bcf0 100644
--- a/shopware/paas-meta/6.6/.platform/routes.yaml
+++ b/shopware/paas-meta/6.7/.platform/routes.yaml
@@ -2,7 +2,6 @@
 #
 # Each route describes how an incoming URL is going
 # to be processed by Platform.sh.
-
 "https://{default}/":
     type: upstream
     id: shopware
diff --git a/shopware/paas-meta/6.6/.platform/services.yaml b/shopware/paas-meta/6.7/.platform/services.yaml
index e59fcaa..41bdcdc 100644
--- a/shopware/paas-meta/6.6/.platform/services.yaml
+++ b/shopware/paas-meta/6.7/.platform/services.yaml
@@ -1,28 +1,25 @@
 db:
     type: mariadb:11.4
     disk: 2048
-
 cacheredis:
     type: redis:7.2
     configuration:
         maxmemory_policy: volatile-lfu
-
 sessionredis:
     type: redis-persistent:7.2
     disk: 1024
     configuration:
         maxmemory_policy: allkeys-lru
-
 # comment if you want to disable rabbitmq
+
 rabbitmq:
     type: rabbitmq:3.13
     disk: 1024
-
 # uncomment if you want to use opensearch
+
 #opensearch:
 #    type: opensearch:2
 #    disk: 256
-
 # Change the disk space according to your needs for a.o. media files
 fileshare:
     type: network-storage:2.0
diff --git a/shopware/paas-meta/6.6/config/packages/paas.yaml b/shopware/paas-meta/6.7/config/packages/paas.yaml
index 8c2ea01..9480496 100644
--- a/shopware/paas-meta/6.6/config/packages/paas.yaml
+++ b/shopware/paas-meta/6.7/config/packages/paas.yaml
@@ -1,6 +1,5 @@
 # yaml-language-server: $schema=https://raw.githubusercontent.com/shopware/shopware/refs/heads/trunk/config-schema.json
 # This file contains all default configuration or PaaS
-
 framework:
     session:
         handler_id: "%env(SESSION_REDIS_URL)%/0?persistent=1"
@@ -8,11 +7,7 @@ framework:
         app: cache.adapter.redis
         system: cache.adapter.redis
         default_redis_provider: "%env(CACHE_URL)%/0?persistent=1"
-
 shopware:
-    api:
-        jwt_key:
-            use_app_secret: true
     admin_worker:
         enable_admin_worker: false
         enable_queue_stats_worker: false
@@ -20,10 +15,9 @@ shopware:
         cluster_setup: true
     dompdf:
         options:
-            tempDir: '%kernel.project_dir%/var/dompdf/tempDir'
-            fontDir: '%kernel.project_dir%/var/dompdf/fontDir'
-            fontCache: '%kernel.project_dir%/var/dompdf/fontCache'
-
+            tempDir: "%kernel.project_dir%/var/dompdf/tempDir"
+            fontDir: "%kernel.project_dir%/var/dompdf/fontDir"
+            fontCache: "%kernel.project_dir%/var/dompdf/fontCache"
 monolog:
     handlers:
         main:
@@ -41,7 +35,6 @@ monolog:
             type: console
             process_psr_3_messages: false
             channels: ["!event", "!doctrine"]
-
 elasticsearch:
     index_settings:
         number_of_replicas: null
diff --git a/shopware/paas-meta/6.6/manifest.json b/shopware/paas-meta/6.7/manifest.json
index 5fc5880..5e652b8 100644
--- a/shopware/paas-meta/6.6/manifest.json
+++ b/shopware/paas-meta/6.7/manifest.json
@@ -11,6 +11,9 @@
         "default_redis_database": "0",
         "default_redis_host": "rediscache.internal",
         "default_redis_port": "6379",
-        "env(CACHE_URL)": "redis://localhost"
+        "env(CACHE_URL)": "redis://localhost",
+        "env(MESSENGER_TRANSPORT_DSN_PREFIX)": "doctrine://default?auto_setup=false&queue_name=",
+        "env(MESSENGER_TRANSPORT_DSN)": "%env(MESSENGER_TRANSPORT_DSN_PREFIX)%messages",
+        "env(MESSENGER_TRANSPORT_LOW_PRIORITY_DSN)": "%env(MESSENGER_TRANSPORT_DSN_PREFIX)%low_priority"
     }
 }

@keulinho
Jonas Elfering (keulinho) merged commit 68eea7f into shopware:main Oct 16, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants