From 2b72a3ce57d85a0f677333d6cb1effac7f370e2b Mon Sep 17 00:00:00 2001 From: Lee Mills Date: Thu, 6 Aug 2026 20:35:20 +0100 Subject: [PATCH 1/7] content: added author file --- src/content/authors/lee-mills.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/content/authors/lee-mills.md diff --git a/src/content/authors/lee-mills.md b/src/content/authors/lee-mills.md new file mode 100644 index 00000000..42f5f874 --- /dev/null +++ b/src/content/authors/lee-mills.md @@ -0,0 +1,7 @@ +--- +name: Lee Mills +firstName: Lee +avatarUrl: https://avatars.githubusercontent.com/u/8024370 +--- + +[Lee](https://github.com/millnut) is a Principal Software Engineer in the United Kingdom with more than 20 years of CMS and platform work behind him, currently on Umbraco CMS and .NET. He uses DDEV day to day across Drupal, WordPress, Laravel and Next.js projects. From 78768d1fc579b592b9aa824a8d4e0d48fb97120f Mon Sep 17 00:00:00 2001 From: Lee Mills Date: Fri, 21 Aug 2026 17:38:00 +0100 Subject: [PATCH 2/7] content: initial umbraco blog post --- src/content/blog/umbraco-on-ddev.md | 188 ++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 src/content/blog/umbraco-on-ddev.md diff --git a/src/content/blog/umbraco-on-ddev.md b/src/content/blog/umbraco-on-ddev.md new file mode 100644 index 00000000..d5426e3c --- /dev/null +++ b/src/content/blog/umbraco-on-ddev.md @@ -0,0 +1,188 @@ +--- +title: "Umbraco on DDEV: .NET, SQL Server, and the generic project type" +pubDate: 2026-08-06 +summary: An experiment in running Umbraco CMS and .NET 10 under DDEV, using the generic project type, a custom web image, and Azure SQL Edge. +author: Lee Mills +featureImage: + src: /img/blog/2026/08/umbraco-on-ddev.png + alt: DDEV and Umbraco logos joined by a plus sign +categories: + - Community + - TechNotes +--- + +DDEV's `generic` project type will run anything that brings its own web server, and people already use it for Node and other stacks. Umbraco is a less travelled case: .NET, Kestrel, and SQL Server. I wanted to know how much of the DDEV experience still holds up there. Clone a repository, run one command, have a working site and database a few minutes later. + +Most of it holds up. The result is [umbraco-clean-ddev](https://github.com/millnut/umbraco-clean-ddev), which runs Umbraco on .NET 10 with SQL Server and Adminer, and gets a new developer going with a single `ddev setup`. What took the time was a handful of places where DDEV expected something I had not worked out yet. + +## What I wanted out of it + +Four things, and nothing more ambitious than that. One command for someone joining the project. Nothing installed on my own machine: no SQL Server, no .NET SDK, none of the project's other dependencies. Projects that stay out of each other's way. A way to take a backup from Umbraco Cloud and debug against it locally. + +DDEV already does all of this elsewhere. The Umbraco Cloud backup turned out to be the least transferable: `ddev import-db` and `ddev export-db` work on the database container DDEV manages, and this project omits that container entirely. Anything equivalent I would have to write myself. + +Keeping the dependencies off my machine also makes the project easier to hand to someone who has never worked with .NET. The SDK and SQL Server both live in containers, so trying Umbraco does not start with installing either of them locally. Clone the repository, run one command, and the CMS is there to look at. + +## The parts that needed working out + +### The generic project type + +DDEV's `generic` type doesn't start nginx or PHP-FPM, which is what you want when the application brings its own web server: + +```yaml +# .ddev/config.yaml +name: umbraco-clean +type: generic +docroot: "" +webserver_type: generic +omit_containers: [db] +disable_settings_management: true +``` + +`omit_containers: [db]` drops DDEV's MariaDB, since SQL Server runs as a separate service and MariaDB would only sit there idling. `disable_settings_management: true` stops DDEV writing a `php.ini` and an `nginx.conf` that nothing in the project would ever read. + +A generic web server type also emits no default router configuration, so without one, every request 404s. `web_extra_exposed_ports` supplies it: + +```yaml +# .ddev/config.yaml +web_extra_exposed_ports: + - name: umbraco + container_port: 80 + http_port: 80 + https_port: 443 +``` + +Those two port numbers being equal matters. DDEV builds the Traefik backend URL from `http_port` rather than `container_port`, so an otherwise reasonable pairing of `container_port: 8080` with `http_port: 80` sends traffic to port 80 in the container and returns a 502. I lost a while to that one before reading the router configuration it generates. + +### The .NET SDK is not in the web image + +DDEV's web image has no .NET SDK, so `.ddev/web-build/Dockerfile` adds one. The important thing about that file is what it does not contain: + +```dockerfile +# .ddev/web-build/Dockerfile +RUN curl -fsSL https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb -o /tmp/pmp.deb \ + && dpkg -i /tmp/pmp.deb \ + && rm /tmp/pmp.deb \ + && apt-get update \ + && ACCEPT_EULA=Y apt-get install -y dotnet-sdk-10.0 mssql-tools18 \ + && rm -rf /var/lib/apt/lists/* + +RUN dotnet tool install --tool-path /usr/local/share/dotnet-tools microsoft.sqlpackage + +ENV PATH="$PATH:/usr/local/share/dotnet-tools:/opt/mssql-tools18/bin" +``` + +There is no `FROM` line. DDEV prepends its own, and adding one starts a fresh stage that throws away the user setup, supervisord, healthcheck and tooling that make the container a DDEV container. You would have to rebuild all of that yourself, which I do not recommend as a way to spend an evening. + +Debian trixie ships no .NET packages, so the SDK comes from Microsoft's feed, registered by installing `packages-microsoft-prod.deb`. Only .NET 10 publishes an ARM64 build there, so anyone on Apple Silicon has a floor of 10.0. + +I also left `webimage_extra_packages` out of `config.yaml` on purpose. DDEV injects it ahead of the `web-build` Dockerfile, so any package listed there is looked up before the Microsoft feed exists. + +### SQL Server on Apple Silicon + +Full SQL Server publishes no ARM64 image, so the database service is Azure SQL Edge. It speaks the same TDS protocol and Umbraco cannot tell the difference. + +DDEV does have an add-on for SQL Server, [ddev-sqlsrv](https://github.com/ddev/ddev-sqlsrv), which runs full SQL Server and works on Apple Silicon through Rosetta 2 emulation. Apple has announced Rosetta is going away, and I wanted to see what was possible without installing it. + +This is the choice I would most like to revisit. If Microsoft ever publishes an ARM64 image, I would rather be running full SQL Server than Azure SQL Edge. + +```yaml +# .ddev/docker-compose.umbraco.yaml +services: + sqlserver: + container_name: ddev-${DDEV_SITENAME}-sqlserver + image: mcr.microsoft.com/azure-sql-edge:latest + environment: + - ACCEPT_EULA=Y + - MSSQL_SA_PASSWORD=${MSSQL_SA_PASSWORD} + healthcheck: + test: + - CMD-SHELL + - python3 -c "import socket; s=socket.create_connection(('localhost',1433),2); s.close()" + start_period: 30s +``` + +The healthcheck is a raw socket connection because Azure SQL Edge ships no `sqlcmd` to query with. It only proves the port is open, and the server accepts logins a moment after that, so the check is weaker than I would like. The 30 second grace period covers the initialisation of the system databases on a first run, which takes about 20 seconds and would otherwise exhaust the retries. + +Only `sqlserver` and `adminer` are defined in that compose file. The web container is configured entirely through `config.yaml`, so DDEV keeps ownership of its lifecycle. + +### Keeping Kestrel alive + +The application runs as an extra daemon rather than as a container command: + +```yaml +# .ddev/config.yaml +web_extra_daemons: + - name: umbraco + command: "dotnet watch run --non-interactive --no-launch-profile" + directory: /var/www/html/MyProject +``` + +That puts `dotnet watch` under the web container's supervisord, so supervisord restarts it on failure. Overriding the compose command instead would displace DDEV's own entrypoint, and a build error would leave you with a container that is up but serving nothing. + +### TLS stops at the router + +Three environment variables. The first two are there because the router sits in front of Kestrel: + +```yaml +# .ddev/config.yaml +web_environment: + - ASPNETCORE_URLS=http://0.0.0.0:80 + - ASPNETCORE_FORWARDEDHEADERS_ENABLED=true + - NUGET_PACKAGES=/mnt/ddev-global-cache/nuget +``` + +Kestrel has to bind `0.0.0.0` because the router reaches it across the Docker network rather than over loopback. The forwarded headers setting is easy to miss and confusing when it's absent: the router terminates TLS and forwards plain HTTP, so without it Kestrel decides the request was insecure and generates `http://` links on an `https://` site. + +The NuGet line has nothing to do with the router. It moves the package cache onto a DDEV volume, so a rebuilt container no longer re-downloads every package. + +## Getting it running + +```bash +ddev setup +``` + +That copies `appsettings.Local.json.example` into place, installs the Adminer add-on and starts the environment. On first boot Umbraco runs its unattended install, creating the schema and the default admin user, `admin@example.com` with password `1234567890`. + +:::warning[Error 4060 on first boot] +The first boot logs `Cannot open database "UmbracoDb"` with error number 4060. The database does not exist until the unattended install creates it, so Umbraco logs the error once during startup. It does not recur, and you do not need to do anything. +::: + +After that, `ddev dotnet` is a passthrough that runs the CLI in the project directory, so nobody needs the SDK on their host to run `ddev dotnet build`. + +## Moving the database around + +This is the one I care most about: pulling a backup down from Umbraco Cloud and running it locally to test or debug against real content. A local environment that cannot take a copy of the site's actual database will not reproduce the bug you are chasing. DDEV's own `import-db` and `export-db` talk to the container this project does not have, and Umbraco Cloud backups come as `.bacpac` files, so I wrote two commands to handle them: + +```bash +ddev bacpac-export # writes UmbracoDb.bacpac to the project root +ddev bacpac-import UmbracoDb.bacpac +``` + +Both wrap `sqlpackage`, which has no apt package and so gets installed via `dotnet tool install` in the web image build. Import is the harder of the two: `sqlpackage` requires an empty or nonexistent target, and Kestrel holds an open connection to the database being dropped: + +```bash +# .ddev/commands/web/bacpac-import +sqlcmd -S sqlserver -U sa -P "${MSSQL_SA_PASSWORD}" -C -Q " +IF DB_ID('UmbracoDb') IS NOT NULL +BEGIN + ALTER DATABASE UmbracoDb SET SINGLE_USER WITH ROLLBACK IMMEDIATE; + DROP DATABASE UmbracoDb; +END" +``` + +`SINGLE_USER WITH ROLLBACK IMMEDIATE` forces that connection closed so the drop can proceed. Both commands read and write `/var/www/html`, which is the host-mounted project root, so a `.bacpac` downloaded from Cloud goes next to the solution file and imports from there. + +## Things that look wrong and are deliberate + +`.ddev/.env` holds the SA password, the Umbraco connection string and the SMTP configuration for mailpit, and it is committed. That is a fixed local development credential in the same spirit as DDEV's own db/db/db, and committing it is what makes a fresh clone work with no manual step. On a project with real secrets I would not do this: the file would move somewhere untracked, and `ddev setup` would grow a prompt to fill it in. + +`appsettings.Local.json` is git-ignored and exists for per-developer overrides such as logging levels. `Program.cs` registers it after `CreateBuilder` has already added the environment variable provider, so that file wins over `.ddev/.env`. A `ConnectionStrings` block there will override the environment, and someone who then edits the password in `.ddev/.env` will find it has no effect. + +The Adminer add-on's `docker-compose.adminer.yaml` is committed with one edit: its default `depends_on: [db]` is gone, because this project has no `db` container. The committed copy carries no `#ddev-generated` marker, so DDEV treats it as mine and leaves it alone. The cost is that it no longer updates with the add-on. + +## Try it + +The repository is at [millnut/umbraco-clean-ddev](https://github.com/millnut/umbraco-clean-ddev), built on Paul Seal's [Clean](https://github.com/prjseal/Clean) starter kit. Clone it, run `ddev setup`, and you should have Umbraco and SQL Server running without either of them touching your machine directly. + +It is still a bespoke setup rather than something reusable. The .NET SDK install, the SQL Server service and the bacpac commands are all things I now maintain by hand, and an add-on would be a better home for most of them. If you work with Umbraco or .NET and want to try it, I would be glad to hear what breaks: I have only run this on my own machine, against one project. From 5fc99be2d3f2f00ff1038a33d53c04a7719d0814 Mon Sep 17 00:00:00 2001 From: Lee Mills Date: Fri, 21 Aug 2026 17:39:22 +0100 Subject: [PATCH 3/7] content: initial umbraco blog post --- src/content/blog/umbraco-on-ddev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/umbraco-on-ddev.md b/src/content/blog/umbraco-on-ddev.md index d5426e3c..987a5c7d 100644 --- a/src/content/blog/umbraco-on-ddev.md +++ b/src/content/blog/umbraco-on-ddev.md @@ -1,6 +1,6 @@ --- title: "Umbraco on DDEV: .NET, SQL Server, and the generic project type" -pubDate: 2026-08-06 +pubDate: 2026-08-20 summary: An experiment in running Umbraco CMS and .NET 10 under DDEV, using the generic project type, a custom web image, and Azure SQL Edge. author: Lee Mills featureImage: From aa7f23757957c65e04064185e4687b8858c6f94f Mon Sep 17 00:00:00 2001 From: Lee Mills Date: Fri, 21 Aug 2026 18:09:53 +0100 Subject: [PATCH 4/7] content: initial umbraco blog post image --- public/img/blog/2026/08/umbraco-on-ddev.png | Bin 0 -> 75420 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/img/blog/2026/08/umbraco-on-ddev.png diff --git a/public/img/blog/2026/08/umbraco-on-ddev.png b/public/img/blog/2026/08/umbraco-on-ddev.png new file mode 100644 index 0000000000000000000000000000000000000000..26d2c0b462a008dc508d877cd2b4435a36db656e GIT binary patch literal 75420 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 S1yB<2+6!lm&gAIaxc5JyfGx@Z literal 0 HcmV?d00001 From 1e99307224e7e2bd8a8739b67409469a86207846 Mon Sep 17 00:00:00 2001 From: Lee <8024370+millnut@users.noreply.github.com> Date: Sat, 22 Aug 2026 18:28:59 +0100 Subject: [PATCH 5/7] Update src/content/blog/umbraco-on-ddev.md Co-authored-by: Randy Fay --- src/content/blog/umbraco-on-ddev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/umbraco-on-ddev.md b/src/content/blog/umbraco-on-ddev.md index 987a5c7d..b3c50145 100644 --- a/src/content/blog/umbraco-on-ddev.md +++ b/src/content/blog/umbraco-on-ddev.md @@ -120,7 +120,7 @@ web_extra_daemons: That puts `dotnet watch` under the web container's supervisord, so supervisord restarts it on failure. Overriding the compose command instead would displace DDEV's own entrypoint, and a build error would leave you with a container that is up but serving nothing. -### TLS stops at the router +### TLS is terminated on the router Three environment variables. The first two are there because the router sits in front of Kestrel: From 0e69c1e32d35cfc379d2856ac3783c4483120d52 Mon Sep 17 00:00:00 2001 From: Lee Mills Date: Sun, 23 Aug 2026 10:40:19 +0100 Subject: [PATCH 6/7] content: umbraco amends --- src/content/blog/umbraco-on-ddev.md | 65 ++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/src/content/blog/umbraco-on-ddev.md b/src/content/blog/umbraco-on-ddev.md index b3c50145..335cedcb 100644 --- a/src/content/blog/umbraco-on-ddev.md +++ b/src/content/blog/umbraco-on-ddev.md @@ -11,13 +11,18 @@ categories: - TechNotes --- -DDEV's `generic` project type will run anything that brings its own web server, and people already use it for Node and other stacks. Umbraco is a less travelled case: .NET, Kestrel, and SQL Server. I wanted to know how much of the DDEV experience still holds up there. Clone a repository, run one command, have a working site and database a few minutes later. +DDEV's `generic` project type will run anything that brings its own web server, and people already use it for Node and other stacks. Umbraco is a less-travelled case: .NET, [Kestrel](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel), and SQL Server. I wanted to know how much of the DDEV experience still holds up there. Clone a repository, run one command, have a working site and database a few minutes later. -Most of it holds up. The result is [umbraco-clean-ddev](https://github.com/millnut/umbraco-clean-ddev), which runs Umbraco on .NET 10 with SQL Server and Adminer, and gets a new developer going with a single `ddev setup`. What took the time was a handful of places where DDEV expected something I had not worked out yet. +Most of it holds up. The result is [umbraco-clean-ddev](https://github.com/millnut/umbraco-clean-ddev), which runs Umbraco on .NET 10 with SQL Server and Adminer, and gets a new developer going with a single `ddev start`. What took the time was a handful of places where DDEV expected something I had not worked out yet. ## What I wanted out of it -Four things, and nothing more ambitious than that. One command for someone joining the project. Nothing installed on my own machine: no SQL Server, no .NET SDK, none of the project's other dependencies. Projects that stay out of each other's way. A way to take a backup from Umbraco Cloud and debug against it locally. +I wanted four things out of this, and nothing more ambitious than that. + +1. One command for someone joining the project +2. Nothing installed on my own machine: no SQL Server, no .NET SDK, none of the project's other dependencies. +3. Projects that stay out of each other's way. +4. A way to take a backup from Umbraco Cloud and debug against it locally. DDEV already does all of this elsewhere. The Umbraco Cloud backup turned out to be the least transferable: `ddev import-db` and `ddev export-db` work on the database container DDEV manages, and this project omits that container entirely. Anything equivalent I would have to write myself. @@ -39,7 +44,7 @@ omit_containers: [db] disable_settings_management: true ``` -`omit_containers: [db]` drops DDEV's MariaDB, since SQL Server runs as a separate service and MariaDB would only sit there idling. `disable_settings_management: true` stops DDEV writing a `php.ini` and an `nginx.conf` that nothing in the project would ever read. +`omit_containers: [db]` drops DDEV's MariaDB, since SQL Server runs as a separate service and MariaDB would only sit there idling. A generic web server type also emits no default router configuration, so without one, every request 404s. `web_extra_exposed_ports` supplies it: @@ -56,10 +61,10 @@ Those two port numbers being equal matters. DDEV builds the Traefik backend URL ### The .NET SDK is not in the web image -DDEV's web image has no .NET SDK, so `.ddev/web-build/Dockerfile` adds one. The important thing about that file is what it does not contain: +DDEV's web image has no .NET SDK, so `.ddev/web-build/Dockerfile.dotnet` adds one. The important thing about that file is what it does not contain: ```dockerfile -# .ddev/web-build/Dockerfile +# .ddev/web-build/Dockerfile.dotnet RUN curl -fsSL https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb -o /tmp/pmp.deb \ && dpkg -i /tmp/pmp.deb \ && rm /tmp/pmp.deb \ @@ -95,6 +100,8 @@ services: environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=${MSSQL_SA_PASSWORD} + volumes: + - sqlserver-data:/var/opt/mssql healthcheck: test: - CMD-SHELL @@ -104,7 +111,22 @@ services: The healthcheck is a raw socket connection because Azure SQL Edge ships no `sqlcmd` to query with. It only proves the port is open, and the server accepts logins a moment after that, so the check is weaker than I would like. The 30 second grace period covers the initialisation of the system databases on a first run, which takes about 20 seconds and would otherwise exhaust the retries. -Only `sqlserver` and `adminer` are defined in that compose file. The web container is configured entirely through `config.yaml`, so DDEV keeps ownership of its lifecycle. +The named volume is why the database survives a `ddev restart`: without it every restart would hand Umbraco an empty server and trigger the unattended install again. + +Alongside `sqlserver` and `adminer`, the compose file carries a short `web` block, the one place this project reaches into the container DDEV owns: + +```yaml +# .ddev/docker-compose.umbraco.yaml +services: + web: + depends_on: + sqlserver: + condition: service_healthy + environment: + - Umbraco__CMS__WebRouting__UmbracoApplicationUrl=${DDEV_PRIMARY_URL} +``` + +`condition: service_healthy` is what the healthcheck above exists for. It holds the web container until SQL Server answers, so `dotnet watch` is not racing a database that has not finished booting. `UmbracoApplicationUrl` hands Umbraco the site's real external address rather than letting it infer one from a request that arrived over plain HTTP from the router. Everything else about the web container is configured through `config.yaml`, so DDEV keeps ownership of its lifecycle. ### Keeping Kestrel alive @@ -122,30 +144,43 @@ That puts `dotnet watch` under the web container's supervisord, so supervisord r ### TLS is terminated on the router -Three environment variables. The first two are there because the router sits in front of Kestrel: +Five environment variables, two of them there because the router sits in front of Kestrel: ```yaml # .ddev/config.yaml web_environment: + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_FORWARDEDHEADERS_ENABLED=true + - DOTNET_CLI_TELEMETRY_OPTOUT=1 - NUGET_PACKAGES=/mnt/ddev-global-cache/nuget ``` Kestrel has to bind `0.0.0.0` because the router reaches it across the Docker network rather than over loopback. The forwarded headers setting is easy to miss and confusing when it's absent: the router terminates TLS and forwards plain HTTP, so without it Kestrel decides the request was insecure and generates `http://` links on an `https://` site. -The NuGet line has nothing to do with the router. It moves the package cache onto a DDEV volume, so a rebuilt container no longer re-downloads every package. +The NuGet line has nothing to do with the router. It moves the package cache onto a DDEV volume, so a rebuilt container no longer re-downloads every package. The remaining two are ordinary .NET settings that happen to belong here rather than in a launch profile. ## Getting it running ```bash -ddev setup +ddev start ``` -That copies `appsettings.Local.json.example` into place, installs the Adminer add-on and starts the environment. On first boot Umbraco runs its unattended install, creating the schema and the default admin user, `admin@example.com` with password `1234567890`. +A `pre-start` hook copies `appsettings.Local.json.example` into place when it is missing: + +```yaml +# .ddev/config.yaml +hooks: + pre-start: + - exec-host: "bash -c '[ -f MyProject/appsettings.Local.json ] || cp MyProject/appsettings.Local.json.example MyProject/appsettings.Local.json'" +``` + +`pre-start` rather than `post-start`, because Kestrel comes up with the container: a `post-start` hook would write the file after the application had already read its configuration. That phase also forces `exec-host`, since there is no container yet to run the command inside. + +On first boot Umbraco runs its unattended install, creating the schema and the default admin user, `admin@example.com` with password `1234567890`. :::warning[Error 4060 on first boot] -The first boot logs `Cannot open database "UmbracoDb"` with error number 4060. The database does not exist until the unattended install creates it, so Umbraco logs the error once during startup. It does not recur, and you do not need to do anything. +The first boot logs `Cannot open database "UmbracoDb"` with error number 4060. The database does not exist until the unattended install creates it, so Umbraco logs the error a couple of times during startup until it can connect and action the unattended install. ::: After that, `ddev dotnet` is a passthrough that runs the CLI in the project directory, so nobody needs the SDK on their host to run `ddev dotnet build`. @@ -175,14 +210,14 @@ END" ## Things that look wrong and are deliberate -`.ddev/.env` holds the SA password, the Umbraco connection string and the SMTP configuration for mailpit, and it is committed. That is a fixed local development credential in the same spirit as DDEV's own db/db/db, and committing it is what makes a fresh clone work with no manual step. On a project with real secrets I would not do this: the file would move somewhere untracked, and `ddev setup` would grow a prompt to fill it in. +`.ddev/.env` holds the SA password, the Umbraco connection string and the SMTP configuration for mailpit, and it is committed. That is a fixed local development credential in the same spirit as DDEV's own db/db/db, and committing it is what makes a fresh clone work with no manual step. On a project with real secrets I would not do this: the file would move somewhere untracked, and a setup step would have to prompt for the values. `appsettings.Local.json` is git-ignored and exists for per-developer overrides such as logging levels. `Program.cs` registers it after `CreateBuilder` has already added the environment variable provider, so that file wins over `.ddev/.env`. A `ConnectionStrings` block there will override the environment, and someone who then edits the password in `.ddev/.env` will find it has no effect. -The Adminer add-on's `docker-compose.adminer.yaml` is committed with one edit: its default `depends_on: [db]` is gone, because this project has no `db` container. The committed copy carries no `#ddev-generated` marker, so DDEV treats it as mine and leaves it alone. The cost is that it no longer updates with the add-on. +Both files the Adminer add-on provides are committed here, the compose file and the `ddev adminer` launcher, so `ddev add-on get` never has to run and a clone starts with Adminer already working. `docker-compose.adminer.yaml` carries one edit: its default `depends_on: [db]` is gone, because this project has no `db` container. Adminer's connection defaults are set in `docker-compose.umbraco.yaml` instead, pointing it at the `sqlserver` service. Neither committed copy carries a `#ddev-generated` marker, so DDEV treats them as mine and leaves them alone. The cost is that they no longer update with the add-on. ## Try it -The repository is at [millnut/umbraco-clean-ddev](https://github.com/millnut/umbraco-clean-ddev), built on Paul Seal's [Clean](https://github.com/prjseal/Clean) starter kit. Clone it, run `ddev setup`, and you should have Umbraco and SQL Server running without either of them touching your machine directly. +The repository is at [millnut/umbraco-clean-ddev](https://github.com/millnut/umbraco-clean-ddev), built on Paul Seal's [Clean](https://github.com/prjseal/Clean) starter kit. Clone it, run `ddev start`, and you should have Umbraco and SQL Server running without either of them touching your machine directly. It is still a bespoke setup rather than something reusable. The .NET SDK install, the SQL Server service and the bacpac commands are all things I now maintain by hand, and an add-on would be a better home for most of them. If you work with Umbraco or .NET and want to try it, I would be glad to hear what breaks: I have only run this on my own machine, against one project. From d1a753265d3a9e756323ecfaca2a24381dff6fab Mon Sep 17 00:00:00 2001 From: Randy Fay Date: Mon, 24 Aug 2026 12:28:39 -0600 Subject: [PATCH 7/7] Update pubDate --- src/content/blog/umbraco-on-ddev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/umbraco-on-ddev.md b/src/content/blog/umbraco-on-ddev.md index 335cedcb..18635883 100644 --- a/src/content/blog/umbraco-on-ddev.md +++ b/src/content/blog/umbraco-on-ddev.md @@ -1,6 +1,6 @@ --- title: "Umbraco on DDEV: .NET, SQL Server, and the generic project type" -pubDate: 2026-08-20 +pubDate: 2026-08-24 summary: An experiment in running Umbraco CMS and .NET 10 under DDEV, using the generic project type, a custom web image, and Azure SQL Edge. author: Lee Mills featureImage: