Kesiapan Pemulihan
Libre WebUI menyediakan inventaris pemulihan hanya-baca sebagai gerbang keamanan pertama. Inventaris melaporkan status dan kondisi yang memblokir cuplikan. Ia tidak mengunci pemeliharaan, menyalin, mengenkripsi, mengunggah, menghapus, memperbaiki, atau memulihkan data.
libre-webui recovery-check --json > recovery-inventory.json
Dari sumber, jalankan npm run build:backend lalu ganti libre-webui recovery-check dengan npm run recovery:check --. Instalasi npx/Homebrew memeriksa ~/.libre-webui; DATA_DIR menimpa lokasi.
Kode keluar 0 berarti tanpa penghalang, 1 laporan lengkap berisi penghalang, 2 argumen/koleksi gagal. Gunakan --data-dir PATH atau --database PATH. Inventaris volume hanya menerima DATA_DIR/data.sqlite biasa tanpa tautan simbolis/keras. --database dapat di luar DATA_DIR tetapi berkas harus reguler. Tanpa --data-dir, induk basis data menjadi akar data agar kunci, blob, dan plugin diinventarisasi bersama.
Runtime juga membaca plugin historis dari direktori plugins backend dan lokasi lama PLUGINS_DIR. Definisi khusus di luar volume memblokir cuplikan hanya-volume. Gunakan --legacy-plugins-dir PATH untuk lokasi tambahan.
docker exec libre-webui \
libre-webui recovery-check --json --data-dir /app/backend/data
Yang Diperiksa Inventaris
Laporan mencatat versi, ukuran SQLite/WAL/SHM, quick_check, kunci asing, sidik skema, tabel hilang, keterbacaan/penulisan direktori, sidik kunci, .encryption_key, plugin, blob, media, suara, teks dokumen, vektor, ACL, tugas Work, volume/PVC, pekerjaan media, pekerjaan persisten, aliran peristiwa, penghalang, dan pengecualian.
Setiap blob, vektor, selubung AES-GCM lama, suara tersimpan, muatan pekerjaan, dan peristiwa diautentikasi dalam batas agregat. Laporan tidak pernah mencetak kunci, JWT, kredensial, isi pengguna, atau jalur host literal.
Pemasangan hanya-baca memberi peringatan, bukan penghalang. Jangan jalankan aplikasi pada cuplikan hanya-baca.
Penghalang
Basis data hilang/rusak, skema tidak lengkap, kunci konflik, ciphertext rusak, batas terlampaui, direktori tidak terbaca, Work aktif, pekerjaan aktif, ruang kerja hilang, urutan peristiwa berlubang, plugin eksternal, atau pengendali yang tidak dapat memverifikasi ruang eksternal adalah penghalang. Hentikan pekerjaan dan perbaiki penyebab; jangan menyunting laporan.
Muatan terenkripsi diautentikasi terhadap identitas dan JSON kanonik. Referensi buram hanya diperiksa sintaks karena tidak ada repositori target otoritatif; referenceTargetsVerified tetap false.
Teks biasa dari skema lama tetap kompatibel karena belum memiliki penanda selubung. Selubung kanonik wajib diautentikasi. Bagian encryption.legacyCiphertext hanya memberi jumlah.
Jika users.email_lookup v4 ada, email dan token pencarian diverifikasi. Ketidaksesuaian memblokir cuplikan.
Batas Cadangan Saat Ini
Pembantu privat menghentikan aplikasi dan membuat arsip solo dari image, volume, dan lingkungan tepat. Manifest ditandatangani Ed25519, muatan dienkripsi AES-256-GCM. Arsip berisi SQLite, blob, vektor, pemilih runtime, dan konfigurasi terlindungi. libre-webui-restore hanya menerima volume baru dan memverifikasi sebelum menyalin.
Konfigurasi terlindungi mencakup batas waktu PostgreSQL/Redis, kuota blob, pemilih platform, awalan dan mode S3. Berkas dipublikasikan dengan mode 0600.
Arsip solo tidak mencakup volume Work, PVC, folder host, model Ollama, atau status penyedia. Team memakai alur PostgreSQL/S3/PGVector terkoordinasi. Redis dibangun ulang dari SQL.
Cadangan team memverifikasi semua pekerjaan/peristiwa dalam ekspor PostgreSQL. Setiap aliran harus memiliki 1..last_sequence; kursor global tidak boleh tertinggal. Celah kursor global boleh terjadi, urutan aliran harus utuh.
Jika PLUGINS_DIR di luar DATA_DIR, direktori dikecualikan dan harus dicadangkan tersendiri. Tautan simbolis atau JSON tidak terbaca memblokir.
Simpan kunci dalam pengelola rahasia, arsip di luar host, dan uji pemulihan pada lingkungan bersih.
Perintah Cadangan Ditandatangani dan Dienkripsi
Gunakan libre-webui terpasang atau npx --yes libre-webui@latest. Dari sumber, ganti libre-webui backup dengan npm run recovery:backup --. Image produksi menyediakan perintah yang sama di /usr/local/bin/libre-webui. Team memerlukan PostgreSQL 16 pg_dump dan pg_restore.
install -d -m 0700 /absolute/private/libre-backup-keys
libre-webui backup keygen \
--directory /absolute/private/libre-backup-keys
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
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
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
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
Jangan pulihkan ke sumber atau target berisi data. Jika pembatalan team tidak lengkap, bersihkan PostgreSQL dan semua versi objek/penanda hapus S3, lalu ulangi restore-team-preflight.
Latihan Pemulihan Terverifikasi Terjadwal
Latihan membuat cuplikan tenang, arsip sementara bertanda tangan, memulihkan ke target terisolasi, mencatat RTO/RPO, lalu menghapus artefak. Latihan bukan cadangan.
Aktifkan dengan RECOVERY_DRILL_INTERVAL_HOURS seperti 24. System menampilkan riwayat dan "Run drill now" melalui GET /api/recovery/drills dan POST /api/recovery/drills/run. RECOVERY_DRILL_HISTORY membatasi riwayat (bawaan 60).
Latihan mencakup solo dan menerapkan aturan yang sama dengan recovery-check. Team tetap memakai backup create-team.