Version 5.1.1
[5.1.1] — 2026-09-02
A hotfix for 5.1.0: one unterminated heredoc, and wildcard domains made to work end to end.
Fixed
-
One unterminated heredoc broke app creation, every vhost rewrite, and emptied FPM pools.
_create_fpm_poolended its heredoc with${overrides}EOFon a single line. A heredoc only closes on a line holding the delimiter alone, so the body ran on: the pool file was truncated to zero bytes by the redirection and the run then died on an unbound variable, and the runaway body swallowed the next function,_nginx_reverb_location_block, whole. Consequences, all from the same line:cipi app createaborted at the PHP-FPM step.- Every vhost regeneration —
cipi alias add/remove,cipi www,cipi basicauth,cipi app suspend, a PHP version change — died with_nginx_reverb_location_block: command not foundafter apps.json had been written, so the panel's state and nginx drifted apart. - Migration 5.1.0 called
_create_fpm_poolfor every app, so upgraded servers can be left with empty pools: the sites keep serving until the next php-fpm restart, then answer 502.
Migration 5.1.1 rebuilds every FPM pool (reporting the ones that had been emptied), restarts the affected
php*-fpmafter a config test, and regenerates the vhosts that no longer match apps.json — healthy vhosts are left untouched, backups go to/var/lib/cipi/vhost-backup-5.1.1, and a failingnginx -trolls the batch back. -
A regression test now fails if this class of bug returns.
tests/verify-5.1.1.shsources each library and checks that every function it defines is actually defined afterwards — an unterminated heredoc makes the functions behind it disappear, which is exactly what went unnoticed here.
Fixed — wildcard domains
*.example.comwas rejected as a primary domain.cipi app createandcipi app edit --domain=validated the primary with the non-wildcard matcher, so a multi-tenant app fronted by one wildcard vhost could not be created at all — even though nginx serves a wildcardserver_namenatively andcipi.ymldocuments*.${domain}as an alias. Wildcards are now accepted for the primary domain ofapp create,app edit --domain=andapp clone --domain=.- Every URL built from the domain was unusable on a wildcard app.
APP_URL, the deploy webhook shown bycipi app show/cipi deploy webhook, and the webhook registered with GitHub or GitLab were all built ashttps://*.example.com/…, which is not a hostname and which both providers refuse. They now name a concrete tenant host (www.example.com). - SSL could not work on a wildcard app. Let's Encrypt validates a wildcard over DNS-01 only, and certbot names the lineage after the bare domain — but Cipi passed
--cert-name '*.example.com'and looked for/etc/letsencrypt/live/*.example.com, so nothing matched. Certificate names and lineage lookups now strip the wildcard label everywhere (install, force, renew-time reinstall, domain change, app delete,cipi domains). - A single wildcard alias failed the whole certificate.
cipi ssl installsent every alias to HTTP-01, and one-d '*.example.com'fails the entire order — so an app with a wildcard alias could not get a certificate for any of its domains. Wildcard aliases are now left out of the HTTP-01 certificate with a warning pointing at--dns=cloudflare, and a wildcard primary is refused up front with the two commands that do work. cipi ssl install --dns=cloudflare --wildcarddoubled the wildcard label when the primary domain already was one (*.*.example.com).cipi www force-to-root|force-from-rootandcipi health setproduced nonsense on a wildcard app —www.*.example.comas a server_name, and a healthcheck (with post-deploy rollback attached) aimed athttps://*.example.com/up. Both now stop with an explanation;cipi health setasks for an explicit--url.cipi app createnow says how to secure a wildcard app, printing thecipi ssl dns set/cipi ssl install --dns=cloudflarepair in the summary instead of the plaincipi ssl installthat cannot work there.