Highlights
Security + reliability hardening pass, followed by a simplify review.
Critical fixes
- restore.sh rewritten with
casepattern — prior unterminated quote crashed every gzip restore. - health-check.sh colors emit real ANSI via
printf— prior Unicode␛glyph rendered as garbage. - .env.example key-based sed replacement — prior lowercase pattern never matched
DB_PASSWORD=, leaking real generated passwords into the example file.
Security
- Removed
PMA_ARBITRARY: 1from phpMyAdmin to shrink attack surface. - Permissions:
0775dirs /0664files,backups/0700(was0777, exposing dumps to any host user). PROJECT_NAMEvalidated against[A-Za-z0-9_-]+.openssladded to dependency check (was used without verification).make installno longer uses--forceand refuses to overwrite an existingwp-config.php.
Reliability and UX
wpcliimage now followsPHP_VERSION(was pinned tocli-php8.4).make clean FORCE=1for non-interactive runs.mailpitnow starts by default (devprofile removed; was never activated).make installdrops redundantwait-dbdep (upalready waits).trap EXIT/INT/TERMremoves partial project dir on aborted setup.php.inino longer hardcodesdate.timezone; defers toTZenv var.- Generated
docker-compose.ymlvalidated before setup exits.
Housekeeping
.gitignore:plugins/*+!plugins/.gitkeeppattern (so.gitkeepsurvives),backups/, generated helper scripts,*.sql.gz.tmp.Makefile.PHONYsplit across lines; dropped undefinedprune-backupstarget.chmod +xconsolidated (was duplicated 4×).- README PHP badge
8.2→8.4to match default. CONTRIBUTING.mdadded (badge previously linked to missing file).
Simplify pass (follow-up)
- Color helpers in
setup.shnow use the sameprintf '%s[31m%s%s[0m\n'style ashealth-check.sh(was inconsistent). - Dropped redundant
SETUP_COMPLETEflag;.envexistence is the single source of truth for the cleanup trap. - Final-block permissions now only touch top-level dirs; recursive perms on the WP core tree are deferred to
make fix-permissions, avoiding a multi-thousand-file walk on every setup run. fix-permissionscollapses twofindtraversals into one via-orbranching (halves stat syscalls).docker compose configvalidation block flattened from a 3-level nestedifto a guard + dispatch + single assertion.
Behavior changes worth noting
make installon an existing project now errors instead of silently overwritingwp-config.php. Runmake cleanfirst to reinstall.make cleanin CI requiresFORCE=1(was hanging onread -p).mailpitnow runs by default; ports1025/8025are bound onmake up.
Full Changelog: v1.0.0...v1.1.0