Zum Inhalt springen

Backups und Wiederherstellung

Eine Installation von Labtagon AI OS hält ihren Zustand an drei Stellen: Postgres, der Objektspeicher mit den Bytes der Dateien, und die Schlüssel. Eine Wiederherstellung braucht alle drei, aus Zeitpunkten, die zusammenpassen.

Postgres enthält alles außer den Bytes der Dateien: Chats, Tool-Server mit ihren Versionen und Code-Bundles, Freigaben, Einstellungen, Erinnerungen, das Audit-Log und die gespeicherten Anmeldungen und Schlüssel der Tool-Server als age-Chiffrat.

Das Chart legt einen CloudNativePG-Cluster an (postgres.create), richtet dafür aber kein Backup ein. Richte die Backups von CloudNativePG selbst ein, mit fortlaufender WAL-Archivierung, damit du auf einen Zeitpunkt zurücksetzen kannst, auf Speicher außerhalb des Clusters.

  • Bewahre die Backups mindestens so lange auf wie storage.graceDays (standardmäßig 90 Tage), oder setz diesen Wert auf deine Aufbewahrung herunter: Ein Objekt, das keine Datei mehr nennt, bleibt so lange im Speicher, damit eine Wiederherstellung von Postgres innerhalb dieser Zeit jede Datei noch findet.
  • Die Datenbank heißt ai-os und gehört ai-os; die Ressource Database des Charts behält sie, wenn das Release entfernt wird (databaseReclaimPolicy: retain).
  • Mit postgres.create: false sind dein Postgres und seine Backups deine Sache.

Die Bytes der Dateien liegen in Garage oder deinem S3, verschlüsselt, bevor sie AI OS verlassen (ADR 0093): Der Bucket, seine Volumes und jede Kopie enthalten nur Chiffrat.

  • Garage macht alle 6 Stunden einen Snapshot seiner Metadaten (storage.garage.metadataSnapshotInterval) in sein Metadaten-Volume. Mach danach Volume-Snapshots seiner Volumes.
  • Eine externe Kopie: storage.offsite.enabled: true lässt rclone nach Zeitplan laufen (standardmäßig 17 3 * * *) und kopiert neue Objekte in ein anderes S3. Dort löscht es nichts; ein Bucket, in den man nur schreiben kann und der Objekte sperrt, passt dazu.
  • Externes S3: Nutze die Versionierung oder Replikation deines Anbieters.
  • Mit storage.mode: postgres liegen die Dateien in Postgres, und sein Backup umfasst sie.
Schlüssel Wo Ohne ihn
age-identity (Schlüssel-Secret) keys.existingSecret, am besten aus OpenBao Keine gespeicherte Anmeldung und kein Schlüssel eines Tool-Servers lässt sich entschlüsseln; Personen müssen sie neu eingeben.
approval-signing-key, approval-verify-key Schlüssel-Secret Jede signierte Freigabe ist ungültig. Die Schlüssel der LLM-Provider sind mit einem vom Signaturschlüssel abgeleiteten Schlüssel verschlüsselt: Auch sie lassen sich nicht mehr lesen.
agent-token-key Schlüssel-Secret Die Tokens, die AI OS an Clients ausgegeben hat, lassen sich nicht mehr prüfen.
egress-ca.crt, egress-ca.key, session-key Schlüssel-Secret Bewahre sie mit den anderen auf; die Hinweise des Charts nennen, wie jeder entsteht.
Speicherschlüssel storage-key (und previous-keys) <release>-storage-key oder storage.encryption.existingSecret Keine Datei lässt sich lesen.

Bewahre sie getrennt vom Datenbank-Backup auf: in OpenBao (keys.externalSecret, storage.encryption.externalSecret) oder an einem anderen sicheren Ort. Hat das Chart den Speicherschlüssel selbst angelegt, kopiere das Secret <release>-storage-key gleich nach der Installation aus dem Cluster. Das Chart behält dieses Secret, wenn das Release entfernt wird.

  1. Postgres auf den gewählten Zeitpunkt, mit der Point-in-Time-Recovery von CloudNativePG.
  2. Die Objekte: bei Garage seine Volumes, wie sie sind, oder auf jedem Knoten den Volume-Snapshot nach einem Metadaten-Snapshot (Knoten anhalten, den Snapshot an die Stelle der Metadaten-Datenbank legen, starten, garage repair -a --yes tables ausführen); mit einer externen Kopie diese zurück in den Bucket kopieren (rclone copy, nichts gelöscht).
  3. Dieselben Schlüssel, auch den Speicherschlüssel und seine früheren Schlüssel, in ihren Secrets.
  4. Prüfen, dass jede Datei ein Objekt nennt, das der Speicher hat, und dass Dateien sich öffnen. Objekte, die die wiederhergestellte Datenbank nicht kennt, bleiben für die Karenzzeit und werden dann entfernt.

Ein Garage mit einem Knoten lässt sich nicht einfach in ein HA-Garage zurückspielen: Starte das HA-Garage, kopiere den Bucket hinüber, dann schalte um.

Ein Tool-Server mit dauerhafter Arbeit hält sie auf einem eigenen Volume (work-<name>) im Namespace seines Besitzers. Für ein Backup-Werkzeug, das nach Labels auswählt, setzt instances.workVolumeLabels Labels auf diese Volumes und die Pods, die sie einbinden, zum Beispiel { velero/backup: enabled }.