20. modulBackup, katasztrófa-helyreállítás és GDPR
Cloudflare for Devs · 20. modul

Backup, katasztrófa-helyreállítás és GDPR

A kurzus során minden rétegnél felmerült valami mentés-szerű (Time Travel, R2, export), de sosem állt össze képpé. Itt összeáll: mi a helyreállítási terved rétegenként, mit exportálsz rendszeresen, hogyan törölsz egy tenantot nyomtalanul, és mit kell tudnod adatfeldolgozóként EU-s ügyfeleknél.

20.1Előbb a két szám: RPO és RTO

Mielőtt bármit beállítanál, két kérdésre kell választ adnod — és ezek üzleti, nem technikai döntések:

Egy tipikus B2B SaaS-nál reális kiindulás: RPO ≈ 1 óra, RTO ≈ 4 óra. Ezt írd le, mert innentől minden döntés (mennyire gyakran exportálsz, mit automatizálsz) ebből következik — és mert egy enterprise ügyfél előbb-utóbb megkérdezi.

20.2Mi romolhat el? — négy forgatókönyv

ForgatókönyvValószínűségMi véd
1. Alkalmazás-hiba — rossz migráció, hibás tömeges update töröl/felülír adatota leggyakoribbTime Travel / PITR, expand–contract fegyelem (8. modul), pre-flight ellenőrzések
2. Emberi hiba — valaki éles adatbázison futtat egy DELETE-etgyakorijogosultság-korlátozás, gated prod-hozzáférés, PITR
3. Fiók-kompromittálás — kiszivárgott API-token, belső támadóritka, de végzetesfiókon kívüli export, token-hatókörök, 2FA, audit-log
4. Platform-kiesés — a szolgáltatás vagy egy komponense elérhetetlenritkaezt jellemzően kivárod; a kérdés inkább a kommunikáció
A legfontosabb felismerés: a platform beépített mentései (Time Travel, replikáció) az 1. és 2. forgatókönyvre kiválóak — de a 3.-ra nem. Ha valaki hozzáfér a fiókodhoz, a fiókon belüli mentéseket is törölni tudja. Ezért kell legalább egy olyan másolat, ami kívül van: másik Cloudflare-fiók, S3, vagy akár egy titkosított másolat egy külön szolgáltatónál. Ez az a lépés, amit szinte mindenki kihagy, amíg baj nem lesz.

20.3A helyreállítási terv rétegenként

RétegBeépített védelemAmit neked kell hozzátenni
D1Time Travel: visszaállítás múltbeli időpontra (fizetős csomagon 30 napig)rendszeres wrangler d1 export fiókon kívülre; nagy flottánál a registry alapján (5b. modul)
Postgres (Aurora, Hyperdrive mögött)a szolgáltatód PITR-je és snapshotjaiez marad a megszokott rutinod — plusz teszteld a visszaállítást
R2tartós tárolás; bucket-verziózás bekapcsolhatófontos bucketnél verziózás + lifecycle; kritikus adatnál másolat másik bucketbe/fiókba
KVreplikáció (nem backup!)ide ne tegyél olyat, ami nem újraépíthető — cache és config való bele (6. modul)
Durable Objectstartós, replikált tárha üzleti igazság van benne (számlálók, foglalások), írj rendszeres exportot D1-be/R2-be
AI Search indexderivált adat: az R2-ből és a DB-ből újraépíthető (15b. modul) — írd meg az újraindexelő Workflow-t előre
Kód és konfigversion-history, rollback (8. modul)a wrangler-konfig a repóban (12. modul); a secretek külön, biztonságos helyen dokumentálva
Secreteklista arról, milyen secretek kellenek (secrets.required), és honnan szerezhetők be újra

A heti export — a minimum, amit meg kell csinálni

Egy cron-Worker (7. modul), ami hetente kimenti a lényeget egy külön helyre. Ez a legkisebb munka, ami a 3. forgatókönyv ellen véd:

a mentési Workflow váza
export class BackupWorkflow extends WorkflowEntrypoint {
  async run(event, step) {
    const stamp = event.payload.stamp;      // a cron adja, determinisztikus ID-hez

    // 1) D1 SQL-export
    const dump = await step.do("export-d1", () => exportDatabase(this.env));

    // 2) titkosítás — a mentés is érzékeny adat!
    const enc = await step.do("encrypt", () =>
      encryptAesGcm(dump, this.env.BACKUP_KEY));

    // 3) elhelyezés FIÓKON KÍVÜL (S3 vagy másik fiók R2-je)
    await step.do("upload-offsite",
      { retries: { limit: 5, delay: "30 seconds", backoff: "exponential" } },
      () => putOffsite(this.env, `backups/${stamp}/db.sql.enc`, enc));

    // 4) ellenőrzés: a feltöltött méret és hash stimmel-e
    await step.do("verify", () => verifyOffsite(this.env, stamp));

    // 5) értesítés — ha ez elmarad, tudni akarsz róla
    await step.do("notify", () => notifySlack(this.env, `backup ok: ${stamp}`));
  }
}
A mentés, amit nem próbáltál visszaállítani, nem mentés. Tegyél a naptáradba negyedévente egy órát: fogj egy exportot, töltsd be egy friss staging-adatbázisba, és indítsd el rá az appot. Ez a gyakorlat két dolgot ad: kiderül, ha az export hiányos (pl. kimaradt egy tábla), és a csapat begyakorolja a folyamatot — mert éles helyzetben nem olvasni fogtok dokumentációt.

20.4Runbook: mit csinálsz, amikor baj van?

Írd meg előre, egy oldalban, és tedd a repóba. A váza:

  1. Állítsd meg a vérzést. Ha kód okozza: wrangler rollback (8. modul, másodpercek). Ha adatot ír felül: kapcsold ki az érintett funkciót (feature flag, 16. modul) vagy tedd karbantartási módba.
  2. Mérd fel a kárt. Mikor kezdődött? Melyik tenantokat érinti? Melyik rétegben van a hiba (kód / séma / adat)? A verzió-korrelált logok itt segítenek (9. modul).
  3. Döntsd el a stratégiát. Fix-forward (javító szkript) vagy restore? Az esetek többségében a fix-forward a jobb, mert a restore visszaviszi a hiba óta érkezett legitim adatot is (8. modul).
  4. Ha restore: lehetőleg szűkítve. Per-tenant D1-nél csak az érintett tenant Time Travelje (5b. modul!) — ez a minta egyik legszebb haszna. Shared DB-nél: állítsd vissza egy másolatba, és onnan emeld át a hiányzó rekordokat, ne az egész éles bázist told vissza.
  5. Kommunikálj. Statusz-oldal, érintett ügyfelek értesítése. GDPR-releváns incidensnél az órák számítanak (20.6).
  6. Utóelemzés. Mi hiányzott a védvonalakból? Kerüljön be pre-flight ellenőrzésbe, tesztbe vagy riasztásba (8. modul playbookja).

20.5Tenant-törlés: a teljes lista

Amikor egy ügyfél távozik (vagy GDPR-törlést kér), az adatai sok helyen vannak szétszórva. Ez a lista azért fontos, mert a hiányzó tétel az, ami később kellemetlen kérdéssé válik:

HolMit kell tenniAutomatizálható?
Adatbázis (shared)DELETE minden táblából tenant_id szerint — vagy anonimizálás, ha számviteli megőrzési kötelezettség vanigen (kaszkád vagy szkript)
Adatbázis (per-tenant D1)az egész adatbázis törlése — egy hívás (5b. modul)igen, triviálisan
R2 objektumokprefix szerinti listázás + törlés (tenantId/ előtag)igen — ezért érdemes tenant-prefixes kulcsokat használni!
AI Search indexinstance törlése (15b. modul)igen, egy hívás
KV-bejegyzésektenant-prefixes kulcsok törlése (cache, config, session)igen, ha a kulcsséma prefixes
Durable Objectsa tenant objektumainak állapotaigen, ha a névséma tartalmazza a tenantot
Queue-ban álló üzeneteka feldolgozó ellenőrizze, létezik-e még a tenantigen (védekező kód)
Logoka retención belül elévülnek (Workers Logs: 7 nap)automatikus
Analytics Engineaggregált adat — a megőrzési politikád szerinttervezendő
Külső rendszerekerror tracker, számlázó, CRM, email-szolgáltatóAPI-val, de ezt szokták kihagyni
Mentéseka rotációval évülnek el — dokumentáld a határidőtpolitikai döntés
Két tervezési döntés, ami a törlést triviálissá teszi — érdemes a migráció elején meghozni őket: ① minden erőforrás-kulcs tenant-prefixes legyen (R2: acme/…, KV: tenant:acme:…, DO-név: acme:…), így minden törlés egy prefix-bejárás; ② a törlés maga legyen Workflow (7. modul), lépésenkénti naplózással — így auditálható, hogy mi mikor törlődött, és egy félbeszakadt törlés folytatható. Az „ügyfél törlésének igazolása" ráadásul gyakran szerződéses elvárás.

20.6GDPR és adatvédelem — a fejlesztőt érintő rész

Nem jogi tanácsadás, hanem az a néhány dolog, ami a te architektúrádban dől el (a szerződéses részhez kérj jogi segítséget):

KérdésMi a platform válaszaAmit neked kell
Hol tárolódik az adat?jurisdiction-beállítás létrehozáskor: D1 (--jurisdiction eu), R2, Durable Objects (5b, 6, 16. modul)EU-s ügyfélnél EU-jurisdiction — és tudd, hogy ez létrehozáskor dől el, utólag nem állítható
Adatfeldolgozói szerződés (DPA)a Cloudflare adatfeldolgozóként áll szerződésben veledaz alfeldolgozók listáját tartsd karban — az AI-szolgáltatód is az!
Törléshez való joga törlési műveletek adottaka 20.5 lista végigvitele, igazolással
Hordozhatóság (export)„töltsd le az adataimat" funkció: JSON/CSV export R2-be, aláírt letöltő linkkel (6. modul)
Adatminimalizálás a logokbana strukturált logolás a tiéd (9. modul)ne logolj személyes adatot: azonosítót igen, email-t/nevet ne; a 7 napos retenció itt előny
AI és személyes adatAI Gateway DLP-funkciók (15b. modul)döntsd el, mi mehet ki modellhez; dokumentáld, melyik szolgáltató melyik adatot látja
Incidens-bejelentésrunbook: ki dönt, kit értesítesz, milyen határidővel (a GDPR 72 órás bejelentési szabálya)
Az AI-vonalra külön figyelj: abban a pillanatban, hogy egy AI-funkciót élesítesz, a felhasználói tartalom egy újabb feldolgozóhoz kerül. Ezt három helyen kell rendezni: az alfeldolgozói listádban (az ügyfeleid felé), a beállításokban (melyik modell, melyik régió), és a kódban (mi az, amit nem küldesz ki — pl. maszkolt személyes adatok). A 15b. modul Gateway-logolása itt kétélű: hasznos hibakereséshez, de a logokban is ott lesz a prompt — a megőrzési idő és a hozzáférés legyen tudatos döntés.

20.7Amit érdemes negyedévente elvégezni

20.8Ellenőrizd magad

  1. Miért nem elég a platform beépített mentése (Time Travel, replikáció)?
    Válasz

    Mert a fiókon belül van: alkalmazás- és emberi hiba ellen kiváló, de fiók-kompromittálás esetén a támadó ezeket is elérheti. Ezért kell legalább egy titkosított, fiókon kívüli másolat (másik fiók, másik szolgáltató).

  2. Éles adatbázisban egy hibás tömeges update elrontott adatot. Mi a helyes sorrend, és miért nem a restore az első lépés?
    Válasz

    Először állítsd meg a vérzést (rollback/feature flag), aztán mérd fel a kárt, és jellemzően fix-forward javító szkripttel dolgozz. A teljes restore visszaviszi a hiba óta érkezett legitim adatot is; ha mégis kell, szűkítsd (per-tenant Time Travel) vagy másolatba állíts vissza és onnan emelj át.

  3. Milyen két tervezési döntés teszi triviálissá a tenant teljes törlését?
    Válasz

    ① Minden erőforrás-kulcs tenant-prefixes (R2, KV, DO-nevek) — így minden törlés prefix-bejárás; ② a törlés Workflow, lépésenkénti naplózással: auditálható, folytatható, és igazolható az ügyfél felé.

  4. Melyik adatréteget nem kell menteni, és melyiket felejtik el a leggyakrabban?
    Válasz

    Az AI Search index (és általában a derivált adat) nem kell menteni — R2-ből és a DB-ből újraépíthető, csak az újraindexelő folyamatot kell előre megírni. A leggyakrabban elfelejtett: a külső rendszerekben lévő adat (error tracker, számlázó, CRM, email-szolgáltató) tenant-törléskor.

  5. Mit jelent a jurisdiction-beállítás, és mi a buktatója?
    Válasz

    Létrehozáskor kikötheted, hogy az adott erőforrás (pl. D1) az EU-ban fut és tárol — GDPR-adatlokalizációhoz. A buktató: ez létrehozáskor dől el, utólag nem állítható, tehát az EU-s igényt előre kell tudni (vagy migrálni kell).

Előző19. modul — Webhookok és külső integrációk Következő 21. modul — A hálózati réteg: DNS, TLS, szabályok, kérés-életciklus