CI/CD programmā Github Actions projektā Flask+Angular

CI/CD programmā Github Actions projektā Flask+Angular
Å 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.

Saites uz krātuvēm: aizmugure, frontend.

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.

Mapē /konf ir divas apakÅ”mapes:

  • docker ar diviem Docker failiem (base.dockerfile lai izveidotu bāzes attēlu, kas reti mainās un Dockerfile galvenajiem mezgliem);
  • .env_files - ar failiem ar vides mainÄ«gajiem dažādām vidēm.

Projekta saknē ir četri docker-compose faili:

  • docker-compose.local.db.yml izveidot lokālu datubāzi attÄ«stÄ«bai;
  • docker-compose.local.workers.yml lokālai strādnieka audzināŔanai, datu bāzei, Redis un RabbitMQ;
  • docker-compose.test.yml testu veikÅ”anai izvietoÅ”anas laikā;
  • docker-compose.yml izvietoÅ”anai.

Un pēdējā mÅ«s interesējoŔā mape ir .ci-cd. Tas satur čaulas skriptus izvietoÅ”anai:

  • deploy.sh ā€” migrācijas un izvietoÅ”anas uzsākÅ”ana. Darbojas serverÄ« pēc Github Actions testu izveides un palaiÅ”anas;
  • rollback.sh - konteineru atgrieÅ”ana uz iepriekŔējo montāžas versiju;
  • curl_tg.sh - izvietoÅ”anas paziņojumu nosÅ«tÄ«Å”ana uz Telegram.

PriekŔpuse uz Angular

Repozitorijs ar priekŔpusi daudz vienkārŔāka nekā Beka. PriekŔpuse sastāv no trim lapām:

  • 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:

CI/CD programmā Github Actions projektā Flask+Angular
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:

CI/CD programmā Github Actions projektā Flask+Angular
Mēs neapsvērsim detalizētu paplaÅ”inājumu konfigurāciju; mÅ«su demonstrācijas nolÅ«kiem bÅ«s piemēroti noklusējuma iestatÄ«jumi.

Abonementa un vietnes izveide

Tālāk mums ir jāizveido mÅ«su vietnes helloworld.ru abonements un jāpievieno tur apakÅ”domēns dev.helloworld.ru.

  1. Mēs izveidojam domēna helloworld.ru abonementu un norādām sistēmas lietotāja pieteikÅ”anās paroli:

    CI/CD programmā Github Actions projektā Flask+Angular
    AtzÄ«mējiet izvēles rÅ«tiņu lapas apakŔā NodroÅ”iniet domēnu, izmantojot funkciju Let's Encryptja vēlamies vietnei iestatÄ«t HTTPS:

    CI/CD programmā Github Actions projektā Flask+Angular

  2. Pēc tam Å”ajā abonementā izveidojiet apakÅ”domēnu dev.helloworld.ru (kuram varat arÄ« izsniegt bezmaksas TLS sertifikātu):

    CI/CD programmā Github Actions projektā Flask+Angular

Servera komponentu instalēŔana

Mums ir serveris ar OS Debian Stretch 9.12 un uzstādÄ«ts vadÄ«bas panelis Pleskas obsidiāns 18.0.27.

Mums ir jāinstalē un jākonfigurē mūsu projektam:

  • PostgreSQL (mÅ«su gadÄ«jumā bÅ«s viens serveris ar divām datu bāzēm dev un prod vidēm).
  • RabbitMQ (tas pats, tas pats gadÄ«jums ar dažādiem vhosts vidēm).
  • Divi Redis gadÄ«jumi (izstrādātāju un produkciju vidēm).
  • Docker reÄ£istrs (apkopoto Docker attēlu lokālai glabāŔanai).
  • Docker reÄ£istra lietotāja saskarne.

PostgreSQL

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:

wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

Ņ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:

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

sudo apt-get update
sudo apt-get install erlang erlang-nox

sudo add-apt-repository 'deb http://www.rabbitmq.com/debian/ testing main'
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

sudo apt-get update
sudo apt-get install rabbitmq-server

Pēc instalÄ“Å”anas mums ir jāizveido vhosts, lietotājiem un pieŔķirt nepiecieÅ”amās tiesÄ«bas:

sudo rabbitmqctl add_user hw_dev_amqp_user hw_dev_amqp_password 
sudo rabbitmqctl set_user_tags hw_dev_amqp_user administrator
sudo rabbitmqctl add_vhost hw_dev_vhost
sudo rabbitmqctl set_permissions -p hw_dev_vhost hw_dev_amqp_user ".*" ".*" ".*"

sudo rabbitmqctl add_user hw_prod_amqp_user hw_prod_amqp_password 
sudo rabbitmqctl set_user_tags hw_prod_amqp_user administrator
sudo rabbitmqctl add_vhost hw_prod_vhost
sudo rabbitmqctl set_permissions -p hw_prod_vhost hw_prod_amqp_user ".*" ".*" ".*"

Redis

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.

  1. 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):

    CI/CD programmā Github Actions projektā Flask+Angular

  2. Dodieties uz instalēto paplaÅ”inājumu, atrodiet attēlu, izmantojot meklÄ“Å”anu redis bitnami un instalējiet jaunāko versiju:

    CI/CD programmā Github Actions projektā Flask+Angular

  3. 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:

    CI/CD programmā Github Actions projektā Flask+Angular

  4. 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:

    CI/CD programmā Github Actions projektā Flask+Angular

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.

Mēs vēlamies, lai mums būtu:

Lai to izdarītu:

  1. 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.
  2. Pievienojiet failu docker.helloworld.ru apakÅ”domēna mapei docker-compose.yml ar Ŕādu saturu:
    version: "3"
    
    services:
      docker-registry:
        image: "registry:2"
        restart: always
        ports:
          - "53985:5000"
        environment:
          REGISTRY_AUTH: htpasswd
          REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
          REGISTRY_AUTH_HTPASSWD_PATH: /auth/.htpasswd
          REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
        volumes:
          - ./.docker-registry.htpasswd:/auth/.htpasswd
          - ./data:/data
    
      docker-registry-ui:
        image: konradkleine/docker-registry-frontend:v2
        restart: always
        ports:
          - "53986:80"
        environment:
          VIRTUAL_HOST: '*, https://*'
          ENV_DOCKER_REGISTRY_HOST: 'docker-registry'
          ENV_DOCKER_REGISTRY_PORT: 5000
        links:
          - 'docker-registry'
    

  3. Zem SSH mēs ģenerēsim .htpasswd failu pamata autorizācijai Docker repozitorijā:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Savācam un pacelsim konteinerus:
    docker-compose up -d
  5. 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:

CI/CD programmā Github Actions projektā Flask+Angular
Un pievienojiet kārtulu mūsu konteinera ienākoŔās trafika starpniekserveram:

CI/CD programmā Github Actions projektā Flask+Angular

  1. 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
  2. PārbaudÄ«sim arÄ« apakÅ”domēna docker-ui.helloworld.ru darbÄ«bu:

    CI/CD programmā Github Actions projektā Flask+Angular
    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):

    CI/CD programmā Github Actions projektā Flask+Angular

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.

  1. Iet uz Rīki un iestatījumi > Iestatījumi > Ugunsmūris:
    CI/CD programmā Github Actions projektā Flask+Angular
  2. 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

    CI/CD programmā Github Actions projektā Flask+Angular

  3. Mēs arī pievienosim noteikumu, kas ārpasaulei atvērs PostgreSQL portus un RabbitMQ pārvaldības paneli:

    CI/CD programmā Github Actions projektā Flask+Angular

  4. Lietojiet noteikumus, izmantojot pogu Lietot izmaiņas:

    CI/CD programmā Github Actions projektā Flask+Angular

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.

  1. Mēs pārejam uz mÅ«su Helloworld vietnes abonementu un dodamies uz Git apakÅ”sadaļu:

    CI/CD programmā Github Actions projektā Flask+Angular

  2. Laukā "Remote Git repozitorijs" ievietojiet saiti uz mūsu Github repozitoriju un mainiet noklusējuma mapi httpdocs citam (piem. /httpdocs/hw_back):

    CI/CD programmā Github Actions projektā Flask+Angular

  3. Kopējiet SSH publisko atslēgu no iepriekŔējās darbÄ«bas un pievienot to Github iestatÄ«jumos.
  4. 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):

    CI/CD programmā Github Actions projektā Flask+Angular

  5. 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
  6. 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 cauruļvads uz Github darbībām

Pāriesim pie mūsu CI/CD konveijera pirmās daļas iestatīŔanas pakalpojumā Github Actions.

aizmugure

Cauruļvads ir aprakstīts deploy.yml failu.

Bet pirms tā parsÄ“Å”anas aizpildÄ«sim slepenos mainÄ«gos, kas mums nepiecieÅ”ami Github. Lai to izdarÄ«tu, dodieties uz IestatÄ«jumi -> Noslēpumi:

  • DOCKER_REGISTRY ā€” mÅ«su Docker repozitorija resursdators (docker.helloworld.ru);
  • DOCKER_LOGIN ā€” pieteikÅ”anās Docker repozitorijā;
  • DOCKER_PASSWORD - parole tai;
  • DEPLOY_HOST ā€” resursdators, kurā ir pieejams Plesk administratora panelis (piemērs: helloworld.ru: 8443 vai 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN ā€” marÄ·ieris izvietoÅ”anai prod repozitorijā serverÄ« (mēs to saņēmām sadaļā Deployment in Plesk, 4. darbÄ«ba);
  • DEPLOY_BACK_DEV_TOKEN ā€” marÄ·ieris izvietoÅ”anai servera izstrādātāja repozitorijā.

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

CI/CD programmā Github Actions projektā Flask+Angular

frontend

CI/CD programmā Github Actions projektā Flask+Angular
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.

Es dublÄ“Å”u saites uz krātuvēm ar kodu: aizmugure, frontend.

Avots: www.habr.com

Pievieno komentāru