Kad je došlo vrijeme za implementaciju aplikacije, isprobao sam AWS, ali iskreno, bio sam pomalo zbunjen količinom informacija i usluga koje pružaju, i stvarno sam želio vidjeti svoju aplikaciju u divljini. Tako sam naišao na Vercela. Povrh svega, učio sam o Dockeru i želio sam primijeniti u praksi ono što sam do sada naučio, ovo je bila prava prilika.
Vercel je dobro poznat po svojoj implementaciji bez konfiguracije. Sa samo nekoliko klikova možete postaviti svoju aplikaciju. Također možete povezati svoje spremište i Vercel će odmah izgraditi i implementirati vaš projekt nakon svakog uvrštavanja. Ne može biti zgodnije od toga 😀 . Još jedan razlog zbog kojeg sam odabrao Vercel umjesto AWS-a bila je njihova funkcija 'bez poslužitelja' koju sam koristio za renderiranje dokumenata iz svoje baze podataka putem Express API-ja. Da budem iskren, ne mogu se žaliti na njihovu uslugu. Nikada nisam imao problema sa svojim projektom. Stvar je u tome što sam želio naučiti više o pozadini svoje aplikacije i zaključio sam da bi mi razumijevanje njezine implementacije moglo pomoći u tome. Vidio sam mnogo ljudi koji biraju AWS umjesto Vercela zbog njihovog plana cijena. To se ne odnosi na moj slučaj jer moja aplikacija nema toliko prometa i uglavnom je koristim u svrhu učenja. Ali dobro je spomenuti da Vercel ima “problem” s eskalacijom kada su u pitanju cijene.
Aplikacija Toronto Food Basket može se podijeliti u tri različita dijela:
Webscraper za prikupljanje informacija iz lokalne trgovine mješovitom robom
Express API koji organizira informacije i može izvoditi matematičke operacije za to.
React aplikacija koja renderira aplikaciju i sve potrebne informacije.
Za sada implementiram samo Webscraper na AWS jer još uvijek moram naučiti više o poslužiteljima i rutama za implementaciju Express API-ja i aplikacije React. Za početak sam pokrenuo AWS EC2 instancu i postavio alarm proračuna tako da svaki put kada potrošnja na mojoj instanci prijeđe 0,01 USD dobijem obavijest - naučio sam to na teži način nakon što mi je naplaćena instanca DocumentDB-a koju sam pokrenuo na svom računu od prosinca /2023 i nisam imao pojma 😂. Amazon nudi besplatne razine sa 750 sati t2.micro (ili t3.micro u regijama u kojima t2.micro nije dostupan), 30 Gib EBS pohrane, 2 milijuna IO-a, 1 GB snimaka i 100 GB propusnosti za internet.
Dok sam učio kako implementirati svoju dockeriziranu aplikaciju na AWS-u shvatio sam da postoje najmanje dva različita pristupa - moglo bi ih biti više:
izgraditi docker spremnik lokalno i poslati samo spremnik AWS-u.
poslati sve AWS-u i izgraditi moj kontejner na daljinu.
Odabrao sam drugi pristup jer sam želio steći iskustvo potpuno udaljenog rada na svojoj aplikaciji ako budem morao. Nisam uvijek za svojim računalom i imati moju aplikaciju na EC2 instanci bilo bi jako zgodno u takvim situacijama. Također, bio bih prisiljen raditi s Vimom, što je nešto što sam želio. Prije slanja datoteka na svoju EC2 instancu pripremio sam svoje udaljeno okruženje instaliranjem Node.js i Docker.
Kako bih poslao datoteke svojoj EC2 instanci, koristio sam Secure Copy Protocol (scp). Naredba 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č) koja se koristi za autentifikaciju javnog ključa. U ovom slučaju, ubuntu.pem
je datoteka privatnog ključa koja se koristi za autentifikaciju na udaljenom poslužitelju.-r
: Ova zastavica označava da operacija treba biti rekurzivna, što znači da će kopirati direktorije i njihov sadržaj rekurzivno.[email protected]:/home/ubuntu/downloads/webscraperdockeraws
: Ovo je specifikacija odredišta. Uključuje korisničko ime ( ubuntu
) i IP adresu ( 35.183.21.127
) udaljenog poslužitelja, nakon čega slijedi put direktorija ( /home/ubuntu/downloads
) u koji će se datoteke kopirati.
Nakon što su sve datoteke prenesene na moju EC2 instancu, mogao sam izgraditi svoj docker spremnik. I tu su počele greške - juhu! Najvažnija biblioteka mog Webscrapera je Puppeteer, koja pruža API visoke razine za kontrolu Chromea/Chromiuma preko protokola DevTools. Puppeteer radi u bezglavom načinu rada, što ubrzava njegovo izvršenje. Ali kada sam pokušavao dokerizirati svoju aplikaciju naišao sam na neke probleme:
Prema zadanim postavkama, kada je Puppeteer instaliran, on preuzima Chrome za testiranje i binarnu datoteku chrome-headless-shell. Preglednik se preuzima u mapu $HOME/.cache/puppeteer. Problem je u tome što AWS ne uključuje $HOME/.cache u svoju Ubuntu instancu. Otkrio sam ovaj problem nakon malo istraživanja, a da bih ga riješio, sve što sam morao učiniti je premjestiti /.cache mapu u korijenski direktorij - ovaj problem je dobro dokumentiran na Puppeteersovom npm portalu.
Jedna očita stvar koju nisam shvatio je da sam do sada svoju aplikaciju pokretao u OS-u kao što su Windows i MacOs. Ali sada sam se bavio Ubuntuom. Budući da je to bila prazna instanca, nije imao unaprijed instaliran nikakav paket/aplikaciju, zato sam instalirao node i docker čim sam prvi put pokrenuo instancu. Ali zaboravio sam stvarno važnu aplikaciju za rad mog Webscrapera: Google Chrome. Sjećate se što sam prije rekao o Puppeteeru? Pa, morao sam biti siguran da imam pravu verziju Chromiuma na svojoj instanci. Svaka veća verzija Node.js izgrađena je na verziji Debiana, a ta Debian verzija dolazi sa starom verzijom Chromiuma, koja ponekad nije kompatibilna s najnovijom verzijom Puppeteera. Nakon malo istraživanja otkrio sam da moram uključiti upute u svoju Dockerfile kako bi se prava verzija Chromiuma mogla preuzeti prije nego što Docker instalira sve ovisnosti moje aplikacije i pokrene je. Moja Docker datoteka izgledala je otprilike ovako:
Nakon rješavanja prethodnog problema pojavio se još jedan. Sada poruka o pogrešci glasi: "Nema upotrebljivog sandboxa". Kako bih to popravio, sve što sam morao učiniti bilo je promijeniti svoj kod i uključiti argument –no-sandbox na funkciju puppeteer.launch() za svaki pojedini moj mješoviti proizvod.
Gotovo. Sada moj Webscraper radi u spremniku na mojoj AWS EC2 instanci. Ipak neće izgrebati 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 prilikom pokretanja strugača s github radnjama. U svakom slučaju, moj cilj je bio pokrenuti AWS EC2 instancu i pokrenuti svoju aplikaciju na daljinu, što sam i učinio. Puno toga dolazi!