CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
Di vê gotarê de, ez ê ezmûna xwe di sazkirina CI/CD de bi karanîna panela kontrolê ya Plesk û Çalakiyên Github re parve bikim. Îro em ê fêr bibin ka meriv çawa projeyek hêsan bi navê hêsan "Helloworld" saz dike. Ew di çarçoveya Python Flask de, bi karkerên li Celery û pêşekek li Angular 8 ve hatî nivîsandin.

Girêdanên depoyan: backend, pêşiya.

Di beşa yekem a gotarê de em ê li projeya xwe û beşên wê binêrin. Di ya duyemîn de, em ê fêr bibin ka meriv çawa Plesk mîheng dike û pêvekirin û hêmanên pêwîst saz dike (DB, RabbitMQ, Redis, Docker, hwd.).

Di beşa sêyemîn de, em ê di dawiyê de fêhm bikin ka meriv çawa boriyek ji bo bicîhkirina projeya xwe li serverek di hawîrdorek dev û prod de saz dike. Û paşê em ê malperê li ser serverê bidin destpêkirin.

Û erê, min ji bîr kir ku ez xwe bidim naskirin. Navê min Oleg Borzov e, ez di tîmê CRM-ê de ji bo rêveberên deyndana mortgage-ê li Domklik pêşdebirek tev-stack im.

Projeya giştî

Pêşîn, bila em li du depoyên projeyê binihêrin - paşverû û pêş - û kodê bişopînin.

Beşa paşîn: Flask + Celery

Ji bo paşîn-dawiyê, min berhevokek ku di nav pêşdebirên Python de pir populer e hilda: çarçoveya Flask (ji bo API) û Celery (ji bo rêza peywirê). SQLAchemy wekî ORM tê bikar anîn. Alembic ji bo koçberan tê bikaranîn. Ji bo pejirandina JSON di destan de - Marshmallow.

В depoyên Dosyayek Readme.md heye ku bi hûrgulî ravekirin û rêwerzên ji bo destpêkirina projeyê heye.

Web Part API pir hêsan, ji 6 destan pêk tê:

  • /ping - kontrolkirina hebûna;
  • ji bo qeydkirin, destûrkirin, nedestûrkirin û wergirtina bikarhênerek destûrdar digire;
  • destekek ji bo şandina e-nameyek ku peywirê dixe rêza Celery.

Parçeya kerfê Ew hê hêsantir e, tenê pirsgirêkek heye send_mail_task.

Di peldankê de /conf du binpeldank hene:

  • docker bi du Dockerfiles (base.dockerfile ji bo avakirina image bingehîn ku kêm diguhere û Dockerfile ji bo civînên sereke);
  • .env_files - bi pelên bi guhêrbarên jîngehê ji bo derdorên cihêreng.

Di koka projeyê de çar pelên docker-compose hene:

  • docker-compose.local.db.yml ji bo pêşveçûnê databasek herêmî bilind bikin;
  • docker-compose.local.workers.yml ji bo bilindkirina herêmî ya xebatkar, databas, Redis û RabbitMQ;
  • docker-compose.test.yml ji bo ceribandinên di dema sazkirinê de xebitandin;
  • docker-compose.yml ji bo belavkirinê.

Û peldanka dawî ya balkêş ji bo me ye .ci-cd. Ew ji bo bicîhkirinê nivîsarên şêlê vedihewîne:

  • deploy.sh - destpêkirina koçberî û belavkirinê. Piştî çêkirin û ceribandinên di Github Actions de li ser serverê hate destpêkirin;
  • rollback.sh - konteynirên vegerandina guhertoya berê ya civînê;
  • curl_tg.sh - şandina agahdariyên bicîhkirinê ji Telegram re.

Frontend di Angular de

Depoya bi pêş ji ya Bekov pir sadetir e. Pêşî ji sê rûpelan pêk tê:

  • Rûpelê malê bi formek ji bo şandina e-nameyê û bişkokek derketinê.
  • Rûpelê têketinê.
  • Rûpelê qeydkirinê.

Rûpelê sereke asketî xuya dike:

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
Di root de du pel hene Dockerfile и docker-compose.yml, û her weha peldanka naskirî .ci-cd bi hejmarek piçûktir a nivîsan ji depoya paşîn (nivîsên ji bo ceribandinên xebitandinê hatine rakirin).

Li Plesk projeyek dest pê dike

Ka em bi sazkirina Plesk û afirandina abonetiyek ji bo malpera xwe dest pê bikin.

Sazkirina pêvekan

Di Plesk de ji me re çar dirêjkirin hewce ne:

  • Docker ji bo rêvebirin û xuyangkirina rewşa konteyneran di panela rêveberê Plesk de;
  • Git ji bo mîhengkirina pêngava bicihkirinê li ser serverê;
  • Let's Encrypt ji bo hilberîna (û oto-nûvekirina) sertîfîkayên TLS yên belaş;
  • Firewall ji bo fîlterkirina seyrûsefera hatinî mîheng bikin.

Hûn dikarin wan bi navgîniya panelê rêveberê Plesk di beşa Pêvekan de saz bikin:

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
Em ê ji bo mebestên xwe yên demo veavakirina berfireh nagirin, mîhengên xwerû dê guncan bin.

Abonetiyek û malperek çêbikin

Dûv re, pêdivî ye ku em ji bo malpera xwe abonetiyek helloworld.ru çêbikin û subdomain dev.helloworld.ru li wir zêde bikin.

  1. Em ji bo domaina helloworld.ru abonetiyê diafirînin û şîfreya têketinê ji bo bikarhênerê pergalê diyar dikin:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
    Qutiya li binê rûpelê kontrol bikin Bi Let's Encrypt domainê ewle bikin, heke em dixwazin HTTPS ji bo malperê mîheng bikin:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  2. Dûv re, di vê abonetiyê de, em subdomainek dev.helloworld.ru diafirînin (ji bo vê yekê hûn dikarin sertîfîkayek TLS ya belaş jî bidin):

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

Sazkirina pêkhateyên serverê

Em xwedî server bi OS Debian Dirêjkirin 9.12 û panelê kontrolê saz kirin Plesk Obsidian 18.0.27.

Divê em ji bo projeya xwe saz bikin û mîheng bikin:

  • PostgreSQL (di doza me de dê serverek bi du databasên ji bo hawîrdorên dev û prod hebe).
  • RabbitMQ (eynî tişt, yek mînakek bi vhostên cihêreng ji bo hawîrdoran).
  • Du mînakên Redis (ji bo hawîrdorên dev û prod).
  • Docker Registry (ji bo hilanîna herêmî ya wêneyên Docker ên berhevkirî).
  • Navbera UI ji bo qeydkirina Docker.

PostgreSQL

Plesk jixwe bi DBMSek PostgreSQL tê, lê ne guhertoya herî dawî (di dema nivîsandina Plesk Obsidian de piştgirî kirin Guhertoyên Postgres 8.4–10.8). Em ji bo serîlêdana xwe guhertoya herî dawî (12.3 di dema nivîsandinê de) dixwazin, ji ber vê yekê em ê wê bi destan saz bikin.

Rêwerzên berfireh li ser sazkirina Postgres li ser Debian gelek li ser înternetê heye (nimûne), ji ber vê yekê ez ê wan bi hûrgulî nebêjim, ez ê tenê fermanan bidim:

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

Bihesibînin ku PostgreSQL xwedan mîhengên xwerû yên pir navîn e, pêdivî ye ku meriv veavakirinê biguhezîne. Ev dê alîkariya me bike hesabker: Pêdivî ye ku hûn pîvanên servera xwe têkevin û mîhengên pelê biguhezînin /etc/postgresql/12/main/postgresql.confji yên ku hatine pêşniyar kirin. Li vir divê were zanîn ku hesabkerên weha ne guleyek efsûnî ne, û pêdivî ye ku bingeh li ser bingeha hardware, serîlêdan û tevliheviya pirsên we bi hûrgulî were guheztin. Lê ev ji bo destpêkirinê bes e.

Ji bilî mîhengên ku ji hêla hesabker ve têne pêşniyar kirin, em jî diguherînin postgresql.confporta xwerû 5432 ji yekî din re tê veqetandin (di mînaka me de - 53983).

Piştî ku pelê veavakirinê biguhezîne, bi fermanê re servera postgresql ji nû ve saz bike:

service postgresql restart

Me PostgreSQL saz kir û mîheng kir. Naha em databasek, bikarhênerên ji bo hawîrdorên dev û prod biafirînin, û mafên bikarhêneran bidin ku databasê birêve bibin:

$ 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

Werin em derbasî sazkirina RabbitMQ bibin, ku brokerek peyaman ji bo Celery ye. Ew li ser hatiye sazkirin Debian Ew pir hêsan e:

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

Piştî sazkirinê divê em çêbikin vhosts, bikarhêneran û mafên pêwîst bidin:

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

Naha em ji bo serîlêdana xwe pêkhateya paşîn saz bikin û mîheng bikin - Redis. Ew ê wekî paşverû were bikar anîn da ku encamên karên Celery hilîne.

Em ê du konteynerên Docker bi Redis re ji bo hawîrdorên dev û prod bi karanîna dirêjkirinê rakin Docker ji bo Plesk.

  1. Herin Plesk, biçin beşa Extensions, li dirêjkirina Docker bigerin û wê saz bikin (hewceya me bi guhertoya belaş heye):

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  2. Herin pêveka sazkirî, wêneyê bi lêgerînê bibînin redis bitnami û guhertoya herî dawî saz bikin:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  3. Em diçin nav konteynera dakêşandî û veavakirinê eyar dikin: portê, mezinahiya herî zêde ya RAM-ê ya veqetandî, şîfreya di guhêrbarên hawîrdorê de destnîşan bikin, û hejmûnê siwar bikin:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  4. Em gavên 2-3 ji bo konteynerê prod pêk tînin, di mîhengan de em tenê pîvanan diguhezînin: port, şîfre, mezinahiya RAM û rêça peldanka volumê ya li ser serverê:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

Docker Registry

Digel karûbarên bingehîn, dê xweş be ku hûn depoya wêneya xweya Docker-ê li ser serverê saz bikin. Xwezî, cîhê li ser serveran naha pir erzan e (bê guman ji abonetiya DockerHub erzantir e), û pêvajoya sazkirina depoyek taybet pir hêsan e.

Em dixwazin hebin:

Ji bo vê kirin:

  1. Ka em di abonetiya xwe de li Plesk du subdomain biafirînin: docker.helloworld.ru û docker-ui.helloworld.ru, û ji bo wan sertîfîkayên Let's Encrypt mîheng bikin.
  2. Pelê zêde bike peldanka subdomainê docker.helloworld.ru docker-compose.yml bi naverok bi vî rengî:
    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. Di bin SSH de, em ê pelek .htpasswd ji bo destûrnameya bingehîn di depoya Docker de biafirînin:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Ka em konteyneran berhev bikin û rakin:
    docker-compose up -d
  5. Û em hewce ne ku Nginx berbi konteynerên xwe vegerînin. Ev dikare bi rêya Plesk were kirin.

Pêdivî ye ku gavên jêrîn ji bo bindomayên docker.helloworld.ru û docker-ui.helloworld.ru bêne kirin:

beşa Dev Tools malpera me biçe Rêbazên Proxy Docker:

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
Û qaîdeyek ji bo prokskirina seyrûsefera hatinê li konteynera me zêde bikin:

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  1. Em kontrol dikin ku em dikarin ji makîneya herêmî têkevin konteynera xwe:
    $ 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. Werin em di heman demê de xebata bindomaina docker-ui.helloworld.ru jî kontrol bikin:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
    Dema ku hûn li ser Depoyan Bigerin bikirtînin, gerok dê pencereyek destûrnameyê nîşan bide ku hûn hewce ne ku têketin û şîfreya depoyê têkevin. Piştî vê yekê em ê ber bi rûpelek bi navnîşek depoyan ve werin rêve kirin (ji bo nuha ew ê vala be):

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

Vekirina portan di Plesk Firewall de

Piştî sazkirin û mîhengkirina pêkhateyan, pêdivî ye ku em benderan vekin da ku pêkhate ji konteynerên Docker û tora derveyî bigihîjin.

Ka em bibînin ka meriv çawa vê yekê bi karanîna mînaka dirêjkirina Firewall-ê ji bo Plesk-ê ku me berê saz kiriye, dike.

  1. Biçe Amûr & Mîheng > Mîheng > Firewall:
    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
  2. Biçe Rêgezên Plesk Firewall biguherînin> Rêzika Xweser lê zêde bikin û portên TCP-ê yên jêrîn ji bo jêrtora Docker vekin (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  3. Em ê qaîdeyek jî lê zêde bikin ku dê portên PostgreSQL û panela rêveberiya RabbitMQ ji cîhana derve re veke:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  4. Bi karanîna bişkojka Guhertinên Serlêdan, qaîdeyan bicîh bînin:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

Di Çalakiyên Github de CI/CD saz kirin

Ka em biçin beşa herî balkêş - sazkirina boriyek entegrasyonê ya domdar û gihandina projeya xwe ji serverê re.

Ev boriyê dê ji du beşan pêk were:

  • avakirina wêneyê û ceribandinên xebitandinê (ji bo paşîn) - li aliyê Github;
  • destpêkirina koçberan (ji bo paşîn) û danîna konteyneran li ser serverê.

Li Plesk bicîh bikin

Ka em pêşî bi xala duyemîn re mijûl bibin (ji ber ku ya yekem bi wê ve girêdayî ye).

Em ê pêvajoya bicîhkirinê bi karanîna dirêjkirina Git ji bo Plesk mîheng bikin.

Ka em li mînakek bi hawîrdora Prod-ê ji bo depoyek Backend-ê binêrin.

  1. Em diçin abonetiya malpera xwe ya Helloworld û diçin binbeşa Git:

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  2. Zencîreya depoya meya Github-ê li qada "Depoya Git-ya Dûr" bixin û peldanka xwerû biguherînin. httpdocs ji yê din re (mînak, /httpdocs/hw_back):

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  3. Mifteya Giştî ya SSH-ê ji gava berê kopî bikin û lêzêdekirin ew di mîhengên Github de.
  4. Di qonaxa 2-ê de li ser ekranê OK bikirtînin, piştî ku em ber bi rûpela depoyê ya li Plesk ve têne rêve kirin. Naha pêdivî ye ku em depoyê mîheng bikin da ku dema ku meriv bi şaxê masterê ve girêdayî ye nûve bike. Ji bo vê yekê, biçin Mîhengên Depoyê û nirxê xilas bike Webhook URL (Em ê paşê vê yekê hewce bikin dema ku Çalakiyên Github saz bikin):

    CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

  5. Li qada Çalakiyên li ser ekranê ji paragrafa berê, skrîptê têkevin da ku dest bi danînê bikin:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    derê

    {REPOSITORY_ABSOLUTE_PATH} - riya peldanka depoya paşîn a prod ya li ser serverê;
    {ENV} - jîngehê (dev / prod), di doza me de prod;
    {DOCKER_REGISTRY_HOST} - mêvandarê depoya meya dokerê
    {TG_BOT_TOKEN} - Token bot Telegram;
    {TG_CHAT_ID} - Nasnameya chat / kanalê ji bo şandina agahdariyan.

    Mînaka skrîptê:

    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. Em bikarhênerek ji abonetiya xwe li koma Docker zêde dikin (da ku ew bikaribe konteyneran birêve bibe):
    sudo usermod -aG docker helloworld_admin

Jîngeha Dev ji bo depoya paşîn û pêşiyê bi heman rengî têne mîheng kirin.

Xeta Berhevkirina Berbi Çalakiyên Github

Werin em biçin sazkirina beşa yekem a xeta xweya CI/CD-ê di Çalakiyên Github de.

Backend

Xeta boriya tê de tê şirove kirin pelê deploy.yml.

Lê berî parskirina wê, em guhêrbarên Veşartî yên ku em li Github hewce ne tije bikin. Ji bo vê yekê, biçin Mîheng -> Veşartî:

  • DOCKER_REGISTRY - mêvandarê depoya meya Docker (docker.helloworld.ru);
  • DOCKER_LOGIN - têkevin depoya Docker;
  • DOCKER_PASSWORD - şîfreya wê;
  • DEPLOY_HOST - mêvandarek ku panela rêveberiya Plesk li ser heye (mînak: helloworld.ru:8443 an 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - nîşanek ji bo danîna depoya prod ya li ser serverê (me ew di Deployment in Plesk, gav 4 de wergirt);
  • DEPLOY_BACK_DEV_TOKEN - nîşanek ji bo bicihkirina depoya dev a li ser serverê.

Pêvajoya sazkirinê hêsan e û ji sê gavên sereke pêk tê:

  • avakirin û weşandina wêneyê di depoya me de;
  • ceribandinên di konteynerê de li ser bingeha wêneyek nû hatî berhev kirin;
  • bicihkirina li hawîrdora xwestinê li gorî şaxê (dev / master).

Frontend

Pelê Deploy.yml ji bo depoya pêşîn ji ya Bekov ne pir cuda ye. Ew gavê ceribandinên xebitandinê winda dike û navên nîşanan ji bo bicîhkirinê diguhezîne. Veşartî ji bo depoya pêşiyê, bi awayê, pêdivî ye ku ji hev cuda bêne dagirtin.

Sazkirina malperê

Bi navgîniya Nginx ve seyrûsefera proxying

Erê, em gihîştin dawiyê. Tiştê ku dimîne ev e ku meriv proxykirina seyrûsefera hatin û derketinê ya li konteynera me bi navgîniya Nginx ve mîheng bike. Me berê vê pêvajoyê di gava 5-ê ya sazkirina Docker Registry de vegirtiye. Pêdivî ye ku heman tişt ji bo beşên paş û pêş ên di hawîrdorên dev û prod de were dubare kirin.

Ez ê dîmenên mîhengan peyda bikim.

Backend

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular

Frontend

CI/CD di Çalakiyên Github de ji bo projeyek Flask+Angular
Dibe ku. Hemî URL dê li konteynera pêşiyê werin veguheztin, ji bilî yên ku bi wan dest pê dikin /api/ - ew ê berbi konteynera paşîn ve werin girêdan (wiha di konteynera paşîn de, divê hemî hilber dest pê bikin /api/).

Encam

Naha divê malpera me li helloworld.ru û dev.helloworld.ru (bi rêzê, hawîrdorên prod û dev) bigihîje.

Bi tevahî, em fêr bûn ka meriv çawa di Flask û Angular de serîlêdanek hêsan amade dike û di Github Actions de boriyek saz dike da ku wê ji serverek ku Plesk dimeşîne rabike.

Ez ê girêdanên depoyan bi kodê dubare bikim: backend, pêşiya.

Source: www.habr.com

Ji bo malperên bi parastina DDoS, serverên VPS VDS mêvandariya pêbawer bikirin 🔥 Hostinga malperê ya pêbawer bi parastina DDoS, serverên VPS VDS bikirin | ProHoster