Vorgehen
Sammle zuerst die Fakten, dann suchst du das Symptom in den Tabellen unten:
- Meldet ein Benutzer einen Fehler, lass dir die Request-ID (
req_...) geben und schlage sie mit der Support-Referenz nach. - Lies das kombinierte Journal (siehe Wiederherstellung).
- Lies die Journale der betroffenen Units:
journalctl -u <unit> -n 50 --no-pager. - Erstelle auf jedem betroffenen Host ein Support-Bundle.
Symptome rund um den Workspace haben eine eigene Tabelle im Kapitel Workspace.
Werkzeuge für den Support
Drei Werkzeuge, von der engsten zur weitesten Sicht:
| Werkzeug | Beantwortet | Wo |
|---|
| Support-Referenz | „Was ist mit genau dieser Anfrage passiert?“ | Panel Support-Referenzen, GET /support/references/{req}, CLI auf dem Control-Host |
| Ressourcenverlauf und Operation-Timelines | „Was ist mit dieser Ressource / Operation passiert?“ | Panel, GET /history/{type}/{id}, Betrieb & Diagnose |
| Support-Bundle | „In welchem Zustand ist dieser Host?“ | nova-support-bundle auf jedem Host |
Fehlerreferenz (Request-ID)
Jede API-Antwort trägt eine Request-ID: req_ plus 32 Hex-Zeichen, im Header X-Request-ID und bei Fehlern zusätzlich in error.request_id. Das Panel zeigt sie in jeder Fehlermeldung unter Technische Referenz. Kam keine Serverantwort an, zeigt das Panel stattdessen eine Browser-Referenz (brw_...) – zu der gibt es keinen Server-Trace.
Frag deine Benutzer nach dieser Referenz und schlage sie auf dem Control-Host nach (als root oder nova-controlpanel):
php /opt/nova-controlpanel/application/current/src/api/bin/nova-support-reference.php req_0123456789abcdef0123456789abcdef
Die Ausgabe ist ein JSON-Dokument (nova.support-reference.v1) mit:
- der Anfrage: Route, Status, öffentlicher Fehlercode und der interne Ablehnungscode dahinter (
request.internal_code, nur für Administratoren); - den Operationen, die die Anfrage ausgelöst hat, mit Operations-Events, Jobs, Versuchen und den Ergebnissen der Node Agents;
- Workspace-Jobs mit ihren Versuchen und Node-Befehlen.
Enthalten sind nur IDs, Zustände, Codes und Zeiten – nie Nutzdaten oder Geheimnisse. Mit --no-operations überspringst du den Operations-Teil (nützlich, wenn Operations nicht läuft).
| Exit-Code | Bedeutung |
|---|
| 0 | gefunden |
| 3 | unbekannt oder abgelaufen ("state":"not_found", mit retention_days) |
| 64 | Aufruffehler |
| 1 | Nachschlagen nicht möglich (NOVA_SUPPORT_REFERENCE_UNAVAILABLE:<stage> auf stderr) |
Request-Traces werden 30 Tage aufbewahrt (nova-application-support-trace-retention.timer, stündlich). Administratoren finden dieselbe Abfrage im Panel unter Support-Referenzen → Referenz nachschlagen, Reseller mit operations.read für ihre eigenen Mandanten. Jede Abfrage wird auditiert.
Für jede abgelehnte Anfrage schreibt die Anwendung zusätzlich eine Zeile ins PHP-Fehlerlog: nova-refusal request_id=req_... status=... public_code=... internal_code=.... Der Nova-Pool setzt kein eigenes error_log; wo die Zeile landet, hängt von den PHP-FPM-Vorgaben ab:
grep -r req_... /var/log/apache2-nova/ /var/log/php8.3-fpm.log # unter Debian: php8.4-fpm.log
Ressourcenverlauf und Operation-Timelines
GET /history/{resourceType}/{resourceId}: geschwärzter Verlauf einer Website, Datenbank, DNS-Zone oder Mail-Ressource; im Panel aus den Backup- und Ressourcenansichten verlinkt.- Betrieb & Diagnose (Administratoren): Operationen mit Timeline und Nachweisen, Vorfälle, Audit-Stream, Fleet und Topologie, Zertifikatsinventar.
- Aufträge & Verlauf: Jobs mit ihren Versuchen; abbrechen, wo erlaubt.
Was du an den Support schickst
- Die Request-Referenz(en) und den Zeitpunkt des Fehlers.
- Die Ausgabe der Support-Referenz-CLI dazu.
- Ein Support-Bundle vom Control-Host (mit
--reference für die wichtigste Anfrage) und von jedem beteiligten Node. - Den Zustand des kombinierten Journals (siehe Wiederherstellung).
Support-Bundle
nova-support-bundle sammelt die Diagnosefakten eines Hosts in einem Archiv, das du gefahrlos an den Support schicken kannst. Es enthält nie Geheimnisse, Passwörter, private Schlüssel, Tokens, Sitzungsdaten, Mailinhalte, Kundendateien oder Datenbankzeilen.
Der Node-Agent-Installer legt das Werkzeug auf jedem Nova-Host (Control-Host und jeder Node) als /usr/local/sbin/nova-support-bundle an (Modus 0750, nur root). Starte es als root:
nova-support-bundle # letzte 24 Stunden, Archiv in /root
nova-support-bundle --since 2h --output /var/tmp # kürzeres Fenster, anderes Verzeichnis
nova-support-bundle --reference req_0123456789abcdef0123456789abcdef # Control-Host
| Option | Bedeutung |
|---|
--output DIR | Vorhandenes Verzeichnis (kein Symlink) für das Archiv. Standard /root. |
--since DURATION | Zeitfenster für Journalzeilen und Operations-Events: <n>m, <n>h oder <n>d, höchstens 30d. Standard 24h. |
--reference REQ_ID | Nur Control-Host: nimmt die geschwärzte Timeline der Anfrage aus nova-support-reference.php auf. Auf einem Node vermerkt das Bundle, dass die Abfrage den Control-Host braucht. |
Bei Erfolg gibt das Werkzeug den Archivpfad und dessen SHA-256 aus. Das Archiv heißt nova-support-<host>-<UTC-Zeit>.tar.gz, gehört root und hat Modus 0600.
| Exit-Code | Bedeutung |
|---|
| 0 | Archiv geschrieben |
| 1 | Fehler beim Sammeln oder Schreiben |
| 2 | Aufruffehler oder nicht root |
| 3 | vom abschließenden Geheimnis-Scanner abgelehnt |
Bei jedem Exit-Code ungleich 0 bleibt kein (auch kein halbes) Archiv zurück.
Inhalt
| Datei im Archiv | Inhalt |
|---|
SUMMARY.txt | Lesbare Zusammenfassung: Rollen, Versionen, fehlgeschlagene Units und Konfigurationstests, Fleet-Exposition, Zertifikate mit weniger als 30 Tagen Restlaufzeit, Node-Agent-Drains, fehlgeschlagene Jobs, Sammelhinweise |
MANIFEST.json | Werkzeugversion, Rollen, Plattform, Zeitpunkt, Parameter, Schwärzungsregeln, SHA-256 und Größe jeder Datei |
host/platform.json, host/roles.json, host/resources.txt, host/time-sync.json | OS-Release, Kernel, PHP-Version, Uptime, Hostname; erkannte Rollen (control, node); Platz, Inodes, Speicher, Last; Zeitsynchronisation |
nova/versions.json | Installierte Release-Daten, Schema-Version, Zustand des kombinierten Installer-Journals, Node-Agent-Installation |
systemd/units.json | Zustand der Nova-Units und Plattformdienste (Apache, PHP-FPM, BIND, Postfix, Dovecot, MariaDB, HAProxy, Rspamd, Pure-FTPd, Zeitsync …) |
journal/<unit>.log | Die letzten 200 Journalzeilen je Nova-Unit im Zeitfenster, geschwärzt |
checks/config-tests.json | Exit-Code und höchstens 20 geschwärzte stderr-Zeilen von apache2ctl configtest, php-fpm<series> -t, named-checkconf, postfix check, doveconf -n, rspamadm configtest, haproxy -c |
network/sockets.json, network/fleet.json | Lauschende Sockets (nur Protokoll und Adresse:Port); Ergebnis von nova-fleet-network.py detect und der Expositionsprüfung |
certificates/certificates.json | Subject, Aussteller, Gültigkeit und Resttage der Zertifikate in den Nova-TLS-Verzeichnissen |
node/agent.json | Node-Identität (ID, Rollen, Write-Capabilities, Endpunkte), letzte Drains, Ledger-Übersicht |
operations/jobs.json | Nur Control-Host: Jobs und Operationen nach Zustand, die letzten 50 fehlgeschlagenen Jobs, Event-Zähler |
reference/timeline.txt | Nur mit --reference: die geschwärzte Timeline der Anfrage |
collection-notes.json | Bereiche, die auf diesem Host nicht verfügbar waren oder fehlschlugen |
Was nie gesammelt wird
- Geheimnisspeicher und Schlüsselmaterial:
/etc/nova-controlpanel/secrets/*, *.key, private Schlüssel in Bundles, TSIG-Keyrings, DKIM- und Backup-Schlüssel, Zugangsdateien, Werte aus runtime.env außerhalb der Identitäts-Allowlist. - Das Installationsprofil und die Laufzeitkonfiguration selbst (gelesen werden nur
schema_version und Fleet-Adresse/-Ports). - Sitzungen, Cookies, Zugangsdaten, Tokens, API-Keys, Passwörter.
- Mail-Spools, Postfachinhalte, Website-Dateien, Datenbankzeilen.
- Konfigurations-Dumps (
doveconf -n, named-checkconf -p, php-fpm -tt).
Schwärzung und Abschluss-Scanner
Jede Datei durchläuft zwei unabhängige Stufen:
- Schwärzung: Schlüsselbasierte Regeln entfernen Werte von Passwort-, Secret-, Token-, Key-, Cookie-, Session- und Credential-Feldern (auch
MYSQL_PWD), dazu PEM-Blöcke, SSH-Schlüssel, Bearer/Basic/Digest-Zugangsdaten, Benutzerangaben in URLs und hochentropisches Base64. E-Mail-Adressen werden zu <email:…> – einem nicht umkehrbaren Kürzel, das innerhalb eines Bundles stabil bleibt, damit du Zeilen zuordnen kannst. IP-Adressen, Commit-IDs, SHA-256-Werte und präfixierte IDs (req_…, node_…) bleiben erhalten. - Abschluss-Scanner: Er prüft jede Datei – auch
MANIFEST.json und SUMMARY.txt – erneut auf dieselben Muster. Jeder Fund lehnt das gesamte Bundle ab (Exit 3) und nennt nur Datei, Zeile und Regel, nie den Treffer selbst.
Vor dem Versenden prüfen
Lies SUMMARY.txt, bevor du das Archiv verschickst. Eine schnelle Gegenprobe:
tar -xzOf /root/nova-support-*.tar.gz --wildcards '*/SUMMARY.txt'
tar -xzOf /root/nova-support-*.tar.gz | grep -E -- '-----BEGIN|PRIVATE KEY|MYSQL_PWD=[^[]' || echo CLEAN
Symptome und Lösungen
Host und Netzwerk
| Symptom | Ursache | Lösung |
|---|
Host hat nach dem Boot keine private Adresse; nova-fleet-network.py detect liefert 127.0.0.1 oder der Coordinator bindet nie | Ubuntu lässt eine private Netzwerkkarte, die nach dem ersten Boot angehängt wurde, unkonfiguriert | Netplan-Datei für das Interface anlegen (dhcp4: true), netplan apply (Voraussetzungen) |
FLEET_NETWORK_AMBIGUOUS | mehr als eine RFC-1918-Adresse auf dem Host | Adresse festlegen: detect --address <addr> und diese Adresse im Profil verwenden |
FLEET_NETWORK_ADDRESS_PUBLIC / ..._NOT_OFFERED | die festgelegte Adresse ist öffentlich oder nicht auf diesem Host | private Adresse des Hosts oder 127.0.0.1 verwenden |
FLEET_NETWORK_PORT_EXPOSED <addr:port> bei verify/accept | ein interner Port lauscht auf einer anderen Adresse | Listener finden (ss -ltnp) und entfernen; interne Ports gehören nur auf die Fleet-Adresse |
| Paketschicht scheitert zu Beginn der Installation | unattended-upgrades oder cloud-init hält den dpkg-Lock | warten (cloud-init status --wait, pgrep -a unattended leer), dann denselben Befehl erneut ausführen |
Nova package candidate unavailable: jailkit (Ubuntu) | Komponente universe nicht aktiviert | universe in den APT-Quellen aktivieren, apt-get update, Paket-Bundle neu bauen |
host platform marker required / host platform marker differs from candidate | /etc/nova-controlpanel/host-platform fehlt oder nennt eine andere Plattform | nova-controlpanel-host-platform:<platform>:apache hineinschreiben (Voraussetzungen) |
Installer-Eingaben
| Symptom | Ursache | Lösung |
|---|
trusted installer source ownership invalid | der Checkout, aus dem du installierst, gehört nicht root oder ist gruppen-/weltbeschreibbar | als root mit umask 022 oder strenger klonen; chmod -R go-w $SRC |
root-owned immutable candidate input required | Kandidaten-Archiv gehört nicht root oder ist für andere beschreibbar | chown root:root, chmod 0644 (oder strenger) |
root-owned private input required: <path> | Profil- oder Secret-Datei nicht 0600 root | chown root:root <path>; chmod 0600 <path> |
native writes must remain disabled during fresh combined installation | ein frisches Profil aktiviert Writes, Zustellung oder Auslieferung | mit allen Write-/Serving-Schaltern auf false installieren; danach per Rekonfiguration aktivieren |
fresh combined installation requires no active Nova runtime | Nova ist schon installiert | upgrade oder reconfigure verwenden |
existing combined transaction requires explicit resolution bei frischem install | eine fehlgeschlagene Erstinstallation hat ihr Journal hinterlassen | denselben Kandidaten mit demselben Profil installieren oder auf einem neuen Host beginnen. Hat das Journal keine Stufe abgeschlossen (completed leer), archiviert install-nova-combined-runtime.py archive-empty es (Wiederherstellung) |
combined reconfiguration requires a new profile file / ... profile equals the active profile | das aktive Profil wurde bearbeitet oder nichts geändert | aktives Profil in eine neue Datei kopieren und die Kopie ändern |
combined update changes stateful database/trusted_origin/secrets configuration | das Zielprofil ändert ein zustandsbehaftetes Feld | diese Felder exakt wie installiert lassen |
node id invalid oder NOVA_NODE_BOOTSTRAP_ARGUMENTS_INVALID | Node-IDs sind überall node_ plus 22 bis 59 Zeichen | längere Node-ID wählen; sie ist dauerhaft, also vor der ersten Aufnahme festlegen |
NOVA_NODE_BOOTSTRAP_SERVER_REF_INVALID | server_ref ist nicht srv_ plus 8 bis 59 Zeichen | gültige Server-Referenz verwenden |
coordinator-configure scheitert, weil die Umgebungsdatei mit anderem Inhalt existiert | eine frühere Umgebungsdatei weicht ab | /etc/nova-controlpanel/operations/agent-coordinator.env beiseitelegen und coordinator-configure erneut ausführen |
Ausführungskette (auf den Nodes passiert nichts)
| Symptom | Ursache | Lösung |
|---|
Ressourcen bleiben pending/accepted, Nodes erhalten nichts | Worker- oder Dispatcher-Timer nicht aktiv, oder native Befehle aus | systemctl enable --now nova-controlpanel-operations-worker.timer nova-controlpanel-operations-dispatcher.timer; install-nova-operations-http-bridge.sh native-commands / on und accept / |
Operations-verify/accept scheitert wegen des Executor-Profils | /etc/nova-controlpanel/operations/runtime.env nennt ein fremdes Profil (z. B. fake) | fremde Zeile OPERATIONS_EXECUTOR_PROFILE entfernen und den Installer erneut ausführen; er schreibt OPERATIONS_EXECUTOR_PROFILE=next-native selbst |
| Writes einer Domäne werden auf einer frischen Installation abgelehnt | die Capability ist im Operations-Store nicht aktiviert | fresh-installation-enable.php <capability> 1 "<rollback plan>", sobald der zuständige Node aktiv ist |
Alle Node Agents melden nach einem Neustart des Control-Hosts AGENT_MTLS_CONNECT_FAILED | Coordinator nicht für den Boot aktiviert oder private Adresse fehlt | systemctl enable --now nova-controlpanel-operations-agent-coordinator.service; private Netzwerkkarte prüfen |
Ressource endet in error mit AGENT_RUNTIME_CAPABILITY_UNAVAILABLE | NOVA_AGENT_WRITE_CAPABILITIES des Nodes fehlt die Capability | in /etc/nova-controlpanel-node-agent/runtime.env ergänzen; Ressource zurückziehen und neu anlegen |
web node filesystem user quota is not enforced | web.execute.v1 gelistet, aber kein Quota-Volume eingerichtet | nova-web-node-quota.sh setup DEVICE auf einem frischen Volume, dann verify |
ext4 quota format module quota_v2/quota_tree unavailable ... oder ein Kernel-Update scheitert mit einer nova-web-quota-Logzeile | Ubuntu-Cloud-Kernel ohne linux-modules-extra-<kernel> | apt-get install --no-install-recommends linux-modules-extra-<kernel>, dann dpkg --configure -a; neu starten, falls der neueste Kernel abweicht |
Host bootet degraded, quotaon@... mit File exists | Boot-Quota-Units eines älteren Provisionierers | nova-web-node-quota.sh boot-units (ein Update erledigt das ebenfalls) |
Plattform-Operation (z. B. Server anlegen) bleibt nach einem kurzen 503 in accepted | die Anfrage wurde angenommen, die Antwort ging verloren | dieselbe Anfrage mit demselben Idempotency-Key erneut senden; ein neuer Key erzeugt eine zweite Operation |
503 VALIDATION_PENDING bei einem DNS-Write | Validierung der Zone läuft noch | nach einigen Sekunden mit demselben Idempotency-Key wiederholen |
422 VALIDATION_REQUEST_INVALID bei jedem Write eines API-Clients | Idempotency-Key fehlt oder verletzt die Regel (16 bis 128 Zeichen aus A-Z a-z 0-9 . _ : -, erstes Zeichen Buchstabe oder Ziffer) | gültigen Key verwenden, z. B. eine UUID |
Administrator-Aktion verlangt Step-up, oder MFA_ENROLLMENT_REQUIRED | die Aktion braucht Passwort + TOTP, das Konto hat keinen Faktor | TOTP einrichten (Einstellungen → Sicherheit); API-Clients senden die Freigabe in X-Capability-Elevation |
| Profil abgelehnt, weil Writes MFA und Step-up brauchen | ein Profil aktiviert einen nativen Write ohne native_identity_mfa.enabled, enrollment_enabled und native_capability_elevation.enabled | MFA-Reader, dann Enrollment und Elevation aktivieren, TOTP einrichten, danach die Writes (Installation) |
| Ein Administrator hat Authenticator und alle Recovery-Codes verloren | kein Faktor mehr übrig | MFA-Notfall-Reset auf dem Control-Host (Sicherheit) |
DNS
| Symptom | Ursache | Lösung |
|---|
Zone endet in error, Node-Log NOVA_DNS_BIND_ADD_FAILED | dynamische BIND-Zonen auf dem DNS-Node nicht aktiviert | activate-nova-bind-dynamic-zones.sh activate auf dem Node; das nächste Update oder die nächste Abgleichung spielt die Zone erneut ein |
| Replikation oder TSIG startet nie | Secondary ohne Endpunkt, nicht im Plan, oder dns.keyring.apply.v1 / Lease-Zweck dns fehlt | Endpunkt registrieren (PUT /dns-node-endpoints/{node_id}, FQDN mit abschließendem Punkt), in dns.secondary-nodes zulassen, Capability und Lease-Zweck ergänzen |
| Zonentransfers zwischen Primary und Secondaries scheitern | Port 53 im privaten Netz blockiert | 53/tcp und 53/udp zwischen den Transferadressen freigeben |
| Kunden können keinen externen Master mit privater Adresse nutzen | gewollt: private oder reservierte Master sind Administratoren vorbehalten | öffentliche Master-Adresse verwenden oder die Zone als Eigentümer anlegen |
Mail
| Symptom | Ursache | Lösung |
|---|
Native Mail-Writes abgelehnt mit NOVA_MAIL_DOVECOT_SYSTEM_AUTH_ACTIVE; Installer-Warnung Dovecot system authentication is still enabled | die PAM-/Systemauthentifizierung der Distribution ist in Dovecot noch aktiv – Systembenutzer könnten sich per IMAP/POP3 anmelden | sh /opt/nova-controlpanel-node-agent/deploy/activate-nova-dovecot-auth.sh activate (status prüft es) |
| Recovery- oder Support-Mails werden nicht zugestellt | der ausgehende Transport verlangt verifiziertes TLS | Mail-Konfiguration auf ein Relay mit einem Zertifikat zeigen lassen, dem der Host vertraut |
Web
| Symptom | Ursache | Lösung |
|---|
| Liste der PHP-Versionen für Websites ist leer | der Web-PHP-Katalog wurde nach Aktivierung der PHP-Runtime nicht abgeglichen | nova-web-php-runtime-catalog.php reconcile ... ausführen (Installation) |
Katalogabgleich abgelehnt mit DUPLICATE_VERSION_SCOPE | zwei PHP-Runtimes derselben Version auf einem Server | die doppelte PHP-Version löschen |
Eine Anwendung funktioniert nach dem Upgrade nicht mehr (Bildwerkzeuge, Backup-Plugins, exec()) | die verwalteten deaktivierten PHP-Funktionen greifen beim nächsten Apply | Ausnahme pro Website gewähren (php.enabled_functions; Administratoren, Kunden nur mit dem Plan-Feature web.php-function-exceptions) |
Anwendung kann einen Pfad außerhalb der Website oder /dev/urandom nicht lesen | das verwaltete Standard-open_basedir | ein Administrator setzt php.open_basedir für die Website (inklusive ihres tmp/) |
| Benutzer werden nach dem Upgrade einmalig aus einer Website ausgeloggt | Sitzungen wandern beim nächsten Apply in das eigene tmp/ der Website | einmalig, erwartet |
NOVA_WEB_PATH_ALIAS_COLLISION | ein lesbarer Pfad der Website (/var/www/<domain>, /var/www/clients/<customer>/<domain>, bei umgezogenen Sites /var/www/clients/clientN/webN) existiert auf dem Node bereits als etwas anderes, oder ein Elternverzeichnis gehört nicht root | vorhandenen Pfad auf dem Node wegräumen, dann die Website abgleichen (Tagesbetrieb) |
| Panel zeigt keinen lesbaren Pfad für eine Website | der Node hat ihn noch nicht angelegt (Nachzug läuft noch, Kollision) oder das Lesen schlug fehl | path_backfill im Receipt des Web-Settlement-Workers und collisions in /var/lib/nova-controlpanel-agent/web-state/path-aliases.json prüfen |
422 WEB_PHP_SETTING_NOT_ALLOWED (php.open_basedir / php.custom_ini) | ein Kunde wollte eine Administrator-Einstellung setzen, oder eine ältere Website trägt unmarkierte Administrator-Werte | ein Administrator öffnet und speichert die Website einmal oder entfernt die Werte (Sicherheit) |
| Website-Backup oder -Restore scheitert auf dem Node | Server-Backup-Schlüssel fehlt, oder zstd fehlt auf einem älteren Web-Node | nova-web-website-backup-key.sh setup und verify; nova-host-bootstrap.py --mode install --roles web ... installiert zstd (Backups) |
503 BACKUP_DOWNLOAD_UNAVAILABLE bei jedem Download-Schritt | native_backup_download.enabled ist aus, der interne Listener liefert nicht aus, oder der Node hat backup.artifact.export.v1 weder in NOVA_AGENT_WRITE_CAPABILITIES noch in NOVA_AGENT_DEFAULT_WRITE_CAPABILITIES | alle drei herstellen (Backups) |
409 BACKUP_EXPORT_BUSY, obwohl kein anderer Export läuft | dem Spool-Dateisystem fehlen Archivgröße plus 1 GiB Reserve, oder die Spool-Kapazität ist durch fertige Exporte belegt | Platz schaffen oder auf den stündlichen Ablauf warten; spool_capacity_bytes senken oder die Platte vergrößern |
409 BACKUP_EXPORT_BUSY | auf dem Node laufen schon zwei Transfers, oder die Spool-Kapazität ist erschöpft | nach der Retry-After-Zeit wiederholen; bei Wiederholung spool_capacity_bytes erhöhen |
Export endet failed mit BACKUP_EXPORT_DIGEST_MISMATCH | das Archiv auf dem Node passt nicht zu seinem veröffentlichten Digest | Archiv als beschädigt behandeln; neues Backup erstellen |
| Abgelaufene Backups werden nicht entfernt | Retention-Timer läuft nicht, oder die Ebene dieses Backup-Typs ist nicht installiert | systemctl status nova-application-backup-retention.timer; das Journal nennt behaltene Backups |
Datenbanken
| Symptom | Ursache | Lösung |
|---|
Datenbank bleibt nach POST /databases in error | ein gleichnamiges Schema existiert außerhalb von Nova; der Node übernimmt es nicht (NOVA_DATABASE_SCHEMA_EXISTS_NOT_OWNED), die fremden Daten bleiben sicher | DELETE /databases/{id} senden: der Node meldet NOVA_DATABASE_NEVER_OWNED und löscht nichts, der Eintrag geht auf deleted, Quota und Namen werden frei. Dann anderen Namen wählen oder das fremde Schema zuerst entfernen |
DELETE dieser Datenbank antwortet 202, der Eintrag fällt aber zurück auf error | der Rückzug wurde abgelehnt: Node Agent zu alt, oder der Eintrag könnte auf dem Node etwas besitzen (z. B. requires_attention) | Node Agent aktualisieren und erneut löschen. Bleibt es dabei: Operation-Journal der Datenbank prüfen. Notweg auf dem DB-Node: fremdes Schema sichern (mysqldump --databases <name>), DROP DATABASE <name>, DELETE /databases/{id} erneut senden, Dump unter dem ursprünglichen Namen zurückspielen |
409 RESOURCE_CONFLICT bei POST /databases oder 409 USERNAME_TAKEN | Datenbank- und Kontonamen sind pro Datenbankserver über alle Mandanten eindeutig | anderen Namen wählen |
422 VALIDATION_FIELD_INVALID bei name oder roles | System- und Control-Plane-Namen (mysql, sys, nova_*, root …) sind reserviert | anderen Namen wählen |
Topologie, Zertifikate, fail2ban
| Symptom | Ursache | Lösung |
|---|
DNS topology change requires an explicit migration | eine normale Rekonfiguration oder ein Upgrade zeigt auf eine geänderte Topologie-Datei | Topologieänderung verwenden: native-topology-change.php plan, dann reconfigure --topology-change (Anleitungen) |
Topologieänderung abgelehnt mit Zählern, z. B. node_... role mail: mailboxes=2, tenant_mail_placements=1 | die zu entfernende Rolle oder der Node ist nicht leer | gelistete Ressourcen und Platzierungen verschieben oder löschen, dann neu planen |
| Fabric-Zertifikate warnt in Fleet & Agenten | ein Fabric-Zertifikat läuft innerhalb von 60 Tagen ab | node-renew-* oder coordinator-renew* (Zertifikate) |
nova-panel-certificate.sh replace abgelehnt | Schlüssel passt nicht, falscher Name, zu kurze Gültigkeit, oder die Kette erreicht keine Vertrauenswurzel der Nodes | Dateien korrigieren; das alte Zertifikat wird weiter ausgeliefert (Zertifikate) |
| Ein Administrator ist gesperrt | fail2ban-Jail aus dem Admin-Netz ausgelöst | nova-fail2ban.sh unban ADDRESS auf dem Host (oder Fleet & Agenten → fail2ban-Sperren), dann nova-fail2ban.sh install --ignore-ip=<admin net> |
fail2ban-Liste oder Entsperren im Panel antwortet 503 | dem Node fehlt host-security.fail2ban.v1 | zu den Write-Capabilities des Nodes hinzufügen; bei einem früher aufgenommenen Node einmal node-register auf dem Control-Host ausführen |
Upgrade, Rollback, Wiederherstellung
| Symptom | Ursache | Lösung |
|---|
combined update candidate equals the active candidate | Upgrade auf den bereits installierten Kandidaten | neueren Stand bauen; reine Profiländerungen laufen über reconfigure |
combined update requires an accepted predecessor | die letzte Transaktion ist nicht akzeptiert | accept ausführen oder zurückrollen |
combined update predecessor ... has an unresolved rolled-back payload | ein Upgrade wurde zurückgerollt und nicht neu vorbereitet | rearm-upgrade mit dem vertrauenswürdigen Checkout des abgelehnten Kandidaten und den Eingaben aus dem Journal (Updates) |
rearm-upgrade scheitert mit einem Vollständigkeitsfehler (z. B. Operations/Node candidate file missing) | aus einem neueren Checkout gestartet | aus dem Checkout des abgelehnten Commits ausführen (git worktree add ... <commit>) |
package update dependencies unsatisfiable on this host | der Host ist bei einzelnen Paketen neuer als das Bundle | apt-get install <named packages>, dann Preflight wiederholen |
package database incomplete after rollback | dpkg wurde unterbrochen | dpkg --configure -a, dann erneut rollback; Pakete nie downgraden |
accept scheitert direkt nach einem Upgrade mit einem Settlement-Readiness-Fehler | ein Worker war noch nicht bereit | eine Minute warten und accept erneut ausführen |
Panel startet nach Neustart nicht, Recovery-Journal zeigt drift oder digest invalid | installierte Dateien wurden verändert | untersuchen – das ist der Manipulationsschutz. Dateien aus der Stage wiederherstellen oder zurückrollen; die Prüfung nie umgehen (Wiederherstellung) |
| Ein gescheiterter Preflight hat die Zielprofil-Datei hinterlassen | normal; Preflight bindet nichts | Datei weiterverwenden oder beiseitelegen |
Lizenz, Update-Kanal, Node-Zulassung
| Symptom | Ursache | Lösung |
|---|
node-register lehnt mit AGENT_ENROLLMENT_LICENSE_NODE_LIMIT ab, oder nova-node-bootstrap.php mit NOVA_LICENSE_NODE_LIMIT | Community-Edition (1 Server) oder Lizenz für weniger Nodes | zuerst eine Lizenz für die Node-Anzahl installieren (Lizenz) |
license trust input refused, NOVA_LICENSE_KEYS_NOT_PINNED oder LICENSE_KEYS_NOT_PINNED (409) | keine Lizenzschlüssel-Liste festgelegt, oder eine Liste, die nicht von der festgelegten signiert ist | nova-update license trust keys/license/<n>.json mit der vollständigen Kette daneben |
LICENSE_INSTALLATION_MISMATCH, LICENSE_NOT_YET_VALID, LICENSE_SUPERSEDED | Lizenz für eine andere Installations-ID, vor valid_from, oder älter als die installierte | für nova-update license show-id neu ausstellen lassen, warten oder die neuere Lizenz behalten (Lizenz) |
Dashboard-Banner over_limit, Updates abgelehnt mit NOVA_UPDATE_LICENSE_OVER_LIMIT | mehr Nodes als lizenziert, Kulanzzeit vorbei | Lizenz für die Node-Anzahl installieren; nichts Laufendes wird abgeschaltet |
check zeigt NOT ENTITLED, apply lehnt mit NOVA_UPDATE_LICENSE_ENTITLEMENT_ENDED ab | das Release erschien nach Ende der Update-Berechtigung | Lizenz verlängern; die installierte Version läuft weiter |
NOVA_UPDATE_INDEX_EXPIRED, NOVA_UPDATE_SIGNATURE_INVALID, NOVA_UPDATE_KEY_UNTRUSTED, NOVA_UPDATE_SOURCE_DENIED | Index des Release-Servers abgelaufen, manipuliert oder mit unbekanntem Schlüssel signiert, oder Update-Schlüssel widerrufen | Index neu signieren, Schlüsselkette und Update-Schlüssel prüfen (Updates) |
apply lehnt nach einem Kanalwechsel mit NOVA_UPDATE_RELEASE_NOT_NEWER ab | es gibt nie ein Downgrade | warten, bis der Kanal die installierte Version erreicht (AHEAD OF CHANNEL) |
Lease- oder Export-Anfragen eines Nodes antworten 403; Audit internal.node-admission.refused mit NATIVE_NODE_ADMISSION_REVOKED, _ABANDONED, _UNKNOWN oder _INACTIVE | Node-Zulassung: der Node ist widerrufen, aufgegeben oder nicht registriert | gewollt bei widerrufenen oder aufgegebenen Nodes (Wiederherstellung); einen unbekannten Node mit node-register aufnehmen |
Coordinator lehnt einen Node nach Zertifikatserneuerung ab (AGENT_MTLS_CONNECT_FAILED) | der Fingerabdruck wechselt erst bei node-renew-register | Erneuerung abschließen (node-renew-register, node-renew-finish) |
Globale Konfigurations- oder Direktiven-Writes abgelehnt mit NODE_RECONCILE_REQUIRED | ein Node hat für diese Ressource einen unbekannten oder abweichenden Verlauf | laufende Operationen abwarten; sonst Node abgleichen oder aufgeben. Den Operations-Store nie direkt bearbeiten |
Eine lesende Capability eines neuen Releases (z. B. web.statistics.collect) fehlt nach dem Upgrade auf einem alten Node | der Node hat keinen gespeicherten Rollensatz | Rollen über den Fabric-Rollenablauf ändern oder Node neu aufnehmen |
Umzug
| Symptom | Ursache | Lösung |
|---|
nova-import endet mit Exit 75 | Node-Effekte, Datenläufe oder die Adressübernahme sind noch nicht abgeschlossen | denselben Befehl erneut ausführen; den operator-Block im Receipt lesen |
cutover wartet bei address_takeover mit NOT_CONFIGURED | der Primary-IP-Tausch ist noch nicht erfolgt | swap des Hilfsskripts ausführen, den Quellserver ohne öffentliche IP wieder einschalten, cutover wiederholen |
cutover wartet bei mail_source | dem übernehmenden Mail-Node fehlt mail.source-address.configure.v1 | in NOVA_AGENT_WRITE_CAPABILITIES des Nodes ergänzen |
NOVA_IMPORT_ROLLBACK_AFTER_CUTOVER | eine Cutover-Aktivierung hat begonnen; rollback ist geschlossen | fallback verwenden (Umzug) |
409 NATIVE_IMPORT_FALLBACK_WINDOW_OPEN oder NATIVE_IMPORT_TENANT_FROZEN im Panel | Mandant eines offenen Umzugs: strukturelle Änderungen warten auf commit, während Import- und Umschaltphase wartet jeder Write | erwartet; commit ausführen oder die Phase abschließen |
Workspace (Kurzliste)
| Symptom | Ursache | Lösung |
|---|
nova-workspace-node ist gestoppt, nachdem du den Broker neu gestartet hast | die Node-Unit hat Requires= auf den Broker: Stoppen stoppt den Node mit, Starten startet ihn nicht | systemctl start nova-workspace-node |
| Bau des nativen Bundles hat Web-Pakete oder Quota-Werkzeuge von einem Host entfernt | Bundle auf einem Host mit web-Rolle gebaut; das Bauwerkzeug entfernt, was es installiert hat | nur auf einem separaten Host derselben Plattform bauen, der nie die web-Rolle bekommt |
node-issue scheitert mit NOVA_WORKSPACE_NODE_SERVER_REF_INVALID | Node-Eintrag mit altem, kurzem server_ref | einmalig nova-node-bootstrap.php repair-server-ref ... vor der Aufnahme |
Gateway root key rotation requires a separate migration | für eine Installation mit vorhandenem Root-Key wurde ein neuer angegeben | root_key_source_file auf dem installierten Schlüssel lassen; nur Zertifikat, Schlüssel und Node-CA tauschen |
Mehr dazu im Kapitel Workspace.
Bekannte Grenzen von 1.0
Geplant für 1.0.1
- Stärkerer Spamschutz: Lernen aus dem Junk-Ordner, Postscreen, DNSBL und Schwellwerte pro Postfach.
Geplant für 1.1 oder später
- Eigenes Import-Konto pro Datenbank beim Umzug. In 1.0 spielt der Import Datenbank-Dumps mit administrativen Rechten auf dem Zielserver ein; prüfe deshalb die Integrität des Quellservers vor dem Umzug (siehe Umzug).
- Direktes Upgrade eines Servers der Legacy-Basis an Ort und Stelle (1.0 zieht auf neue Hosts um).
- Ubuntu 26.04 LTS (PHP 8.5 als Standard), Dark Mode, Abrechnung, Offsite-Backups.
- Public-Suffix-Liste für die Beanspruchung verwalteter Domains.
Nicht in 1.0 enthalten
- Domainregistrierung: Domains bleiben beim Registrar, nur NS- und DNSSEC-Einträge zeigen auf Nova.
- Abrechnung und Rechnungsstellung.
- PowerDNS, PostgreSQL und XFS als Web-Speicher werden nicht als Installationsoption angeboten.
- CGI-Ausführung für Websites.
- XMPP, APS, OpenVZ und die Traffic-Historie des bisherigen Hosting-Panels meldet der Umzug, übernimmt sie aber nicht; Daten aus dessen Abrechnungsmodul werden nicht importiert.
Verhalten, das du kennen solltest
- Geschützte Ordner sind mit Apache im Betrieb erprobt; der nginx-Renderer ist durch Tests abgedeckt.
- Hinter dem SNI-Router protokolliert Apache für Anfragen, die schon vor der Request-Zeile scheitern (HTTP 400),
127.0.0.1 statt der Client-Adresse. fail2ban nutzt diese Zeilen nicht. - ClamAV prüft Anhänge, nicht den reinen Nachrichtentext. Bis zum ersten Signatur-Download (etwa 250 MB) wird Mail ungeprüft zugestellt. clamd braucht etwa 1–1,5 GB RAM.
- Solange das Fallback-Fenster eines Umzugs offen ist, lassen sich umgezogene Benutzer geschützter Ordner nicht ändern.
- Importierte geschützte Ordner zeigen als Realm-Text „Restricted“ statt des bisherigen Textes.
- Ein gelöschtes Postfach behält seinen verschlüsselten Passwort-Eintrag (für ein Rollback nötig); ohne aktives Postfach ist er unbrauchbar.