Sam sebi klijent
Posao NIJEFILA je da tuđi sajtovi rade. Kada klijent pita šta da uradi pre velike izmene na sajtu, odgovor znam napamet: napravi kopiju i proveri da ta kopija stvarno može da se vrati. Lako je to reći kada sajt nije tvoj.
Već neko vreme pravim Gray Horizon, browser igru na pravoj mapi sveta. To je moj lični projekat, ne usluga NIJEFILA i ne posao za klijenta. Igra je trenutno u zatvorenoj alfi, a u ovoj priči sam ja klijent koji ne sluša šta mu se kaže.
Igra u kojoj niste država
Gray Horizon je multiplayer geopolitička strategija koja se igra u browseru, na računaru ili na telefonu. Na mapi je 196 država i 755 provincija, ali ne igrate kao država. Igrate kao jedan građanin. Radite, osnivate firme, trgujete na tržištu, glasate, pišete novine, a ako vas izaberu, sedite i u vladi. Vlade, firme i novine vode ljudi koji igraju.
Svet je trajan: šta god se desi danas, ostaje i sutra, za sve. Čak i alfa svet, koji će biti obrisan kada alfa završi, do tada živi kao pravi. Ljudi u njemu igraju svaki dan i sigurno ne bi voleli da izgube nedelju dana zato što sam ja nešto zeznuo.

Tehnički, to je TypeScript projekat: API u NestJS-u, web aplikacija u Next.js-u (na istom Next.js-u radi i ovaj sajt) i PostgreSQL baza sa PostGIS-om za mapu. Kako sam došao do ideje i zašto je igrač građanin a ne država, pisao sam na sajtu igre. Ovde pišem o manje zabavnom delu, o tome kako se takva stvar drži u životu.
Sajt se uglavnom čita, igra se stalno piše
Sajtovi koje hostujemo se uglavnom čitaju. Vlasnik doda tekst ili proizvod, posetioci čitaju. Ako nešto pođe po zlu, vratite jučerašnji backup i izgubite možda jedan tekst. Kod prodavnice je osetljivije zbog porudžbina, ali ritam je sličan.
U igri je obrnuto. Skoro svaki klik nešto upisuje u bazu: platu, kupovinu na tržištu, glas, članak, potez u ratu. Ako vratim jučerašnju kopiju, oduzeo sam dan svima koji su igrali, zajedno sa svim što su jedni drugima uradili tog dana.
Zato je u igri baza ono pravo. Kod mogu ponovo da napravim kad god hoću, podatke ne mogu. A baza se menja stalno. Igra već ima više od 180 migracija, to jest skripti koje menjaju strukturu baze, a otkako je alfa počela, u toj bazi su i podaci pravih ljudi.
Pet kopija u RAM-u
Pre svakog izdanja koje menja bazu pravim kopiju baze, da bih imao čemu da se vratim ako migracija pođe po zlu. Moje uputstvo za izdanje je govorilo da se ta kopija sačuva u /tmp.
Na tom serveru /tmp je tmpfs. Ne leži na disku, nego u RAM-u, i nestaje pri svakom restartu. Znači, kopija koja postoji za dan kada nešto krene naopako stajala je na mestu koje briše restart. A kada nešto krene naopako, restart je obično prva stvar koju neko uradi.
Pet izdanja je prošlo tako. Primetio sam tek na šestom, kada sam uputstvo izvršio korak po korak, umesto da ga samo prelistam.
Uz to, moja provera da je kopija napravljena bila je ls -lh. Fajl postoji, ima neku veličinu, idemo dalje. To dokazuje samo da fajl postoji, ne i da je u njemu baza. Sada posle svake kopije čitam njen sadržaj nazad sa pg_restore --list, pa se odsečena ili polovična kopija vidi odmah, a ne onog dana kada zatreba.
U tekstu o tome kako se pravi backup WordPress sajta napisao sam da kopija može da bude prazna ili oštećena, a da to ne primetite dok ne pokušate vraćanje. Nisam očekivao da ću uhvatiti samog sebe kako proveravam samo da li fajl postoji. Malo mi je neprijatno da to priznam na blogu hosting firme.
Backup koji radi, a javlja grešku
Noćni backup je imao suprotan problem. Kada sam ga prvi put pokrenuo na serveru, pao je dva puta zaredom, i oba puta je kopija baze bila napravljena i stigla van servera. Pao je samo korak koji briše stare kopije, a skripta je zbog toga javila da ceo backup nije uspeo.
To je možda najgori oblik koji backup može da ima. Radio bi svake noći i gomilao kopije zauvek, a ko god čita logove, posle par nedelja bi naučio da crvenu poruku preskače. A onda jedne noći poruka bude tačna.
Sama popravka je bila dosadna. Zanimljivija je provera: podmetnuo sam lažnu kopiju sa starim datumom i gledao kako je noćni posao pronalazi i briše, dok tri prave kopije ostaju.
Proveri i ono što migracija nije smela da dira
Jedna migracija je trebalo da obriše jedno podešavanje i da ne dira njegov trag u istoriji izmena. Ta istorija i postoji da se iz nje ništa ne bi brisalo.
Da je migracija greškom obrisala i taj trag, sve uobičajene provere bi prošle. Aplikacija se podigla, automatska provera kaže da je sve u redu, svet je tu. Izdanje bi izgledalo čisto.
Zato sada brojim pre i posle migracije, i to ne samo ono što je trebalo da se promeni nego i ono što je trebalo da ostane isto. Broj posle migracije ne znači mnogo ako ne znate koliki je bio pre.
Isto važi za običan sajt. Posle ažuriranja plugin-a ili selidbe na novi hosting, to što se početna strana otvara nije test. Pošaljite sebi poruku preko kontakt forme i napravite probnu porudžbinu, pa proverite da li su mejlovi stigli.
Lista stvari koje ne pravim
Pre prve linije koda za Gray Horizon napisao sam dizajn dokument, a u njemu i listu stvari koje ne treba da pravim. Na njoj su bili i mikroservisi i Kubernetes, bar dok neko ne pokaže da su zaista potrebni. „Možda jednog dana bude veliko“ se ne računa. Tu listu i pravila iz kojih je igra nastala opisao sam u devlogu The Rules That Built Gray Horizon.
Igra je i danas jedan TypeScript repozitorijum sa API-jem, web aplikacijom i jednom PostgreSQL bazom. Kada pogledam priče iznad, nijednu ne bi rešio Kubernetes. Sve tri mogu da se dese i na jednom serveru i na sto, samo bih ih na sto tražio duže.
Isto govorim ljudima koji pitaju za VPS. U tekstu o deljenom hostingu i VPS-u sam napisao da VPS nije viši nivo koji svaki sajt treba jednom da dostigne. Uzmete ga kada vam treba njegova kontrola i kada znate ko će ga održavati. Sa Kubernetesom je ista priča, samo skuplja.
Zašto ovo pišem ovde
Zato što su ovo iste greške koje viđam kod klijenata, samo sam ih ovaj put napravio ja, na sistemu za koji niko drugi nije odgovoran. Nijedna nije egzotična i nijedna nije posebno vezana za igre. Igra ih je samo brže izvukla na videlo, jer se u njoj nešto menja svaki dan, a neko je igra svaki dan.
Backup postoji tek kada može da se pročita nazad.
U dokumentaciji igre sada stoji isto to, samo na engleskom.
Gray Horizon je i dalje u zatvorenoj alfi, a o tome kako nastaje pišem u devlogu na sajtu igre. Poslednji tekst je o radiju koji igri uopšte nije bio potreban.
Osnivač NIJEFILA DOO. Piše o hostingu, DNS-u, email infrastrukturi i serverskoj administraciji.