paint-brush
Рашэнне праблемы «Гэта працуе на маёй машыне».па@gabrielpoeta
348 чытанні
348 чытанні

Рашэнне праблемы «Гэта працуе на маёй машыне».

па Gabriel Poeta5m2024/09/05
Read on Terminal Reader

Занадта доўга; Чытаць

Vercel добра вядомы сваім разгортваннем без канфігурацыі. З дапамогай усяго некалькіх пстрычак мышы вы можаце разгарнуць сваё прыкладанне.
featured image - Рашэнне праблемы «Гэта працуе на маёй машыне».
Gabriel Poeta HackerNoon profile picture
0-item
1-item
2-item

Калі прыйшоў час разгортваць прыкладанне, я паспрабаваў AWS, але, шчыра кажучы, быў у захапленні ад колькасці інфармацыі і паслуг, якія яны прадастаўляюць, і мне вельмі хацелася ўбачыць сваё прыкладанне ў дзікай прыродзе. Так я наткнуўся на Vercel. У дадатак да ўсяго, я вывучаў Docker і хацеў прымяніць на практыцы тое, што я даведаўся да гэтага часу, гэта была правільная магчымасць.


Vercel добра вядомы сваім разгортваннем без канфігурацыі. З дапамогай усяго некалькіх пстрычак мышы вы можаце разгарнуць сваё прыкладанне. Вы таксама можаце падключыць свой рэпазітар, і Vercel будзе імгненна ствараць і разгортваць ваш праект пасля кожнай фіксацыі. Гэта не можа быць больш зручным, чым гэта 😀. Яшчэ адной прычынай, па якой я абраў Vercel замест AWS, была іх бессерверная функцыя, якую я выкарыстаў для візуалізацыі дакументаў з маёй базы дадзеных праз Express API. Шчыра кажучы, я не магу паскардзіцца на іх абслугоўванне. У мяне ніколі не было праблем з маім праектам. Справа ў тым, што я хацеў даведацца больш пра бэкэнд майго прыкладання, і я палічыў, што разуменне яго разгортвання можа дапамагчы мне ў гэтым. Я бачыў шмат людзей, якія выбіралі AWS замест Vercel з-за іх цэнавага плану. Гэта не адносіцца да майго выпадку, бо мая праграма не мае такога вялікага трафіку, і я выкарыстоўваю яе ў асноўным для навучальных мэтаў. Але варта адзначыць, што Vercel мае «праблему» з эскалацыяй цэнаўтварэння.


Дадатак Toronto Food Basket можна падзяліць на тры розныя часткі:

  • Webscraper для збору інфармацыі з мясцовай прадуктовай крамы

  • Express API, які арганізуе інфармацыю і можа выконваць для гэтага матэматычныя аперацыі.

  • Прыкладанне React, якое адлюстроўвае прыкладанне і ўсю неабходную інфармацыю.


На дадзены момант я толькі разгортваю Webscraper у AWS, бо мне яшчэ трэба даведацца больш пра серверы і маршруты для разгортвання Express API і праграмы React. Для пачатку я запусціў асобнік AWS EC2 і ўсталяваў будзільнік бюджэту, таму кожны раз, калі выдаткі на мой экземпляр перавышаюць 0,01 даляра, я атрымліваю апавяшчэнне - даведаўся, што цяжкі шлях пасля таго, як мне выставілі рахунак за асобнік DocumentDB, які працаваў у маім уліковым запісе са снежня /2023 і паняцця не меў 😂. Amazon прадастаўляе бясплатныя ўзроўні з 750 гадзінамі t2.micro (або t3.micro у рэгіёнах, у якіх t2.micro недаступны), 30 ГБ сховішча EBS, 2 мільёнамі IO, 1 ГБ здымкаў і 100 ГБ прапускной здольнасці да Інтэрнэту.


Вывучаючы, як разгортваць сваё дакерызаванае прыкладанне на AWS, я зразумеў, што ёсць як мінімум два розныя падыходы - іх можа быць больш:


  1. стварыць кантэйнер докераў лакальна і адправіць толькі кантэйнер у AWS.

  2. адправіць усё ў AWS і стварыць свой кантэйнер выдалена.


Я абраў другі падыход, таму што хацеў атрымаць вопыт цалкам аддаленай працы над сваім дадаткам, калі б мне гэта спатрэбіцца. Я не заўсёды карыстаюся ўласным камп'ютарам, і ў такіх сітуацыях было б вельмі зручна размясціць маё прыкладанне на асобніку EC2. Акрамя таго, я быў бы вымушаны працаваць з Vim, і гэта тое, што я хацеў зрабіць. Перш чым адправіць файлы ў свой асобнік EC2, я падрыхтаваў аддаленае асяроддзе, усталяваўшы Node.js і Docker.


Для адпраўкі файлаў на мой асобнік EC2 я выкарыстаў пратакол бяспечнага капіравання (scp). Каманда выглядала прыкладна так:

scp -i ubuntu.pem -r LOCAL_DIRECTORY [email protected]:/home/ubuntu/downloads/webscraperdockeraws


  • -i ubuntu.pem : Гэты сцяг вызначае файл ідэнтыфікацыі (закрыты ключ), які будзе выкарыстоўвацца для аўтэнтыфікацыі з адкрытым ключом. У гэтым выпадку ubuntu.pem - гэта файл закрытага ключа, які выкарыстоўваецца для аўтэнтыфікацыі на аддаленым серверы.
  • -r : Гэты сцяг паказвае, што аперацыя павінна быць рэкурсіўнай, гэта значыць яна будзе капіраваць каталогі і іх змесціва рэкурсіўна.
  • [email protected]:/home/ubuntu/downloads/webscraperdockeraws : Гэта спецыфікацыя прызначэння. Ён уключае імя карыстальніка ( ubuntu ) і IP-адрас ( 35.183.21.127 ) аддаленага сервера, а затым шлях да каталога ( /home/ubuntu/downloads ), куды будуць скапіяваны файлы.


Пасля таго, як усе файлы былі перададзены ў мой асобнік EC2, я змог стварыць свой докер-кантэйнер. І тут пачаліся багі - ура! Самая важная бібліятэка майго Webscraper - Puppeteer, якая забяспечвае API высокага ўзроўню для кіравання Chrome/Chromium праз пратакол DevTools. Puppeteer працуе ў рэжыме без галавы, што робіць яго выкананне больш хуткім. Але пры спробе зрабіць докерызацыю майго прыкладання я сутыкнуўся з некаторымі праблемамі:


  • Па змаўчанні, калі Puppeteer усталяваны, ён спампоўвае Chrome для тэставання і двайковы файл chrome-headless-shell. Браўзэр спампоўваецца ў тэчку $HOME/.cache/puppeteer. Праблема ў тым, што AWS не ўключае $HOME/.cache у свой асобнік Ubuntu. Я выявіў гэтую праблему пасля некаторага даследавання, і для вырашэння ўсё, што мне трэба было зрабіць, гэта перамясціць тэчку /.cache у каранёвы каталог - гэтая праблема добра задакументавана на партале npm Puppeteers.


Выява майго толькі што створанага маршруту API


  • Адна відавочная рэч, якую я не разумеў, гэта тое, што дагэтуль я запускаў сваё прыкладанне ў такіх АС, як Windows і MacOs.. Але цяпер я меў справу з Ubuntu. І паколькі гэта быў пусты асобнік, на ім не было папярэдне ўсталяванага пакета/праграмы, вось чаму я ўсталяваў node і docker, як толькі запусціў асобнік у першы раз. Але я забыўся пра вельмі важную праграму для працы майго Webscraper: Google Chrome. Памятаеце, што я казаў пра Puppeteer раней? Што ж, мне трэба было пераканацца, што ў мяне патрэбная версія Chromium на маім асобніку. Кожная асноўная версія Node.js створана на аснове версіі Debian, і гэтая версія Debian пастаўляецца са старой версіяй Chromium, якая часам несумяшчальная з апошняй версіяй Puppeteer. Пасля некаторага даследавання я даведаўся, што мне трэба ўключыць інструкцыю ў мой файл Docker, каб правільную версію Chromium можна было загрузіць, перш чым Docker усталюе ўсе залежнасці майго прыкладання і запусціць яго. Мой файл Docker выглядаў прыкладна так:


Выява майго толькі што створанага маршруту API


Выява майго толькі што створанага маршруту API


  • Пасля выпраўлення папярэдняй праблемы ўзнікла яшчэ адна. Цяпер паведамленне пра памылку абвяшчае: «Не прыдатная пясочніца». Каб выправіць гэта, мне трэба было толькі змяніць свой код і ўключыць аргумент –no-sandbox у функцыю puppeteer.launch() для кожнага з маіх прадуктовых прадуктаў.


Выява майго толькі што створанага маршруту API


Гатова. Цяпер мой Webscraper працуе ў кантэйнеры на маім асобніку AWS EC2. Аднак ён не будзе саскрабаць усе 65 прадуктаў. Пасля пятага прадукту праграма выходзіць з ладу. Я лічу, што гэта звязана з даступнымі рэсурсамі, якія я маю на гэтым экзэмпляры - я сутыкнуўся з той жа праблемай пры запуску скрабка з дзеяннямі github. У любым выпадку, маёй мэтай было запусціць асобнік AWS EC2 і запусціць маё прыкладанне выдалена, і я гэта зрабіў. Шмат яшчэ наперадзе!


Выява майго толькі што створанага маршруту API


Выява майго толькі што створанага маршруту API