Conversation
Runs FreeUnit as the DDEV web server (generic webserver_type + web_extra_daemons). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
Findings are in pkg/ddev/ddev-freeunit/REVIEW.md. The daemon could not start as shipped (DDEV_APPROOT is not set in the container, /var/run and /var/lib/freeunit are root-owned while web_extra_daemons run as the project user, app user/group cannot be set unprivileged). Fixes: run from /mnt/ddev_config, a /run/freeunit runtime dir owned by the project user, one configure/make in the Dockerfile from the release tarball, unitd loads the rendered conf.json from its state dir and is exec'd in the foreground, X-Forwarded-Proto/-For via the listener's "forwarded" option, dotfile deny and *.php execution for non-Drupal projects, embed SAPI shares php-fpm's configuration so stock `ddev xdebug` and .ddev/php/*.ini apply. Removed: the xdebug command override, cron schedules, FREEUNIT_* knobs, the pre-install webserver_type check, most of the README. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
Trust X-Forwarded-Proto/-For from any source (as DDEV's nginx does; the RFC1918 list silently broke HTTPS detection on other Docker networks), pipefail around curl|tar in the Dockerfile, comments out of the RUN continuation, absolute unitd path, README wording; REVIEW.md rounds 2-3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
Root workflow runs the add-on's bats test on PHP 8.5 with FreeUnit built from this commit (git archive into .ddev/web-build/freeunit-src.tar.gz, picked up by the Dockerfile through a bind mount; the release tarball stays the default), then benchmarks nginx-fpm against the add-on on Drupal 11 and 12. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
assert_output --regexp anchors ^ at the start of the whole header block, so the check could never pass (and the refute in the removal test could never fail). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
composer create-project refuses a non-empty project directory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
drush does not install on Drupal 12.0.0-alpha1, so tests/metrics-site.php does the install, node creation and page_cache toggling through Drupal's own API. The node page, the front page and the static file must answer 200 to anonymous users before anything is measured (the drupal11 leg measured a node page that returned 500); on failure the last dblog errors are printed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
Standard in Drupal 11.4/12 has no article type (the node page died in NodeThemeHooks::preprocessNode() on a missing bundle) and Drupal 12 alpha1 answers 403 to anonymous users on /. metrics-site.php now creates a 'bench' type (with body when the storage exists), grants 'access content', and points / at the node if there is no frontpage view. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
hey prints "50%% in", so the report found no percentiles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Proposed changes
A DDEV add-on that makes FreeUnit the project's web server. It uses
webserver_type: generic+web_extra_daemons, the same pattern as ddev-frankenphp. It is laid out as a standalone add-on repository underpkg/ddev/ddev-freeunit/.Contents:
web-build/Dockerfile.freeunit: buildsunitdand the PHP module against sury'sphpX.Y-embed;scheduleswhenFREEUNIT_CRON_KEYis set;ddev freeunit status|reload|log;Verified:
./configure phpagainst the sury 8.3 embed builds with no patches;unitd;/status, app restart andschedulesruns work;Not verified: the
docker buildand the bats suite. The environment has no Docker daemon or DDEV installed, and pkg.ddev.com and sury are blocked.Follow-up: a Fable review of this add-on is in progress; its fixes will land on this branch.
Checklist
🤖 Generated with Claude Code
https://claude.ai/code/session_01YSMMShDBn9zs2gFfTrLqwA
Generated by Claude Code