CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
Дар ин мақола, ман таҷрибаи худро оид ба танзими CI/CD бо истифода аз панели идоракунии Plesk ва амалҳои Github мубодила мекунам. Имрӯз мо мефаҳмем, ки чӣ гуна лоиҳаи оддиро бо номи мураккаби "Helloworld" ҷобаҷо кунем. Он дар чаҳорчӯбаи Flask Python бо коргарони Celery ва фронтали Angular 8 навишта шудааст.

Истинодҳо ба анборҳо: пушти сар, қисмати пеш.

Дар қисми якуми мақола мо лоиҳаи худ ва қисмҳои онро дида мебароем. Дар дуюм, мо мефаҳмем, ки чӣ гуна Plesk-ро насб кунем ва васеъкуниҳо ва ҷузъҳои заруриро насб кунем (DB, RabbitMQ, Redis, Docker ва ғайра).

Дар қисми сеюм, мо дар ниҳоят мефаҳмем, ки чӣ гуна қубурро барои ҷойгиркунии лоиҳаи мо ба сервер дар муҳити таҳиякунанда ва истеҳсолӣ насб кунем. Ва он гоҳ мо сайтро дар сервер оғоз мекунем.

Ва ҳа, ман худро муаррифӣ карданро фаромӯш кардам. Номи ман Олег Борзов аст, ман як таҳиягари пурра дар гурӯҳи CRM барои менеҷерони ипотека дар Domclick ҳастам.

Шарҳи лоиҳа

Аввалан, биёед ду анбори лоиҳаро бубинем - пушти сар ва пеш - ва аз болои код гузаред.

Қафо: Колба + Карафс

Барои қисми қафо, ман як дастаеро гирифтам, ки дар байни таҳиягарони Python хеле маъмул аст: чаҳорчӯбаи Flask (барои API) ва Celery (барои навбати вазифа). SQLAchemy ҳамчун ORM истифода мешавад. Alembic барои муҳоҷират истифода мешавад. Барои тасдиқи JSON дар дастаки - Marshmallow.

В анборҳо як файли Readme.md мавҷуд аст, ки бо тавсифи муфассали сохтор ва дастурҳо барои иҷро кардани лоиҳа.

API-и қисми веб хеле содда, аз 6 қалам иборат аст:

  • /ping - тафтиш кардани мавҷудият;
  • бақайдгирӣ, иҷозатдиҳӣ, бекоркунӣ ва гирифтани корбари ваколатдорро ҳал мекунад;
  • як дастаки почтаи электронӣ, ки мегузорад вазифа дар навбати карафс.

Қисми карафс ҳатто осонтар, танҳо як мушкилот вуҷуд дорад send_mail_task.

Дар папка /conf ду зерпапка вуҷуд дорад:

  • docker бо ду Dockerfiles (base.dockerfile сохтани симои базаи кам тагьирёбанда ва Dockerfile барои маҷлисҳои асосӣ);
  • .env_files - бо файлҳои дорои тағирёбандаҳои муҳити зист барои муҳитҳои гуногун.

Дар решаи лоиҳа чаҳор файли docker-compose мавҷуданд:

  • docker-compose.local.db.yml ба вучуд овардани базаи махаллии тараккиёт;
  • docker-compose.local.workers.yml барои баланд бардоштани маҳаллии коргар, базаи маълумот, Redis ва RabbitMQ;
  • docker-compose.test.yml барои гузаронидани санҷишҳо ҳангоми ҷойгиркунӣ;
  • docker-compose.yml барои ҷойгиркунӣ.

Ва папкаи охирине, ки мо ба он таваҷҷӯҳ дорем - .ci-cd. Он дорои скриптҳои shell барои густариш:

  • deploy.sh — оғози муҳоҷират ва ҷойгиркунӣ. Пас аз сохтан ва иҷро кардани санҷишҳо дар Github Actions дар сервер кор мекунад;
  • rollback.sh - баргардонидани контейнерҳо ба нусхаи қаблии васлкунӣ;
  • curl_tg.sh - фиристодани огоҳиномаҳо дар бораи ҷойгиркунӣ ба Telegram.

Frontend дар Angular

Репозиторий бо пеш назар ба Бек хеле соддатар аст. Саҳифа аз се саҳифа иборат аст:

  • Саҳифаи асосӣ бо шакл барои фиристодани почтаи электронӣ ва тугмаи баромадан.
  • Саҳифаи воридшавӣ.
  • Саҳифаи бақайдгирӣ.

Саҳифаи асосӣ аскетӣ ба назар мерасад:

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
Дар реша ду файл мавҷуд аст Dockerfile и docker-compose.yml, инчунин папкаи шинос .ci-cd бо скриптҳои каме камтар аз анбори қафо (скриптҳои хориҷшуда барои санҷишҳо).

Оғози лоиҳа дар Plesk

Биёед аз таъсиси Plesk ва эҷоди обуна барои сайти мо оғоз кунем.

Насб кардани васеъшавӣ

Дар Plesk ба мо чор васеъшавӣ лозим аст:

  • Docker идора ва ба таври визуалӣ нишон додани ҳолати контейнерҳо дар панели маъмурии Plesk;
  • Git барои танзим кардани қадами ҷойгиркунӣ дар сервер;
  • Let's Encrypt барои тавлиди (ва худкор нав кардани) сертификатҳои ройгони TLS;
  • Firewall барои танзими филтркунии трафики воридотӣ.

Шумо метавонед онҳоро тавассути панели администратори Plesk дар бахши васеъшавӣ насб кунед:

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
Мо танзимоти муфассали васеъкуниро баррасӣ намекунем, танзимоти пешфарз барои мақсадҳои намоишии мо кор хоҳанд кард.

Обуна ва сайт эҷод кунед

Баъдан, мо бояд барои вебсайти helloworld.ru обуна эҷод кунем ва дар он ҷо зердомени dev.helloworld.ru илова кунем.

  1. Барои домени helloworld.ru обуна эҷод кунед ва пароли логин-пароли корбари системаро муайян кунед:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
    Қуттии поёни саҳифаро тафтиш кунед Доменро бо Let's Encrypt муҳофизат кунедагар мо хоҳем, ки HTTPS-ро барои сайт насб кунем:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  2. Баъдан, дар ин обуна зердомени dev.helloworld.ru эҷод кунед (барои он шумо инчунин метавонед сертификати TLS-и ройгон диҳед):

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

Насб кардани ҷузъҳои сервер

Мо сервер дорем бо OS Debian Stretch 9.12 ва панели идоракунӣ насб карда шудааст Plesk Obsidian 18.0.27.

Мо бояд барои лоиҳаи худ насб ва танзим кунем:

  • PostgreSQL (дар ҳолати мо, як сервер бо ду пойгоҳи додаҳо барои муҳити dev ва prod хоҳад буд).
  • RabbitMQ (ҳамон, як мисол бо vhosts гуногун барои муҳитҳо).
  • Ду мисоли Redis (барои муҳити таҳиякунанда ва истеҳсолӣ).
  • Реестри Docker (барои нигаҳдории маҳаллии тасвирҳои сохташудаи Docker).
  • UI барои феҳристи Docker.

PostgreSQL

Plesk аллакай бо DBMS PostgreSQL меояд, аммо на версияи охирин (дар вақти навиштани Plesk Obsidian дастгирй мекунад Версияҳои Postgres 8.4–10.8). Мо мехоҳем, ки версияи охирини замимаи мо (12.3 дар вақти навиштани ин), аз ин рӯ, мо онро дастӣ насб мекунем.

Дар шабака дастурҳои муфассал оид ба насби Postgres дар Debian мавҷуданд (намуна), бинобар ин ман онҳоро ба таври муфассал тавсиф намекунам, ман танҳо фармонҳоро медиҳам:

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-server-ро бо фармон аз нав оғоз кунед:

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

Харгӯш

Биёед ба насби RabbitMQ, брокери паёмӣ барои Celery гузарем. Насб кардани он дар 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

Пас аз насб, мо бояд эҷод кунем ҳостҳо, истифодабарандагон ва додани ҳуқуқҳои зарурӣ:

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 -ро насб ва танзим кунем. Он ҳамчун пуштибони барои нигоҳ доштани натиҷаҳои вазифаҳои Celery истифода мешавад.

Мо бо истифода аз васеъшавӣ ду контейнери Docker-ро бо Redis барои муҳитҳои таҳиякунанда ва истеҳсолӣ мебардорем Docker барои Plesk.

  1. Мо ба Plesk меравем, ба бахши Extensions меравем, васеъшавии Docker-ро ҷустуҷӯ мекунем ва онро насб мекунем (ба мо версияи ройгон лозим аст):

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  2. Ба васеъкунии насбшуда равед, тасвирро тавассути ҷустуҷӯ пайдо кунед redis bitnami ва версияи охиринро насб кунед:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  3. Мо ба контейнери зеркашида ворид мешавем ва конфигуратсияро танзим мекунем: порт, андозаи максималии ҷудошудаи RAM, паролро дар тағирёбандаҳои муҳити зист муайян кунед ва ҳаҷмро насб кунед:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  4. Мо қадамҳои 2-3-ро барои контейнери маҳсулот иҷро мекунем, дар танзимот мо танҳо параметрҳоро тағир медиҳем: порт, парол, андозаи RAM ва роҳ ба папкаи ҳаҷми дар сервер:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

Феҳристи Docker

Илова ба хидматҳои асосӣ, хуб мебуд, ки анбори тасвири Docker-и худро дар сервер ҷойгир кунед. Хушбахтона, фазои сервер ҳоло хеле арзон аст (албатта арзонтар аз обунаи DockerHub) ва раванди таъсиси анбори хусусӣ хеле содда аст.

Мо мехоҳем дошта бошем:

Барои ин кор:

  1. Биёед дар обунаи худ дар Plesk ду зердомен эҷод кунем: docker.helloworld.ru ва docker-ui.helloworld.ru ва барои онҳо сертификатҳоро рамзгузорӣ кунем.
  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, мо файли .htpasswd-ро барои иҷозати Basic дар анбори Docker тавлид мекунем:
    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 ба сайти мо равед Қоидаҳои прокси Docker:

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
Ва барои прокси трафики воридотӣ ба контейнери мо қоида илова кунед:

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  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-ро тафтиш кунем:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
    Вақте ки шумо тугмаи "Муборизаи анборҳо" -ро пахш мекунед, браузер равзанаи иҷозатро намоиш медиҳад, ки дар он шумо бояд номи корбар ва паролро барои анбор ворид кунед. Пас аз он, мо ба саҳифае бо рӯйхати анборҳо интиқол дода мешавем (ҳоло он барои шумо холӣ хоҳад буд):

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

Кушодани портҳо дар Plesk Firewall

Пас аз насб ва танзим кардани ҷузъҳо, мо бояд бандарҳоро кушоем, то ки ҷузъҳо аз контейнерҳои Docker ва шабакаи беруна дастрас бошанд.

Биёед бубинем, ки ин корро бо истифода аз васеъшавии Firewall барои Plesk, ки қаблан насб карда будем, иҷро кунем.

  1. Бирав ба Асбобҳо ва Танзимотҳо > Танзимотҳо > Сипар:
    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
  2. Бирав ба Тағир додани Қоидаҳои Сипари Plesk > Иловаи Қоидаи фармоишӣ ва портҳои зерини TCP-ро барои зершабакаи Docker кушоед (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  3. Мо инчунин қоидаеро илова мекунем, ки портҳои PostgreSQL ва панелҳои идоракунии RabbitMQ-ро ба ҷаҳони беруна мекушояд:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  4. Қоидаҳоро бо истифода аз тугмаи Apply Changes татбиқ кунед:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

Насб кардани CI/CD дар Амалҳои Github

Биёед ба қисми ҷолибтарин - таъсиси лӯлаи пайвастаи ҳамгироӣ ва расонидани лоиҳаи мо ба сервер гузарем.

Ин қубур аз ду қисм иборат хоҳад буд:

  • сохтани тасвир ва иҷро кардани санҷишҳо (барои пушти сар) - дар тарафи Github;
  • интиқоли интиқол (барои пушти сар) ва ҷойгиркунии контейнерҳо - дар сервер.

Ба Plesk ҷойгир кунед

Биёед аввал бо нуктаи дуюм сару кор кунем (зеро нуктаи аввал ба он вобаста аст).

Мо раванди густаришро бо истифода аз тамдиди Git барои Plesk танзим мекунем.

Намунаеро бо муҳити Prod барои анбори Backend баррасӣ кунед.

  1. Мо ба обунаи вебсайти Hellouorld меравем ва ба зербахши Git меравем:

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  2. Истинодро ба анбори Github-и мо ба майдони "Remote Git repository" ворид кунед ва ҷузвдони пешфарзро тағир диҳед httpdocs ба дигараш (масалан. /httpdocs/hw_back):

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  3. Калиди ҷамъиятии SSH-ро аз қадами қаблӣ нусхабардорӣ кунед ва илова кунед он дар танзимоти Github.
  4. Дар қадами 2 дар экран OK -ро клик кунед, пас аз он мо ба саҳифаи репозиторий дар Plesk равона карда мешавем. Ҳоло ба мо лозим аст, ки репозиторийро танзим кунем, то дар бораи ӯҳдадориҳо ба филиали асосӣ нав карда шавад. Барои ин, ба Танзимоти анбор ва арзишро захира кунед Webhook URL (ба мо баъдтар ҳангоми насб кардани Амалҳои Github лозим мешавад):

    CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

  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} — 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. Аз обунаи мо ба гурӯҳи Docker корбар илова кунед (то онҳо тавонанд контейнерҳоро идора кунанд):
    sudo usermod -aG docker helloworld_admin

Муҳити таҳиякунанда барои анбори ақибмонда ва интерфейс бо ҳамин тарз танзим карда мешавад.

Қубури ҷобаҷогузорӣ дар Амалҳои Github

Биёед ба таъсиси қисми якуми лӯлаи CI/CD-и худ дар Github Actions гузарем.

Backend

Қубур дар тавсиф шудааст файли deploy.yml.

Аммо пеш аз таҳлили он, биёед тағирёбандаҳои махфиро, ки ба мо дар Github лозиманд, пур кунем. Барои ин, ба Танзимот -> Сирри:

  • DOCKER_REGISTRY - мизбони анбори Docker мо (docker.helloworld.ru);
  • DOCKER_LOGIN - ворид шудан ба анбори Docker;
  • DOCKER_PASSWORD - парол ба он;
  • DEPLOY_HOST — ҳост, ки дар он панели маъмурии Plesk дастрас аст (масалан: helloworld.ru: 8443 ё 123.4.56.78: 8443);
  • DEPLOY_BACK_PROD_TOKEN - нишона барои ҷойгиркунӣ ба прод-анбори сервер (мо онро дар Deployment дар Plesk саҳ. 4 гирифтаем);
  • DEPLOY_BACK_DEV_TOKEN - нишона барои ҷойгиркунӣ ба анбори dev дар сервер.

Раванди ҷойгиркунӣ оддӣ аст ва аз се марҳилаи асосӣ иборат аст:

  • сохтан ва нашр кардани тасвир дар анбори мо;
  • озмоишҳо дар як контейнер дар асоси тасвири нав сохташуда;
  • ҷойгиркунӣ ба муҳити дилхоҳ вобаста ба филиал (dev/master).

Frontend

Файли deploy.yml барои анбори пеши аз Бек каме фарқ мекунад. Он як қадам бо санҷишҳои иҷрошаванда надорад ва номи аломатҳоро барои ҷойгиркунӣ тағир медиҳад. Асрори анбори пеши, дар омади гап, бояд алоҳида пур карда шавад.

Насби сайт

Прокси трафик тавассути Nginx

Хуб, мо ба охир расидем. Танҳо танзим кардани прокси трафики воридотӣ ва содиротӣ ба контейнери мо тавассути Nginx боқӣ мемонад. Мо аллакай ин равандро дар қадами 5-и танзими Реестри Docker фаро гирифтем. Ҳамин чиз бояд барои қисмҳои қафо ва пеш дар муҳити таҳия ва истеҳсолӣ такрор карда шавад.

Ман скриншотҳои танзимотро пешниҳод мекунам.

Backend

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular

Frontend

CI/CD дар Амалҳои Github барои лоиҳаи Flask+Angular
Интихоб кунед. Ҳама URL-ҳо ба контейнери фронтенд прокси карда мешаванд, ба истиснои онҳое, ки бо /api/ - онҳо ба контейнери қафо прокси карда мешаванд (ҳамин тавр дар контейнер қафо, ҳамаи handers бояд бо оғоз /api/).

Натиҷаҳо

Ҳоло сайти мо бояд дар helloworld.ru ва dev.helloworld.ru дастрас бошад (мутаносибан prod- ва dev-environments).

Дар маҷмӯъ, мо фаҳмидем, ки чӣ гуна як барномаи оддиро дар Flask ва Angular омода кунем ва дар Github Actions лӯлаи насб кунем, то онро ба сервери Plesk интиқол диҳем.

Ман истинодҳоро ба анборҳо бо код такрор мекунам: пушти сар, қисмати пеш.

Манбаъ: will.com

Илова Эзоҳ