Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Бул макалада мен Plesk Control Panel жана Github Actions аркылуу CI/CD орнотуу боюнча тажрыйбам менен бөлүшөм. Бүгүн биз жөнөкөй "Hellouorld" аталышы менен жөнөкөй долбоорду кантип колдонууну үйрөнөбүз. Ал Flask Python алкагында жазылган, сельдерей жумушчулары жана Angular 8 фронту менен.

Репозиторийлерге шилтемелер: backend, frontend.

Макаланын биринчи бөлүгүндө биз долбоорбузду жана анын бөлүктөрүн карайбыз. Экинчиден, биз Pleskти кантип орнотууну жана керектүү кеңейтүүлөрдү жана компоненттерди (DB, RabbitMQ, Redis, Docker ж.б.) орнотууну чечебиз.

Үчүнчү бөлүктө, акыры, биз иштеп чыгуу жана өндүрүш чөйрөсүндөгү серверге долбоорубузду жайылтуу үчүн түтүктү кантип орнотууну чечебиз. Анан серверде сайтты ишке киргизебиз.

Ооба, мен өзүмдү тааныштырууну унутуп калыпмын. Менин атым Олег Борзов, мен Domclickтеги ипотекалык менеджерлер үчүн CRM командасынын толук иштеп чыгуучусумун.

Долбоорго сереп

Биринчиден, эки долбоордун репозиторийлерин карап көрөлү - арткы жана алдыңкы - жана кодду карап көрөлү.

Арткы тарап: Колба+Сельдерей

Арткы бөлүгү үчүн мен Python иштеп чыгуучулары арасында абдан популярдуу болгон бир топту алдым: Flask алкагы (API үчүн) жана Сельдерей (тапшырма кезеги үчүн). SQLAchemy ORM катары колдонулат. Алембик миграция үчүн колдонулат. туткаларда JSON текшерүү үчүн - Marshmallow.

В репозиторийлер түзүмүн жана долбоорду ишке ашыруу үчүн көрсөтмөлөрдү толук сүрөттөлүшү менен Readme.md файлы бар.

Web Part API абдан жөнөкөй, 6 калемден турат:

  • /ping - бар экендигин текшерүүгө;
  • каттоону, авторизациялоону, авторизациялоону жана ыйгарым укуктуу колдонуучуну алууну ишке ашырат;
  • Сельдерей кезегине тапшырма койгон электрондук почта туткасы.

Сельдерей бөлүгү андан да оңой, бир гана көйгөй бар send_mail_task.

папкасында /conf эки папка бар:

  • docker эки Dockerfile менен (base.dockerfile сейрек өзгөрүп турган базалык образды куруу жана Dockerfile негизги жыйындар үчүн);
  • .env_files - ар кандай чөйрөлөр үчүн чөйрө өзгөрмөлөрү бар файлдар менен.

Долбоордун түбүндө төрт докер түзүүчү файл бар:

  • docker-compose.local.db.yml өнүктүрүү үчүн жергиликтүү маалымат базасын түзүү;
  • docker-compose.local.workers.yml жумушчу, маалымат базасы, Redis жана RabbitMQ жергиликтүү жогорулатуу үчүн;
  • docker-compose.test.yml жайгаштыруу учурунда сыноолорду жүргүзүү;
  • docker-compose.yml жайгаштыруу үчүн.

Жана бизди кызыктырган акыркы папка - .ci-cd. Ал жайылтуу үчүн кабык скрипттерин камтыйт:

  • deploy.sh — миграцияны жана жайгаштырууну баштоо. Github аракеттеринде тесттерди куруп, иштеткенден кийин серверде иштейт;
  • rollback.sh - контейнерлерди чогултуунун мурунку вариантына кайтаруу;
  • curl_tg.sh - Telegramга жайгаштыруу эскертмелерин жөнөтүү.

Angular боюнча Frontend

Репозиторий алдыңкы менен Бектен алда канча жөнөкөй. алдыңкы үч барактан турат:

  • Электрондук почтаны жөнөтүү формасы жана чыгуу баскычы бар башкы бет.
  • Кирүү барагы.
  • Каттоо баракчасы.

Башкы бет аскеттик көрүнөт:

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Түптө эки файл бар Dockerfile и docker-compose.yml, ошондой эле тааныш папка .ci-cd арткы репозиторийге караганда бир аз азыраак скрипттер менен (тесттерди жүргүзүү үчүн алынып салынган скрипттер).

Plesk бир долбоорду баштоо

Келгиле, Pleskти орнотуу жана биздин сайтка жазылуу менен баштайлы.

Кеңейтүүлөр орнотулууда

Pleskте бизге төрт кеңейтүү керек:

  • Docker Plesk башкаруу панелинде контейнерлердин абалын башкаруу жана визуалдык түрдө көрсөтүү;
  • Git серверде жайылтуу кадамын конфигурациялоо үчүн;
  • Let's Encrypt бекер TLS сертификаттарын түзүү (жана авто-жаңыртуу) үчүн;
  • Firewall кирүүчү трафикти чыпкалоону конфигурациялоо.

Аларды Кеңейтүүлөр бөлүмүндөгү Plesk администратор панели аркылуу орното аласыз:

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Биз кеңейтүүлөрдүн деталдуу жөндөөлөрүн карабайбыз, демейки жөндөөлөр биздин демо максаттарыбыз үчүн иштейт.

Жазылуу жана сайт түзүү

Андан кийин, биз helloworld.ru веб-сайтыбызга жазылууну түзүп, ал жерге dev.helloworld.ru субдоменин кошушубуз керек.

  1. helloworld.ru доменине жазылууну түзүңүз жана системанын колдонуучусу үчүн логин-паролду көрсөтүңүз:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
    Барактын ылдый жагындагы кутучаны белгилеңиз Let's Encrypt менен доменди коргоңузэгерде биз сайт үчүн HTTPS орнотууну кааласак:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  2. Андан кийин, бул жазылууда dev.helloworld.ru субдоменин түзүңүз (бул үчүн сиз бекер TLS сертификатын да бере аласыз):

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

Сервер компоненттерин орнотуу

Бизде сервер бар OS Debian Stretch 9.12 жана орнотулган башкаруу панели Plesk Obsidian 18.0.27.

Биздин долбоор үчүн орнотуу жана конфигурациялоо керек:

  • PostgreSQL (биздин учурда, иштеп чыгуучу жана өндүрүштүк чөйрөлөр үчүн эки маалымат базасы бар бир сервер болот).
  • RabbitMQ (ошол эле, чөйрөлөр үчүн ар кандай вхосттор менен бирдей).
  • Эки Redis инстанциясы (иштеп чыгуучу жана өндүрүш чөйрөлөрү үчүн).
  • Докер реестри (курулган Docker сүрөттөрүн жергиликтүү сактоо үчүн).
  • Docker реестри үчүн UI.

PostgreSQL

Plesk мурунтан эле PostgreSQL DBMS менен келет, бирок акыркы версия эмес (Plesk Obsidian жазып жатканда колдоого алынган Postgres версиялары 8.4–10.8). Биз колдонмобуздун эң акыркы версиясын каалайбыз (бул жазуу учурунда 12.3), андыктан аны кол менен орнотобуз.

Интернетте Debianга Postgres орнотуу боюнча көптөгөн деталдуу көрсөтмөлөр бар (мисал), ошондуктан мен аларды майда-чүйдөсүнө чейин сүрөттөбөйм, мен жөн гана буйруктарды берем:

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

PostgreSQL демейки жөндөөлөргө ээ экенин эске алып, конфигурацияны оңдоо керек. Бул бизге жардам берет эсептегич: сиз сервериңиздин параметрлерин айдап, файлдагы орнотууларды алмаштырышыңыз керек /etc/postgresql/12/main/postgresql.confсунуш кылынгандарга. Бул жерде белгилей кетүү керек, мындай эсептегичтер сыйкырдуу ок эмес, база сиздин аппараттык камсыздооңузга, тиркемеңизге жана суроо-талаптын татаалдыгына жараша такыраак крондолушу керек. Бирок бул баштоо үчүн жетиштүү.

Калькулятор тарабынан сунушталган орнотуулардан тышкары, биз дагы өзгөрөбүз postgresql.confдемейки порт 5432 башкасына (биздин мисалда - 53983).

Конфигурация файлын өзгөрткөндөн кийин, төмөнкү буйрук менен postgresql-серверди өчүрүп күйгүзүңүз:

service postgresql restart

Биз PostgreSQLди орнотуп, конфигурациялап койдук. Эми келгиле, маалымат базасын түзөлү, иштеп чыгуучу жана өндүрүш чөйрөлөрүнүн колдонуучулары жана колдонуучуларга маалымат базасын башкаруу укугун берели:

$ 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

Rabbit MQ

Келгиле, сельдерей үчүн билдирүү брокери болгон RabbitMQ орнотууга өтөлү. Аны Debianга орнотуу абдан жөнөкөй:

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

Орнотуудан кийин, биз түзүү керек vhosts, колдонуучуларга жана керектүү укуктарды бериңиз:

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

Эми биздин тиркеме үчүн акыркы компонентти орнотуп, конфигурациялайлы - Redis. Ал Сельдерей тапшырмаларынын натыйжаларын сактоо үчүн колдоо катары колдонулат.

Кеңейтүүнү колдонуу менен иштеп чыгуучу жана продюсердик чөйрөлөр үчүн Redis менен эки Docker контейнерин көтөрөбүз Docker Plesk үчүн.

  1. Биз Pleskке барып, Кеңейтүүлөр бөлүмүнө өтүп, Docker кеңейтүүсүн издеп, аны орнотобуз (бизге акысыз версия керек):

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  2. Орнотулган кеңейтүүгө өтүңүз, издөө аркылуу сүрөттү табыңыз redis bitnami жана акыркы версиясын орнотуу:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  3. Жүктөлгөн контейнерге кирип, конфигурацияны тууралайбыз: портту, бөлүнгөн RAMдын максималдуу өлчөмүн, чөйрө өзгөрмөлөрүндөгү сырсөздү көрсөтүп, көлөмдү орнотобуз:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  4. Продукт контейнери үчүн 2-3 кадамдарды аткарабыз, жөндөөлөрдөн биз жөн гана параметрлерди өзгөртөбүз: порт, сырсөз, оперативдүү эс тутумдун өлчөмү жана сервердеги көлөм папкасына жол:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

Докер реестри

Негизги кызматтардан тышкары, серверге өзүңүздүн Docker сүрөт репозиторийиңизди койсоңуз жакшы болмок. Бактыга жараша, сервер мейкиндиги азыр кыйла арзан (Албетте, DockerHub жазылуусуна караганда арзан) жана жеке репозиторийди түзүү процесси абдан жөнөкөй.

Бизге ээ болгубуз келет:

  • сырсөз менен корголгон Докер репозиторийине поддоменде жеткиликтүү https://docker.helloworld.ru;
  • Репозиторийдеги сүрөттөрдү көрүү үчүн UI, дареги боюнча жеткиликтүү https://docker-ui.helloworld.ru.

Бул үчүн:

  1. Жазылуубузда Pleskте эки субдоменди түзөлү: docker.helloworld.ru жана docker-ui.helloworld.ru жана алар үчүн Let's Encrypt сертификаттарын конфигурациялайлы.
  2. Файлды docker.helloworld.ru субдомен папкасына кошуңуз docker-compose.yml мындай мазмун менен:
    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. SSH астында биз Docker репозиторийинде Негизги авторизация үчүн .htpasswd файлын түзөбүз:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Контейнерлерди чогултуу жана көтөрүү:
    docker-compose up -d
  5. Жана биз Nginxти контейнерлерибизге багытташыбыз керек. Бул Plesk аркылуу жасалышы мүмкүн.

docker.helloworld.ru жана docker-ui.helloworld.ru субдомендери үчүн төмөнкү кадамдарды жасоо керек:

Бөлүмүндө Dev Tools биздин сайтка өтүңүз Докер прокси эрежелери:

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Жана биздин контейнерге келген трафикти прокси үчүн эреже кошуңуз:

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  1. Жергиликтүү машинадан контейнерибизге кире аларыбызды текшеребиз:
    $ 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. Ошондой эле docker-ui.helloworld.ru субдоменинин иштешин текшерип көрөлү:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
    Репозиторийлерди карап чыгууну басканда, браузер авторизациялоо терезесин көрсөтөт, анда сиз репозиторийдин логин менен сырсөзүн киргизишиңиз керек болот. Андан кийин, биз репозиторийлердин тизмеси бар баракка багытталабыз (азырынча ал сиз үчүн бош):

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

Plesk Firewallдагы портторду ачуу

Компоненттерди орнотуп, конфигурациялагандан кийин, компоненттер Docker контейнерлеринен жана тышкы тармактан жеткиликтүү болушу үчүн портторду ачуубуз керек.

Келгиле, муну биз мурда орноткон Plesk үчүн Firewall кеңейтүүсү менен кантип жасоону карап көрөлү.

  1. Мурунку Куралдар жана Орнотуулар > Орнотуулар > Firewall:
    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
  2. Мурунку Plesk Firewall эрежелерин өзгөртүү > Ыңгайлаштырылган эрежени кошуу жана Docker ички тармагы үчүн төмөнкү TCP портторун ачыңыз (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  3. Ошондой эле биз тышкы дүйнөгө PostgreSQL портторун жана RabbitMQ башкаруу панелдерин ача турган эрежени кошобуз:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  4. Өзгөртүүлөрдү колдонуу баскычын колдонуп, эрежелерди колдонуңуз:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

Github аракеттеринде CI/CD орнотуу

Келгиле, эң кызыктуу бөлүгүнө — үзгүлтүксүз интеграция түтүгүн орнотууга жана проектибизди серверге жеткирүүгө келели.

Бул түтүк эки бөлүктөн турат:

  • сүрөттү куруу жана иштеп жаткан тесттер (backend үчүн) - Github тарабында;
  • Миграцияларды жүргүзүү (backend үчүн) жана контейнерлерди жайылтуу - серверде.

Pleskке жайгаштыруу

Адегенде экинчи пунктка токтололу (анткени биринчиси андан көз каранды).

Биз Plesk үчүн Git кеңейтүүсүн колдонуу менен жайылтуу процессин конфигурациялайбыз.

Backend репозиторий үчүн Prod чөйрөсү менен мисалды карап көрөлү.

  1. Биз Hellouorld веб-сайтыбызга жазылууга барып, Git бөлүмчөсүнө барабыз:

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  2. Биздин Github репозиторийибизге шилтемени "Алыскы Git репозиторий" талаасына кыстарыңыз жана демейки папканы өзгөртүңүз httpdocs башкага (мис. /httpdocs/hw_back):

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  3. Мурунку кадамдан SSH Коомдук ачкычын көчүрүңүз жана кошуу ал Github жөндөөлөрүндө.
  4. 2-кадамдагы экрандагы OK баскычын чыкылдатыңыз, андан кийин биз Pleskдеги репозиторий барагына багытталабыз. Эми биз репозиторийди башкы филиалга тапшыруу боюнча жаңыртуу үчүн конфигурациялашыбыз керек. Бул үчүн, өтүңүз Репозиторий орнотуулары жана маанини сактаңыз Webhook URL (бул бизге кийинчерээк Github аракеттерин орнотууда керек болот):

    Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

  5. Мурунку абзацтагы экрандагы "Аракеттер" талаасына жайгаштырууну ишке киргизүү үчүн скриптти киргизиңиз:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    мында:

    {REPOSITORY_ABSOLUTE_PATH} - сервердеги резервдик репозиторийдин прод папкасына жол;
    {ENV} - чөйрө (dev / prod), биздин учурда prod;
    {DOCKER_REGISTRY_HOST} - биздин докер репозиторийибиздин ээси
    {TG_BOT_TOKEN} — Telegram ботунун белгиси;
    {TG_CHAT_ID} — билдирүүлөрдү жөнөтүү үчүн чаттын/каналдын идентификатору.

    Скрипт үлгүсү:

    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. Докер тобуна жазылуубуздан колдонуучуну кошуңуз (алар контейнерлерди башкара алышы үчүн):
    sudo usermod -aG docker helloworld_admin

Backend репозиторий жана фронтон үчүн иштеп чыгуучу чөйрө дал ушундай жол менен орнотулган.

Github аракеттеринде жайылтуу түтүгү

Келгиле, Github аракеттеринде CI/CD түтүгүбүздүн биринчи бөлүгүн орнотууга өтөлү.

Backend

түтүк сүрөттөлгөн deploy.yml файлы.

Бирок аны талдоодон мурун, келгиле, Githubда бизге керек болгон Жашыруун өзгөрмөлөрдү толтуруп алалы. Бул үчүн, өтүңүз Орнотуулар -> Сырлар:

  • DOCKER_REGISTRY - биздин Docker репозиторийибиздин хосту (docker.helloworld.ru);
  • DOCKER_LOGIN - Docker репозиторийине кирүү;
  • DOCKER_PASSWORD - ага сырсөз;
  • DEPLOY_HOST — Plesk администратор панели жеткиликтүү болгон хост (мисалы: helloworld.com: 8443 же 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - сервердеги прод-репозиторийге жайылтуу үчүн белги (биз аны Pleskте жайгаштыруудан алдык 4-б.);
  • DEPLOY_BACK_DEV_TOKEN - сервердеги иштеп чыгуучу репозиторийге жайылтуу үчүн белги.

Жайгаштыруу процесси жөнөкөй жана үч негизги кадамдан турат:

  • биздин репозиторийдеги сүрөттү түзүү жана жарыялоо;
  • жаңы курулган сүрөттүн негизинде контейнерде тесттерди жүргүзүү;
  • тармакка жараша каалаган чөйрөгө жайылтуу (dev/master).

Frontend

Алдыңкы репозиторий үчүн deploy.yml файлы Бектен анча айырмаланбайт. Бул сыноолорду жүргүзүү менен бир кадам жок жана жайылтуу үчүн Токендердин атын өзгөртөт. Баса, алдыңкы репозиторийдин сырлары өзүнчө толтурулушу керек.

Сайт орнотуу

Nginx аркылуу прокси трафик

Ооба, биз аягына жеттик. Nginx аркылуу биздин контейнерге кирүүчү жана чыгуучу трафиктин проксисин конфигурациялоо гана калды. Биз бул процессти Докер реестрин орнотуунун 5-кадамында камтыганбыз. Ошол эле нерсени иштеп чыгуучу жана продюсердик чөйрөлөрдө арткы жана алдыңкы бөлүктөр үчүн кайталоо керек.

Мен орнотуулардын скриншотторун берем.

Backend

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD

Frontend

Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Маанилүү түшүндүрмө. менен башталгандардан башка бардык URL'дер фронтондук контейнерге проксиден өткөрүлөт /api/ - алар арткы контейнерге прокси болот (ошондуктан арткы контейнерде, бардык иштетүүчүлөр менен башталышы керек /api/).

натыйжалары

Эми биздин сайт helloworld.ru жана dev.helloworld.ru даректеринде болушу керек (тиешелүү түрдө prod- жана dev-environments).

Бардыгы болуп, биз Flask жана Angular тилдеринде жөнөкөй тиркемени кантип даярдоону үйрөндүк жана аны Plesk иштеткен серверге жайылтуу үчүн Github Actions программасында конвейерди орноттук.

Мен репозиторийлерге шилтемелерди код менен кайталайм: backend, frontend.

Source: www.habr.com

Комментарий кошуу