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 --listonu geri okuduktan sonra sayılır; geri okunamayan döküm.corruptsonekiyle 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_keyayarlıyken döküm akışı diske giderken.dump.encolarak ş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:
backup_allhedefleri 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)._dump_onedöküm rolünü denetler, sonra bölgenin sunucusuna karşıpg_dump -Fckoşar (src/cluster_erp/server/backup_tenants.py:241-258).- Şifreleme anahtarı varken
pg_dumpçıktısı parça parça bir.dump.encdosyasına şifrelenir ve düz bir kopya yazılmaz (src/cluster_erp/server/backup_tenants.py:259-278). Anahtar yoksa döküm.dumpolarak yazılır (src/cluster_erp/server/backup_tenants.py:279-286). verify_dumpdökümüpg_restore --listile listeler. Şifreli bir döküm doğrudanpg_restoreiç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).- Doğrulamayı geçemeyen döküm
.corruptile 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). - İyi bir dökümden sonra
_pruneeski dökümleri yalnız en yenibackup_keepdosyanın ötesindeyse vebackup_keep_dayssıfırdan büyükken o kadar günden eskiyse siler (src/cluster_erp/server/backup_tenants.py:369-384). restore_onerolü denetler, veritabanı yoksa oluşturur ve veritabanında zaten tablo varsa reddeder. Ardındanpg_restore --no-ownerkoş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_dumpdö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_keydeğerini ister (src/cluster_erp/server/backup_tenants.py:195-198). - Veritabanı adları her döküm veya geri yüklemeden önce
DB_NAME_REtanı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.pyvetests/test_backup_pipe.pytestleri budamayı ve şifreli boruyu kapsar.
Diğer parçalarla etkileşim¶
- Silme defteri
backup_diraltı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ükteRESTORE DETECTEDgö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_dirya dacold_storage_dirdeğ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_pathaltındaki ek dosyaları bir dökümün parçası değildir. Yedekleri: Koddan belirlenemedi.backup_tenants.pyvescripts/backup/arandı. - Kapatılmış kiracılar artık hedef değildir, çünkü hedef sorgusu
deleted_atdeğ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ı.