CI/CD Github Actions-i jaoks Flask+Angular projektile

CI/CD Github Actions-i jaoks Flask+Angular projektile
Selles artiklis jagan oma kogemusi CI/CD seadistamisest Plesk'i juhtpaneeli ja Github Actions'i abil. TÀna Ôpime, kuidas rakendada lihtsat projekti nimega "Helloworld", mis on kirjutatud Python'i raamistiku Flask abil, Celery töötluse ja Angular 8 esipaneeliga.

Aadressid hoidlatele: tagaplaan, esine.

Artikli esimeses osas vaatame meie projekti ja selle komponente. Teises osas uurime, kuidas seadistada Plesk ja installida vajalikud laiendused ja komponendid (andmebaas, RabbitMQ, Redis, Docker jne).

Kolmandas osas uurime, kuidas seadistada tööprotsess meie projekti juurutamiseks serverisse arendus- ja tootmisvahendites. SeejÀrel kÀivitame veebilehe serveris.

Ja jah, unustasin tutvustada. Minu nimi on Oleg Borzov, olen tÀisvirna arendaja CRM meeskonnas, mis tegeleb kodulaenude halduritega Domklik'is.

Projekti ĂŒlevaade

Alustame kahe projekti hoidla — tagumise ja esipaneeli — uurimisest ja vaatame koodi.

Tagaplaan: Flask+Celery

Tagumise osa jaoks valisin piisavalt populaarse kombinatsiooni Python'i arendajate seas: raamistik Flask (API jaoks) ja Celery (ĂŒlesannete jĂ€rjekorra jaoks). ORM-ina kasutatakse SQLAlchemy't. Migratsioonide jaoks kasutatakse Alembic'ut. JSON-i valideerimiseks manipulatsioonides kasutatakse Marshmallow't.

Uues hoidlad on olemas fail Readme.md, mis sisaldab ĂŒksikasjalikku kirjeldust struktuurist ja projekti kĂ€ivitamise juhiseid.

Veebiosa API on piisavalt lihtne, koosneb kuuest lÔpp-punktist:

  • /ping — kĂ€ttesaadavuse kontrollimiseks;
  • lĂ”pp-punktid registreerimiseks, autoriseerimiseks, deauthoriseerimiseks ja autoriseeritud kasutaja saamiseks;
  • lĂ”pp-punkt e-kirja saatmiseks, mis lisab ĂŒlesande Celery jĂ€rjekorda.

Celery osa on veel lihtsam, seal on ainult ĂŒks ĂŒlesanne send_mail_task.

Kaustas /conf on kaks alamkausta:

  • docker kahe Docker-failiga (base.dockerfile harva muudetava pĂ”hifoto kogumise jaoks ja Dockerfile peamiste kogumite jaoks);
  • .env_files — failide komplektid keskkonnamuutujate jaoks erinevates keskkondades.

Projekti juures on neli docker-compose faili:

  • docker-compose.local.db.yml kohaliku andmebaasi seadistamiseks arenduseks;
  • docker-compose.local.workers.yml kohaliku töötluse, andmebaasi, Redis'i ja RabbitMQ ĂŒles tĂ”stmiseks;
  • docker-compose.test.yml testide lĂ€biviimiseks paigaldamisel;
  • docker-compose.yml juurutamiseks.

Ja viimane huvitav kaust, .ci-cdSisaldab ĂŒlekande shell-skripte:

  • deploy.sh — migratsioonide ja juurutamise kĂ€ivitamiseks. KĂ€ivitatakse serveris pĂ€rast kogumist ja testide lĂ€biviimist Github Actions'is;
  • rollback.sh — konteinerite tagasiviimine eelmisse versioon
  • curl_tg.sh — teavituste saatmine Telegrami kĂ€ivitamise kohta.

Frontend Angularil

Frontend'i hoidla on mĂ€rksa lihtsam kui backend. Frontend koosneb kolmest lehekĂŒljest:

  • Pealehe, kus on e-posti saatmise vorm ja vĂ€ljumise nupp.
  • Sisestamise leht.
  • Registreerimise leht.

Pealeht on tagasihoidlik:

CI/CD Github Actions-i jaoks Flask+Angular projektile
Juurdes on kaks faili Dockerfile ja docker-compose.yml, samuti tuttav kaust .ci-cd mÔnevÔrra vÀhem skripte kui backend'i hoidlas (testide kÀivitamise skriptid on eemaldatud).

Loome projekti Pleskis

Alustame Pleski seadistamisega ja tellimuse loomisega meie saidile.

Lisandmoodulite installimine

Pleskis vajame nelja lisandmoodulit:

  • Docker konteinerite haldamiseks ja nende oleku visuaalseks kuvamiseks Pleski administraatoris;
  • Git serveri juurutamise etapi seadistamiseks;
  • Let's Encrypt tasuta TLS-sertifikaatide genereerimiseks (ja automaatseks pikendamiseks);
  • Tulekahju sissetuleva liikluse filtreerimise seadistamiseks.

Saame need installida Pleski administraatoris, vaates Extensions:

CI/CD Github Actions-i jaoks Flask+Angular projektile
Detailset seadistust me ei kÀsitle, meie demoteks sobivad vaikesÀtet.

Tellimuse ja saidi loomine

SeejÀrel peame looma tellimuse meie saidile helloworld.ru ja lisama sinna alldomeeni dev.helloworld.ru.

  1. Loome tellimuse domeenile helloworld.ru ja mÀÀrame sĂŒsteemi kasutaja sisselogimise ja parooli:

    CI/CD Github Actions-i jaoks Flask+Angular projektile
    Lehe allosas paneme linnukese Secure the domain with Let’s Encrypt, kui soovime seadistada saidile HTTPS:

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  2. SeejÀrel loome selles tellimuses alldomeeni dev.helloworld.ru (millele saab samuti vÀlja anda tasuta TLS-sertifikaadi):

    CI/CD Github Actions-i jaoks Flask+Angular projektile

Serverikomponentide installimine

Meil on olemas server, millel OS Debian Stretch 9.12 ja paigaldatud juhtimispaneel Plesk Obsidian 18.0.27.

Peame installima ja seadistama oma projekti jaoks:

  • PostgreSQL (meie puhul on ĂŒks server kahe andmebaasiga dev- ja prod-keskkondade jaoks).
  • RabbitMQ (sama, ĂŒks instants erinevate vhost'idega keskkondade jaoks).
  • Kaks Redis'i instantsi (dev- ja prod-keskkondade jaoks).
  • Docker Registry (kogutud Docker-piltide kohaliku salvestamise jaoks).
  • Docker registry UI-liides.

PostgreSQL

Pleskiga kaasneb juba PostgreSQL andmebaas, kuid mitte kĂ”ige uuema versiooniga (artikli kirjutamise ajal toetas Plesk Obsidian Postgres versioone 8.4–10.8). Me soovime oma rakendusele kĂ”ige vĂ€rskemat versiooni (12.3 artikli kirjutamise ajal), seega paigaldame selle kĂ€sitsi. Postgres versioonid 8.4–10.8). Meie soovime oma rakendusele kĂ”ige uuemat versiooni (12.3 artikli kirjutamise ajal), seega installime selle kĂ€sitsi.

Interneti on palju ĂŒksikasjalikke juhiseid Postgresi installimiseks Debianile (nĂ€ide), seega ei hakka ma neid ĂŒksikasjalikult kirjeldama, lihtsalt toon vĂ€lja kĂ€sud:

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

Arvestades, et PostgreSQL-i vaikeseaded on piisavalt keskpÀrased, tuleb konfiguratsiooni kindlasti kohandada. Sellega aitab meid kalkulaator: peate sisestama oma serveri parameetrid ja muutma seadeid failis /etc/postgresql/12/main/postgresql.confpakutud vÀÀrtustega. Siinkohal tasub mÀrkida, et sellised kalkulaatorid ei ole maagilised lahendused ning andmebaasi tuleks tÀpsemalt hÀÀlestada, lÀhtudes teie riistvarast, rakendusest ja pÀringute keerukusest. Kuid selleks, et alustada, on see piisav.

Lisaks kalkulaatori pakutud seadetele muudame postgresql.confvaikimisi pordi 5432 teiseks (meie nĂ€ites — 53983).

PÀrast konfiguratsioonifaili muutmist taaskÀivitame postgresql-serveri kÀsuga:

service postgresql restart

Oleme installinud ja seadistanud PostgreSQL-i. NĂŒĂŒd loome andmebaasid, kasutajad dev- ja prod-keskkondade jaoks ning anname kasutajatele Ă”igused andmebaaside haldamiseks:

$ 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

Liigume RabbitMQ installimise juurde — sĂ”numite edastaja Celery jaoks. Seda on Debianile piisavalt lihtne installida:

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

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

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

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

PÀrast installimist peame looma vhosts, kasutajad ja andma vajalikud Ôigused:

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

NĂŒĂŒd installime ja seadistame meie rakenduse viimase koostisosade — Redis. Seda kasutatakse bakenina Celery ĂŒlesannete tulemuste salvestamiseks.

Me tĂ”stame kaks Docker-konteinerit Redis ĂŒles dev- ja prod-keskkondade jaoks laienduse abil Docker Pleskile.

  1. Siseneme Pleski, lÀheme laienduste jaotisse, otsime Docker laiendust ja installime selle (me vajame tasuta versiooni):

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  2. LĂ€heme installitud laiendusse, leiame pildi otsingu kaudu redis bitnami ja paigaldame viimase versiooni:

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  3. Siseneme alla laaditud konteinerisse ja kohandame konfiguratsiooni: mÀÀrame pordi, maksimaalse eraldatud RAM-i suuruse, parooli keskkonnamuutujates ja montime mahu:

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  4. Kordame samme 2-3 prod-konteineri jaoks, muutes ainult seadistusi: port, parool, RAM-i suurus ja faili tee serveris:

    CI/CD Github Actions-i jaoks Flask+Angular projektile

Docker Registry

Lisaks pÔhiteenustele oleks tore serverisse paigaldada oma Docker-piltide repositoorium. TÀnapÀeval on serverites koht piisavalt odav (kindlasti odavam kui DockerHub'i tellimus) ja privaatse repositooriumi paigaldamine on vÀga lihtne.

Me tahame, et meil oleks installitud:

Selleks:

  1. Loome Pleskis kaks alamdomeeni meie tellimuses: docker.helloworld.ru ja docker-ui.helloworld.ru, ning seadistame nende jaoks Let’s Encrypt sertifikaadid.
  2. Alamdomeeni docker.helloworld.ru kausta lisame faili docker-compose.yml sellise sisuga:
    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 kaudu genereerime faili .htpasswd Docker-repositooriumi Basic-autoriseerimise jaoks:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Kogume ja tĂ”stame konteinerid ĂŒles:
    Vaatame lihtsat nÀidet.
  5. Ja peame suunama Nginxi meie konteineritele. Seda saab teha Pleski kaudu.

JÀrgmiseks tuleb teostada jÀrgmised toimingud alamdomeenidel docker.helloworld.ru ja docker-ui.helloworld.ru:

Jaotises Dev Tools siseneme meie saidile Docker Proxy Rules:

CI/CD Github Actions-i jaoks Flask+Angular projektile
Ja lisame reegli sissetuleva liikluse suunamiseks meie konteinerisse:

CI/CD Github Actions-i jaoks Flask+Angular projektile

  1. Kontrollime, et saaksime oma konteinerisse autentida kohalikust masinast:
    $ 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. Samuti kontrollime alamdomeeni docker-ui.helloworld.ru tööd.

    CI/CD Github Actions-i jaoks Flask+Angular projektile
    Kui vajutate nuppu Browse repositories, avab brauser autentimise akna, kuhu tuleb sisestada kasutajanimi ja parool repole. PĂ€rast seda suunatakse meid repo nimekirja lehele (praegu on see tĂŒhi):

    CI/CD Github Actions-i jaoks Flask+Angular projektile

Avame pordid Plesk Firewallis.

PÀrast komponentide installimist ja seadistamist peame avama pordid, et need oleksid Docker-konteineritest ja vÀlisest vÔrgust ligipÀÀsetavad.

Vaadakem, kuidas seda teha, vÔttes nÀiteks varem installitud Firewall laiendust Pleskile.

  1. Liigume Tools & Settings > Settings > Firewall:
    CI/CD Github Actions-i jaoks Flask+Angular projektile
  2. Liigume Muuda Plesk Firewall reegleid > Lisa kohandatud reegel ja avame jĂ€rgmised TCP-pordid Docker alamsĂŒsteemi jaoks (172.0.0.0/8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  3. Lisame ka reegli, mis avab vÀlist maailma PostgreSQL ja RabbitMQ haldustööriistaribade pordid:

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  4. Rakendame reeglid nuppu Apply Changes abi.

    CI/CD Github Actions-i jaoks Flask+Angular projektile

CI/CD seadistamine Github Actionsis

Alustame kĂ”ige huvitavama osaga — meie projekti pideva integreerimise ja kohaletoimetamise toru seadistamisega serverisse.

See toru koosneb kahest osast:

  • pildi koostamine ja testide lĂ€biviimine (tagapinnal) — Githubis;
  • rĂ€nde kĂ€itamine (tagapinnal) ja konteinerite deploy — serveris.

Deploy Pleskis

Hakkame esmalt tegelema teise punktiga (sest see sÔltub esimesest).

Seadistame deploy Protsessi Pleski Git laienduse abil.

Vaatame nÀidet Prod keskkonna kohta tagapinna repole.

  1. Logime sisse meie saidi Helloworld tellimusse ja liigume Git alasperesse:

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  2. Kopeerime vÀljal "Remote Git repository" link meie Github repository ja muutame vaikimisi kausta httpdocs teiseks (nÀiteks, /httpdocs/hw_back):

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  3. Kopeerime SSH avaliku vÔtme eelmisest etapist ja lisame selle Githubi seadetes.
  4. Klikkame OK ekraanil punktis 2, seejĂ€rel suunatakse meid Pleski repo lehele. NĂŒĂŒd peame seadistama repo uuendamise, kui teeme master haru commite. Selleks liigume Repository Settings ja salvestame vÀÀrtuse Webhook URL (me vajame seda hiljem Github Actionsi seadistamisel):

    CI/CD Github Actions-i jaoks Flask+Angular projektile

  5. Eelneva ekraani Actions vÀljal sisestame skripti deploy kÀivitamiseks:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    kus:

    {REPOSITORY_ABSOLUTE_PATH} — tee prod tagapinna repo kausta serveris;
    {ENV} — keskkond (dev/prod), meie puhul prod;
    {DOCKER_REGISTRY_HOST} — meie docker repo host
    {TG_BOT_TOKEN} — Telegrami boti token;
    {TG_CHAT_ID} — Chat/channel ID for sending notifications.

    Script example:

    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. Adding a user from our subscription to the Docker group (so they can manage containers):
    sudo usermod -aG docker helloworld_admin

The development environment for the backend repository and frontend is configured similarly.

Deployment pipeline in Github Actions

We proceed to configure the first part of our CI/CD pipeline in Github Actions.

Backend

The pipeline is described in the deploy.yml file.

But before we examine it, let's fill in the necessary Secret variables in Github. For that, go to Settings -> Secrets:

  • DOCKER_REGISTRY — the host of our Docker repository (docker.helloworld.ru);
  • DOCKER_LOGIN — login to the Docker repository;
  • DOCKER_PASSWORD — password for it;
  • DEPLOY_HOST — the host where the Plesk admin panel is accessible (example: helloworld.ru:8443 or 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN — token for deployment to the prod repository on the server (we obtained it in Deployment in Plesk p. 4);
  • DEPLOY_BACK_DEV_TOKEN — token for deployment to the dev repository on the server.

The deployment process is simple and consists of three main steps:

  • building and publishing the image in our repository;
  • running tests in a container based on the freshly built image;
  • deployment to the desired environment depending on the branch (dev/master).

Frontend

The deploy.yml file for the frontend repository does not differ much from the backend one. It lacks the step to run tests and changes the names of the tokens for deployment. Secrets for the frontend repository, by the way, need to be filled in separately.

Site Configuration

Traffic proxying through Nginx

Well, we have reached the end. We just need to configure the proxying of incoming and outgoing traffic to our container via Nginx. We already covered this process in step 5 of Docker Registry setup. The same needs to be repeated for the backend and frontend parts in dev and prod environments.

I will provide screenshots of the settings.

Backend

CI/CD Github Actions-i jaoks Flask+Angular projektile

Frontend

CI/CD Github Actions-i jaoks Flask+Angular projektile
Important clarification. All URLs except those starting with will be proxied to the frontend container, /api/ — they will be proxied to the backend container (therefore, in the backend container, all handlers must start with /api/).

Summary

Now our site should be accessible at helloworld.ru and dev.helloworld.ru (prod and dev environments respectively).

In summary, we learned how to prepare a simple application using Flask and Angular, and set up a pipeline in Github Actions for its deployment to a server managed by Plesk.

I will duplicate the links to the repositories with the code: tagaplaan, esine.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster