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.
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.
| Forgatókönyv | Valószínűség | Mi véd |
|---|---|---|
| 1. Alkalmazás-hiba — rossz migráció, hibás tömeges update töröl/felülír adatot | a leggyakoribb | Time Travel / PITR, expand–contract fegyelem (8. modul), pre-flight ellenőrzések |
2. Emberi hiba — valaki éles adatbázison futtat egy DELETE-et | gyakori | jogosultsá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égzetes | fió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érhetetlen | ritka | ezt jellemzően kivárod; a kérdés inkább a kommunikáció |
| Réteg | Beépített védelem | Amit neked kell hozzátenni |
|---|---|---|
| D1 | Time 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 snapshotjai | ez marad a megszokott rutinod — plusz teszteld a visszaállítást |
| R2 | tartó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 |
| KV | replikáció (nem backup!) | ide ne tegyél olyat, ami nem újraépíthető — cache és config való bele (6. modul) |
| Durable Objects | tartós, replikált tár | ha üzleti igazság van benne (számlálók, foglalások), írj rendszeres exportot D1-be/R2-be |
| AI Search index | — | derivá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 konfig | version-history, rollback (8. modul) | a wrangler-konfig a repóban (12. modul); a secretek külön, biztonságos helyen dokumentálva |
| Secretek | — | lista arról, milyen secretek kellenek (secrets.required), és honnan szerezhetők be újra |
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ázaexport 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}`));
}
}
Írd meg előre, egy oldalban, és tedd a repóba. A váza:
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.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:
| Hol | Mit kell tenni | Automatizá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 van | igen (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 objektumok | prefix szerinti listázás + törlés (tenantId/ előtag) | igen — ezért érdemes tenant-prefixes kulcsokat használni! |
| AI Search index | instance törlése (15b. modul) | igen, egy hívás |
| KV-bejegyzések | tenant-prefixes kulcsok törlése (cache, config, session) | igen, ha a kulcsséma prefixes |
| Durable Objects | a tenant objektumainak állapota | igen, ha a névséma tartalmazza a tenantot |
| Queue-ban álló üzenetek | a feldolgozó ellenőrizze, létezik-e még a tenant | igen (védekező kód) |
| Logok | a retención belül elévülnek (Workers Logs: 7 nap) | automatikus |
| Analytics Engine | aggregált adat — a megőrzési politikád szerint | tervezendő |
| Külső rendszerek | error tracker, számlázó, CRM, email-szolgáltató | API-val, de ezt szokták kihagyni |
| Mentések | a rotációval évülnek el — dokumentáld a határidőt | politikai döntés |
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.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és | Mi a platform válasza | Amit 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 veled | az alfeldolgozók listáját tartsd karban — az AI-szolgáltatód is az! |
| Törléshez való jog | a törlési műveletek adottak | a 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 logokban | a 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 adat | AI Gateway DLP-funkciók (15b. modul) | döntsd el, mi mehet ki modellhez; dokumentáld, melyik szolgáltató melyik adatot látja |
| Incidens-bejelentés | — | runbook: ki dönt, kit értesítesz, milyen határidővel (a GDPR 72 órás bejelentési szabálya) |
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ó).
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.
① 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é.
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.
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).