Docker & Nginx aplicate într-un proiect personal

Salut,

            Mă numesc Valentin Anghel și sunt programator .NET în sectorul bancar. În articolul de astăzi, îți voi descrie secretul care mi-a accelerat cariera de programator. Acest lucru m-a ajutat de-a lungul timpului să trec examenele de programare cu note mari, să urc pe podium la două sesiuni studențești de comunicări științifice și să avansez mult mai repede în carieră.

            Majoritatea oamenilor au idei de afaceri, pasiuni sau vor să construiască ceva, iar eu consider că cel mai bun mod de a învăța programare este să începi să lucrezi pentru ideea ta. Dintre prietenii și colegii mei, cei mai buni programatori sunt cei care au lucrat cel puțin odată pentru un proiect personal. Ca a fost o comunitate pentru cicliști, o aplicație mobilă ce afișează orarul mijloacelor de transport în comun sau un site ce oferă utilitare, prea puțin contează, întrucât toți care au realizat aceste lucruri au căpătat o experiență rapidă în tehnologii noi.

            Pentru mine, cel mai bun mod de a învăța lucruri noi este să încep un proiect personal și care să îmi aducă venituri în viitor. Așa am pornit Randommer, un site web ce oferă utilitare și generatoare de date pentru activitățile de zi cu zi de care se lovesc oamenii. Site-ul oferă momentan aproape 70 de funcții diferite de la generare de numere de telefon, nume, adrese, hash-uri și până la generarea unui film aleatoriu în momentul în care nu știi ce să vizionezi.

            Site-ul a fost realizat în ASP.NET Core 3.1 și am putut să folosesc ultimele tehnologii apărute, un bun prilej pentru mine să aflu și să învăț noutăți din lumea programării. Pentru baza de date am folosit PostgreSQL deoarece este open source și implicit gratuita. Am folosit cel mai ieftin pachet de hosting în cloud al celor de la DigitalOcean pentru containere Docker la doar 20 și ceva de lei pe luna. În aceste containere se află atât aplicația web, cât și baza de date. Am vrut ca Randommer să-i ajute cât mai mult pe programatori, de aceea am realizat și un serviciu API ce poate fi folosit gratuit. Descrierea serviciilor am realizat-o prin Swagger, librărie ce realizează automat interfață grafică pentru documentarea API-urile pe baza codului sursă.

Cum am învățat Docker și Nginx 

            Cum de obicei bugetul pentru proiecte personale este mic, am vrut să reduc cât mai mult costurile. Întrucât mai dețineam un site, am zis că cel mai bine ar fi să împart hosting-ul. Așa am ajuns la un serviciu de hosting în cloud pentru containere Docker.

             Containerele permit izolarea resurselor unei aplicații, partajând în aceleași timp resursele serverului. Până să apară containerele, companiile foloseau mașini virtuale dacă doreau să partajeze resursele unui server între aplicații izolate unele de altele.  Problema este că fiecare mașina virtuală utilizează sistemul de operare propriu, care folosește din resursele serverului și care necesită propria licență de folosire. De asemenea, un alt punct negativ este că fiecare mașină virtuală trebuie administrata separat, patch-urile și update-urile realizându-se individual. Totodată, dacă una dintre aplicații are un vârf de trafic, resursele serverului sunt foarte greu de redistribuit către aceasta.

            Docker în schimb izolează aplicațiile, dar folosește direct sistemul de operare al serverului, putând fi considerat o versiune lightweight a unei mașini virtuale. Docker a realizat ce voiam eu și ce vor multe companii: costuri mici, scalabilitate și izolare. După ce am înțeles principiul de bază din spatele containerelor, am reușit ușor să creez o imagine pentru proiectul meu, ce va fi utilizată de container. Visual Studio creează automat un fișier dockerfile pentru crearea imaginii, având un șablon definit pentru proiect.


            Daca ti se pare complicat de citit, nu te speria ca nici eu nu știam sa creez un astfel de fisier. Visual Studio a creat acest fisier printr-un singur click.

            Pornind de la o imagine deja existentă, cea a framework-ului ASP.NET Core și îmbinat cu rezultatul publish-ului proiectului meu. Toate librăriile sunt downloadate de către Docker de la un repository de containere, în cazul meu, repository este DockerHub. Acesta este echivalentul site-ului GitHub pentru imagini de tip Docker.

            Deoarece serverul îl foloseam între mai multe containere, am avut nevoie de un load balancer care să știe să redirecționeze traficul în funcție de domeniu. Nginx este un server web, ce poate fi folosit si ca intermediar pentru un alt server web si care poate fi configurat sa dirijeze traficul in funcție de nevoi. Am realizat o imagine pornind de la imaginea găsită pentru Nginx și am setat fișierul de configurare astfel încât traficul să fie redirecționat către containerul corespunzător. Utilizând Docker am reușit să izolez resursele și să folosesc un hosting cu costuri reduse.

Fișierul dockerfile utilizat pentru crearea imaginii serverului de load balancer.

FROM nginx:alpine #download ngingx
COPY nginx.conf /etc/nginx/nginx.conf #copy our configuration file în the image

Pentru mai multe detalii: https://www.thepolyglotdeveloper.com/2017/03/nginx-reverse-proxy-containerized-docker-applications/

Optimizare și Securitate

            O greșeală frecventă pe care eu și alți programatori o facem este ca ne mulțumim cu prima soluție găsită, chiar dacă nu este cea mai optimă. Pentru site-ul personal mi-am dat seama că trebuie să aprofundez fiecare problemă și să nu mă mulțumesc cu o soluție dacă aceasta nu este cea mai eficientă. Acest obicei m-a ajutat foarte mult, deoarece după ce am găsit unele soluții, am început să le folosesc imediat și la muncă. De exemplu, am descoperit analizatoare statice de cod ce identifică cele mai populare breșe de securitate. Pentru proiectul meu am folosit Sonarqube, deoarece oferă o versiune gratuită și o extensie pentru Visual Studio care analizează codul la pasul de build. Acest serviciu poate fi integrat cu ușurință și într-un pipeline de continuous delivery, lucru pe care l-am și realizat la muncă pentru a fi sigur ca aplicația este mai securizată.

            În ceea ce privește optimizarea, am pornit de la tool-ul LightHouse oferit de Google Chrome în consolă, Acesta realizează un audit pe 4 categorii: optimizare pentru motoare de căutare, accesibilitate, bune practici și performanță. Dacă dorești ca site-ul să urce cât mai sus în rezultatele Google, îți recomand să rulezi acest audit și ulterior să urmezi pașii pentru închiderea punctelor.

            Astfel, pentru a crește în audit și în căutări a trebuit să implementez un certificat ssl. Acest lucru l-am realizat cu ușurință cu serviciul oferit gratuit de către cei de la Cloudflare. Pe lângă conexiunea Https, aceștia oferă și posibilitatea de a păstra în cache resursele statistice și de a le minifica. Practic, prin folosirea acestui serviciu, am reușit într-un timp scurt să optimizez foarte multe lucruri fără costuri.

            Un alt tool ce mi-a oferit multe informații și pe care l-am implementat imediat și la muncă a fost MiniProfiller, un proiect open source oferit de către cei de la StackExchange, cei care dețin și StackOverflow. Acest utilitar este disponibil pentru 4 framewok-uri: .NET, NodeJs, Go și Ruby. MiniProfiler oferă informații despre fiecare cerere Http și arată cât a durat fiecare metodă să ruleze, putând identifica foarte ușor dacă de exemplu o metodă a rulat prea mult timp sau cât la sută din cerere a fost ocupată de interogările SQL. De asemenea, îți permite vizualizarea lor și am observat care erau cele mai costisitoare. Astfel, am găsit librării ce îți permiteau să stochezi în cache rezultatele returnate de interogările SQL, fiind folosite pentru cererile web ulterioare.

            Acest proiect l-am început în luna Decembrie 2019, iar acum după 9 luni de funcționare am ajuns la o medie de 300 de vizitatori pe zi, iar traficul crește zilnic. Din perspectiva mea este un trafic rezonabil. După această perioadă de dezvoltare îmi dau seama că am progresat foarte mult și mi-am sporit cunoștințele, lucru ce îmi va permite să avansez mult mai repede. Pe partea de monetizare, există mai multe variante pe care le iau în calcul: reclama de la AdSense, cont premium pentru api-uri pentru număr mărit de apeluri și program de afiliere pentru secțiunea de generare de filme. Aștept însă să depășesc bariera de 1000 de vizitatori pe site și ulterior voi începe să-l și monetizez.

Lasă-mi un comentariu cu părerea ta despre trafic și care consideri că e cea mai bună metodă de a progresa în programare.

Distribuie articolul pe: