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
+8
View File
@@ -689,3 +689,11 @@ Yerel QA yardımcı sunucusu geçici gerçek SQLite deposuna ilk gözlem ve 22 s
Gerçek geçmiş API'si üzerinden Giresun ayrıntısı → Kaynak değişiklik geçmişi → Geçmişi yükle akışında 20 kayıt; ilk Saat değişti başlığında Önce 11:00 / Sonra 10:00; Daha eski kayıtlar ile toplam 23 kayıt ve ilk gözlem; son sayfada devam düğmesinin kaybolması doğrulandı. Altı kontrol doğru. Kanıt qa-source-history.json. Veriler sentetik ve geçici; canlı resmi zeyilname kabulü değildir.
Yeni açılır başlıkların klavye erişimi için modal odak döngüsüne summary öğeleri eklendi. Üretim derlemesi geçti. Önceki 147 otomatik test bu yalnız QA/odak seçicisi turunda tekrarlanmadı. Ağ hata/yeniden deneme ve gerçek kaynak birikimi kabulü açık. Canlı yayın yapılmadı.
### D11 — Ortak veri volume'u yedeği ve geri yükleme
Kullanıcı yedeğine ek olarak bağımsız veri volume'u aracı eklendi. Seçilen dizinin normal dosyalarını alt dizinlerle kapsar; SQLite başlıklı dosyaları VACUUM INTO ile tutarlı kopyaya çevirir ve integrity_check uygular. İlgili WAL/SHM kopyalanmaz; committed WAL verisi snapshot'a dahil edilir. Diğer dosyalar boyut/akışlı SHA-256 ile doğrulanır. Manifest dışı dosya, eksik/değişmiş içerik, sembolik bağlantı, iç içe hedef ve mevcut hedef reddedilir. Hata durumunda yalnız yeni oluşturulan hedef temizlenir.
Testte iki depo (kalem ve kaynak geçmişi adlarıyla), committed WAL kaydı, alt dizin JSON dosyası yeni volume'a geri yüklendi. Üzerine yazma ve tahrif edilmiş yedek reddi geçti. Tüm 149 test başarılı. Üretim ön yüzü değişmediğinden derleme tekrarlanmadı. Runbook komutları ve sınırlar güncellendi.
Sınırlar: seçilen dizinler dışındaki worker depoları/config/env ayrıca envanter gerektirir; kullanıcı belgesi referans kontrolü kullanıcı yedek aracındadır. Gerçek servis durdurma, tüm volume'ların aynı sürüm setiyle alınması ve platformda geri dönüş yapılmadı. Tam D11 ve canlı yayın açık.
+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.