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:
- Složenost backup-a — 40GB+ fajlova za kopiranje
- Jedna tačka otkazivanja — Jedan servis = jedan rizik
- Zavisnost od plagina — WP Media Cloud je bio posrednik između WordPress-a i GCP-a, još jedna karika koja može da pukne
- 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:
- Query postove bez R2 zastavice
- Pronađi lokalni fajl
- Upload na R2
- Verifikuj upload (HEAD request)
- Postavi zastavicu
- 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:
- Proveri da li lokalni fajl postoji
- Ako da, upload na R2
- Verifikuj HEAD
- 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:
- Alert admin
- Pokušaj re-upload
- Ako ne uspe, drži post kao draft
Nikada više tihih grešaka.
Lekcije za sledeću migraciju
- Verifikuj pre zastavice — Upload nije završen dok HEAD ne vrati 200
- Grupa sa praćenjem napretka — Znaj gde si stao
- Dry-run prvo — Uvek
- Audit posle — Podaci lažu, verifikacija ne laže
- 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.