From e3609f7c208575a597919cfad6233a8de2a8beea Mon Sep 17 00:00:00 2001 From: Stanislav Zhuk Date: Wed, 2 Sep 2026 23:39:40 +0300 Subject: [PATCH 1/2] docs(blog): add DDEV v1.25.4 release post, document gitignored env files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## The Issue DDEV v1.25.4 is released and needs an announcement post. The add-on maintenance guide also needed updating, since v1.25.4's gitignored `.local` env files change how add-ons should ask users for credentials. ## How This PR Solves The Issue Adds `src/content/blog/release-v1-25-4.md` covering database seeding and reset, MySQL 9.7 LTS, global Dockerfiles and env files, the Maho and MODX Revolution project types, new commands, the explained 403/404 pages, and the fixes for v1.25.3 regressions. Snapshots and performance tracking get brief bullet overviews with docs links, since each is getting its own post. Kept to roughly the length of previous release posts rather than restating the release notes. Adds the light and dark banner SVGs, copied from the v1.25.3 pair with only the version text changed, plus a screenshot of the new `ddev-router` 404 page. Adds a "Gitignored Env Files for Credentials" section to `ddev-add-on-maintenance-guide.md`, under "What's New in the DDEV Ecosystem", and updates its `modifiedDate`/`modifiedComment`. ## Manual Testing Instructions https://20260902-stasadev-release-v1.ddev-com-front-end.pages.dev/blog/release-v1-25-4/ - Check the post in light and dark themes; the banner should swap variants. - Confirm the table of contents lists every section and that the `ddev-router` 404 screenshot renders with its caption. - Confirm the v1.25.3 link in "Regressions from v1.25.3, Fixed" resolves to /blog/release-v1-25-3. - On https://20260902-stasadev-release-v1.ddev-com-front-end.pages.dev/blog/ddev-add-on-maintenance-guide/, confirm the new section appears after "Recommending DDEV Version Constraints" and that the cross-reference link in "Advanced Customization with Flags" jumps to it. ## Automated Testing Overview None; content only. `npm run prettier`, `npm run textlint`, and `npm run build` pass, and the build's link validator reports no broken links. ## Release/Deployment Notes None. 🤖 Developed with assistance from [Claude Code](https://claude.ai/code) Co-authored-by: Claude Sonnet 5 --- .../blog/2026/09/banner-ddev-v1-25-4-dark.svg | 33 +++++ .../img/blog/2026/09/banner-ddev-v1-25-4.svg | 33 +++++ .../09/ddev-router-404-no-route-found.png | Bin 0 -> 52538 bytes .../blog/ddev-add-on-maintenance-guide.md | 14 +- src/content/blog/release-v1-25-4.md | 120 ++++++++++++++++++ 5 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 public/img/blog/2026/09/banner-ddev-v1-25-4-dark.svg create mode 100644 public/img/blog/2026/09/banner-ddev-v1-25-4.svg create mode 100644 public/img/blog/2026/09/ddev-router-404-no-route-found.png create mode 100644 src/content/blog/release-v1-25-4.md diff --git a/public/img/blog/2026/09/banner-ddev-v1-25-4-dark.svg b/public/img/blog/2026/09/banner-ddev-v1-25-4-dark.svg new file mode 100644 index 00000000..4fd46a08 --- /dev/null +++ b/public/img/blog/2026/09/banner-ddev-v1-25-4-dark.svg @@ -0,0 +1,33 @@ + + + + + + DDEV v1.25.4 Release + diff --git a/public/img/blog/2026/09/banner-ddev-v1-25-4.svg b/public/img/blog/2026/09/banner-ddev-v1-25-4.svg new file mode 100644 index 00000000..84dbc014 --- /dev/null +++ b/public/img/blog/2026/09/banner-ddev-v1-25-4.svg @@ -0,0 +1,33 @@ + + + + + + DDEV v1.25.4 Release + diff --git a/public/img/blog/2026/09/ddev-router-404-no-route-found.png b/public/img/blog/2026/09/ddev-router-404-no-route-found.png new file mode 100644 index 0000000000000000000000000000000000000000..237d468c08316f0e986cb018dbdd1c70ed92a6a7 GIT binary patch literal 52538 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 v1.24.10" This ensures compatibility and resolves known issues, such as those related to the [Mutagen Problem Report](open-source-for-the-win.md#mutagen-problem-report). +### Gitignored Env Files for Credentials + +DDEV v1.25.4 added a `.local` suffix to the naming scheme for [project env files](https://docs.ddev.com/en/stable/users/configuration/environment-variables/#project-env-files). A trailing `.local`, as in `.ddev/.env.local` or `.ddev/.env..local`, tells DDEV to gitignore the file. + +If your add-on asks users for an API key, a token, or any other secret, point them at a `.local` file rather than the one you ship. The value reaches the container the same way, but it stays out of their repository. + +The same release added labels, as in `.ddev/.env.web.myaddon`, so your add-on's variables can live in a file of their own instead of sharing one with the user and other add-ons. Labeled files now reach the service's container too; before, they were only expanded into `docker-compose.*.yaml`. + ### Customizing `ddev describe` Output DDEV add-ons can now customize the output of the `ddev describe` with `x-ddev.describe-*` extension. @@ -174,6 +182,8 @@ Example: - https://github.com/ddev/ddev-adminer#advanced-customization - https://github.com/ddev/ddev-adminer/blob/main/docker-compose.adminer.yaml +For secrets, point users at a [gitignored `.local` file](#gitignored-env-files-for-credentials) instead of the one your add-on ships. + ### Making Small Changes to Docker Images If your add-on needs a customized Docker image, the typical approach is to create a separate `Dockerfile` and configure your add-on to use it. However, for minor tweaks, you can take advantage of the [`dockerfile_inline`](https://docs.docker.com/reference/compose-file/build/#dockerfile_inline) option in your `docker-compose.*.yaml` file. diff --git a/src/content/blog/release-v1-25-4.md b/src/content/blog/release-v1-25-4.md new file mode 100644 index 00000000..3191cb0a --- /dev/null +++ b/src/content/blog/release-v1-25-4.md @@ -0,0 +1,120 @@ +--- +title: "DDEV v1.25.4: Database Seeding and Reset, MySQL 9.7 LTS, Global Configuration, New Project Types" +pubDate: 2026-09-02 +summary: DDEV v1.25.4 can seed a project's database from a snapshot, reset it on the spot, and apply Dockerfiles and env files to every project at once. It also adds MySQL 9.7 LTS, MODX Revolution and Maho project types, and moves Linux packages to Cloudsmith. +author: Stas Zhuk +featureImage: + src: /img/blog/2026/09/banner-ddev-v1-25-4.svg + srcDark: /img/blog/2026/09/banner-ddev-v1-25-4-dark.svg + alt: DDEV v1.25.4 Release Banner +categories: + - Announcements +--- + +[DDEV v1.25.4](https://github.com/ddev/ddev/releases/tag/v1.25.4) is here: 142 PRs from the entire DDEV community. Your suggestions, bug reports, code, and financial support made it possible. + +The theme this time is doing less by hand. A new project can start with the database you already have, and image and environment customizations can be set once for every project instead of in each one. + +:::note[Linux and WSL2: new package repositories] +DDEV's apt and rpm packages are now published to Cloudsmith at `packages.ddev.com`. Gemfury (`pkg.ddev.com`) keeps working, so switch over whenever it suits you by re-running the [Linux installation steps](https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-linux). + +Package repository hosting is graciously provided by [Cloudsmith](https://cloudsmith.com). +::: + +## Table of Contents + +## Database Seeding and Reset + +Until now, a fresh project meant a fresh empty database, and getting your data back in meant importing a dump every time. DDEV can now restore a snapshot directly into a brand-new database volume, which is far quicker than replaying a SQL file. + +- [`ddev start --seed-snapshot=`](https://docs.ddev.com/en/stable/users/usage/database-management/#seeding-a-fresh-database-from-a-snapshot) fills a brand-new database from a snapshot in `.ddev/db_snapshots`, or from a path to one anywhere else on your machine. It works with MariaDB, MySQL, and PostgreSQL. +- `seed` is a reserved snapshot name. Run `ddev snapshot --name=seed` once, and from then on any `ddev delete` followed by `ddev start` brings that database back, with no flag to remember. +- [`ddev start --reset-database`](https://docs.ddev.com/en/stable/users/usage/database-management/#starting-over-with-a-new-database) throws the current database away and starts over, taking a snapshot first. The two flags combine: `ddev start --reset-database --seed-snapshot=large-dataset`. + +There's more to snapshots in this release: sizes and database versions in `ddev snapshot --list`, [snapshots shared across Git worktrees](https://docs.ddev.com/en/stable/users/usage/database-management/#sharing-snapshots-between-git-worktrees), and [uncompressed snapshots](https://docs.ddev.com/en/stable/users/usage/database-management/#uncompressed-snapshots) for faster restores. See [Snapshots](https://docs.ddev.com/en/stable/users/usage/database-management/#snapshots) for all of it. + +## MySQL 9.7 LTS Support + +DDEV now supports MySQL 9.7, the latest LTS release: + +```bash +# New project +ddev config --database=mysql:9.7 +# Existing project +ddev utility migrate-database mysql:9.7 +``` + +MySQL 8.0 and 8.4 also switched base image, from `bitnamilegacy/mysql`, which no longer receives updates, to [Docker Hardened Images](https://hub.docker.com/hardened-images/catalog/dhi/mysql/images) (`dhi.io/mysql`). + +## Global Configuration: Set It Once, for Every Project + +If you've ever added the same company CA certificate, the same apt package, or the same API token to every project you work on, this release is for you. + +**[Global Dockerfiles](https://docs.ddev.com/en/stable/users/extend/customizing-images/#global-dockerfiles)** in `~/.ddev/web-build/` and `~/.ddev/db-build/` apply the same image customization everywhere: system tools, extra packages, or [container-level SSL trust for `curl`, Composer, and Node.js](https://docs.ddev.com/en/stable/users/usage/networking/#container-level-ssl-trust-for-curl-composer-nodejs-etc), which used to be a per-project chore. A project overrides any of it with the same filename in its own `.ddev/web-build/`. Thanks to [@rmott-littler](https://github.com/rmott-littler). + +**[Global env files](https://docs.ddev.com/en/stable/users/configuration/environment-variables/#global-env-files)** `~/.ddev/.env` and `~/.ddev/.env.` set environment variables for every project. Before this, the only global option was `web_environment` in `~/.ddev/global_config.yaml`, which reaches the `web` container and nothing else. Now you can do it for `db`, or any other service: + +```bash +# Set API_URL for the web service of every project +ddev dotenv global set .ddev/.env.web --api-url=https://example.com +``` + +[Project env files](https://docs.ddev.com/en/stable/users/configuration/environment-variables/#project-env-files) gained two pieces in their names, too. A trailing `.local`, as in `.ddev/.env.local`, tells DDEV to gitignore the file, which is where credentials belong. A label, as in `.ddev/.env.web.myaddon`, keeps files from different sources apart, so an add-on isn't editing the same file you are. + +## New Project Types, and Shopware 6 Without an Add-on + +Two project types joined DDEV: + +- [Maho](https://docs.ddev.com/en/stable/users/quickstart/#maho), thanks to [@fballiano](https://github.com/fballiano) +- [MODX Revolution](https://docs.ddev.com/en/stable/users/quickstart/#modx-revolution) 2.x and 3.x, thanks to [@casparml](https://github.com/casparml) + +Shopware 6 projects now get [`shopware-cli` right in the web image](https://docs.ddev.com/en/stable/users/quickstart/#shopware-cli-and-hot-reload-watchers), along with `ddev admin-watch` and `ddev storefront-watch` and the ports they need. The [ddev-shopware-cli](https://github.com/vanWittlaer/ddev-shopware-cli) add-on isn't needed anymore. Thanks to [@vanWittlaer](https://github.com/vanWittlaer). + +## New Commands and Flags + +- [`ddev add-on update`](https://docs.ddev.com/en/stable/users/usage/commands/#add-on-update) updates the installed add-ons that are behind their latest GitHub release, with `--dry-run` to preview. +- [`ddev utility download-ddev`](https://docs.ddev.com/en/stable/users/usage/commands/#utility-download-ddev) fetches the `ddev` binaries for a PR, branch, commit, or tag without touching your installed DDEV, which is handy for testing a fix before it ships. +- [`ddev utility delete-volume`](https://docs.ddev.com/en/stable/users/usage/commands/#utility-delete-volume) removes one of a project's Docker volumes, for add-ons like [ddev-solr](https://github.com/ddev/ddev-solr) that create their own. +- [`ddev launch --print-url`](https://docs.ddev.com/en/stable/users/usage/commands/#launch) prints the URL instead of opening a browser, for SSH, containers, and CI, thanks to [@steffenmaechtel](https://github.com/steffenmaechtel). +- [`ddev tablepro`](https://docs.ddev.com/en/stable/users/usage/commands/#tablepro) opens the project database in TablePro on macOS, thanks to [@datlechin](https://github.com/datlechin). + +## DDEV Tells You What's Wrong + +A wrong `docroot` used to produce a bare 404 page with nothing to go on. Now `ddev-webserver` explains the 403s and 404s it generates itself, and `ddev-router` does the same for a hostname that doesn't match any project: + +![The `ddev-router` 404 page, shown for a hostname with no running DDEV project](/img/blog/2026/09/ddev-router-404-no-route-found.png) + +The page says where it came from, so you know it isn't your application's own 404, and it lists what to check. A 403 or 404 from your own application is passed through untouched. + +It also replaces the old "docroot may be wrong" warning on `ddev start`, which you never saw in a browser and which sometimes fired when nothing was wrong. + +## Regressions from v1.25.3, Fixed + +[DDEV v1.25.3](release-v1-25-3.md) introduced a few problems, and the ones you're most likely to have run into are resolved here: + +- Project image builds are fast again. Permissions on the Node.js directory were being changed recursively on every build, and are now set once. +- Add-ons and applications that write log files straight into `/var/log` can do that again, after the directory was locked down to root only. +- A site that generates its own `/robots.txt` works again. An Nginx rule was answering before your site could, and it's gone. + +## Other Fixes Worth Knowing About + +- `ddev wp` respects the path in your project's own `wp-cli.yml` again, falling back to the docroot only when that file doesn't set one. Since v1.24.5 it always added `--path=$DDEV_DOCROOT`, which broke Bedrock and any layout where WordPress isn't in the docroot. +- Running `ddev` in a subdirectory with its own `.ddev/config.yaml`, such as a Drupal contrib module or a Git submodule, keeps using the outer project and tells you which one it picked, instead of switching silently and breaking the outer project's custom commands. `ddev start` there asks first. + +## Performance Is Measured Automatically Now + +A nightly benchmark harness now times `ddev start`, `ddev stop`, Mutagen sync-settle, and a Drupal install across the platforms and Docker providers DDEV already tests on, and publishes the results to a [performance history](https://ddev.github.io/ddev/perf/) dashboard, so a regression shows up as a bend in a trend line instead of a bug report months later. A second dashboard tracks [CI test runtime](https://ddev.github.io/ddev/perf/ci/). + +## Everything Else + +This release includes many more features and bugfixes. See the [full release notes](https://github.com/ddev/ddev/releases/tag/v1.25.4) for the complete list. + +From the entire team, thanks for using, promoting, contributing, and supporting DDEV! + +If you have questions, reach out in any of the [support channels](https://docs.ddev.com/en/stable/users/support/). + +Follow our [blog](https://ddev.com/blog/), [Bluesky](https://bsky.app/profile/ddev.bsky.social), [LinkedIn](https://www.linkedin.com/company/ddev-foundation), [Mastodon](https://fosstodon.org/@ddev), and join us on [Discord](/s/discord). Sign up for the [monthly newsletter](/newsletter). + +--- + +_This article was edited and refined with assistance from Claude Code._ From bef3774f18a4bfe2b79ff4f9f084ca04de4f6ab0 Mon Sep 17 00:00:00 2001 From: Randy Fay Date: Wed, 2 Sep 2026 17:21:37 -0600 Subject: [PATCH 2/2] Minor edits --- src/content/blog/release-v1-25-4.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/content/blog/release-v1-25-4.md b/src/content/blog/release-v1-25-4.md index 3191cb0a..14fbed1e 100644 --- a/src/content/blog/release-v1-25-4.md +++ b/src/content/blog/release-v1-25-4.md @@ -13,7 +13,7 @@ categories: [DDEV v1.25.4](https://github.com/ddev/ddev/releases/tag/v1.25.4) is here: 142 PRs from the entire DDEV community. Your suggestions, bug reports, code, and financial support made it possible. -The theme this time is doing less by hand. A new project can start with the database you already have, and image and environment customizations can be set once for every project instead of in each one. +The theme of this release is doing less by hand. A new project can start with a "seed" database you already have, and image and environment customizations can be set globally instead of in every project. :::note[Linux and WSL2: new package repositories] DDEV's apt and rpm packages are now published to Cloudsmith at `packages.ddev.com`. Gemfury (`pkg.ddev.com`) keeps working, so switch over whenever it suits you by re-running the [Linux installation steps](https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-linux). @@ -25,11 +25,11 @@ Package repository hosting is graciously provided by [Cloudsmith](https://clouds ## Database Seeding and Reset -Until now, a fresh project meant a fresh empty database, and getting your data back in meant importing a dump every time. DDEV can now restore a snapshot directly into a brand-new database volume, which is far quicker than replaying a SQL file. +Until now, a fresh project always started with an empty database, and getting your data back in there meant importing a dump or snapshot every time. DDEV can now automatically use a snapshot, which is far quicker than importing a SQL file. - [`ddev start --seed-snapshot=`](https://docs.ddev.com/en/stable/users/usage/database-management/#seeding-a-fresh-database-from-a-snapshot) fills a brand-new database from a snapshot in `.ddev/db_snapshots`, or from a path to one anywhere else on your machine. It works with MariaDB, MySQL, and PostgreSQL. -- `seed` is a reserved snapshot name. Run `ddev snapshot --name=seed` once, and from then on any `ddev delete` followed by `ddev start` brings that database back, with no flag to remember. -- [`ddev start --reset-database`](https://docs.ddev.com/en/stable/users/usage/database-management/#starting-over-with-a-new-database) throws the current database away and starts over, taking a snapshot first. The two flags combine: `ddev start --reset-database --seed-snapshot=large-dataset`. +- `seed` is a reserved snapshot name. Run `ddev snapshot --name=seed` once, and from then on any `ddev delete` followed by `ddev start` brings that database back, with no flag to remember. You can even check `.ddev/db_snapshots/seed*` into Git if it's not annoyingly large. +- [`ddev start --reset-database`](https://docs.ddev.com/en/stable/users/usage/database-management/#starting-over-with-a-new-database) throws the current database away and starts over, taking a snapshot first. The flags can be combined (works with both `ddev start` and `ddev restart`): `ddev start --reset-database --seed-snapshot=large-dataset --omit-snapshot`. There's more to snapshots in this release: sizes and database versions in `ddev snapshot --list`, [snapshots shared across Git worktrees](https://docs.ddev.com/en/stable/users/usage/database-management/#sharing-snapshots-between-git-worktrees), and [uncompressed snapshots](https://docs.ddev.com/en/stable/users/usage/database-management/#uncompressed-snapshots) for faster restores. See [Snapshots](https://docs.ddev.com/en/stable/users/usage/database-management/#snapshots) for all of it. @@ -44,11 +44,11 @@ ddev config --database=mysql:9.7 ddev utility migrate-database mysql:9.7 ``` -MySQL 8.0 and 8.4 also switched base image, from `bitnamilegacy/mysql`, which no longer receives updates, to [Docker Hardened Images](https://hub.docker.com/hardened-images/catalog/dhi/mysql/images) (`dhi.io/mysql`). +MySQL 8.0 and 8.4 also switched base images, from `bitnamilegacy/mysql`, which no longer receives updates, to [Docker Hardened Images](https://hub.docker.com/hardened-images/catalog/dhi/mysql/images) (`dhi.io/mysql`). ## Global Configuration: Set It Once, for Every Project -If you've ever added the same company CA certificate, the same apt package, or the same API token to every project you work on, this release is for you. +If you've ever added the same company CA certificate, apt package, or API token to every project you work on, this release is for you. **[Global Dockerfiles](https://docs.ddev.com/en/stable/users/extend/customizing-images/#global-dockerfiles)** in `~/.ddev/web-build/` and `~/.ddev/db-build/` apply the same image customization everywhere: system tools, extra packages, or [container-level SSL trust for `curl`, Composer, and Node.js](https://docs.ddev.com/en/stable/users/usage/networking/#container-level-ssl-trust-for-curl-composer-nodejs-etc), which used to be a per-project chore. A project overrides any of it with the same filename in its own `.ddev/web-build/`. Thanks to [@rmott-littler](https://github.com/rmott-littler). @@ -61,14 +61,14 @@ ddev dotenv global set .ddev/.env.web --api-url=https://example.com [Project env files](https://docs.ddev.com/en/stable/users/configuration/environment-variables/#project-env-files) gained two pieces in their names, too. A trailing `.local`, as in `.ddev/.env.local`, tells DDEV to gitignore the file, which is where credentials belong. A label, as in `.ddev/.env.web.myaddon`, keeps files from different sources apart, so an add-on isn't editing the same file you are. -## New Project Types, and Shopware 6 Without an Add-on +## New Project Types and Shopware 6 Without an Add-on Two project types joined DDEV: - [Maho](https://docs.ddev.com/en/stable/users/quickstart/#maho), thanks to [@fballiano](https://github.com/fballiano) - [MODX Revolution](https://docs.ddev.com/en/stable/users/quickstart/#modx-revolution) 2.x and 3.x, thanks to [@casparml](https://github.com/casparml) -Shopware 6 projects now get [`shopware-cli` right in the web image](https://docs.ddev.com/en/stable/users/quickstart/#shopware-cli-and-hot-reload-watchers), along with `ddev admin-watch` and `ddev storefront-watch` and the ports they need. The [ddev-shopware-cli](https://github.com/vanWittlaer/ddev-shopware-cli) add-on isn't needed anymore. Thanks to [@vanWittlaer](https://github.com/vanWittlaer). +Shopware 6 projects now get [`shopware-cli` right in the web image](https://docs.ddev.com/en/stable/users/quickstart/#shopware-cli-and-hot-reload-watchers), along with `ddev admin-watch`, `ddev storefront-watch`, and the ports they need. The [ddev-shopware-cli](https://github.com/vanWittlaer/ddev-shopware-cli) add-on isn't needed anymore. Thanks to [@vanWittlaer](https://github.com/vanWittlaer). ## New Commands and Flags @@ -80,7 +80,7 @@ Shopware 6 projects now get [`shopware-cli` right in the web image](https://docs ## DDEV Tells You What's Wrong -A wrong `docroot` used to produce a bare 404 page with nothing to go on. Now `ddev-webserver` explains the 403s and 404s it generates itself, and `ddev-router` does the same for a hostname that doesn't match any project: +A wrong `docroot` used to produce a bare 404/403 page with no hints about why. Now `ddev-webserver` explains the 403s and 404s it generates itself, and `ddev-router` does the same for a hostname that doesn't match any project: ![The `ddev-router` 404 page, shown for a hostname with no running DDEV project](/img/blog/2026/09/ddev-router-404-no-route-found.png) @@ -113,6 +113,8 @@ From the entire team, thanks for using, promoting, contributing, and supporting If you have questions, reach out in any of the [support channels](https://docs.ddev.com/en/stable/users/support/). +If you're amazed by how much is in this release, we are too! If you wonder how all this could be done, it's because of generous sponsors who let two of us work on this every day. If you and your team aren't already financially supporting DDEV, consider [joining our sponsors](/sponsor). + Follow our [blog](https://ddev.com/blog/), [Bluesky](https://bsky.app/profile/ddev.bsky.social), [LinkedIn](https://www.linkedin.com/company/ddev-foundation), [Mastodon](https://fosstodon.org/@ddev), and join us on [Discord](/s/discord). Sign up for the [monthly newsletter](/newsletter). ---