Å ajÄ rakstÄ es dalÄ«Å”os pieredzÄ par CI/CD iestatÄ«Å”anu, izmantojot Plesk vadÄ«bas paneli un Github darbÄ«bas. Å odien mÄs uzzinÄsim, kÄ izvietot vienkÄrÅ”u projektu ar vienkÄrÅ”u nosaukumu "Helloworld". Tas ir rakstÄ«ts Flask Python ietvarÄ ar Selery darbiniekiem un Angular 8 priekÅ”galu.
Raksta pirmajÄ daÄ¼Ä mÄs apskatÄ«sim mÅ«su projektu un tÄ daļas. OtrajÄ mÄs izdomÄsim, kÄ iestatÄ«t Plesk un instalÄt nepiecieÅ”amos paplaÅ”inÄjumus un komponentus (DB, RabbitMQ, Redis, Docker utt.).
TreÅ”ajÄ daÄ¼Ä mÄs beidzot izdomÄsim, kÄ izveidot cauruļvadu mÅ«su projekta izvietoÅ”anai serverÄ« izstrÄdes un ražoÅ”anas vidÄ. Un tad mÄs palaižam vietni serverÄ«.
Un jÄ, es aizmirsu sevi iepazÄ«stinÄt. Mani sauc Oļegs Borzovs, es esmu pilna apjoma izstrÄdÄtÄjs Domklik hipotekÄrÄs kreditÄÅ”anas menedžeru CRM komandÄ.
Projekta pÄrskats
Vispirms apskatÄ«sim divus projektu repozitorijus ā backend un front ā un pÄrskatÄ«sim kodu.
AizmugurÄjÄ daļa: Kolba + Selerijas
AizmugurÄjai daļai es paÅÄmu Ä·ekaru, kas ir diezgan populÄrs Python izstrÄdÄtÄju vidÅ«: Flask ietvaru (API) un Selery (uzdevumu rindai). SQLAchemy tiek izmantots kÄ ORM. Alembic izmanto migrÄcijÄm. JSON validÄcijai rokturos ā Marshmallow.
Š krÄtuves ir fails Readme.md ar detalizÄtu struktÅ«ras aprakstu un norÄdÄ«jumiem projekta izpildei.
Web daļas API diezgan vienkÄrÅ”a, sastÄv no 6 pildspalvÄm:
/ping ā pÄrbaudÄ«t pieejamÄ«bu;
apstrÄdÄ reÄ£istrÄciju, autorizÄciju, deautorizÄciju un autorizÄta lietotÄja iegÅ«Å”anu;
rokturis e-pasta sÅ«tÄ«Å”anai, kas ievieto uzdevumu Selerijas rindÄ.
Selerijas daļa Tas ir vÄl vienkÄrÅ”Äk, ir tikai viena problÄma send_mail_task.
MÄjas lapa ar veidlapu e-pasta nosÅ«tÄ«Å”anai un atteikÅ”anÄs pogu.
PieteikÅ”anÄs lapa.
ReÄ£istrÄcijas lapa.
GalvenÄ lapa izskatÄs askÄtiski:
SaknÄ ir divi faili Dockerfile Šø docker-compose.yml, kÄ arÄ« pazÄ«stamÄ mape .ci-cd ar nedaudz mazÄku skriptu skaitu nekÄ aizmugurÄjÄ repozitorijÄ (noÅemti skripti testu veikÅ”anai).
Projekta uzsÄkÅ”ana PleskÄ
SÄksim, iestatot Plesk un izveidojot mÅ«su vietnes abonementu.
PaplaÅ”inÄjumu instalÄÅ”ana
PleskÄ mums ir nepiecieÅ”ami Äetri paplaÅ”inÄjumi:
Docker pÄrvaldÄ«t un vizuÄli parÄdÄ«t konteineru statusu Plesk admin panelÄ«;
Git lai konfigurÄtu izvietoÅ”anas soli serverÄ«;
Let's Encrypt bezmaksas TLS sertifikÄtu Ä£enerÄÅ”anai (un automÄtiskai atjaunoÅ”anai);
Firewall lai konfigurÄtu ienÄkoÅ”Äs trafika filtrÄÅ”anu.
Varat tos instalÄt, izmantojot Plesk administratora paneli sadaÄ¼Ä PaplaÅ”inÄjumi:
Plesk jau ir aprÄ«kots ar PostgreSQL DBVS, bet ne jaunÄko versiju (rakstÄ«Å”anas laikÄ Plesk Obsidian atbalstÄ«ts Postgres versijas 8.4ā10.8). MÄs vÄlamies mÅ«su lietojumprogrammai jaunÄko versiju (12.3 Ŕī rakstÄ«Å”anas laikÄ), tÄpÄc mÄs to instalÄsim manuÄli.
Ir daudz detalizÄtu instrukciju Postgres instalÄÅ”anai Debian tÄ«klÄ (piemÄrs), tÄpÄc es tos sÄ«kÄk neaprakstÄ«Å”u, es tikai doÅ”u komandas:
Å emot vÄrÄ, ka PostgreSQL ir diezgan viduvÄji noklusÄjuma iestatÄ«jumi, ir nepiecieÅ”ams pielÄgot konfigurÄciju. Tas mums palÄ«dzÄs kalkulators: jÄievada sava servera parametri un jÄaizstÄj faila iestatÄ«jumi /etc/postgresql/12/main/postgresql.confpiedÄvÄtajiem. Å eit jÄatzÄ«mÄ, ka Å”Ädi kalkulatori nav burvju lode, un bÄze ir jÄnoregulÄ precÄ«zÄk, pamatojoties uz jÅ«su aparatÅ«ru, lietojumprogrammu un vaicÄjumu sarežģītÄ«bu. Bet ar to pietiek, lai sÄktu.
Papildus kalkulatora ieteiktajiem iestatÄ«jumiem mÄs arÄ« mainÄm postgresql.confnoklusÄjuma ports 5432 ir pieŔķirts citam (mÅ«su piemÄrÄ - 53983).
PÄc konfigurÄcijas faila maiÅas restartÄjiet postgresql-server ar komandu:
service postgresql restart
MÄs instalÄjÄm un konfigurÄjÄm PostgreSQL. Tagad izveidosim datu bÄzi, lietotÄjus izstrÄdÄtÄju un produkciju vidÄm un pieŔķirsim lietotÄjiem tiesÄ«bas pÄrvaldÄ«t datu bÄzi:
$ su - postgres
postgres:~$ create database hw_dev_db_name;
CREATE DATABASE
postgres:~$ create user hw_dev_db_user with password 'hw_dev_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_dev_db_name to hw_dev_db_user;
GRANT
postgres:~$ create database hw_prod_db_name;
CREATE DATABASE
postgres:~$ create user hw_prod_db_user with password 'hw_prod_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_prod_db_name to hw_prod_db_user;
GRANT
RabbitMQ
PÄriesim pie Selery ziÅojumu brokera RabbitMQ instalÄÅ”anas. TÄs instalÄÅ”ana uz Debian ir pavisam vienkÄrÅ”a:
Tagad instalÄsim un konfigurÄsim mÅ«su lietojumprogrammas pÄdÄjo komponentu - Redis. Tas tiks izmantots kÄ aizmugursistÄma Selery uzdevumu rezultÄtu glabÄÅ”anai.
Izmantojot paplaÅ”inÄjumu, mÄs izveidosim divus Docker konteinerus ar Redis dev un prod vidÄm Docker par Plesku.
Dodieties uz Plesk, dodieties uz sadaļu PaplaÅ”inÄjumi, meklÄjiet Docker paplaÅ”inÄjumu un instalÄjiet to (mums ir nepiecieÅ”ama bezmaksas versija):
Dodieties uz instalÄto paplaÅ”inÄjumu, atrodiet attÄlu, izmantojot meklÄÅ”anu redis bitnami un instalÄjiet jaunÄko versiju:
MÄs ieejam lejupielÄdÄtajÄ konteinerÄ un pielÄgojam konfigurÄciju: norÄdiet portu, maksimÄlo pieŔķirto RAM lielumu, paroli vides mainÄ«gajos un uzstÄdiet skaļumu:
MÄs veicam 2.-3. darbÄ«bu prod konteineram, iestatÄ«jumos mainÄm tikai parametrus: ports, parole, RAM lielums un ceļŔ uz servera skaļuma mapi:
Docker reģistrs
Papildus pamata pakalpojumiem bÅ«tu jauki serverÄ« instalÄt savu Docker attÄlu krÄtuvi. Par laimi, vieta serveros tagad ir diezgan lÄta (noteikti lÄtÄk nekÄ DockerHub abonements), un privÄtÄs krÄtuves instalÄÅ”anas process ir ļoti vienkÄrÅ”s.
Izveidosim divus apakÅ”domÄnus Plesk savÄ abonementÄ: docker.helloworld.ru un docker-ui.helloworld.ru un konfigurÄsim tiem Let's Encrypt sertifikÄtus.
Pievienojiet failu docker.helloworld.ru apakÅ”domÄna mapei docker-compose.yml ar Å”Ädu saturu:
Un mums ir jÄnovirza Nginx uz mÅ«su konteineriem. To var izdarÄ«t caur Plesk.
ApakÅ”domÄniem docker.helloworld.ru un docker-ui.helloworld.ru ir jÄveic Å”Ädas darbÄ«bas:
IedaÄ¼Ä IzstrÄdes rÄ«ki dodieties uz mÅ«su vietni Docker starpniekservera noteikumi:
Un pievienojiet kÄrtulu mÅ«su konteinera ienÄkoÅ”Äs trafika starpniekserveram:
MÄs pÄrbaudÄm, vai varam pieteikties savÄ konteinerÄ no vietÄjÄs maŔīnas:
$ docker login docker.helloworld.ru -u hw_docker_admin -p hw_docker_password
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
NoklikŔķinot uz PÄrlÅ«kot repozitorijus, pÄrlÅ«kprogramma parÄdÄ«s autorizÄcijas logu, kurÄ jums bÅ«s jÄievada repozitorija lietotÄjvÄrds un parole. PÄc tam mÄs tiksim pÄrsÅ«tÄ«ti uz lapu ar repozitoriju sarakstu (pagaidÄm tas jums bÅ«s tukÅ”s):
Portu atvÄrÅ”ana Plesk ugunsmÅ«rÄ«
PÄc komponentu instalÄÅ”anas un konfigurÄÅ”anas mums ir jÄatver porti, lai komponenti bÅ«tu pieejami no Docker konteineriem un ÄrÄjÄ tÄ«kla.
ApskatÄ«sim, kÄ to izdarÄ«t, izmantojot iepriekÅ” instalÄtÄ Plesk ugunsmÅ«ra paplaÅ”inÄjuma piemÄru.
Iet uz Rīki un iestatījumi > Iestatījumi > Ugunsmūris:
Iet uz ModificÄt Plesk ugunsmÅ«ra noteikumus > Pievienot pielÄgotu kÄrtulu un atveriet tÄlÄk norÄdÄ«tos TCP portus Docker apakÅ”tÄ«klam (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
MÄs arÄ« pievienosim noteikumu, kas Ärpasaulei atvÄrs PostgreSQL portus un RabbitMQ pÄrvaldÄ«bas paneli:
Lietojiet noteikumus, izmantojot pogu Lietot izmaiÅas:
CI/CD iestatÄ«Å”ana programmÄ Github Actions
SÄksim pie visinteresantÄkÄs daļas - nepÄrtrauktas integrÄcijas konveijera izveides un mÅ«su projekta piegÄdes serverÄ«.
Å is cauruļvads sastÄvÄs no divÄm daļÄm:
attÄla veidoÅ”ana un testu palaiÅ”ana (aizmugursistÄmai) - Github pusÄ;
migrÄcijas palaiÅ”ana (aizmugursistÄmai) un konteineru izvietoÅ”ana serverÄ«.
Izvietot uz Plesku
Vispirms tiksim galÄ ar otro punktu (jo pirmais ir atkarÄ«gs no tÄ).
MÄs konfigurÄsim izvietoÅ”anas procesu, izmantojot Git paplaÅ”inÄjumu Plesk.
Apsveriet piemÄru ar Prod vidi aizmugursistÄmas repozitorijai.
MÄs pÄrejam uz mÅ«su Helloworld vietnes abonementu un dodamies uz Git apakÅ”sadaļu:
LaukÄ "Remote Git repozitorijs" ievietojiet saiti uz mÅ«su Github repozitoriju un mainiet noklusÄjuma mapi httpdocs citam (piem. /httpdocs/hw_back):
KopÄjiet SSH publisko atslÄgu no iepriekÅ”ÄjÄs darbÄ«bas un pievienot to Github iestatÄ«jumos.
NoklikŔķiniet uz Labi ekrÄnÄ 2. darbÄ«bÄ, pÄc kura mÄs tiksim novirzÄ«ti uz repozitorija lapu Plesk. Tagad mums ir jÄkonfigurÄ repozitorijs, lai tas tiktu atjauninÄts, veicot saistÄ«bas galvenajÄ filiÄlÄ. Lai to izdarÄ«tu, dodieties uz KrÄtuves iestatÄ«jumi un saglabÄjiet vÄrtÄ«bu Webhook URL (tas bÅ«s vajadzÄ«gs vÄlÄk, iestatot Github Actions):
EkrÄna laukÄ DarbÄ«bas no iepriekÅ”ÄjÄs rindkopas ievadiet skriptu, lai sÄktu izvietoÅ”anu:
cd {REPOSITORY_ABSOLUTE_PATH}
.ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}
ja:
{REPOSITORY_ABSOLUTE_PATH} ā ceļŔ uz prod backend repozitorija mapi serverÄ«; {ENV} - vide (dev/prod), mÅ«su gadÄ«jumÄ prod; {DOCKER_REGISTRY_HOST} ā mÅ«su dokera repozitorija saimnieks {TG_BOT_TOKEN} ā Telegram bota marÄ·ieris; {TG_CHAT_ID} ā tÄrzÄÅ”anas/kanÄla ID paziÅojumu sÅ«tÄ«Å”anai.
Skripta piemÄrs:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
.ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
MÄs pievienojam lietotÄju no mÅ«su abonementa grupai Docker (lai viÅÅ” varÄtu pÄrvaldÄ«t konteinerus):
sudo usermod -aG docker helloworld_admin
AizmugursistÄmas repozitorija un priekÅ”gala izstrÄdÄtÄju vide ir iestatÄ«ta vienÄdi.
IzvietoÅ”anas process ir vienkÄrÅ”s un sastÄv no trim galvenajiem posmiem:
attÄla izveidoÅ”ana un publicÄÅ”ana mÅ«su repozitorijÄ;
testu veikÅ”ana konteinerÄ, pamatojoties uz tikko apkopotu attÄlu;
izvietoÅ”ana vÄlamajÄ vidÄ atkarÄ«bÄ no filiÄles (izstrÄdÄtÄjs/masters).
frontend
Deploy.yml fails priekÅ”Äjai repozitorijai nedaudz atŔķiras no Beka. Tam trÅ«kst soļa ar testu izpildi un tiek mainÄ«ti izvietoÅ”anai paredzÄto marÄ·ieru nosaukumi. Starp citu, priekÅ”ÄjÄs krÄtuves noslÄpumi ir jÄaizpilda atseviŔķi.
Vietnes iestatīŔana
Trafika starpniekserveris, izmantojot Nginx
Nu mÄs esam nonÄkuÅ”i pie beigÄm. Atliek tikai konfigurÄt ienÄkoÅ”Äs un izejoÅ”Äs trafika starpniekserveri uz mÅ«su konteineru, izmantojot Nginx. MÄs jau esam aptvÄruÅ”i Å”o procesu Docker reÄ£istra iestatÄ«Å”anas 5. darbÄ«bÄ. Tas pats ir jÄatkÄrto ar aizmugurÄjo un priekÅ”Äjo daļu izstrÄdes un ražoÅ”anas vidÄs.
Es sniegÅ”u iestatÄ«jumu ekrÄnuzÅÄmumus.
aizmugure
frontend
SvarÄ«gs precizÄjums. Visi vietrÄži URL tiks pievienoti priekÅ”galda konteineram, izÅemot tos, kas sÄkas ar /api/ - tie tiks pievienoti aizmugurÄjam konteineram (tÄ aizmugurÄjÄ konteinerÄ visiem apstrÄdÄtÄjiem jÄsÄk ar /api/).
RezultÄti
Tagad mÅ«su vietnei vajadzÄtu bÅ«t pieejamai vietnÄs helloworld.ru un dev.helloworld.ru (attiecÄ«gi prod un dev vide).
KopumÄ mÄs uzzinÄjÄm, kÄ sagatavot vienkÄrÅ”u lietojumprogrammu programmÄs Flask un Angular un izveidot konveijeru programmÄ Github Actions, lai to izplatÄ«tu serverÄ«, kurÄ darbojas Plesk.