Add recipe for fyrst/shopware-cd (#2049)

* Add recipe for fyrst/shopware-cd

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* fix: use .yaml and 4-space indent for fyrst/shopware-cd recipe

recipes-contrib QA rejects *.yml and YAML lines whose leading indent is
not a multiple of 4. GitLab still defaults to .gitlab-ci.yml, so
post-install.txt documents the CI/CD configuration file setting.
shopware-cli already loads .shopware-project.yaml.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* fix: point fyrst/shopware-cd recipe at fyrst-dev/shopware-cd

Sync the Flex recipe from fyrst-dev/recipes (source of truth). The
Packagist package repo is now https://github.com/fyrst-dev/shopware-cd
instead of shopware-cd-template.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* fix: require shopware/docker docker/Dockerfile in fyrst/shopware-cd

Drop the root Dockerfile fallback so the recipe matches fyrst-dev/recipes.
GitHub Actions, GitLab CI, and Compose now default DOCKERFILE to
docker/Dockerfile from the shopware/docker Flex recipe.

https://github.com/symfony/recipes-contrib/pull/2049

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* fix: drop project-create overlaps; put CD compose in deploy/

shopware-cli project create owns shop-root compose.yaml, .gitignore,
and .shopware-project.yaml. Move the CD stack to deploy/compose.yaml
and deploy/compose.prod.yaml, and point vps-release.sh at
-f deploy/compose.yaml -f deploy/compose.prod.yaml -f deploy/compose.vps.yaml.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* feat: add VPS runtime sync (no S3) to fyrst/shopware-cd

Copy live MySQL + Docker volumes onto lower envs over SSH
(mysqldump + volume tars). Snapshot/restore stay on the VPS.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* feat: bind-mount Shopware VPS runtime data by default

Use SHOPWARE_DATA_ROOT host dirs for files/media/thumbnail/theme/sitemap
instead of named volumes. Keep mysql_data/redis_data as named volumes.
sync-runtime.sh rsyncs those host dirs as the primary copy path.

Expand compose.yaml without YAML aliases (4-space .yaml). Feeds #2049.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* feat: add local project-dev runtime rsync helper

Copy live VPS SHOPWARE_DATA_ROOT trees into shopware-cli project dev
paths via deploy/sync-runtime-local.sh (rsync, optional --delete).

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* feat: derive Compose project and data root from shop id + env

SHOPWARE_SHOP_ID + SHOPWARE_DEPLOY_ENV drive COMPOSE_PROJECT_NAME and
SHOPWARE_DATA_ROOT=/var/lib/shopware/data/<shop>/<env>. Compose no longer
hardcodes name: shopware. Sync scripts auto-derive when those vars are unset.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* feat: interpolate Compose name and bind mounts from shop id + env

Compose uses ${SHOPWARE_SHOP_ID}-${SHOPWARE_DEPLOY_ENV} for the project
name (required via :?) and bind-mounts
${SHOPWARE_DATA_BASE:-/var/lib/shopware/data}/${SHOPWARE_SHOP_ID}/${SHOPWARE_DEPLOY_ENV}/...
COMPOSE_PROJECT_NAME and SHOPWARE_DATA_ROOT are no longer required for
compose. Keep expanded YAML (no aliases) and 4-space indent for contrib QA.

Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>

* docs: mark SHOPWARE_PACKAGES_TOKEN as optional

* docs: mark SHOPWARE_PACKAGES_TOKEN optional in env and deploy README

* docs: mark SHOPWARE_PACKAGES_TOKEN optional in GitLab CI comments

* docs: mark SHOPWARE_PACKAGES_TOKEN optional in GitHub Actions comments

* fix: E2E compose run, pull_policy override, and create .env footguns

Mirror fyrst-dev/recipes overlay notes from Shopware 6.7 E2E:
create writes .shopware-project.yml and COMPOSE_PROJECT_NAME=sw-shop-…;
Compose v5 rejects run --no-build; same-host tag-and-load uses
PULL_POLICY=never / SKIP_PULL=1 (default pull_policy stays always).

Do not require SHOPWARE_PACKAGES_TOKEN. Recipe does not delete create's .env.

* fix: E2E compose run, pull_policy override, and create .env footguns

Mirror fyrst-dev/recipes overlay notes from Shopware 6.7 E2E:
create writes .shopware-project.yml and COMPOSE_PROJECT_NAME=sw-shop-…;
Compose v5 rejects run --no-build; same-host tag-and-load uses
PULL_POLICY=never / SKIP_PULL=1 (default pull_policy stays always).

Do not require SHOPWARE_PACKAGES_TOKEN. Recipe does not delete create's .env.

* fix: E2E compose run, pull_policy override, and create .env footguns

Mirror fyrst-dev/recipes overlay notes from Shopware 6.7 E2E:
create writes .shopware-project.yml and COMPOSE_PROJECT_NAME=sw-shop-…;
Compose v5 rejects run --no-build; same-host tag-and-load uses
PULL_POLICY=never / SKIP_PULL=1 (default pull_policy stays always).

Do not require SHOPWARE_PACKAGES_TOKEN. Recipe does not delete create's .env.

* fix: E2E compose run, pull_policy override, and create .env footguns

Mirror fyrst-dev/recipes overlay notes from Shopware 6.7 E2E:
create writes .shopware-project.yml and COMPOSE_PROJECT_NAME=sw-shop-…;
Compose v5 rejects run --no-build; same-host tag-and-load uses
PULL_POLICY=never / SKIP_PULL=1 (default pull_policy stays always).

Do not require SHOPWARE_PACKAGES_TOKEN. Recipe does not delete create's .env.

* fix: E2E compose run, pull_policy override, and create .env footguns

Mirror fyrst-dev/recipes overlay notes from Shopware 6.7 E2E:
create writes .shopware-project.yml and COMPOSE_PROJECT_NAME=sw-shop-…;
Compose v5 rejects run --no-build; same-host tag-and-load uses
PULL_POLICY=never / SKIP_PULL=1 (default pull_policy stays always).

Do not require SHOPWARE_PACKAGES_TOKEN. Recipe does not delete create's .env.

* feat: Flex env SoT keys and deploy/init-env.sh after create

Mirror fyrst-dev/recipes: Flex env appends safe CD keys; operators finish
shop-specific values with deploy/init-env.sh --shop-id (VPS: --vps).

* feat: register FyrstShopwareCdBundle in Flex recipe

* feat: add slim bash guards for fyrst:sales-channel:rewrite-urls

* docs: document console rewrite and Flex bundle for shops

* docs: point contrib sync rewrite at fyrst:sales-channel:rewrite-urls

* docs: mention console rewrite in contrib deploy README

* feat(shopware-cd): call fyrst:sales-channel:rewrite-urls after restore

* feat: dump VPS snapshots with shopware-cli project dump

* feat: dump VPS snapshots with shopware-cli project dump

* feat: dump VPS snapshots with shopware-cli project dump

* feat: dump VPS snapshots with shopware-cli project dump

* feat: dump VPS snapshots with shopware-cli project dump

* feat: add deploy/lib/identity.sh for shopware-cd sync split

* feat: add remaining deploy/lib helpers for shopware-cd sync split

* feat: add sync-live and sync-app libs for shopware-cd split

* feat: add sync-identity and sync-ssh libs for shopware-cd split

* refactor: thin sync-runtime.sh CLI and slim rewrite lib

* fix: match deploy/lib/sync-rewrite.sh to fyrst-dev/recipes main

* feat: add deploy/lib/sync-volumes.sh for shopware-cd split

* feat: add deploy/lib/sync-commands.sh for shopware-cd split

* feat: add deploy/lib/sync-db.sh for shopware-cd split

* fix: slim fyrst/shopware-cd recipe to copy-from-package

Honor diimpp's review on #2049. Recipe is Flex metadata only
(manifest + post-install). Overlay files come from
vendor/fyrst/shopware-cd/overlay/. Toast uses fyrst-cli 0.1.0+;
do not ship bash wrappers.

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

* fix: drop fyrst/shopware-cd recipe root overlay

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: ROBJkE <ROBJkE@users.noreply.github.com>
This commit is contained in:
ROBJkE
2026-09-16 17:55:36 +04:00
committed by GitHub
co-authored by Cursor Agent ROBJkE
parent d48bb7db3c
commit d844543ffa
2 changed files with 139 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
{
"copy-from-package": {
"overlay/": ""
},
"bundles": {
"Fyrst\\ShopwareCd\\FyrstShopwareCdBundle": [
"all"
]
},
"env": {
"SHOPWARE_SHOP_ID": "",
"SHOPWARE_DEPLOY_ENV": "live",
"SHOPWARE_DATA_BASE": "/var/lib/shopware/data"
}
}
+124
View File
@@ -0,0 +1,124 @@
* <fg=blue>fyrst/shopware-cd</>
Flex copied CD files from the package
<comment>overlay/</comment> into the shop root: CI,
<comment>deploy/</comment> (including CD Compose), <comment>.dockerignore</comment>,
and <comment>.env.example</comment>
(same idea as <comment>shopware/docker</comment> copying <comment>docker/Dockerfile</comment>).
<comment>compose.yaml</comment>, <comment>.gitignore</comment>, and
<comment>.shopware-project.yml</comment> (creates default;
<comment>.shopware-project.yaml</comment> is also accepted — do not rename)
are owned by
<comment>shopware-cli project create</comment> / the CLI — not this recipe.
Local: <comment>shopware-cli project dev</comment> and the CLI-managed
shop-root <comment>compose.yaml</comment>.
VPS/CD: files under <comment>deploy/</comment>
(<comment>deploy/compose.yaml</comment>, <comment>deploy/compose.prod.yaml</comment>,
<comment>deploy/compose.vps.yaml</comment>).
Runtime DB/bind-mount copy between VPS hosts:
<comment>fyrst-cli shopware sync pull</comment>
(see <comment>deploy/sync-runtime.md</comment>).
DB snapshots use <comment>shopware-cli project dump</comment>
(fyrst-cli never dumps; restore is
<comment>fyrst-cli shopware db import</comment>).
Live backups (not sync):
<comment>fyrst-cli shopware backup create</comment>
(see <comment>deploy/backup-runtime.md</comment>).
Rollback:
<comment>IMAGE_TAG=$(cat .previous-tag) fyrst-cli shopware deploy rollback</comment>.
Each VPS needs <comment>fyrst-cli</comment> 0.1.0+
(<comment>https://github.com/fyrst-dev/cli</comment>).
CI runs <comment>fyrst-cli shopware deploy release</comment>
with <comment>IMAGE</comment> / <comment>IMAGE_TAG</comment> /
<comment>COMPOSE_DIR</comment>.
TLS edge: <comment>deploy/edge/Caddyfile</comment>.
Live → local project dev rsync (no DB):
<comment>fyrst-cli shopware sync local</comment>
(reads <comment>SHOPWARE_SHOP_ID</comment> from local <comment>.env</comment>;
remote root <comment>/var/lib/shopware/data/${SHOPWARE_SHOP_ID}/live</comment>;
<comment>--data all</comment> is refused).
Flex may append a <comment>###> fyrst/shopware-cd ###</comment>
block to shop-root <comment>.env</comment> (empty
<comment>SHOPWARE_SHOP_ID</comment>, <comment>SHOPWARE_DEPLOY_ENV=live</comment>,
<comment>SHOPWARE_DATA_BASE=/var/lib/shopware/data</comment>).
It does not overwrite creates whole <comment>.env</comment>
and does not put secrets in that block. Then run
<comment>fyrst-cli shopware env init --shop-id …</comment>
(see <comment>deploy/README</comment>).
VPS <comment>.env</comment> source of truth (required):
<comment>SHOPWARE_SHOP_ID</comment> (same slug on live + staging + laptop),
<comment>SHOPWARE_DEPLOY_ENV</comment> (live|staging|playground|dev).
Compose derives project name
(<comment>${SHOPWARE_SHOP_ID}-${SHOPWARE_DEPLOY_ENV}</comment>)
and bind-mount paths from those two plus optional
<comment>SHOPWARE_DATA_BASE</comment> (default
<comment>/var/lib/shopware/data</comment>) — three separate interpolations,
no nested defaults. It does not require
<comment>COMPOSE_PROJECT_NAME</comment> or <comment>SHOPWARE_DATA_ROOT</comment>
(optional for scripts/docs; fyrst-cli derives when unset and prefers them
when set — do not assign them empty).
WARNING: <comment>shopware-cli project create</comment> writes
<comment>COMPOSE_PROJECT_NAME=sw-shop-…</comment> into shop-root
<comment>.env</comment> for local <comment>project dev</comment>. That env var
overrides Compose <comment>name:</comment>
(<comment>${SHOPWARE_SHOP_ID}-${SHOPWARE_DEPLOY_ENV}</comment>).
On the VPS, comment out that line
(<comment>fyrst-cli shopware env init --vps</comment> or by hand).
Flex does not delete it on <comment>composer require</comment>
(create owns the local flow).
Bootstrap:
<comment>DATA="${SHOPWARE_DATA_BASE:-/var/lib/shopware/data}/${SHOPWARE_SHOP_ID}/${SHOPWARE_DEPLOY_ENV}"</comment>
then <comment>mkdir -p "${DATA}"/{files,media,thumbnail,theme,sitemap}</comment>
then <comment>chown -R 82:82 "${DATA}"</comment>.
Live profiles: uncomment
<comment>COMPOSE_PROFILES=redis,worker,scheduler</comment>
in <comment>.env</comment> (worker + scheduler; redis if used). Staging leaves
this unset unless you need async tasks.
<comment>fyrst-cli shopware deploy release</comment> warns on live when it is empty; it does
not auto-enable.
Same-host tag-and-load / air-gap: <comment>PULL_POLICY=never</comment>
and <comment>SKIP_PULL=1</comment> (or
<comment>fyrst-cli shopware deploy release --skip-pull</comment>). Default
<comment>pull_policy</comment> is <comment>always</comment> for CI/VPS.
Several shops or live+staging on one VPS share the host; shop id + env
keep stacks isolated.
You MUST require <comment>shopware/docker</comment> in the same Composer command as
this package. That recipe copies <comment>docker/Dockerfile</comment>, which CI and
CD Compose require (default <comment>DOCKERFILE=docker/Dockerfile</comment>). This recipe
does not ship a root Dockerfile. A missing <comment>docker/Dockerfile</comment>
means <comment>shopware/docker</comment> was skipped.
Flex may append SoT keys to <comment>.env</comment>; it does not
overwrite creates whole <comment>.env</comment>. Then run
<comment>fyrst-cli shopware env init --shop-id …</comment>
(VPS: add <comment>--vps</comment>; see <comment>deploy/README</comment>).
If <comment>.env</comment> is missing, that command copies
<comment>.env.example</comment> first. Commit the copied files;
<comment>vendor/</comment> is gitignored.
shopware-cli project create writes <comment>.shopware-project.yml</comment>
(that extension is fine). shopware-cli accepts both
<comment>.yml</comment> and <comment>.yaml</comment>; do not rename.
GitHub Actions picks up
<comment>.github/workflows/cd.yaml</comment>. GitLab still defaults to
<comment>.gitlab-ci.yml</comment>: set Settings → CI/CD → CI/CD configuration file
to <comment>.gitlab-ci.yaml</comment> (or copy/symlink that name).
Flex registers
<comment>Fyrst\ShopwareCd\FyrstShopwareCdBundle</comment>
in <comment>config/bundles.php</comment>.
Post-restore sales-channel URL rewrite uses
<comment>APP_URL</comment> in shop-root <comment>.env</comment>;
sync calls
<comment>bin/console fyrst:sales-channel:rewrite-urls</comment>.
Laptop SSH (<comment>SHOPWARE_SSH_*</comment>) belongs in
<comment>.env.local</comment>.
Shops need <comment>composer update fyrst/shopware-cd</comment>
so the command and bundle exist, then
<comment>composer recipes:update fyrst/shopware-cd</comment>.
Refresh later with <comment>composer recipes:update fyrst/shopware-cd</comment>.
See https://github.com/fyrst-dev/shopware-cd