{"id":85646,"date":"2020-06-18T01:42:15","date_gmt":"2020-06-17T23:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ci-cd-v-github-actions-dlya-proekta-na-flask-angular"},"modified":"2020-06-18T01:42:15","modified_gmt":"2020-06-17T23:42:15","slug":"ci-cd-v-github-actions-dlya-proekta-na-flask-angular","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ci-cd-v-github-actions-dlya-proekta-na-flask-angular","title":{"rendered":"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/26d0945a41bbf3c98fa92f15be5b8c6c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelles artiklis jagan oma kogemusi CI\/CD seadistamisel, kasutades Pleski juhtpaneeli ja Github Actions'i. T\u00e4na \u00f5pime, kuidas k\u00e4ivitada lihtsat projekti nimega \"Helloworld\", mis on kirjutatud Python'i raamistikus Flask, Celery t\u00f6\u00f6tajatega ja Angular 8 frontendiga.<\/p>\n<p><b>Repo \u00fchendused:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\">tagumine osa<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld-front\">esimene osa<\/a><\/noindex>.<\/p>\n<p>Artikli esimeses osas vaatame meie projekti ja selle komponente. Teises osas selgitame, kuidas seadistada Pleskit ja installida vajalikud laiendused ja komponendid (andmebaas, RabbitMQ, Redis, Docker jne).<\/p>\n<p>Kolmandas osas k\u00e4sitleme l\u00f5puks, kuidas seadistada pipelines, et k\u00e4ivitada meie projekt serveris dev- ja prod-keskkonnas. Seej\u00e4rel k\u00e4ivitame saidi serveris.<\/p>\n<p>Ja jah, unustasin end tutvustada. Minu nimi on Oleg Borzov, olen t\u00e4isvirna arendaja CRM meeskonnas, mis tegeleb kodulaenude halduritega Domklik'is. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Projekt vaade<\/h1>\n<p>\nAlustuseks vaatame kahte projekti hoidlat \u2014 tagumist osa ja esimest osa \u2014 ning n\u00e4eme koodi \u00fcle.<\/p>\n<h2>Tagumine osa: Flask + Celery<\/h2>\n<p>\nTagak\u00fcljeks valisin Python-arendajate seas \u00fcsna populaarse kombinatsiooni: Flask (API jaoks) ja Celery (\u00fclesannete j\u00e4rjekorra jaoks). ORM-ina kasutatakse SQLAlchemy't. Migratsioonide jaoks on kasutusel Alembic. JSONi valideerimiseks k\u00e4epidemetes \u2013 Marshmallow.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\">repositoriis<\/a><\/noindex> on olemas fail Readme.md, kus on selle struktuuri ja projekti k\u00e4ivitamiseks vajalikud juhised.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\/tree\/master\/app_web\">Veebi API<\/a><\/noindex> on piisavalt lihtne, koosneb 6 k\u00e4epidemest:<\/p>\n<ul>\n<li><code>\/ping<\/code> \u2014 t\u00f6\u00f6kindluse kontrollimiseks;<\/li>\n<li>k\u00e4epidemed registreerimiseks, autentimiseks, deautentimiseks ja autentitud kasutaja saamiseks;<\/li>\n<li>k\u00e4epide e-kirjade saatmiseks, mis paneb \u00fclesande Celery j\u00e4rjekorda.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\/tree\/master\/app_celery\">Celery osa<\/a><\/noindex> on veelgi lihtsam, seal on vaid \u00fcks \u00fclesanne <code>send_mail_task<\/code>.<\/p>\n<p>Kaustas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\/tree\/master\/conf\/\">\/conf<\/a><\/noindex> on kaks alamkausta: <\/p>\n<ul>\n<li><code>docker<\/code> kahe Docker-failiga (<code>base.dockerfile<\/code> harva muutuva p\u00f5hikujundi jaoks ja <code>Dockerfile<\/code> peamiseks kogumis);<\/li>\n<li><code>.env_files<\/code> \u2014 keskkonnamuutujatefailidega erinevatele keskkondadele. <\/li>\n<\/ul>\n<p>\nProjekti juures on neli docker-compose faili:<\/p>\n<ul>\n<li><code>docker-compose.local.db.yml<\/code> kohaliku arenduse andmebaasi k\u00e4ivitamiseks;<\/li>\n<li><code>docker-compose.local.workers.yml<\/code> kohalike t\u00f6\u00f6tajate, andmebaasi, Redis'i ja RabbitMQ k\u00e4ivitamiseks;<\/li>\n<li><code>docker-compose.test.yml<\/code> testide l\u00e4biviimiseks juurutuse k\u00e4igus;<\/li>\n<li><code>docker-compose.yml<\/code> deploomiseks.<\/li>\n<\/ul>\n<p>\nJa viimane huvitav kaust, millel on t\u00e4htsust \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\/tree\/master\/.ci-cd\">.ci-cd<\/a><\/noindex>. Siin on shell-scriptid juurutamiseks:<\/p>\n<ul>\n<li><code>deploy.sh<\/code> \u2014 migratsiooni ja juurutamise k\u00e4ivitamine. K\u00e4ivitatakse serveris p\u00e4rast koostamist ja testide l\u00e4biviimist Github Actions'is;<\/li>\n<li><code>rollback.sh<\/code> \u2014 konteinerite tagasiviimine eelnenud versiooni.<\/li>\n<li><code>curl_tg.sh<\/code> \u2014 teavituste saatmine juurutamisest Telegramisse.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Frontend Angularil<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld-front\">Repo front-end'iga<\/a><\/noindex> on palju lihtsam kui back-end. Front koosneb kolmest lehelt:<\/p>\n<ul>\n<li>Pealeht koos e-posti saatmise vormi ja v\u00e4ljuminenuhiga.<\/li>\n<li>Sisselogimise leht.<\/li>\n<li>Registreerimise leht.<\/li>\n<\/ul>\n<p>\nPealeht n\u00e4eb minimaalne v\u00e4lja:<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/4db36add2c4277397724b0d71b96ff06.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJuurtas on kaks faili <code>Dockerfile<\/code> ja <code>docker-compose.yml<\/code>, samuti tuttav meile kaust <code>.ci-cd<\/code> veidi v\u00e4hemate skriptidega kui back-end'i repos (testide k\u00e4ivitamise skriptid on eemaldatud).<\/p>\n<h1>Loome projekti Pleskis<\/h1>\n<p>\nAlustame Pleski seadistamise ja tellimuse loomisega meie saidile.<\/p>\n<h2>Laienduste installimine<\/h2>\n<p>\nPleskis vajame nelja laiendust: <\/p>\n<ul>\n<li><code>Docker<\/code> konteinerite haldamiseks ja nende oleku visuaalseks kuvamiseks Pleski halduses;<\/li>\n<li><code>Git<\/code> pakkumise seadistamiseks serveris;<\/li>\n<li><code>Let's Encrypt<\/code> tasuta TLS-sertifikaatide genereerimiseks (ja automaatseks uuendamiseks);<\/li>\n<li><code>Firewall<\/code> sissetuleva liikluse filtreerimise seadistamiseks.<\/li>\n<\/ul>\n<p>\nNeed saab installida Pleski halduses jaotises Extensions:<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/350cf7d7ca3ae1a965a0d3f8a73594ef.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAinult p\u00f5hiseaded sobivad meie demonstratsioonide jaoks, detailset seadistust me ei aruta.<\/p>\n<h2>Tellimuse ja veebisaidi loomine<\/h2>\n<p>\nEdasi peame looma tellimuse meie veebisaidile helloworld.ru ja lisama alamdomeeni dev.helloworld.ru.<\/p>\n<ol>\n<li>Loome tellimuse domeenile helloworld.ru ja m\u00e4\u00e4rame s\u00fcsteemikasutaja kasutajanime ja parooli:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/3932dc7492aa523b6cbd540ad7a7fe6b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAllpool lehte paneme linnukese <i>Kaitse domeeni Let&#8217;s Encryptiga<\/i>, kui soovime seadistada HTTPS-i veebisaidile:<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/f4d23a34764fdeb411fe2ca9cc95cb45.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Edasi selles tellimuses loome alamdomeeni dev.helloworld.ru (mille jaoks saab samuti tasuta TLS-sertifikaadi v\u00e4lja anda):\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/d57e6ba71454cb537917400de4275e92.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p><\/p>\n<h1>Serverikomponentide installimine<\/h1>\n<p>\nMeil on server, millel on <i>OS Debian Stretch 9.12<\/i> ja paigaldatud halduspaneel <i>Plesk Obsidian 18.0.27<\/i>.<\/p>\n<p>Peame installima ja seadistama meie projekti jaoks:<\/p>\n<ul>\n<li>PostgreSQL (meie juhul on \u00fcks server kahe andmebaasiga dev- ja prod-keskkonna jaoks).<\/li>\n<li>RabbitMQ (sama, \u00fcks instants erinevate vhosts vahel keskkondade jaoks).<\/li>\n<li>Kaks Redis\u2019i instantsi (dev- ja prod-keskkonna jaoks).<\/li>\n<li>Docker Registry (kogutud Docker-piltide kohalikuks salvestamiseks).<\/li>\n<li>Docker registry jaoks UI-liides.<\/li>\n<\/ul>\n<p><\/p>\n<h2>PostgreSQL<\/h2>\n<p>\nPleskiga tuleb juba kaasa PostgreSQL andmebaas, kuid mitte k\u00f5ige uuema versiooniga (artikli kirjutamise ajal toetas Plesk Obsidian <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.plesk.com\/release-notes\/obsidian\/software-requirements\/\">siiski versiooni<\/a><\/noindex> Postgres versioonid 8.4\u201310.8). Meie soovime oma rakendusele k\u00f5ige uuemat versiooni (12.3 kirjutamise ajal), seega paigaldame selle k\u00e4sitsi.<\/p>\n<p>Internetis on palju \u00fcksikasjalikke juhiseid Postgresi paigaldamiseks Debianile (<noindex><a rel=\"nofollow\" href=\"https:\/\/tecadmin.net\/install-postgresql-on-debian-9-stretch\/\">an example<\/a><\/noindex>), seega ei hakka ma neid \u00fcksikasjalikult kirjeldama, lihtsalt toome v\u00e4lja k\u00e4sud:<\/p>\n<pre><code class=\"bash\">wget -q https:\/\/www.postgresql.org\/media\/keys\/ACCC4CF8.asc -O - | sudo apt-key add -\nsudo sh -c 'echo \"deb http:\/\/apt.postgresql.org\/pub\/repos\/apt\/ stretch-pgdg main\" &gt;&gt; \/etc\/apt\/sources.list.d\/pgdg.list'\n\nsudo apt-get update\nsudo apt-get install postgresql postgresql-contrib\n<\/code><\/pre>\n<p>\nArvestades, et PostgreSQL-i vaikeseaded on \u00fcsna keskp\u00e4rased, on vajalik kindlasti konfiguratsiooni kohandamine. Meid aitab selle juures <noindex><a rel=\"nofollow\" href=\"http:\/\/pgconfigurator.cybertec.at\/\">kalkulaator<\/a><\/noindex>: tuleb sisestada oma serveri parameetrid ja asendada seaded failis <code>\/etc\/postgresql\/12\/main\/postgresql.conf<\/code>soovitustega. Siinkohal tuleks m\u00e4rkida, et sellised kalkulaatorid ei ole imerohtu ning andmebaasi tuleks t\u00e4psemalt h\u00e4\u00e4lestada, l\u00e4htudes teie riistvarast, rakendusest ja p\u00e4ringute keerukusest. Kuid alustamiseks on see piisav.<\/p>\n<p>Lisaks kalkulaatori soovitatud seadetele muudame ka <code>postgresql.conf<\/code>vaikimisi m\u00e4\u00e4ratud sadama 5432 teiseks (meie n\u00e4ites \u2014 <strong>53983<\/strong>).<\/p>\n<p>P\u00e4rast konfiguratsioonifaili muutmist taask\u00e4ivitame postgresql-serveri k\u00e4suga:<\/p>\n<pre><code class=\"bash\">service postgresql restart\n<\/code><\/pre>\n<p>\nMe oleme installinud ja seadistanud PostgreSQL. N\u00fc\u00fcd loome andmebaasi, arenduse ja tootmise keskkonna kasutajad ning anname neile \u00f5igused andmebaasi haldamiseks:<\/p>\n<pre><code class=\"bash\">$ su - postgres\npostgres:~$ create database hw_dev_db_name;\nCREATE DATABASE\npostgres:~$ create user hw_dev_db_user with password 'hw_dev_db_password';\nCREATE ROLE\npostgres:~$ grant ALL privileges ON database hw_dev_db_name to hw_dev_db_user;\nGRANT\npostgres:~$ create database hw_prod_db_name;\nCREATE DATABASE\npostgres:~$ create user hw_prod_db_user with password 'hw_prod_db_password';\nCREATE ROLE\npostgres:~$ grant ALL privileges ON database hw_prod_db_name to hw_prod_db_user;\nGRANT\n<\/code><\/pre>\n<p><\/p>\n<h2>RabbitMQ<\/h2>\n<p>\nLiigume edasi RabbitMQ installimise juurde \u2014 s\u00f5numite vahendaja Celery jaoks. Debianis on selle paigaldamine \u00fcsna lihtne:<\/p>\n<pre><code class=\"bash\">wget https:\/\/packages.erlang-solutions.com\/erlang-solutions_1.0_all.deb\nsudo dpkg -i erlang-solutions_1.0_all.deb\n\nsudo apt-get update\nsudo apt-get install erlang erlang-nox\n\nsudo add-apt-repository 'deb http:\/\/www.rabbitmq.com\/debian\/ testing main'\nwget -O- https:\/\/www.rabbitmq.com\/rabbitmq-release-signing-key.asc | sudo apt-key add -\n\nsudo apt-get update\nsudo apt-get install rabbitmq-server\n<\/code><\/pre>\n<p>\nP\u00e4rast installimist peame looma <i>vhosts<\/i>, kasutajad ja andma vajalikud \u00f5igused:<\/p>\n<pre><code class=\"bash\">sudo rabbitmqctl add_user hw_dev_amqp_user hw_dev_amqp_password \nsudo rabbitmqctl set_user_tags hw_dev_amqp_user administrator\nsudo rabbitmqctl add_vhost hw_dev_vhost\nsudo rabbitmqctl set_permissions -p hw_dev_vhost hw_dev_amqp_user \".*\" \".*\" \".*\"\n\nsudo rabbitmqctl add_user hw_prod_amqp_user hw_prod_amqp_password \nsudo rabbitmqctl set_user_tags hw_prod_amqp_user administrator\nsudo rabbitmqctl add_vhost hw_prod_vhost\nsudo rabbitmqctl set_permissions -p hw_prod_vhost hw_prod_amqp_user \".*\" \".*\" \".*\"\n<\/code><\/pre>\n<p><\/p>\n<h2>Redis<\/h2>\n<p>\nSeame n\u00fc\u00fcd paika ja seadistame meie rakenduse viimase komponendi \u2014 Redis. Seda kasutatakse Celery \u00fclesannete tulemuste salvestamise tagaplaanina.<\/p>\n<p>Loome kaks Docker-konteinerit Redis' jaoks dev- ja prod-keskkondade jaoks kasutades laiendust <code>Docker<\/code> Pleskile.<\/p>\n<ol>\n<li>Logime Pleski sisse, l\u00e4hme laienduste sektsiooni, otsime Docker laiendust ja installime selle (me vajame tasuta versiooni):\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/5638f9b40274e4f7441434279c76a426.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>J\u00f5uame installitud laiendusse, otsime piltide seast <code>redis bitnami<\/code> ja paigaldame viimase versiooni:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/578bbbed6a66a60a4f7410f7d61ea542.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Siseneme allalaaditud konteinerisse ja kohandame seadistust: m\u00e4\u00e4rame porti, maksimaalse eraldatud RAM-i suuruse, parooli keskkonnamuutujates ning monteerime mahu:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/8bc804b794735412f5e510b3049c5667.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Korrame samme 2-3 prod-konteineri jaoks, muudame seadistustes ainult parameetreid: port, parool, RAM-i suurus ja kausta rada serveris:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/3af50181c8b3e1ace23a8de11826cb51.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p><\/p>\n<h2>Docker Registry<\/h2>\n<p>\nLisaks p\u00f5hiteenustele oleks hea paigaldada serverisse ka oma Docker-piltide hoidla. Hea k\u00fcll, et serverite ruum on praegu piisavalt odav (kindlasti odavam kui DockerHub'i tellimus), ja privaatse hoidla seadistamine on v\u00e4ga lihtne. <\/p>\n<p>Soovime, et meil oleksid paigaldatud:<\/p>\n<ul>\n<li>parooliga kaitstud Docker-hoidla, mis on kergesti ligip\u00e4\u00e4setav aladomeeni kaudu. <noindex><a rel=\"nofollow\" href=\"https:\/\/docker.helloworld.ru\">https:\/\/docker.helloworld.ru<\/a><\/noindex>;<\/li>\n<li>UI-liides, mille kaudu saab vaadata pilte hoidlas, mis on saadaval aadressil <noindex><a rel=\"nofollow\" href=\"https:\/\/docker-ui.helloworld.ru\">https:\/\/docker-ui.helloworld.ru<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nSelleks:<\/p>\n<ol>\n<li>Loome Pleskis meie tellimuses kaks alamdomeeni: docker.helloworld.ru ja docker-ui.helloworld.ru, ning seadistame neile Let\u2019s Encrypt sertifikaadid.<\/li>\n<li>Alandomeeni docker.helloworld.ru kausta lisame faili <code>docker-compose.yml<\/code> sellise sisuga:\n<pre><code class=\"plaintext\">version: \"3\"\n\nservices:\n  docker-registry:\n    image: \"registry:2\"\n    restart: always\n    ports:\n      - \"53985:5000\"\n    environment:\n      REGISTRY_AUTH: htpasswd\n      REGISTRY_AUTH_HTPASSWD_REALM: basic-realm\n      REGISTRY_AUTH_HTPASSWD_PATH: \/auth\/.htpasswd\n      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: \/data\n    volumes:\n      - .\/docker-registry.htpasswd:\/auth\/.htpasswd\n      - .\/data:\/data\n\n  docker-registry-ui:\n    image: konradkleine\/docker-registry-frontend:v2\n    restart: always\n    ports:\n      - \"53986:80\"\n    environment:\n      VIRTUAL_HOST: '*, https:\/\/*'\n      ENV_DOCKER_REGISTRY_HOST: 'docker-registry'\n      ENV_DOCKER_REGISTRY_PORT: 5000\n    links:\n      - 'docker-registry'\n<\/code><\/pre>\n<p>\n<\/li>\n<li>SSH kaudu genereerime faili .htpasswd Basic-autoriseerimise jaoks Docker-hoidlas:\n<pre><code class=\"plaintext\">htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password<\/code><\/pre>\n<\/li>\n<li>Kogume ja k\u00e4ivitame konteinerid:\n<pre><code class=\"plaintext\">docker-compose up -d<\/code><\/pre>\n<\/li>\n<li>Ja tuleb suunata Nginx meie konteineritele. Seda saab teha Pleskis. <\/li>\n<\/ol>\n<p>\nJ\u00e4rgmised toimingud tuleb teha alamdomeenide docker.helloworld.ru ja docker-ui.helloworld.ru jaoks:<\/p>\n<p>Jaotises <i>Dev Tools<\/i> mine meie veebisaidile <i>Docker Proxy Rules<\/i>:<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/d9c05901d95d61ce5db27a1a7cfddf49.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJa lisame reegli sissetuleva liikluse suunamiseks meie konteinerisse:<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/faa85cf6da648ef55b7c87c44040efb1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<ol>\n<li>Kontrollime, kas saame meie konteinerisse siseneda kohalikult masinalt:\n<pre><code class=\"plaintext\">$ docker login docker.helloworld.ru -u hw_docker_admin -p hw_docker_password\nHOIATUS! --password CLI kaudu kasutamine on ebaturvaline. Kasutage --password-stdin.\nLogimine \u00f5nnestus<\/code><\/pre>\n<\/li>\n<li>Kontrollime ka subdomeeni docker-ui.helloworld.ru t\u00f6\u00f6d:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/fdd6e1396c27c02a88bcbd7efb12f247.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKl\u00f5psates nuppu Browse repositories, kuvab brauser autoriseerimise akna, kuhu tuleb sisestada repo kasutajanimi ja parool. P\u00e4rast seda suunatakse meid reposiitide nimekirja lehele (see on teil veel t\u00fchi):<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/f2d75edb530e9d746095ae02d7793c1f.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p><\/p>\n<h2>Avame sadamad Plesk Firewallis<\/h2>\n<p>\nP\u00e4rast komponentide installimist ja seadistamist tuleb avada sadamad, et komponendid oleksid Docker-konteineritest ja v\u00e4lisest v\u00f5rgust ligip\u00e4\u00e4setavad.<\/p>\n<p>Vaadake, kuidas seda teha, Pleskile varem installitud Firewalli laienduse n\u00e4itel.<\/p>\n<ol>\n<li>Liigume <i>Tools &amp; Settings &gt; Settings &gt; Firewall<\/i>:<br \/>\n<img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/d54b4941944fe191574472a475cbaebe.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Liigume <i>Muuda Plesk Firewalli reegleid &gt; Lisa kohandatud reegel<\/i> ja avame j\u00e4rgmised TCP-sadamad Docker alv\u00f5rgu jaoks (<strong>172.0.0.0\/8)<\/strong>:<br \/>\nRabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614<br \/>\nRedis: 32785, 32786<\/p>\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/3359845f9bd6dc303274da737d4b27a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Lisame ka reegli, mis avab v\u00e4lismaailmale PostgreSQL ja RabbitMQ halduspaneeli sadamat:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/f812cfc7127da469507538ea48b2c80d.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Kohaldame reegleid nuppu Apply Changes abil:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/e85444ae717aaefa796664003fc86578.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p><\/p>\n<h1>CI\/CD seadistamine Github Actionsis<\/h1>\n<p>\nAsume k\u00f5ige huvitavama osa juurde \u2014 meie projekti pideva integreerimise ja kohaletoimetamise t\u00f6\u00f6voo seadistamine serverisse.<\/p>\n<p>See toru koosneb kahest osast: <\/p>\n<ul>\n<li>pildi koostamine ja testide l\u00e4biviimine (tagaplaanil) \u2014 Githubi poolel;<\/li>\n<li>migreerimise k\u00e4ivitamine (tagaplaanil) ja konteinerite juurutamine \u2014 serveris.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Juurutamine Pleskis<\/h2>\n<p>\nAlustame k\u00f5igepealt teise punktiga (kuna see s\u00f5ltub esimesest).<\/p>\n<p>Juurutamisprotsessi seadistame Pleski jaoks Git laienduse abil.<\/p>\n<p>Vaatame n\u00e4idet Prod keskkonnast Backend hoidla jaoks.<\/p>\n<ol>\n<li>Siseneme meie saidi Helloworld tellimusse ja liigume Git alammen\u00fc\u00fcsse:\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/b55b371560ea87a2954b6553a7cefc49.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Kopeerime \u00abRemote Git repository\u00bb v\u00e4ljale meie Githubi hoidla lingi ja muudame vaikimisi kausta <code>httpdocs<\/code> teisel (n\u00e4iteks, <code>\/httpdocs\/hw_back<\/code>):\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/db9ba9adb6e2e1bed5da7ae8e88c76e1.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Kopeerime SSH avaliku v\u00f5tme eelmiselt etapilt ja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/settings\/ssh\/new\">lisame<\/a><\/noindex> selle Githubi seadetes.<\/li>\n<li>Kl\u00f5psame ekraanil punkti 2 juures OK, p\u00e4rast mida suunatakse meid Pleski hoidla lehele. N\u00fc\u00fcd peame seadistama hoidla v\u00e4rskendamise, kui tehakse komiteed master harusse. Selleks liigume <i>Repository Settings<\/i> ja salvestame v\u00e4\u00e4rtuse <code>Webhook URL<\/code> (see l\u00e4heb meil hiljem vaja Github Actions seadistamisel):\n<p><img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/14d48a357f821d734d40dc434ab3682a.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Eelmise punkti ekraanil v\u00e4ljal Actions sisestame juurutamise skripti:\n<pre><code class=\"plaintext\">cd {REPOSITORY_ABSOLUTE_PATH}\n.ci-cd\/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} <\/code><\/pre>\n<p>\nkus: <\/p>\n<p><code>{REPOSITORY_ABSOLUTE_PATH}<\/code> \u2014 tee prod backend-repositooriumi kaustale serveris;<br \/>\n<code>{ENV}<\/code> \u2014 keskkond (dev\/prod), meie puhul <code>prod<\/code>;<br \/>\n<code>{DOCKER_REGISTRY_HOST}<\/code> \u2014 meie docker-repositooriumi host<br \/>\n<code>{TG_BOT_TOKEN}<\/code> \u2014 Telegrami boti token;<br \/>\n<code>{TG_CHAT_ID}<\/code> \u2014 chati\/kanaali ID teavituste saatmiseks.<\/p>\n<p>Skripti n\u00e4ide:<\/p>\n<pre><code class=\"plaintext\">cd \/var\/www\/vhosts\/helloworld.ru\/httpdocs\/hw_back\/\n.ci-cd\/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890<\/code><\/pre>\n<\/li>\n<li>Lisame meie tellimuse kasutaja Docker gruppi (et ta saaks konteineritega t\u00f6\u00f6tada):\n<pre><code class=\"plaintext\">sudo usermod -aG docker helloworld_admin<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\nDev-keskkond backend-repositooriumi ja frontend'i jaoks seadistatakse sarnaselt.<\/p>\n<h2>Github Actioni deploy pipeline<\/h2>\n<p>\nLiigume edasi meie CI\/CD-pipelai esimese osa seadistamise juurde Github Actionsis.<\/p>\n<h3>Backend<\/h3>\n<p>\nPipeline on kirjas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\/blob\/master\/.github\/workflows\/deploy.yml\">failis deploy.yml<\/a><\/noindex>. <\/p>\n<p>Kuid enne selle anal\u00fc\u00fcsimist t\u00e4idame Githubis vajalikud Secret-muutujad. Selleks liigume <i>Seaded -&gt; Saladused<\/i>:<\/p>\n<ul>\n<li><code>DOCKER_REGISTRY<\/code> \u2014 meie Docker-repositooriumi host (docker.helloworld.ru);<\/li>\n<li><code>DOCKER_LOGIN<\/code> \u2014 sisse logimine Docker-repositooriumisse;<\/li>\n<li><code>DOCKER_PASSWORD<\/code> \u2014 parool sellele;<\/li>\n<li><code>DEPLOY_HOST<\/code> \u2014 host, kus on Pleski adminpaneel (n\u00e4ide: <noindex><a rel=\"nofollow\" href=\"https:\/\/helloworld.ru\">helloworld.ru<\/a><\/noindex>:8443 v\u00f5i <noindex><a rel=\"nofollow\" href=\"http:\/\/123.4.56.78\">123.4.56.78<\/a><\/noindex>:8443);<\/li>\n<li><code>DEPLOY_BACK_PROD_TOKEN<\/code> \u2014 token prod-repositooriumisse serveris deployimiseks (oleme selle saanud Pleski seadistamisest p. 4);<\/li>\n<li><code>DEPLOY_BACK_DEV_TOKEN<\/code> \u2014 token dev-repositooriumisse serveris deployimiseks.<\/li>\n<\/ul>\n<p>\nDeployimise protsess on lihtne ja koosneb kolmest peamisest sammust: <\/p>\n<ul>\n<li>pildi kokkupanemisest ja avaldamisest meie registris;<\/li>\n<li>testide k\u00e4ivitamisest konteineris v\u00e4rskelt kokkupandud pildiga;<\/li>\n<li>t\u00f6\u00f6keskkonda juurutamisest s\u00f5ltuvalt harust (dev\/master).<\/li>\n<\/ul>\n<p><\/p>\n<h3>Frontend<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld-front\/blob\/master\/.github\/workflows\/deploy.yml\">Fail deploy.yml front-end registrile<\/a><\/noindex> ei erine palju tagumistest. Selles puudub testide k\u00e4ivitamise etapp ning muutuvad deploy tokenite nimed. Front-end registri saladused tuleb muide eraldi t\u00e4ita.<\/p>\n<h1>Selle seadistamine<\/h1>\n<p><\/p>\n<h2>Liikluse suunamine Nginx'i kaudu<\/h2>\n<p>\nNoh, oleme j\u00f5udnud l\u00f5puni. J\u00e4\u00e4nud on vaid seadistada siseneva ja v\u00e4ljuva liikluse suunamine meie konteinerisse Nginx'i kaudu. Seda protsessi oleme juba k\u00e4sitlenud punktis 5, kus seadistasime Docker Registry. Sama tuleb teha tagumise ja front-end osa jaoks dev- ja prod-keskkondades.<\/p>\n<p>Toon v\u00e4lja seadetest ekraanipildid.<\/p>\n<h3>Backend<\/h3>\n<p>\n<img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/f3c38dc1c25b648db000c72ef2d30b2a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Frontend<\/h3>\n<p>\n<img decoding=\"async\" alt=\"CI\/CD GitHub Actions projekti jaoks, mis kasutab Flaski ja Angularit\" src=\"\/wp-content\/uploads\/2020\/06\/35d4d8ef3489608db1e173b7f214ca03.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<strong>Oluline t\u00e4psustus<\/strong>. Front-end konteinerisse suunatakse k\u00f5ik URL-id, v\u00e4lja arvatud need, mis algavad <code>\/api\/<\/code> \u2014 need suunatakse tagumise konteineri poole (seet\u00f5ttu <strong>peavad tagumise konteineri k\u00f5ik t\u00f6\u00f6tlejate nimed algama <\/strong><strong><code>\/api\/<\/code><\/strong>).<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nN\u00fc\u00fcd peaks meie sait olema ligip\u00e4\u00e4setav aadressidel helloworld.ru ja dev.helloworld.ru (vastavalt prod- ja dev-keskkond).<\/p>\n<p>Nii, me \u00f5ppisime, kuidas valmistada ette lihtsat rakendust Flaskis ja Angularis ning seadistada GitHub Actions'is torustik selle serverisse v\u00e4lja toimetamiseks Pleski all.<\/p>\n<p>Kordan lingid koodirepositooriumidele: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld_back\">tagumine osa<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/olegborzov\/helloworld-front\">esimene osa<\/a><\/noindex>.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/506802\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CI\/CD \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Plesk \u0438 Github Actions. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abHelloworld\u00bb. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 Flask, \u0441 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Celery \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u043d\u0430 Angular 8. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":85647,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-85646","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CI\/CD \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Plesk \u0438 Github Actions. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abHelloworld\u00bb. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 Flask, \u0441 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Celery \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u043d\u0430 Angular 8. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ci-cd-v-github-actions-dlya-proekta-na-flask-angular\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47CI\/CD \u0432 Github Actions \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 Flask+Angular | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CI\/CD \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Plesk \u0438 Github Actions. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abHelloworld\u00bb. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 Flask, \u0441 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Celery \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u043d\u0430 Angular 8. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ci-cd-v-github-actions-dlya-proekta-na-flask-angular\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-06-17T23:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-17T23:42:15+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47CI\/CD GitHub Actions'is Flask+Angular projekti jaoks | ProHoster","description":"Selles artiklis jagan oma kogemusi CI\/CD seadistamisel Pleski juhtpaneeli ja GitHub Actions'i abil. T\u00e4na \u00f5pime, kuidas deployda lihtsat projekti nimega 'Helloworld'. See on kirjutatud Python'i raamistiku Flask abil, koos Celery t\u00f6\u00f6delda ja Angular 8 esiotsaga. Lingid repositooriumitele: tagaosa, esiots. Artikli esimeses osas vaatame meie projekti.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ci-cd-v-github-actions-dlya-proekta-na-flask-angular","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47CI\/CD \u0432 Github Actions \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 Flask+Angular | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CI\/CD \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Plesk \u0438 Github Actions. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abHelloworld\u00bb. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 Flask, \u0441 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Celery \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u043d\u0430 Angular 8. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u0431\u044d\u043a\u0435\u043d\u0434, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/ci-cd-v-github-actions-dlya-proekta-na-flask-angular","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-06-17T23:42:15+00:00","article:modified_time":"2020-06-17T23:42:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"85646","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:12:50","updated":"2022-09-29 06:56:26"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/85646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=85646"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/85646\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/85647"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=85646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=85646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=85646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}