Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / İşletme

Açıklama

Yedekler ve geri yükleme

Filo yedek çalıştırıcısının veritabanlarını döküp şifrelemesi, doğrulaması ve budaması, geri yükleme ve isteğe bağlı arşivler.

Cluster ERP'nin tek bir yedek gerçekleştirimi vardır: python -m cluster_erp.server.backup_tenants çalıştırıcısı. Cron, kurucu, operatör konsolu ve kiracı ayrılışı hepsi onu çağırır. Bu sayfa neyi döktüğünü, bir dökümün nasıl doğrulanmış bir yedeğe dönüştüğünü, eski dökümlerin nasıl budandığını ve geri yüklemenin nasıl çalıştığını açıklar. Gerçek düğümlerin yedek konumları dağıtım verisidir ve güvenlik açıklama politikası gereği yazılmamıştır; sayfa bunun yerine backup_dir ayarını adlandırır.

Kısaca

  • Çalıştırıcı varsayılan veritabanını, her canlı kiracı veritabanını kendi bölgesinin sunucusundan ve kontrol düzlemi veritabanını döker (src/cluster_erp/server/backup_tenants.py:387-405).
  • Her dökümden önce döküm rolünün satır korumasını aşarak okuyabildiğini denetler; okuyamıyorsa adlandırılmış bir hatayla durur (src/cluster_erp/server/backup_tenants.py:105-144).
  • Bir döküm ancak pg_restore --list onu geri okuduktan sonra sayılır; geri okunamayan döküm .corrupt sonekiyle yeniden adlandırılır (src/cluster_erp/server/backup_tenants.py:147-173, src/cluster_erp/server/backup_tenants.py:287-304).
  • backup_encryption_key ayarlıyken döküm akışı diske giderken .dump.enc olarak şifrelenir (src/cluster_erp/server/backup_tenants.py:259-278).
  • Geri yükleme yalnız tablosu olmayan bir veritabanına yapılır (src/cluster_erp/server/backup_tenants.py:477-532).

Nasıl çalışır

Komutlar

Komut Etkisi Kaynak
python -m cluster_erp.server.backup_tenants Her hedefi yedekler. src/cluster_erp/server/backup_tenants.py:3
python -m cluster_erp.server.backup_tenants --only <db> Tek bir veritabanını yedekler. src/cluster_erp/server/backup_tenants.py:4
python -m cluster_erp.server.backup_tenants --restore <db> --file <dump> Tek bir dökümü tek bir veritabanına geri yükler. src/cluster_erp/server/backup_tenants.py:5
python -m cluster_erp.server.backup_tenants --list Her hedefi sekmeyle ayrılmış ad, ana makine ve bağlantı noktası olarak yazar. src/cluster_erp/server/backup_tenants.py:6, src/cluster_erp/server/backup_tenants.py:535-543

Herhangi bir veritabanı başarısız olduğunda çıkış kodu 1'dir; böylece cron başarısızlığı bildirir (src/cluster_erp/server/backup_tenants.py:570-573).

Yedek ve geri yükleme yolu

Diyagram bir veritabanının yolunu gösterir.

flowchart TD
  start["backup_all"] --> check["assert_dump_role_can_read_everything"]
  check --> dump["pg_dump -Fc"]
  dump --> enc{"backup_encryption_key ayarlı"}
  enc -- "evet" --> sealed["encrypt_stream ile .dump.enc"]
  enc -- "hayır" --> plain[".dump yaz"]
  sealed --> verify["pg_restore --list ile verify_dump"]
  plain --> verify
  verify -- "başarısız" --> corrupt[".corrupt olarak adlandır, bildir"]
  verify -- "geçti" --> prune["sayıya ve yaşa göre _prune"]
  rstart["restore_one"] --> rcheck["rol denetimi, veritabanı oluştur"]
  rcheck --> empty{"veritabanında tablo var"}
  empty -- "evet" --> refuse["reddet"]
  empty -- "hayır" --> restore["pg_restore --no-owner"]

Düz yazıyla:

  1. backup_all hedefleri sırayla dolaşır ve başarısızlıkları sayar; başarısız bir veritabanı diğerlerini durdurmaz (src/cluster_erp/server/backup_tenants.py:408-439).
  2. _dump_one döküm rolünü denetler, sonra bölgenin sunucusuna karşı pg_dump -Fc koşar (src/cluster_erp/server/backup_tenants.py:241-258).
  3. Şifreleme anahtarı varken pg_dump çıktısı parça parça bir .dump.enc dosyasına şifrelenir ve düz bir kopya yazılmaz (src/cluster_erp/server/backup_tenants.py:259-278). Anahtar yoksa döküm .dump olarak yazılır (src/cluster_erp/server/backup_tenants.py:279-286).
  4. verify_dump dökümü pg_restore --list ile listeler. Şifreli bir döküm doğrudan pg_restore içine çözülür ve her parça doğrulanır (src/cluster_erp/server/backup_tenants.py:147-173, src/cluster_erp/server/backup_tenants.py:187-238).
  5. Doğrulamayı geçemeyen döküm .corrupt ile yeniden adlandırılır; böylece hiçbir zaman tutulan bir yeri işgal etmez (src/cluster_erp/server/backup_tenants.py:287-304).
  6. İyi bir dökümden sonra _prune eski dökümleri yalnız en yeni backup_keep dosyanın ötesindeyse ve backup_keep_days sıfırdan büyükken o kadar günden eskiyse siler (src/cluster_erp/server/backup_tenants.py:369-384).
  7. restore_one rolü denetler, veritabanı yoksa oluşturur ve veritabanında zaten tablo varsa reddeder. Ardından pg_restore --no-owner koşar ve şifreli bir dökümü doğrudan onun içine çözer (src/cluster_erp/server/backup_tenants.py:477-532).

Döküm dosyaları backup_dir içinde veritabanı başına bir klasörde <db>__<UTC stamp>.dump veya .dump.enc olarak adlandırılır (src/cluster_erp/server/backup_tenants.py:242-243, src/cluster_erp/server/backup_tenants.py:264, src/cluster_erp/server/backup_tenants.py:280).

Çağıranlar

Çağıran Ne zaman Kaynak
deploy/cluster-erp.cron Her gün, servis kullanıcısı olarak. deploy/cluster-erp.cron:4-7
scripts/backup/pg_full_backup.sh ve .ps1 Çalıştırıcıyı verilen argümanlarla çağıran ince sarmalayıcılar. scripts/backup/pg_full_backup.sh:6-32, scripts/backup/pg_full_backup.ps1:1-7
deploy/install.sh Bir kurulumun veya yükseltmenin her göç adımından önce. deploy/install.sh:214-226
Operatör konsolu console_backup_enabled açıkken gerekçeyle POST /api/v1/vendor/tenants/{key}/backup; sonuç bir operatör eylemi olarak kaydedilir. src/cluster_erp/server/routes/vendor.py:690-737
offboard_tenant Bir kiracı kapatılmadan önce alınan dışa aktarım. src/cluster_erp/server/offboard_tenant.py:113-119

İsteğe bağlı arşivler

Betik Ne ekler Kaynak
scripts/backup/pg_wal_archive.sh Her WAL parçasını CLUSTER_ERP_WAL_ARCHIVE_DIR klasörüne kopyalayan, ortamında bir yedek anahtarı veya anahtar dosyası varsa mühürleyen PostgreSQL archive_command betiği. scripts/backup/pg_wal_archive.sh:1-40
haftalık temel yedek satırı WAL arşiviyle birlikte zamanda belirli bir ana kurtarmayı sağlayan, yorum hâlindeki pg_basebackup cron satırı. deploy/cluster-erp.cron:21-25
scripts/backup/pg_cold_storage_export.sh ve .ps1 --list çıktısındaki her hedef için audit_log, core_change_history, core_sequences ve documents_versions tablolarının, sağlama dosyası ve kendi saklama süresiyle CSV dışa aktarımı. scripts/backup/pg_cold_storage_export.sh:1-116
scripts/backup/pg_streaming_replica.conf Akışlı bir kopya için yalnız açıklamadan oluşan başvuru ayarları. scripts/backup/pg_streaming_replica.conf:1-30

Soğuk dışa aktarım bir veritabanında eksik olan tabloyu adıyla bildirir, diğerleriyle devam eder ve sonunda 1 koduyla çıkar (scripts/backup/pg_cold_storage_export.sh:72-79, scripts/backup/pg_cold_storage_export.sh:112-116). Cron satırı varsayılan olarak yorum hâlindedir (deploy/cluster-erp.cron:13-19).

Neden böyle kurulmuştur

  • Tek gerçekleştirim, çünkü tek bir veritabanının eski tekli pg_dump dökümü yedek gibi görünüyor ama müşteri verisinin hiçbirini içermiyordu (scripts/backup/pg_full_backup.sh:19-23).
  • Doğrulama "bir döküm var" ile "bir yedek var" arasını ayırır (src/cluster_erp/server/backup_tenants.py:147-160).
  • İki saklama koruması birden, çünkü yalnız sayı çalıştırıcı sık koştuğunda geçmişi kaybettirir, yalnız yaş ise çalıştırıcı durduğunda bir veritabanının klasörünü boşaltır (deploy/env.example:117-120).
  • Geri yükleme hiçbir zaman üzerine yazmaz, "so a typo cannot destroy a live customer" (src/cluster_erp/server/backup_tenants.py:21-24).

Kurallar ve sınırlar

  • Şifreli bir dökümün geri yüklenmesi aynı backup_encryption_key değerini ister (src/cluster_erp/server/backup_tenants.py:195-198).
  • Veritabanı adları her döküm veya geri yüklemeden önce DB_NAME_RE tanımlayıcı kalıbına uymalıdır (src/cluster_erp/server/backup_tenants.py:415-418, src/cluster_erp/server/backup_tenants.py:479-481).
  • tests/test_backup_retention.py ve tests/test_backup_pipe.py testleri budamayı ve şifreli boruyu kapsar.

Diğer parçalarla etkileşim

  • Silme defteri backup_dir altında durur ve her açılışta okunur. Defterin kaydettiği ama geri yüklenen veritabanının tamamlanmış göstermediği bir silme yeniden uygulanır ve günlükte RESTORE DETECTED görünür (src/cluster_erp/core/erasure_ledger.py:1-16, src/cluster_erp/server/app.py:255-300). Bkz. gizlilik ve ilgili kişi başvuruları.
  • İkamet denetimi uzak veya göreli bir backup_dir, wal_archive_dir ya da cold_storage_dir değerini bildirir (src/cluster_erp/server/residency_check.py:105-122, src/cluster_erp/server/residency_check.py:213-233). Bkz. veri ikameti denetimi.

Sınırlar ve açık noktalar

  • Çalıştırıcı yalnız veritabanlarını yedekler; storage_path altındaki ek dosyaları bir dökümün parçası değildir. Yedekleri: Koddan belirlenemedi. backup_tenants.py ve scripts/backup/ arandı.
  • Kapatılmış kiracılar artık hedef değildir, çünkü hedef sorgusu deleted_at değeri boş olan kiracıları seçer (src/cluster_erp/server/backup_tenants.py:395-401, src/cluster_erp/core/tenancy.py:550-575).

Tanıtılan terimler

Terim Kod tanımlayıcısı Tanım Türkçe terim Kaynak
filo yedek çalıştırıcısı backup_tenants Bir düğümün her veritabanını döken tek komut. filo yedek çalıştırıcısı src/cluster_erp/server/backup_tenants.py:1-31
karantinaya alınmış döküm .corrupt Doğrulamayı geçemeyen ve budamanın hiç saymaması için yeniden adlandırılan döküm. karantinaya alınmış döküm src/cluster_erp/server/backup_tenants.py:299-304
silme defteri erasure_ledger Tamamlanan silmelerin veritabanı dışında tutulan ve bir geri yüklemeden sonra yeniden oynatılan, yalnız eklenen kaydı. silme defteri src/cluster_erp/core/erasure_ledger.py:1-16

İlgili sayfalar


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13