Ετοιμότητα ανάκτησης
Το Libre WebUI παρέχει read-only απόθεμα ανάκτησης ως πρώτη πύλη ασφάλειας backup/restore. Αναφέρει γνωστή κατάσταση και blockers, αλλά δεν αποκτά maintenance lock, δεν αντιγράφει, κρυπτογραφεί, ανεβάζει, διαγράφει, επιδιορθώνει ή επαναφέρει δεδομένα.
libre-webui recovery-check --json > recovery-inventory.json
Από source τρέξτε μία φορά npm run build:backend και αντικαταστήστε libre-webui recovery-check με npm run recovery:check --. npx και Homebrew ελέγχουν το ~/.libre-webui· DATA_DIR και ρητές διαδρομές το αλλάζουν.
Η εντολή recovery-check ελέγχει την ετοιμότητα· για το ολοκληρωμένο αντίγραφο ασφαλείας χρησιμοποιήστε libre-webui backup.
Status 0 σημαίνει χωρίς blockers, 1 πλήρης αναφορά με blockers και 2 άκυρα arguments ή σφάλμα συλλογής. Χρησιμοποιήστε --data-dir PATH ή --database PATH. Το προεπιλεγμένο απόθεμα δέχεται μόνο DATA_DIR/data.sqlite και απορρίπτει hardlinks, symlinks και μη regular αρχεία database/WAL/SHM. Ρητή --database μπορεί να είναι εκτός DATA_DIR, αλλά πρέπει να είναι regular χωρίς symlink· χωρίς --data-dir, ο parent της γίνεται data root.
Το runtime διαβάζει επίσης ιστορικούς ορισμούς από τον φάκελο plugins του backend και παλιά backend-relative θέση για σχετικό PLUGINS_DIR. Προσαρμοσμένοι ορισμοί εκεί μπλοκάρουν backup μόνο volume. Packaged εγκατάσταση μπορεί να δώσει πολλαπλά --legacy-plugins-dir PATH.
Για ιδιωτικό Compose τρέξτε μέσα στο container:
docker exec libre-webui \
libre-webui recovery-check --json --data-dir /app/backend/data
Τι ελέγχει το απόθεμα
Η versioned JSON αναφορά καταγράφει:
- versions εφαρμογής, Node.js, OS και αρχιτεκτονικής·
- μεγέθη SQLite/WAL/SHM,
quick_check, foreign keys, schema fingerprint, user version, ελλείποντες πίνακες και no-follow validation· - δυνατότητα ανάγνωσης/εγγραφής data directory, αριθμό αρχείων και bytes·
- πηγή κλειδιού και μη αναστρέψιμο fingerprint 16 χαρακτήρων και έλεγχο
.encryption_key· - custom plugins, κρυπτογραφημένα τοπικά blobs, media, αναφορές φωνής, κείμενο εγγράφων και legacy/platform vectors με ACL·
- πλήρη περιορισμένη πιστοποίηση canonical blobs, vector envelopes και chunks/checksums με διαθέσιμα κλειδιά·
- πιστοποίηση αναγνωρίσιμων legacy AES-GCM envelopes σε chats, notes, documents, preferences, plugin secrets, media, email και AAD-bound voice fields·
- Work tasks/runs/previews και αναμενόμενα Docker volumes, Kubernetes PVC ή hashed host paths με σωστό owner·
- media jobs, durable jobs/attempts, event streams και global cursor·
- πιστοποίηση κρυπτογραφημένων payloads και syntax validation opaque references· και
- ρητά blockers, warnings και δεδομένα εκτός data directory.
Δεν περιλαμβάνονται κλειδιά, JWT/session secrets, credentials, plugin/user content ή πραγματικά host paths. Read-only mount δίνει warning, όχι blocker, αλλά μην ξεκινάτε εφαρμογή πάνω στο snapshot.
Blockers
Κάθε blocker αποτυγχάνει την πύλη. Συνήθεις αιτίες: ελλιπής/κατεστραμμένη βάση, incomplete schema, ελλιπές ή αντικρουόμενο κλειδί, κατεστραμμένο ciphertext, υπέρβαση ορίων, μη αναγνώσιμο directory, linked SQLite, ενεργό Work/media/durable job, ελλιπής ή λάθος labeled χώρος, event-head mismatch/sequence gap, custom plugin εκτός data directory ή control plane που δεν επαληθεύει εξωτερικούς χώρους. Σταματήστε εργασία και διορθώστε εξαρτήσεις· μην αλλάζετε την αναφορά.
Κρυπτογραφημένα payloads πιστοποιούνται με ταυτότητα job/event και canonical bounded JSON. Opaque references ελέγχονται μόνο σε μέγεθος και σύνταξη επειδή δεν υπάρχει authoritative repository. Το referenceTargetsVerified γίνεται false και εμφανίζεται warning χωρίς payload values.
Legacy text fields προϋπάρχουν marker envelope, άρα γνήσιο παλιό plaintext παραμένει αναγνώσιμο και δεν μετρά ως authenticated ciphertext. Canonical envelopes πιστοποιούνται πάντα· κακοσχηματισμένες τριμερείς τιμές αποτυγχάνουν κλειστά. Voice fields έχουν ξεκάθαρο binary envelope δεμένο σε profile/owner/field. Το encryption.legacyCiphertext αναφέρει counts/bytes χωρίς plaintext.
Με schema v4 και users.email_lookup, πιστοποιείται κάθε email και επανυπολογίζεται domain-separated keyed token. Ελλιπές, λάθος ή token σε null email μπλοκάρει· παλιές βάσεις χωρίς στήλη παραμένουν συμβατές.
Τρέχον όριο backup
Ο helper ιδιωτικής εγκατάστασης σταματά την εφαρμογή αν χρειάζεται και δημιουργεί integrated solo archive από ακριβές image, volume και environment. Το manifest υπογράφεται Ed25519 και το payload κρυπτογραφείται AES-256-GCM με κλειδί operator. Περιέχει SQLite, τοπικά blobs, embedded vectors, runtime selectors και προστατευμένο config. Signature, ciphertext checksum και decrypted payload επαληθεύονται πριν δημοσίευση. Το libre-webui-restore δέχεται μόνο νέο Docker volume και γράφει config ως private files σε νέο directory.
Προστατευμένο config περιλαμβάνει PostgreSQL pool/timeouts, Redis timeout, blob quotas, platform selectors και S3 prefix/addressing. Είναι στο signed/encrypted payload και δημοσιεύεται ως 0600.
Solo archive δεν περιέχει Work volumes, Kubernetes PVC, host folders, Ollama models ή external provider state. Κρατήστε ξεχωριστό backup. Team flow σφραγίζει PostgreSQL export, ακριβή versioned S3 objects, PGVector inventory, runtime config και key identity και επαληθεύει καθαρούς στόχους. Redis cache/presence/wake-up/leases ξαναχτίζονται από SQL.
Team backup πιστοποιεί όλα τα bounded encrypted job/event payloads. Κάθε stream πρέπει να έχει 1..last_sequence και global cursor να μην υστερεί. Restore συγκρίνει πλήρες αποτέλεσμα με signed source inventory. Gaps μεταξύ global cursors επιτρέπονται επειδή PostgreSQL identity allocation δεν είναι transactional· per-stream συνέχεια είναι η σύμβαση.
Αν PLUGINS_DIR είναι έξω από DATA_DIR, σημειώνεται excluded και ορισμοί μπλοκάρουν volume backup ώσπου να υπάρχει αντίστοιχο snapshot. Symlink, non-regular ή unreadable JSON είναι blockers. Durable jobs/events είναι ενεργά και στα δύο profiles· recovery μπλοκάρει ενεργές προσπάθειες και Work, επικυρώνει payload/sequence και διατηρεί SQL. Solo έχει embedded worker, team external worker και Redis μόνο για wake-up/fan-out.
Σε παραγωγή κρατήστε encryption/JWT secrets σε secret manager, encrypted archives off-host και δοκιμάστε restore σε καθαρό συμβατό περιβάλλον. Το inventory είναι preflight snapshot, όχι lock ή πλήρης απόδειξη εξωτερικών πόρων.
Εντολές υπογεγραμμένου και κρυπτογραφημένου backup
Χρησιμοποιήστε εγκατεστημένο libre-webui· χωρίς global εγκατάσταση npx --yes libre-webui@latest, από source npm run recovery:backup --. Το production image έχει /usr/local/bin/libre-webui. Team απαιτεί PostgreSQL 16 pg_dump και pg_restore.
Δημιουργήστε κλειδιά σε ιδιωτικό directory:
install -d -m 0700 /absolute/private/libre-backup-keys
libre-webui backup keygen \
--directory /absolute/private/libre-backup-keys
Δημιουργία και επαλήθευση solo archive:
libre-webui backup create \
--offline \
--data-dir /absolute/path/to/libre-data \
--output /absolute/backups/libre-solo.lwbackup \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-private-key /absolute/private/libre-backup-keys/backup-signing-private.pem
libre-webui backup verify \
--archive /absolute/backups/libre-solo.lwbackup \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-public-key /absolute/private/libre-backup-keys/backup-signing-public.pem
Preflight και apply μόνο σε νέο κενό directory:
libre-webui backup restore-preflight \
--archive /absolute/backups/libre-solo.lwbackup \
--target /absolute/restore/libre-data \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-public-key /absolute/private/libre-backup-keys/backup-signing-public.pem
libre-webui backup restore-apply \
--archive /absolute/backups/libre-solo.lwbackup \
--target /absolute/restore/libre-data \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-public-key /absolute/private/libre-backup-keys/backup-signing-public.pem
libre-webui backup restore-verify \
--target /absolute/restore/libre-data
Για team σταματήστε replicas/workers:
libre-webui backup create-team \
--offline \
--output /absolute/backups/libre-team.lwbackup \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-private-key /absolute/private/libre-backup-keys/backup-signing-private.pem
Φορτώστε environment για ξεχωριστή κενή PostgreSQL και versioned S3 bucket. Preflight αποδεικνύει κενούς στόχους χωρίς δημοσίευση· apply επαναφέρει και επαληθεύει schema, ακριβή S3 objects και PGVector και γράφει προστατευμένο config:
libre-webui backup restore-team-preflight \
--archive /absolute/backups/libre-team.lwbackup \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-public-key /absolute/private/libre-backup-keys/backup-signing-public.pem
libre-webui backup restore-team-apply \
--archive /absolute/backups/libre-team.lwbackup \
--configuration-output /absolute/restore/libre-team-config \
--encryption-key /absolute/private/libre-backup-keys/backup-encryption.key \
--signing-public-key /absolute/private/libre-backup-keys/backup-signing-public.pem
Μην επαναφέρετε σε source database/bucket ή υπάρχον data/config directory. Public signing key δεν αρκεί για decrypt. Αν team rollback είναι incomplete, θεωρήστε και τους δύο στόχους βρώμικους: καθαρίστε PostgreSQL και όλες τις S3 versions/delete markers κάτω από ακριβές prefix και ξανατρέξτε restore-team-preflight.
Προγραμματισμένες επαληθευμένες ασκήσεις ανάκτησης
Backup που δεν αποκαταστάθηκε είναι ελπίδα, όχι ανάκτηση. Μια άσκηση:
- Παίρνει quiescent snapshot SQLite μέσω online backup API και αντιγράφει blobs/files· αρνείται ενεργό durable job.
- Δημιουργεί signed AES-256-GCM archive με προσωρινά κλειδιά και πλήρες inventory.
- Επαληθεύει, επαναφέρει απομονωμένα και επαληθεύει ξανά.
- Καταγράφει διάρκεια ως RTO και διάστημα επιτυχιών ως RPO και διαγράφει artifacts/keys.
Ενεργοποιήστε με RECOVERY_DRILL_INTERVAL_HOURS (π.χ. 24). Coordinator lease αποτρέπει διπλή εκτέλεση. Το System δείχνει ιστορικό και «Run drill now» μέσω GET /api/recovery/drills και POST /api/recovery/drills/run. Ανεπιτήρητη αποτυχία ειδοποιεί admins· RECOVERY_DRILL_HISTORY περιορίζει ιστορικό (60).
Οι ασκήσεις καλύπτουν solo/SQLite. Το team συνεχίζει backup create-team και runbook operator.