Kopia zapasowa i odzyskiwanie po awarii
To jest aplikacja handlowa/finansowa: baza danych przechowuje konta handlowe, profile kopii, wyzwania prop-firm, łańcuchy audytu i pierścień klucza Data Protection. Utraty go traci pieniądze i łamie obowiązki regulacyjne/audytu. Zrób kopię zapasową i udowodnij, że przywrócenie działa.
Cele
| Metryka | Cel | Znaczenie |
|---|---|---|
| RPO (maks. strata danych) | ≤ 5 min | Użyj point-in-time recovery (continuous WAL), nie tylko nocne zrzuty. |
| RTO (maks. przestój) | ≤ 1 h | Czas na przywrócenie + ponowne umieszczenie aplikacji na przywróconą bazę danych. |
| Retencja kopii zapasowej | ≥ 35 dni | Pokrywa późno odkrytą uszkodzenie + ponad miesiąc okna audytu. |
| Dryl przywrócenia | miesięczny | Nieprzetestowana kopia zapasowa nie jest kopią zapasową. |
Co musi być zrobione kopią zapasową
- Baza danych Postgres — wszystkie dane aplikacji (pojedyncza logiczna baza danych
appdb). - Pierścień klucza Data Protection — utrwalony w bazie danych (
PersistKeysToDbContext<DataContext>) i PFX-szyfrowany poprzezApp:DataProtectionCertBase64. Jeździ wzdłuż kopii zapasowej DB, ale zagrażający certyfikat + jego hasło (App:DataProtectionCertPassword) to sekrety przechowywane poza DB — robić kopię zapasową w menedżerze sekretów. Bez certyfikatu nie możesz odszyfrować sekrety (hasła cTID, tokeny Open API, sekrety węzła, klucz AI) po przywróceniu.
Zarządzany Postgres (rekomendowany)
Oba ścieżki IaC chmury dostarcza zarządzany Postgres z wbudowanym PITR — włącz i zweryfikuj retencję:
- Azure (
deploy/azure/main.bicep, Flexible Server): ustawbackup.backupRetentionDays(≥ 35) igeoRedundantBackupgdzie zgodność wymaga. Przywróć za pomocą Point-in-time restore do nowego serwera, następnie zaktualizuj ciąg połączeniaappdbaplikacji. - AWS (
deploy/aws, RDS Postgres, Terraform): ustawbackup_retention_period(≥ 35) ibackup_window; utrzymuj automatyczne kopie zapasowe + opcjonalna kopia między regionami. Przywróć za pomocą RestoreDBInstanceToPointInTime, następnie wskaź aplikację ponownie.
Zarządzany PITR daje ≤ 5 min RPO bez zmian aplikacji — aplikacja tylko potrzebuje nowego ciągu połączenia (i istniejącej strategii ponowienia, patrz scaling.md, toleruje blip przejścia).
Samodzielnie hostowany Postgres
- Ciągłe archiwizowanie (PITR): włącz archiwizowanie WAL (
archive_mode=on,archive_commanddo magazynu obiektów) + okresowypg_basebackup. Przywróć = przywróć kopię zapasową bazy + powtórz WAL do czasu docelowego. To jest to, co spełnia cel RPO. - Logiczne zrzuty (drugorzędne): nocny
pg_dump -Fc appdbdo magazynu poza boxem do przenośności / częściowych przywróceń. Nie wystarczająca sam na osiągnięcie celu RPO. - Szyfruj kopie zapasowe spoczynku; przechowuj poza hostem bazy danych.
Dryl przywrócenia (uruchom miesięcznie)
- Przywróć najnowszą kopię zapasową (PITR do "teraz − 10 min") do scratch bazy danych, nie produkcji.
- Wskaż jednorazową instancję aplikacji (lub sesję psql) na nią.
- Zweryfikuj schemat:
dotnet ef migrations listpokazuje żadnych oczekujących migracji, aplikacja zaczyna się i staje się/health-gotowy. - Zweryfikuj łańcuch audytu jest nienaruszony i niezłamany poprzez
IAuditTrailVerifier(łańcuchAuditChainInterceptortamper-evident) — przerwany łańcuch po przywróceniu oznacza uszkodzenie lub manipulację. - Potwierdź, że odszyfrowanie sekretu działa (np. autoryzacja Open API odszyfrowuje) — potwierdza Data Protection cert + hasło zostały przywrócone poprawnie.
- Zanotuj wynik drilu (czas podjętych vs RTO) i zniszcz scratch bazę danych.
Zautomatyzuj kroki 1–4 w CI, gdzie środowisko pozwala (przywróć zasiane kopią zapasową do Testcontainer, uruchom dotnet ef migrations list + weryfikacja łańcucha audytu), więc regresja złamanej kopii zapasowej jest złapana, zanim jej potrzebujesz.
Po rzeczywistym przywróceniu
- Przywróć DB (PITR do tuż przed incydentem).
- Upewnij się, że Data Protection cert + hasło to ten sam przed incydentem.
- Wskaż aplikację ponownie
appdbciąg połączenia; rzuć repliki. - Startup uruchamia migracje pod lock doradcy (patrz scaling.md) — bezpieczne z N replikami.
- Nadzorcy kopii/prop-firm odzyskują ich leasingi i resync z brokera (cTrader to źródło prawdy), więc otwarte pozycje reconverge automatycznie — nic nie jest zaufane z zastanym stanem lokalnym.
- Zweryfikuj łańcuch audytu + punkt-check niedawne dane handlowe.