Vesti i updatei Studija slučaja

Cloudflare R2 migracija: kako smo prebacili 40.000 fajlova bez downtime-a (i šta smo naučili od 10% failure rate)

· 5 min
Sadržaj

Ne možete obnoviti kuću dok ljudi žive u njoj.

Osim ako to nije upravo ono što radite.

40.000 dokumenata. 250.000 korisnika. Migracija na cloud skladište dok platforma radi. Bez prekida. Bez gubitka podataka.

Barem, to je bio plan.

Prethodni sistem: Google Cloud i jedan fajl po dokumentu

Pre obnove, studenti.rs je koristio WordPress plagin WP Media Cloud koji je sve fajlove (slike, PDF-ove) preusmeravao na Google Cloud Platform (GCP). Klasičan wp-content/uploads/ folder nije bio na serveru — GCP je bio jedini storage.

Za svaki dokument koji korisnik uploaduje, sistem je čuvao samo jednu stvar: originalni PDF. Bez preview-a, bez sažetaka, bez thumbnail-a.

Posle obnove, novi pipeline generiše deset i više fajlova po dokumentu: originalni PDF, redaktovani PDF (sa skrivenim delovima), markdown za pretragu, HTML preview za web pregledač, slike svake stranice, thumbnail za listing, metadata… Umesto jednog fajla po dokumentu, sada ih je desetak. Lokalni server ne može da drži toliko podataka — cloud skladište je postalo neophodno.

Zašto R2?

Cloudflare R2 je cloud skladište za fajlove (slično Amazon S3), ali sa jednom velikom razlikom: besplatan izlazni saobraćaj. Kod većine cloud provajdera, svaki download košta. Kod R2 — ne.

Za platformu sa 250.000 korisnika koji preuzimaju dokumente, to je ogromna ušteda.

Stari setup na GCP je imao probleme:

  1. Složenost backup-a — 40GB+ fajlova za kopiranje
  2. Jedna tačka otkazivanja — Jedan servis = jedan rizik
  3. Zavisnost od plagina — WP Media Cloud je bio posrednik između WordPress-a i GCP-a, još jedna karika koja može da pukne
  4. Troškovi — GCP naplaćuje izlazni saobraćaj

Cloudflare R2 rešava sve:

  • Besplatan izlazni saobraćaj — Nema troškova za preuzimanja
  • S3 kompatibilno — Postojeći alati rade bez promena
  • Globalni CDN — Automatski, bez konfiguracije
  • Potpisani URL-ovi — Sigurnost bez složenosti

Tri bucket-a, tri svrhe

Bucket Sadržaj Pristup
studenti-private Original PDF, redacted PDF, metadata Signed URL (60s TTL)
studenti-public HTML preview, thumbnails, images Public CDN
studenti-rag RAG markdown za pretragu Internal only

Konvencija: {postId}/original.pdf, {postId}/index.html, {postId}.md

Jedna putanja, uvek znate gde je fajl.

Migracija u grupama

WP-CLI komanda:

wp studenti migrate-r2 --batch=100 --dry-run
wp studenti migrate-r2 --batch=100

Logika:

  1. Query postove bez R2 zastavice
  2. Pronađi lokalni fajl
  3. Upload na R2
  4. Verifikuj upload (HEAD request)
  5. Postavi zastavicu
  6. Sledeći batch

Progress bar. Logging. Rate limiting.

Problem: 9.7% stopa neuspeha

Revizija je otkrila 970 postova sa r2_uploaded = true ali bez fajla na R2.

Skoro 10% tihih grešaka.

Root cause: Originalna migracija je postavljala zastavicu PRE verifikacije uploada. Network timeout = zastavica postavljena, fajl nije uploadovan.

Lekcija: Nikada ne verujte zastavicama. Verujte HTTP HEAD.

Oporavak: 95%

Sledeći korak: pokušaj oporavka.

wp studenti r2-recovery --source=local

Za svaki od 970 postova:

  1. Proveri da li lokalni fajl postoji
  2. Ako da, upload na R2
  3. Verifikuj HEAD
  4. Update zastavicu

Rezultat: 921/970 oporavljeno. 95%.

49 zauvek izgubljenih

49 postova nije imalo ni lokalni fajl ni R2 fajl.

Gde su otišli? Verovatno:

  • Originalni upload nikada nije završen
  • Fajl obrisan tokom nekog ranijeg cleanup-a
  • Bug u prethodnom sistemu

Šta raditi? Ništa. Prihvatiti gubitak.

Neki podaci su zauvek izgubljeni. To je realnost migracija. Možete minimizovati, ne možete eliminisati.

ACF → Ugrađeni tagovi: 52K tagova

ACF (Advanced Custom Fields — WordPress plagin za prilagođena polja) je čuvao ključne reči u skrivenom polju ai_keywords. Te reči su bile nevidljive za WordPress pretragu, SEO, i sve standardne upite.

Rešenje: migracija u WordPress ugrađene tagove.

Zašto? Ugrađeni tagovi su:

  • Pretraživi
  • Indeksabilni
  • SEO prijateljski
  • Dostupni za upite

ACF polja su skrivena u meta tabeli. Nevidljiva za pretragu.

wp studenti migrate-tags --dry-run
wp studenti migrate-tags

52.098 tagova kreirano. Jedna WP-CLI komanda.

Excerpts: 17K AI sažetaka

ACF ai_summary → WordPress native excerpt.

Isti razlog: native excerpts su vidljivi u search rezultatima, RSS, itd.

wp studenti backfill-excerpts --limit=1000

17.000+ excerpts migrirano.

myCRED migracija: Otkrivanje zloupotrebe

5.873 korisnika sa myCRED poenima.
7.900 stavki u biblioteci (preuzeti dokumenti).
12 naloga koji zloupotrebljavaju sistem.

Jedan korisnik: 887 transakcija.

Migracija je bila jednostavna: preslikaj poene na prava pristupa, transakcije na biblioteku.

Otkrivanje zloupotrebe je bio bonus. Nismo tražili. Podaci su pokazali.

Verification kao princip

Posle migracije, implementirali smo automatsku verifikaciju:

# Cron job svakih sat vremena
wp studenti verify-r2 --recent

HTTP HEAD na CDN za svaki objavljeni post u poslednjih X sati.

Ako HEAD vrati 404:

  1. Alert admin
  2. Pokušaj re-upload
  3. Ako ne uspe, drži post kao draft

Nikada više tihih grešaka.

Lekcije za sledeću migraciju

  1. Verifikuj pre zastavice — Upload nije završen dok HEAD ne vrati 200
  2. Grupa sa praćenjem napretka — Znaj gde si stao
  3. Dry-run prvo — Uvek
  4. Audit posle — Podaci lažu, verifikacija ne laže
  5. Prihvati gubitak — Neke stvari su zauvek izgubljene

Migracija 40.000 fajlova nije "upload i gotovo."

To je upload, verifikacija, audit, recovery, prihvatanje gubitka, i automatska provera da se ne ponovi.

9.7% stopa neuspeha bi ostala neotkrivena bez revizije. 921 fajl bi bio zauvek nedostupan.

Ne verujte zastavicama. Verujte HTTP HEAD.