Zum Inhalt

v2.4.21 – v2.4.35 — 2026-04-21

15 Releases an einem Tag — gruppiert nach Funktionsbereich.

Extensions & Marketplace

  • Update-Flow für Extensions (v2.4.22): Marketplace zeigt "Update verfügbar"-Badge wenn die installierte Version von der Upstream-Version abweicht. In-Place-Update mit Backup/Rollback bei Health-Check-Fail — extension_settings und der enabled-Flag bleiben erhalten, neue Manifest-Settings werden mit Default befüllt.
  • Git-Deploy als vollwertige Marketplace-Extension (v2.4.25 + v2.4.26): aus dem Core entfernt und als eigenständige Extension neu released — SQLite-State, Webhook-Receiver für GitHub/GitLab/Gitea (HMAC-validiert), Auto-Deploy on Push, Rollback auf vorherige Commits, Pre-Deploy-Commands (composer/npm/yarn — Whitelist), 15 Sprachen, Pro-Repo-Webhook-URL + rotierbares Secret.
  • Manifest-Sanitizer (v2.4.21): Frisch installierte Extensions deren Manifest noch den alten /run/netcell/-Socket-Pfad enthält werden automatisch beim Entpacken auf /run/enconf/ umgeschrieben. Schützt vor Health-Check-Fails durch stale Upstream-Tarballs.
  • Extension-Permissions akzeptieren Integer-Limits (v2.4.29): Package-Editor speichert jetzt auch max_git_repos und ähnliche Extension-Limits in der extension_permissions JSONB, nicht nur perm_*-Booleans.

SSL & TLS

  • Reissue-Button für ALLE Cert-Typen (v2.4.33 + v2.4.35): Im SSL-Dashboard funktioniert "Reissue" jetzt auch für Mail- und Panel-Certs (nicht-Site-bound). Neuer Agent-Endpoint POST /api/v1/ssl/force-renew ruft certbot renew --force-renewal --cert-name <domain> — Postfix/Dovecot/nginx werden automatisch via Deploy-Hook neu geladen.
  • TLS-Health-Probe ehrlicher (v2.4.34): Mail-Certs (z.B. customer-mail.example.com) wurden fälschlich als "Falsches Cert" gemeldet, weil die Probe Port 443 abfragte — dort liefert aber das Default-Vhost-Cert. Probe wird für Server-level Certs jetzt mit Status "Übersprungen" markiert statt False-Positive.
  • Google-Ads-Reject-Schutz (v2.4.27 + v2.4.28): nginx- und Apache-Vhost-Templates strippen jetzt unsichtbare Unicode-Steuerzeichen (Bidi-Overrides U+202C, Zero-Width-Joiner, BOM) aus dem $request_uri. Verhindert dass Google Ads die Domain als URL-spoofed markiert wenn ein Suchergebnis-Link einen solchen Char trägt.
  • /ssl mobile-optimiert (v2.4.33): Page-Header-Search nimmt auf Mobile volle Breite, TLS-Health-Header stackt vertikal, beide Tabellen scrollen horizontal statt überzulaufen.

Domain & Site Robustness

  • Domain-Namen-Validierung beim Erstellen (v2.4.23 + v2.4.24): isDomainValid() wird jetzt in createDomain, createSite sowie Alias-Admin-/Customer-Create aufgerufen — verhindert dass Garbage-Names wie foo..com in die DB landen und beim nächsten nginx-Reload kaputt gehen.
  • Alias-Delete räumt Schatten-Domain-Row mit auf (v2.4.23): Beim Alias-Erstellen wird eine synthetische Domain-Row angelegt damit der Alias in den SSL/Domain-Listen erscheint. Delete entfernte sie bisher nicht — jetzt wird sie scoped nach (name, customer_id) mit gelöscht.
  • DNS-Patch-Fehler geloggt statt verworfen (v2.4.23): applyAlias und applySubdomain ignorierten den Return-Value von DNSPatchRecords. Jetzt WARN-Log mit Hinweis auf den nachfolgenden ACME-Preflight-Skip.

System & Operations

  • Apache im Repair-System sichtbar (v2.4.30): Eigener RepairApacheVhosts-Reconciler im Admin → Repair, plus Orphan-Detection für stale /etc/apache2/sites-available/*.conf-Dateien (eigener Agent-Endpoint POST /api/v1/system/apache-orphans). Cleanup-Action im Repair-Report mit Ownership-Guard.
  • OPcache zeigt LIVE-FPM-Daten (v2.4.31): Status-View im System-Tab fragte bisher den CLI-Kontext ab — der ist immer kalt. Agent nutzt jetzt cgi-fcgi zum Shared-FPM-Socket und liest die echten Pool-Stats. Fallback auf CLI wenn kein Shared-Socket existiert. libfcgi-bin wurde Agent-Dependency.
  • PHP-FPM-Service-Failure-Email-Storms gestoppt (v2.4.31): Zweiter Orphan-Pool-Sweep direkt nach RunFPMMigration in der Hardening-Migration — fängt Leftover-Pool-Configs die unter Race-Bedingungen den Shared-FPM-Restart kollidieren ließen.
  • OPcache-Version-Dropdown dynamisch (v2.4.32): Frontend liest installierte PHP-Versionen vom Agent (Glob auf /etc/php/*/fpm/php-fpm.conf) statt einer hardcoded ['8.1','8.2','8.3','8.4']-Liste — zeigt jetzt PHP 8.5 an wo es installiert ist und blendet nicht-installierte aus.

Bugfixes (User-Reports)

  • Subscription-Detail "Speicherplatz 0/5120 MB" (v2.4.29): used war als Placeholder auf 0 hardcoded, dazu fehlte disk_usage_mb im API-Response. Beides verdrahtet — zeigt jetzt den echten Verbrauch (z.B. 2724 MB / 5120 MB).
  • Git-Deploy "Neues Repository"-Modal crashte (v2.4.29): "n.map is not a function" — der Sites-API-Endpoint liefert ein paginated Envelope {data: {data: [], total, page}}, der Fetcher las nur r.data.data. Akzeptiert jetzt beide Shapes defensiv.
  • max_git_repos-Limit wurde beim Speichern verworfen (v2.4.29): Package-Update-Handler akzeptierte im Extension-Fallback nur perm_*-Booleans, keine max_*-Integer. Jetzt mixed-typed JSONB; HasExtensionPermission ist robust gegen non-bool-Werte; neue GetExtensionLimit-Hilfsfunktion zum Auslesen.