Backups

Wie Nova Website-, Datenbank- und Postfach-Backups auf den Knoten erstellt, aufbewahrt, wiederherstellt und zum Download anbietet – und was du selbst sichern musst.

Grundprinzip

Nova speichert Kunden-Backups auf dem Knoten, auf dem die jeweilige Ressource läuft. Jedes Backup hat eine undurchsichtige ID (nbk_...) und ist an Mandant, Ressource, Knoten und Ressourcen-Generation gebunden. Verfügbar wird es erst, wenn der Knoten das Archiv veröffentlicht und seine SHA-256-Prüfsumme verifiziert hat. Die API nimmt nie einen Pfad oder Dateinamen entgegen.

Wichtig: Nova kopiert Backups nicht vom Knoten weg. Externer, verschlüsselter Backup-Speicher ist nicht Teil von Version 1.0 und folgt als eigene Funktion. Einzelne Backups können heruntergeladen werden. Ein verlorener Knoten nimmt seine Backups mit – sichere deshalb die Backup-Verzeichnisse der Knoten und die Installation selbst (siehe „Was du selbst sichern musst“).

Überblick

ArtAuslöserAblage auf dem KnotenWiederherstellung
Websiteauf Anforderung (POST /web/sites/{nws}/backups)/var/lib/nova-controlpanel-agent/website-backups/nws_.../nbk_....tar.{zst,gz}POST /web/sites/{nws}/restores
Datenbankauf Anforderung und nach der backup-Richtlinie der Datenbank (interval: disabled, daily, weekly, monthly; retained_copies)/var/lib/nova-controlpanel-agent/database-backupsPOST /databases/{id}/restores
Postfachauf Anforderung und über den täglichen Timer nova-controlpanel-mail-backup.timer (00:00 UTC) nach Postfach-Richtlinie (interval: none, daily, weekly, monthly; copies)/var/lib/nova-controlpanel-agent/mail-backups/nmb_.../POST /mail/mailboxes/{nmb}/restores

Lange Backups und Wiederherstellungen laufen als dauerhafte Läufe: Jeder Lauf hat eine eigene systemd-Unit (nova-controlpanel-{website,database,mail}-data-run@<run>.service), übersteht einen Neustart des Node Agent, ist auf 5 Stunden und 3 Versuche begrenzt und meldet seinen Fortschritt (phase, attempt, bytes_written, Frist, cancellable). Abgeschlossene Läufe bleiben 14 Tage unter /var/lib/nova-controlpanel-agent/data-runs/ erhalten.

Website-Backups einschalten

Website-Backups werden standardmäßig mit einem Server-Schlüssel auf dem Web-Knoten verschlüsselt abgelegt (Format tar-zstd, 30 Tage Aufbewahrung). Die Reihenfolge ist wichtig: Ohne Schlüssel verweigern die Installer die Capability.

Auf jedem Web-Knoten:

sh
D=/opt/nova-controlpanel-node-agent/deploy
bash $D/nova-web-website-backup-key.sh setup     # SETUP_OK key_id=server-v1 state=present
bash $D/nova-web-website-backup-key.sh verify    # VERIFY_OK key_id=server-v1 round_trip=ok
# zstd (tar --zstd) comes with the web role; a web node installed earlier: nova-host-bootstrap.py --mode install --roles web ...
# add website.backup.execute.v1 to NOVA_AGENT_WRITE_CAPABILITIES in /etc/nova-controlpanel-node-agent/runtime.env
systemctl start nova-controlpanel-node-agent.service

Der Schlüssel liegt unter /etc/nova-controlpanel-node-agent/website-backup-keys/server-v1.key (0600 root, Verzeichnis 0700). setup überschreibt ihn nie.

Wichtig: Sichere diesen Schlüssel offline. Ohne ihn lässt sich kein Server-Key-Backup wiederherstellen; ein ersetzter Schlüssel macht alle vorhandenen Backups unbrauchbar.

Auf dem Control-Host folgt eine Rekonfiguration mit native_web.website_backup_enabled: true (setzt native_web.enabled im akzeptierten Vorgänger voraus), danach accept.

Prüfen:

sh
runuser -u nova-controlpanel -- php /opt/nova-controlpanel/application/current/src/api/application/bin/nova-principal-web-settlement-worker.php --verify

Die Ausgabe muss "status":"ready" enthalten.

Backups im Panel und über die API

Das Panel bietet alle Aktionen an: Website-Backups bei der Website; Postfach-Backups mit Richtlinie, Wiederherstellung, Löschen, Fortschritt und Abbruch beim Postfach; Datenbank-Backups mit Löschen und Abbruch unter Datenbanken. Unter Backups findest du den Katalog aller Backups, die du sehen darfst.

Über die API brauchen alle Schreibvorgänge ein CSRF-Token (Scope web, mail oder database), einen Idempotency-Key und – außer beim Abbruch – If-Match mit der Revision der Ressource. Backup, Wiederherstellung und Löschen antworten mit 202 und Location: /api/next/v1/operations/{op}; GET /operations/{op} zeigt status, progress und failure_code.

AktionWebsitePostfachDatenbank
ErstellenPOST /web/sites/{nws}/backups, Body {} (sites.effect; Administratoren)POST /mail/mailboxes/{nmb}/backups (mail.effect)POST /databases/{id}/backups
WiederherstellenPOST /web/sites/{nws}/restores {"artifact_id","artifact_revision"}POST /mail/mailboxes/{nmb}/restores mit backup_id (nmbkp_...) oder artifact_id (nbk_...)POST /databases/{id}/restores {"backup_id"}
LöschenDELETE /web/sites/{nws}/backups/{nbk} mit artifact_revisionDELETE /mail/mailboxes/{nmb}/backups/{nmbkp_...|nbk_...} (mail.delete)DELETE /databases/{id}/backups/{ndbkp_...|nbk_...}, leerer Body; nur abgeschlossene Dumps (available, failed, expired)
AbbrechenPOST /web/sites/{nws}/backups/{nbk}/cancellationPOST /mail/mailboxes/{nmb}/backups/{ref}/cancellationPOST /operations/{op}/cancellation
Richtlinienur auf AnforderungPUT /mail/mailboxes/{nmb}/backup-policy {"interval","copies"} (mail.update)backup in POST/PATCH /databases
  • Der Abbruch ist kooperativ: Die Operation endet mit status cancelled, sobald der Lauf auf dem Knoten gestoppt hat. Eine Wiederherstellung, die ihren Punkt ohne Rückkehr überschritten hat, läuft stattdessen zu Ende (409 BACKUP_OPERATION_NOT_CANCELLABLE, wenn nichts in der Warteschlange ist oder läuft).
  • Die letzte bekannt gute Kopie einer Ressource wird nie gelöscht (409 BACKUP_LAST_KNOWN_GOOD_REQUIRED).
  • Eine Website-Wiederherstellung wird bereitgestellt, geprüft und dann umgeschaltet; schlägt die Gesundheitsprüfung fehl, wird genau die vorherige Generation wiederhergestellt.
  • Katalog: GET /backups?resource_type=website|mailbox|database&resource_id=... und GET /backups/{nbk}.

Aufbewahrung

nova-application-backup-retention.timer läuft stündlich auf dem Control-Host. Er löscht abgelaufene Website-, Postfach- und Datenbank-Backups auf ihrem Knoten über den normalen Löschweg, behält die letzte bekannt gute Kopie jeder Ressource, räumt fehlgeschlagene Backups auf und protokolliert jede Entscheidung im Audit. Ist der Bereich eines Backup-Typs nicht installiert, bleiben dessen abgelaufene Backups erhalten und werden gemeldet. Derselbe Timer räumt auch die Download-Exporte auf.

sh
systemctl status nova-application-backup-retention.timer
journalctl -u nova-application-backup-retention.service

Download (Export)

Ein Download ist ein Export: Der Knoten überträgt das Archiv in einen Zwischenspeicher (Spool) auf dem Control-Host, und der Browser lädt diese Kopie herunter.

Voreinstellung

Neuinstallationen haben Downloads eingeschaltet. Ein Profil v28, das native_backup_download weglässt, erhält:

json
"native_backup_download": {"enabled": true, "spool_capacity_bytes": 21474836480, "bytes_per_second": null}

Das sind 20 GiB Spool-Kapazität ohne Bandbreitenbegrenzung. Außerdem gilt:

  • Die internen Listener für Web, Mail und Datenbank werden in der Writer-Stufe der Installation prepared und serving_enabled (siehe Installation); vorher liefern sie nichts aus.
  • Jeder Knoten mit Backups (Rollen master, web, mail, database) erhält bei nova-agent-fabric.sh node-install die Zeile NOVA_AGENT_DEFAULT_WRITE_CAPABILITIES=backup.artifact.export.v1 in seiner runtime.env.

Ausschalten oder anpassen

Gib den Abschnitt im Profil an und rekonfiguriere:

json
"native_backup_download": {"enabled": false, "spool_capacity_bytes": 21474836480, "bytes_per_second": null}
FeldWerte
enabledtrue oder false
spool_capacity_bytes64 MiB bis 4 TiB (Summe der Quellgrößen aller laufenden und bereiten Exporte)
bytes_per_secondnull oder mindestens 64 KiB/s pro Download

Ein angegebener Abschnitt hat immer Vorrang. Soll ein einzelner Knoten nicht exportieren, entferne die Zeile NOVA_AGENT_DEFAULT_WRITE_CAPABILITIES aus seiner runtime.env (oder lass sie leer) und führe backup.artifact.export.v1 nicht in NOVA_AGENT_WRITE_CAPABILITIES.

Nach einem Upgrade einschalten

Upgrades behalten die aktuelle Einstellung. Eine Installation, deren Laufzeit älter als die Download-Funktion ist (Profil v27 oder älter), behält Downloads ausgeschaltet, und früher eingebundene Knoten erhalten keine Voreinstellungszeile. Zum Einschalten:

  1. Abschnitt mit "enabled": true im nächsten Profil angeben und rekonfigurieren.
  2. Sicherstellen, dass die internen Listener für Web, Mail und Datenbank prepared und serving_enabled sind.
  3. Auf jedem Knoten, der exportieren soll, backup.artifact.export.v1 zu NOVA_AGENT_WRITE_CAPABILITIES hinzufügen.

Solange nicht alle drei Voraussetzungen erfüllt sind, antwortet jeder Schritt ohne Wirkung mit 503 BACKUP_DOWNLOAD_UNAVAILABLE.

Speicherplatz

Die Spool-Kapazität ist ein Reservierungsbudget; der Installer vergleicht sie nicht mit der Festplatte. Jeder neue Export braucht stattdessen seine Quellgröße frei auf dem Spool-Dateisystem plus 1 GiB Reserve für den Host, sonst antwortet er mit 409 BACKUP_EXPORT_BUSY (Retry-After: 60), bis abgelaufene Exporte Platz freigeben.

Hinweis: Dimensioniere die Platte für /var/lib/nova-controlpanel passend zu spool_capacity_bytes plus 1 GiB Reserve, oder senke die Kapazität.

Herunterladen

Im Panel: Download in der Backup-Detailansicht oder in der Backup-Liste des Postfachs.

Über die API (native Sitzung, CSRF-Scope des Bereichs, Body genau {"artifact_revision":"nbkrev_..."}; benötigt <module>.read und sites.effect, mail.effect bzw. database.update):

SchrittAnfrageAntwort
1POST /backups/{nbk}/exports202 mit Location während der Übertragung, 200 wenn bereit; export_id nbx_...
2GET /backups/{nbk}/exports/{nbx}state requested, transferring, ready, failed oder expired, übertragene Bytes
3POST /backups/{nbk}/download-linkssignierter Link, 10 Minuten gültig (409 BACKUP_EXPORT_REQUIRED, solange nicht bereit)
4GET /backups/{nbk}/content?ticket=...das Archiv; ein Range pro Anfrage, unterbrochene Downloads lassen sich fortsetzen
  • Ein Website-Archiv mit Server-Schlüssel wird beim Streamen auf seinem Knoten entschlüsselt; der Schlüssel verlässt den Knoten nie. Der Download ist das unverschlüsselte Archiv.
  • Archive mit customer-key, importierte Referenzen und Archive über 64 GiB werden nie exportiert (409 BACKUP_DOWNLOAD_NOT_SUPPORTED).
  • Der Link braucht dieselbe Sitzung und denselben Benutzer. Eine Wiederherstellung, Löschung oder andere Änderung des Backups beendet jeden Link. Das Ticket erscheint in Zugriffsprotokollen, ist ohne die Sitzung aber nutzlos.
  • Höchstens zwei Übertragungen pro Knoten; dazu gelten Spool-Kapazität und freier Speicher, sonst 409 BACKUP_EXPORT_BUSY mit Retry-After: 60.
  • Eine Übertragung muss innerhalb von 5,5 Stunden fertig sein; ein bereiter Export lebt 24 Stunden.

Der Spool liegt unter /var/lib/nova-controlpanel/backup-exports (Eigentümer nova-controlpanel, 0700; Dateien <nbx>.part und <nbx>.bin, 0600). Der stündliche Aufbewahrungs-Timer bricht überfällige Übertragungen ab und entfernt abgelaufene Exporte.

Fehlercode (failure_code)Bedeutung
BACKUP_EXPORT_DIGEST_MISMATCHBytes passen nicht zur veröffentlichten Prüfsumme; ein manipuliertes Archiv wird nie bereitgestellt
BACKUP_EXPORT_NODE_FAILEDFehler auf dem Knoten
BACKUP_EXPORT_TIMEOUTZeitlimit überschritten
BACKUP_EXPORT_DISPATCH_FAILEDAuftrag konnte nicht an den Knoten übergeben werden

Grenzen dieser Version

  • Im realen Betrieb erprobt ist der Download bisher für Website-Backups mit Server-Schlüssel (Export, Link, byte-identischer Download, Range-Anfrage). Abgebrochene Übertragungen, Ablehnungen, Limits, das Aufräumen und die Voreinstellung bei Neuinstallationen sind dort noch nicht erprobt.
  • Verschlüsselung mit customer-key ist noch nicht wählbar.
  • Backups bleiben auf ihrem Knoten; externer Speicher ist nicht Teil von Version 1.0.
  • Die Backups eines aufgegebenen Knotens gelten als verloren; nur deine eigenen Kopien seiner Backup-Verzeichnisse bleiben erhalten.

Was du selbst sichern musst

Novas Backups schützen Kundenressourcen vor Fehlern der Kunden. Sie schützen nicht die Installation. Sichere verschlüsselt und außerhalb des Hosts:

WasWarum
$IN (Installer-Eingaben und Profile), die Stage-Verzeichnisse und die vertrauenswürdige Kopie des Releasenötig für jedes Upgrade, jeden Rollback und Rearm
$PKI (Agent-Fabric) und die Workspace-PKInötig, um Knoten einzubinden oder neu einzubinden
/etc/nova-controlpanel/ und /etc/nova-controlpanel-node-agent/ (inklusive Website-Backup-Schlüssel)Geheimnisse und Schlüssel; ohne den DNS-Verschlüsselungsschlüssel sind die TSIG-Schlüssel verloren
die Anwendungsdatenbank (mariadb-dump --single-transaction <db>)alle Mandanten, Ressourcen und das Audit
den Operations-Store als Backup-Datei der Operations-Sicherung (nie die laufenden Dateien operations.sqlite, -wal, -shm)Operations-Store (SQLite im WAL-Modus), siehe unten
/etc/nova-controlpanel/installation.json, /var/lib/nova-controlpanel/license/, die hinterlegten Schlüssellisten unter /etc/nova-controlpanel/Installations-ID, an die deine Lizenz gebunden ist, die installierte Lizenz und die Vertrauensanker
/var/lib/nova-controlpanel/updates/releases/<version>/ des aktiven Release und seines Vorgängers (Update-Kanal)das Installer-Journal verweist auf Kandidat, Profil und Stage dort
Website-Daten (/var/www/nova-controlpanel), Mail-Speicher, Kundendatenbanken und die Backup-Verzeichnisse der KnotenKundendaten

Operations-Store sichern

Der Store läuft im WAL-Modus; operations.sqlite-wal und -shm daneben sind normal. Kopiere die laufenden Dateien nie von Hand – eine Kopie während eines Schreibvorgangs ist inkonsistent. Die Operations-Sicherung schreibt den WAL zurück, erzeugt mit VACUUM INTO eine konsistente Datei und prüft deren Integrität:

sh
runuser -u nova-controlpanel-operations -- env OPERATIONS_DATABASE=/var/lib/nova-controlpanel/operations/operations.sqlite \
      OPERATIONS_BACKUP_DIRECTORY=/var/lib/nova-controlpanel/operations/backups php /opt/nova-controlpanel/operations/bin/backup.php create

Die Ausgabe nennt den Backup-Eintrag (Name operations-<UTC time>-<id>.sqlite, SHA-256, Integrität); kopiere diese Datei vom Host weg. Führe den Befehl wie gezeigt als Operations-Dienstkonto aus, damit die -wal- und -shm-Dateien ihren Eigentümer behalten. Für einen Snapshot auf Host-Ebene stoppe vorher die Operations-Timer und -Dienste oder verlass dich auf diese Backup-Datei.

Wichtig: Teste die Wiederherstellung dieser Sicherungen auf einem separaten Host, bevor du dich auf sie verlässt. Wie du daraus wiederherstellst, beschreibt Wiederherstellung.