Hoppa till huvudinnehåll

Återställningsberedskap

Libre WebUI erbjuder en skrivskyddad återställningsinventering som första säkerhetsgrind. Körningen recovery-check rapporterar känt tillstånd och blockerande villkor men låser, kopierar, krypterar, laddar upp, raderar, reparerar eller återställer ingenting.

libre-webui recovery-check --json > recovery-inventory.json

Från källkod kör du npm run build:backend en gång och ersätter libre-webui recovery-check med npm run recovery:check --. npx och Homebrew inspekterar normalt ~/.libre-webui; DATA_DIR och uttryckliga sökvägar överstyr.

Status 0 betyder inga blockerare, 1 en fullständig rapport med blockerare och 2 ogiltiga argument eller insamlingsfel. Använd --data-dir PATH via --data-dir eller --database PATH via --database för annan plats. Standardinventering accepterar bara DATA_DIR/data.sqlite och avvisar hårdlänkade, symlänkade eller icke-reguljära databas/WAL/SHM-filer. En explicit databas får ligga utanför DATA_DIR men måste vara reguljär och utan symlänkar; dess förälder blir datarot om ingen datakatalog anges.

Runtime läser även historiska insticksprogramsdefinitioner i backendpaketets plugins och den äldre backendrelativa platsen för relativ PLUGINS_DIR. Anpassade definitioner där blockerar en volymbackup. Paketerade installationer kan ange flera --legacy-plugins-dir PATH.

För privat Compose kör du kontrollen i den driftsatta containern:

docker exec libre-webui \
libre-webui recovery-check --json --data-dir /app/backend/data

Vad inventeringen kontrollerar

Den versionshanterade JSON-rapporten registrerar:

  • app-, Node.js-, operativsystems- och arkitekturversion;
  • SQLite/WAL/SHM-storlekar, quick_check, främmande nycklar, schemafingeravtryck, user version, saknade tabeller och no-follow-validering;
  • datakatalogens läs-/skrivbarhet, fil- och byteantal;
  • vald krypteringsnyckelkälla och oåterkalleligt 16-teckensfingeravtryck samt säker .encryption_key;
  • anpassade insticksprogram, lokala krypterade blobbar, media, röstreferenser, dokumenttext och legacy-/plattformvektorer med ACL;
  • full, begränsad autentisering av kanoniska blobbar, vektorenvelopes och chunk/checksum med tillgängliga nycklar;
  • autentisering av igenkännbara legacy AES-GCM-fält i chattar, anteckningar, dokument, preferenser, insticksprogramshemligheter, media, e-post och AAD-bundna röstfält;
  • Work-uppgifter, körningar, förhandsvisningar och förväntade Docker-volymer, Kubernetes-PVC:er eller hashade värdsökvägar med rätt etiketter och ägare;
  • mediejobb, beständiga jobb/försök, händelseströmmar och global cursor;
  • autentisering av krypterade jobb-/händelsepayloads och syntaxkontroll av begränsade ogenomskinliga referenser; samt
  • uttryckliga blockerare, varningar och data utanför appens datakatalog.

Rapporten innehåller aldrig nycklar, JWT-/sessionshemligheter, leverantörsuppgifter, insticksprogramsinnehåll, användarinnehåll eller bokstavliga värdsökvägar. En skrivskyddad datamontering ger en varning men blockerar inte inspektion; starta aldrig appen mot backupens skrivskyddade kopia.

Blockerare

Varje blockerare innebär misslyckad grind. Typiska orsaker är saknad/skadad databas, ofullständigt schema, saknad eller motstridig nyckel, skadad/oautentiserad chiffertext, överskridna verifieringsgränser, oläsbar katalog, länkad SQLite-källa, aktiva Work-/media-/beständiga jobb, saknad eller felmärkt arbetsyta, event-head-avvikelse eller sekvenslucka, externa insticksprogram eller en kontrollplan som inte kan verifiera externa arbetsytor. Stoppa arbete och lös beroenden; redigera inte rapporten för att dölja blockering.

Krypterade jobbpayloads autentiseras mot jobb-/händelseidentitet och kanonisk begränsad JSON. Ogenomskinliga referenser kan bara storleks- och syntaxkontrolleras eftersom ingen auktoritativ referensdatabas finns. referenceTargetsVerified blir false och en varning visas utan payloadvärden.

Äldre textfält saknar obligatorisk envelope-markör, så verklig legacy-klartext förblir läsbar och räknas inte som autentiserad chiffertext. Kanoniska envelopes autentiseras alltid; felaktiga tre-delade värden med envelopebred IV/tagg stängs säkert. Röstfält har entydig binär envelope och binds till profil, ägare och fält. encryption.legacyCiphertext visar antal och byte utan klartext.

Med schema v4 och users.email_lookup autentiseras varje e-post och dess domänseparerade nycklade lookup-token räknas om. Saknad, felaktig eller token på null blockerar; äldre databaser utan kolumnen stöds.

Nuvarande backupgräns

Hjälpverktyget för privat driftsättning stoppar appen vid behov och skapar ett integrerat soloarkiv från exakt image, volym och miljö. Manifestet signeras med Ed25519 och hela payloaden krypteras med operatörens AES-256-GCM-nyckel. SQLite, lokala blobbar, inbäddade vektorer, runtimeval och skyddad konfiguration ingår. Signatur, chifferchecksum och dekrypterad payload verifieras före publicering. libre-webui-restore accepterar bara en ny Docker-volym och skriver återställd konfiguration som privata filer i ny katalog.

Skyddad konfiguration omfattar PostgreSQL-pool- och timeoutvärden, Redis-timeout, blobkvoter, plattformsval och S3-prefix/adresseringsläge. Den ligger i signerad krypterad payload och återpubliceras med läge 0600.

Soloarkivet omfattar inte Docker Work-volymer, Kubernetes-PVC:er, värdbundna mappar, Ollama-modeller eller extern leverantörsstatus. Säkerhetskopiera dem separat. Teamflödet förseglar en PostgreSQL-export, exakt versionshanterade S3-chifferobjekt, PGVector-inventering, runtimekonfiguration och nyckelidentitet och verifierar mot rena mål. Redis-cache, presence, wake-ups och leases byggs om från SQL.

Team-backup autentiserar alla begränsade krypterade jobb-/eventpayloads i den exporterade snapshoten. Varje event stream måste innehålla 1..last_sequence, och global cursor får inte ligga efter största lagrade cursor. Återställning jämför hela resultatet mot signerad källinventering. Luckor mellan globala cursorvärden är tillåtna eftersom PostgreSQL identity-allokering inte är transaktionell; per-stream-sekvensen är kontraktet.

Om PLUGINS_DIR ligger utanför DATA_DIR markeras katalogen som utesluten och definitioner blockerar volymbackup tills en matchande snapshot ordnas. Symlänkad, oregelbunden eller oläsbar JSON är alltid blockerande. Beständiga jobb/events är aktiva i båda profiler; återställning blockerar aktiva försök och Work, verifierar payloads och sekvenser och bevarar SQL. Solo har inbäddad worker, team extern worker och Redis endast för väckning/fan-out.

För produktion: lagra krypterings- och JWT-hemligheter i hemlighetshanterare, håll krypterade arkiv utanför värden och testa återställning i ren kompatibel miljö. Inventeringen är preflight, inte lås eller fullständigt bevis för externa resurser.

Signerade och krypterade backupkommandon

Använd installerat libre-webui; ersätt libre-webui backup med npx --yes libre-webui@latest utan global installation eller npm run recovery:backup -- efter källbygge. Produktionsimagen har /usr/local/bin/libre-webui. Team kräver PostgreSQL 16 pg_dump/pg_restore.

Skapa nycklar privat och flytta privata nycklar till skyddad extern lagring:

install -d -m 0700 /absolute/private/libre-backup-keys
libre-webui backup keygen \
--directory /absolute/private/libre-backup-keys

Skapa och verifiera ett stilla soloarkiv:

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

Kör preflight och tillämpa bara på ny tom katalog:

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

Stoppa alla teamreplicas och workers och skapa samordnat arkiv:

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

Ladda miljö för en separat tom PostgreSQL-databas och tom versionshanterad S3-bucket. Preflight bevisar tomma mål utan publicering; apply återställer och verifierar schema, exakta S3-objekt, PGVector och skriver skyddad konfiguration:

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

Återställ aldrig till källdatabas, källbucket eller befintlig data-/konfigurationskatalog. Offentlig signeringsnyckel räcker inte för dekryptering. Om rollback i team är ofullständig betraktas båda mål som smutsiga: rensa PostgreSQL och alla S3-versioner/delete markers under exakt prefix och kör restore-team-preflight igen innan nytt försök.

Schemalagda verifierade återställningsövningar

En backup som aldrig återställts är hopp, inte återställning. En övning:

  1. Tar en stilla kopia av SQLite via online-backup-API och kopierar blobbar/filer; den vägrar medan ett beständigt jobb kör.
  2. Skapar signerat AES-256-GCM-arkiv med tillfälliga nycklar och full inventering.
  3. Verifierar, återställer isolerat och verifierar igen.
  4. Registrerar återställningstid som demonstrerad RTO och avstånd mellan lyckade övningar som möjlig RPO, och raderar sedan alla artifacts och nycklar.

Aktivera med RECOVERY_DRILL_INTERVAL_HOURS (exempelvis 24). En coordinator lease förhindrar dubbelkörning. System visar historik och “Run drill now” via GET /api/recovery/drills och POST /api/recovery/drills/run. Oövervakade fel aviserar alla administratörer; RECOVERY_DRILL_HISTORY begränsar historiken (standard 60).

Övningar gäller solo/SQLite. Team använder fortsatt backup create-team och operatörens återställningsrepetition.