Add verified backup and restore for shared data volumes

This commit is contained in:
2026-09-06 10:52:57 +03:00
parent 8d6f3bc3ea
commit b44ec646a0
4 changed files with 171 additions and 0 deletions
+16
View File
@@ -33,3 +33,19 @@ Yedek aracı SQLite snapshot oluşturur, bütünlük kontrolü yapar, referansl
`20260906_document_file_cleanup` migration'ı, mantıksal olarak silinmiş belgelerin fiziksel dosyalarını kalıcı kuyrukta tutar. Erişim kaydı ve temizleme görevi aynı transaction'da değişir; sonraki veritabanı açılışları temizliği yeniden dener. Dosya sistemi sorunu sürüyorsa kuyrukta kalır. Bu dosyalar aktif belge yedeğine dahil değildir; yedekte kuyruk kaydı bulunup dosya bulunmazsa yeniden açılışta ENOENT başarılı temizleme olarak ele alınır. Fiziksel silmenin anında tamamlandığı varsayılmamalı; işletim kontrolünde kuyruk büyüklüğü ve volume izinleri izlenmelidir.
Kaynak gözlem geçmişi `IHALEIST_SHARED_DATA_DIR/tender-history.sqlite` içinde saklanır (değişken yoksa `server/data`). Kullanıcı verisi yedek aracı bu depoyu kapsamaz; tam yayın/geri dönüş provasında ortak veri volume'uyla birlikte ayrıca yedeklenmelidir.
## Ortak veri volume'u için yedekleme
`server/backup-data-volume.mjs`, seçilen ortak veri dizinindeki normal dosyaları alt dizinleriyle kapsar. Dosya başlığından SQLite olarak tanınan depolar `VACUUM INTO` ile alınır; bağlı WAL/SHM dosyaları ayrı kopyalanmaz. Diğer dosyalar kopyalanır, boyut ve SHA-256 manifesti yazılır. Büyük dosyaların hash'i akışla hesaplanır. Sembolik bağlantılar, iç içe kaynak/hedef ve mevcut hedef dizinleri reddedilir.
Bütün kaynak yazıcılarını durdurduktan sonra, doğrulanmış gerçek volume yollarıyla:
```sh
node server/backup-data-volume.mjs backup /volume/shared /backups/shared-release-001 --offline
node server/backup-data-volume.mjs verify /backups/shared-release-001
node server/backup-data-volume.mjs restore /backups/shared-release-001 /recovery/shared-release-001
```
Bu araç seçilen dizin dışındaki worker depolarını, ortam değişkenlerini veya dağıtım yapılandırmasını kendiliğinden bulmaz. Kullanıcı belgelerinde veritabanı-dosya referans kontrolü için kullanıcı yedek aracını da kullanın. Tüm veri dizinleri ve kullanıcı yedeği aynı durdurulmuş sürümün seti olarak alınmalı; manifest zamanları tek başına servislerin durduğunu kanıtlamaz. Şifreleme/imzalama yapılmaz; backup erişimi ve dış saklama platformda yönetilir. Fiziksel boş dizinler ayrı manifest girdileri değildir.
`tests/data-volume-backup.test.mjs`, iki SQLite deposu, committed WAL verisi, alt dizin dosyası, restore, hedef üzerine yazmama, değişmiş/ek dosya ve sembolik bağlantı reddini doğrular. Gerçek üretim volume'larına bu komutlar henüz uygulanmadı; platform geri dönüş provası açık.