Kada je došlo vrijeme za implementaciju aplikacije, isprobao sam AWS, ali iskreno, bio sam pomalo iznerviran količinom informacija i usluga koje oni pružaju, i zaista sam želio vidjeti svoju aplikaciju tamo u divljini. Tako sam naišao na Vercela. Povrh toga, učio sam o Dockeru i želio sam primijeniti ono što sam do sada naučio, ovo je bila prava prilika.
Vercel je dobro poznat po implementaciji nulte konfiguracije. Sa samo nekoliko klikova možete pokrenuti svoju aplikaciju. Također možete povezati svoje spremište i Vercel će odmah izgraditi i implementirati vaš projekat nakon svakog urezivanja. Ne može biti zgodnije od toga 😀 . Drugi razlog zbog kojeg sam odabrao Vercel umjesto AWS-a bila je njihova funkcija 'bez servera', koju sam koristio za prikazivanje dokumenata iz moje baze podataka putem Express API-ja. Da budem iskren, ne mogu se požaliti na njihovu uslugu. Nikada nisam imao problema sa svojim projektom. Stvar je u tome što sam želio saznati više o pozadinskom dijelu moje aplikacije i shvatio sam da bi mi razumijevanje njegove implementacije moglo pomoći u tome. Vidio sam mnogo ljudi koji su birali AWS umjesto Vercela zbog svog plana cijena. To se ne odnosi na moj slučaj jer moja aplikacija nema toliki promet i uglavnom je koristim u svrhu učenja. Ali dobro je spomenuti da Vercel ima "problem" sa eskalacijom kada je u pitanju cijena.
Aplikacija Toronto Food Basket može se podijeliti na tri različita dijela:
Webscraper za prikupljanje informacija iz lokalne trgovine
Express API koji organizira informacije i može izvoditi matematičke operacije za to.
React aplikacija koja prikazuje aplikaciju i sve potrebne informacije.
Za sada samo implementiram Webscraper na AWS jer još uvijek trebam naučiti više o serverima i rutama za implementaciju Express API-ja i React aplikacije. Za početak, pokrenuo sam AWS EC2 instancu i postavio alarm za budžet tako da svaki put kada potrošnja na mojoj instanci pređe 0,01 USD, dobijem obavijest - naučio sam to na teži način nakon naplate za DocumentDB instancu koju sam pokrenuo na svom računu od decembra /2023 i nisam imao pojma 😂. Amazon pruža besplatne nivoe sa 750 sati t2.micro (ili t3.micro u regijama u kojima t2.micro nije dostupan), 30 Gib EBS skladišta, 2 miliona IO-a, 1 GB snimaka i 100 GB propusnog opsega do interneta.
Dok sam učio kako da implementiram svoju dockerized aplikaciju na AWS, shvatio sam da postoje najmanje dva različita pristupa - možda ih ima više:
izgraditi docker kontejner lokalno i poslati samo kontejner na AWS.
pošalji sve u AWS i napravi moj kontejner na daljinu.
Odabrao sam drugi pristup jer sam želio imati iskustvo potpuno udaljenog rada na svojoj aplikaciji ako treba. Nisam uvijek na svom računaru i moja aplikacija na EC2 instanci bi bila vrlo zgodna u tim situacijama. Takođe, bio bih primoran da radim sa Vimom, što je nešto što sam želeo da radim. Prije slanja datoteka u moju EC2 instancu, pripremio sam svoje udaljeno okruženje instaliranjem Node.js i Dockera.
Da bih poslao datoteke na moju EC2 instancu, koristio sam Secure Copy Protocol (scp). Komanda je izgledala otprilike ovako:
scp -i ubuntu.pem -r LOCAL_DIRECTORY [email protected]:/home/ubuntu/downloads/webscraperdockeraws
-i ubuntu.pem
: Ova zastavica specificira datoteku identiteta (privatni ključ) za korištenje za autentifikaciju javnog ključa. U ovom slučaju, ubuntu.pem
je datoteka privatnog ključa koja se koristi za autentifikaciju na udaljenom serveru.-r
: Ova zastavica označava da bi operacija trebala biti rekurzivna, što znači da će rekurzivno kopirati direktorije i njihov sadržaj.[email protected]:/home/ubuntu/downloads/webscraperdockeraws
: Ovo je specifikacija odredišta. Sadrži korisničko ime ( ubuntu
) i IP adresu ( 35.183.21.127
) udaljenog servera, praćeno putanjom direktorijuma ( /home/ubuntu/downloads
) u koji će se datoteke kopirati.
Nakon što su svi fajlovi prebačeni u moju EC2 instancu, mogao sam da napravim svoj docker kontejner. I tu su greške počele - yay! Najvažnija biblioteka mog Webscrapera je Puppeteer, koji pruža API visokog nivoa za kontrolu Chromea/Chromiuma preko DevTools protokola. Puppeteer radi u načinu rada bez glave, čineći njegovo izvođenje bržim. Ali kada sam pokušavao dokerizirati svoju aplikaciju naišao sam na neke probleme:
Podrazumevano, kada je Puppeteer instaliran, preuzima Chrome za testiranje i chrome-headless-shell binarni fajl. Pretraživač se preuzima u folder $HOME/.cache/puppeteer. Problem je što AWS ne uključuje $HOME/.cache u svoju Ubuntu instancu. Otkrio sam ovaj problem nakon nekog istraživanja, a sve što sam morao da uradim je da premestim /.cache folder u osnovni direktorijum - ovaj problem je dobro dokumentovan na Puppeteers-ovom npm portalu.
Jedna očigledna stvar koju nisam shvatio je da sam do sada pokrenuo svoju aplikaciju u OS-u kao što su Windows i MacOs.. Ali sada sam imao posla sa Ubuntuom. I pošto je to bila prazna instanca, nije prethodno instaliran nijedan paket/aplikacija, zato sam instalirao node i docker čim sam pokrenuo instancu po prvi put. Ali zaboravio sam zaista važnu aplikaciju za rad mog Webscrapera: Google Chrome. Sjećaš li se šta sam prije rekao o Puppeteeru? Pa, morao sam se uvjeriti da imam pravu verziju Chromiuma na svom primjerku. Svaka veća verzija Node.js-a izgrađena je na verziji Debiana, a ta Debian verzija dolazi sa starom verzijom Chromiuma, koja ponekad nije kompatibilna s najnovijom verzijom Puppeteer-a. Nakon nekog istraživanja otkrio sam da moram uključiti instrukciju u svoj Dockerfile kako bi se prava verzija Chromiuma mogla preuzeti prije nego što Docker instalira sve ovisnosti moje aplikacije i pokrene je. Moj Docker fajl je izgledao otprilike ovako:
Nakon rješavanja prethodnog problema pojavio se još jedan. Sada poruka o grešci kaže: “Nema upotrebljivog sandboxa”. Da to popravim, sve što sam trebao učiniti je promijeniti svoj kod i uključiti argument –no-sandbox u funkciju puppeteer.launch() za svaki od mojih prehrambenih proizvoda.
Gotovo. Sada moj Webscraper radi u kontejneru na mojoj AWS EC2 instanci. Ipak, neće ostrugati svih 65 proizvoda. Nakon petog proizvoda aplikacija se ruši. Vjerujem da to ima neke veze s dostupnim resursima koje imam na ovoj instanci - suočio sam se s istim problemom kada sam pokretao scraper sa github akcijama. U svakom slučaju, moj cilj je bio da pokrenem AWS EC2 instancu i da moja aplikacija radi na daljinu, što sam i učinio. Još puno toga!