CI/CD v Github Actions pro projekt Flask+Angular

CI/CD v Github Actions pro projekt Flask+Angular
V tomto článku se podělím o své zkušenosti s nastavením CI/CD pomocí ovládacího panelu Plesk a akcí Github. Dnes se naučíme, jak nasadit jednoduchý projekt s nekomplikovaným názvem „Helloworld“. Je napsán v frameworku Flask Python, s pracovníky Celery a frontendem Angular 8.

Odkazy na repozitáře: backend, frontend.

V první části článku se podíváme na náš projekt a jeho části. Ve druhé přijdeme na to, jak Plesk nastavit a nainstalovat potřebná rozšíření a komponenty (DB, RabbitMQ, Redis, Docker atd.).

Ve třetí části konečně přijdeme na to, jak nastavit kanál pro nasazení našeho projektu na server ve vývojovém a prod prostředí. A poté spustíme stránku na serveru.

A ano, zapomněl jsem se představit. Jmenuji se Oleg Borzov, jsem fullstack developer v CRM týmu pro hypoteční manažery ve společnosti Domclick.

projekt Přehled

Nejprve se podíváme na dvě projektová úložiště – backend a front – a projdeme si kód.

Backend: Baňka + celer

Pro zadní část jsem vzal partu, která je mezi vývojáři Pythonu docela populární: rámec Flask (pro API) a Celery (pro frontu úloh). SQLAchemy se používá jako ORM. Alembic se používá pro migrace. Pro ověření JSON v úchytech - Marshmallow.

В úložišť existuje soubor Readme.md s podrobným popisem struktury a pokyny pro spuštění projektu.

API webové části celkem nekomplikované, skládá se ze 6 per:

  • /ping - ověřit dostupnost;
  • zpracovává pro registraci, autorizaci, deautorizaci a získání oprávněného uživatele;
  • popisovač e-mailu, který zařadí úkol do fronty Celery.

Celerová část ještě jednodušší, je tu jen jeden problém send_mail_task.

Ve složce /conf jsou dvě podsložky:

  • docker se dvěma Dockerfile (base.dockerfile vytvořit zřídka se měnící základní image a Dockerfile pro hlavní sestavy);
  • .env_files - se soubory s proměnnými prostředí pro různá prostředí.

V kořenovém adresáři projektu jsou čtyři soubory docker-compose:

  • docker-compose.local.db.yml vytvořit místní databázi pro vývoj;
  • docker-compose.local.workers.yml pro místní vychování pracovníka, databáze, Redis a RabbitMQ;
  • docker-compose.test.yml spouštět testy během nasazení;
  • docker-compose.yml pro nasazení.

A poslední složka, která nás zajímá - .ci-cd. Obsahuje skripty shellu pro nasazení:

  • deploy.sh — zahájení migrace a zavádění. Spustí se na serveru po vytvoření a spuštění testů v Github Actions;
  • rollback.sh - vrácení kontejnerů na předchozí verzi sestavy;
  • curl_tg.sh - odesílání oznámení o nasazení do Telegramu.

Frontend na Angular

Úložiště s přední stranou mnohem jednodušší než u Becka. Přední strana se skládá ze tří stran:

  • Hlavní stránka s formulářem pro odeslání emailu a tlačítkem odchodu.
  • Přihlašovací stránka.
  • Registrační stránka.

Hlavní stránka vypadá asketicky:

CI/CD v Github Actions pro projekt Flask+Angular
V kořenovém adresáři jsou dva soubory Dockerfile и docker-compose.yml, stejně jako známá složka .ci-cd s o něco méně skripty než v zadním úložišti (odstraněné skripty pro spouštění testů).

Zahájení projektu v Plesku

Začněme nastavením Plesku a vytvořením předplatného pro naše stránky.

Instalace rozšíření

V Plesku potřebujeme čtyři rozšíření:

  • Docker spravovat a vizuálně zobrazovat stav kontejnerů v panelu správce Plesk;
  • Git pro konfiguraci kroku nasazení na serveru;
  • Let's Encrypt generovat (a automaticky obnovovat) bezplatné certifikáty TLS;
  • Firewall pro konfiguraci filtrování příchozího provozu.

Můžete je nainstalovat prostřednictvím administrátorského panelu Plesk v sekci Rozšíření:

CI/CD v Github Actions pro projekt Flask+Angular
Nebudeme uvažovat o podrobných nastaveních pro rozšíření, výchozí nastavení postačí pro naše demo účely.

Vytvořte předplatné a web

Dále musíme vytvořit předplatné pro náš web helloworld.ru a přidat tam subdoménu dev.helloworld.ru.

  1. Vytvořte předplatné pro doménu helloworld.ru a zadejte přihlašovací heslo pro uživatele systému:

    CI/CD v Github Actions pro projekt Flask+Angular
    Zaškrtněte políčko v dolní části stránky Zabezpečte doménu pomocí Let's Encryptpokud chceme pro web nastavit HTTPS:

    CI/CD v Github Actions pro projekt Flask+Angular

  2. Dále v tomto předplatném vytvořte subdoménu dev.helloworld.ru (pro kterou můžete také vydat bezplatný certifikát TLS):

    CI/CD v Github Actions pro projekt Flask+Angular

Instalace serverových komponent

Máme server s OS Debian Stretch 9.12 a nainstalovaný ovládací panel Plesk obsidián 18.0.27.

Potřebujeme nainstalovat a nakonfigurovat pro náš projekt:

  • PostgreSQL (v našem případě to bude jeden server se dvěma databázemi pro dev a prod prostředí).
  • RabbitMQ (stejná, stejná instance s různými vhosty pro prostředí).
  • Dvě instance Redis (pro vývojová a prod prostředí).
  • Registr Docker (pro místní ukládání vytvořených obrazů Docker).
  • Uživatelské rozhraní pro registr Docker.

PostgreSQL

Plesk již přichází s PostgreSQL DBMS, ale ne s nejnovější verzí (v době psaní Plesk Obsidian podporováno Postgres verze 8.4–10.8). Chceme nejnovější verzi naší aplikace (12.3 v době psaní tohoto článku), takže ji nainstalujeme ručně.

Existuje mnoho podrobných pokynů pro instalaci Postgres na Debian na síti (příklad), takže je nebudu podrobně popisovat, uvedu pouze příkazy:

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

Vzhledem k tomu, že PostgreSQL má spíše průměrné výchozí nastavení, je nutné konfiguraci opravit. To nám pomůže kalkulačka: musíte zadat parametry vašeho serveru a nahradit nastavení v souboru /etc/postgresql/12/main/postgresql.confk těm nabízeným. Zde je třeba poznamenat, že takové kalkulačky nejsou žádným kouzelným kouskem a základ by měl být vyladěn přesněji na základě vašeho hardwaru, aplikace a složitosti dotazů. Ale pro začátek to stačí.

Kromě nastavení navržených kalkulačkou se také měníme postgresql.confvýchozí port 5432 na jiný (v našem příkladu - 53983).

Po změně konfiguračního souboru restartujte postgresql-server příkazem:

service postgresql restart

Nainstalovali jsme a nakonfigurovali PostgreSQL. Nyní vytvoříme databázi, uživatele pro vývojová a prod prostředí a dáme uživatelům práva ke správě databáze:

$ 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

Pojďme k instalaci RabbitMQ, zprostředkovatele zpráv pro Celery. Instalace na Debian je poměrně jednoduchá:

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

Po instalaci musíme vytvořit vhosts, uživatelům a udělte potřebná práva:

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 ".*" ".*" ".*"

Redestilát

Nyní nainstalujeme a nakonfigurujeme poslední komponentu pro naši aplikaci – Redis. Bude použit jako backend pro ukládání výsledků úloh Celery.

Pomocí rozšíření vytvoříme dva kontejnery Docker s Redis pro vývojová a prod prostředí Docker pro Pleska.

  1. Přejdeme na Plesk, přejděte do sekce Rozšíření, vyhledejte rozšíření Docker a nainstalujte jej (potřebujeme bezplatnou verzi):

    CI/CD v Github Actions pro projekt Flask+Angular

  2. Přejděte na nainstalované rozšíření a vyhledejte obrázek pomocí vyhledávání redis bitnami a nainstalovat nejnovější verzi:

    CI/CD v Github Actions pro projekt Flask+Angular

  3. Jdeme do staženého kontejneru a upravíme konfiguraci: zadejte port, maximální přidělenou velikost RAM, heslo v proměnných prostředí a připojte svazek:

    CI/CD v Github Actions pro projekt Flask+Angular

  4. Provádíme kroky 2-3 pro prod kontejner, v nastavení měníme pouze parametry: port, heslo, velikost RAM a cestu ke složce svazku na serveru:

    CI/CD v Github Actions pro projekt Flask+Angular

Registr Docker

Kromě základních služeb by bylo hezké umístit na server vlastní úložiště obrázků Docker. Naštěstí je nyní serverový prostor poměrně levný (určitě levnější než předplatné DockerHub) a proces nastavení soukromého úložiště je velmi jednoduchý.

Chceme mít:

Za tímto účelem:

  1. Vytvořme dvě subdomény v Plesku v našem předplatném: docker.helloworld.ru a docker-ui.helloworld.ru a nakonfigurujeme pro ně certifikáty Let's Encrypt.
  2. Přidejte soubor do složky subdomény docker.helloworld.ru docker-compose.yml s obsahem jako je tento:
    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. Pod SSH vygenerujeme soubor .htpasswd pro základní autorizaci v úložišti Docker:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Sbírat a zvedat kontejnery:
    docker-compose up -d
  5. A musíme přesměrovat Nginx do našich kontejnerů. To lze provést přes Plesk.

Pro subdomény docker.helloworld.ru a docker-ui.helloworld.ru je třeba provést následující kroky:

V sekci Dev Tools přejděte na naše stránky Pravidla Docker Proxy:

CI/CD v Github Actions pro projekt Flask+Angular
A přidejte pravidlo pro proxy příchozí provoz do našeho kontejneru:

CI/CD v Github Actions pro projekt Flask+Angular

  1. Zkontrolujeme, zda se můžeme přihlásit do našeho kontejneru z místního počítače:
    $ 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. Pojďme také zkontrolovat fungování subdomény docker-ui.helloworld.ru:

    CI/CD v Github Actions pro projekt Flask+Angular
    Když kliknete na Procházet repozitáře, prohlížeč zobrazí autorizační okno, kde budete muset zadat uživatelské jméno a heslo pro repozitář. Poté se přesuneme na stránku se seznamem úložišť (zatím pro vás bude prázdná):

    CI/CD v Github Actions pro projekt Flask+Angular

Otevírání portů v bráně Plesk Firewall

Po instalaci a konfiguraci komponent musíme otevřít porty, aby byly komponenty přístupné z kontejnerů Docker a externí sítě.

Podívejme se, jak to udělat pomocí rozšíření Firewall pro Plesk, které jsme nainstalovali dříve.

  1. Jít do Nástroje a nastavení > Nastavení > Firewall:
    CI/CD v Github Actions pro projekt Flask+Angular
  2. Jít do Upravit pravidla brány Plesk Firewall > Přidat vlastní pravidlo a otevřete následující porty TCP pro podsíť Docker (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD v Github Actions pro projekt Flask+Angular

  3. Přidáme také pravidlo, které otevře porty PostgreSQL a panely správy RabbitMQ do vnějšího světa:

    CI/CD v Github Actions pro projekt Flask+Angular

  4. Použijte pravidla pomocí tlačítka Použít změny:

    CI/CD v Github Actions pro projekt Flask+Angular

Nastavení CI/CD v akcích Github

Pojďme k nejzajímavější části – nastavení kontinuálního integračního kanálu a doručení našeho projektu na server.

Toto potrubí se bude skládat ze dvou částí:

  • vytvoření obrazu a spuštění testů (pro backend) - na straně Github;
  • spouštění migrací (pro backend) a nasazování kontejnerů - na serveru.

Nasadit do Plesku

Pojďme se nejprve zabývat druhým bodem (protože ten první na něm závisí).

Proces nasazení nakonfigurujeme pomocí rozšíření Git pro Plesk.

Zvažte příklad s prostředím Prod pro Backendové úložiště.

  1. Přejdeme na předplatné našeho webu Helloworld a přejdeme do podsekce Git:

    CI/CD v Github Actions pro projekt Flask+Angular

  2. Vložte odkaz na naše úložiště Github do pole „Remote Git repository“ a změňte výchozí složku httpdocs k jinému (např. /httpdocs/hw_back):

    CI/CD v Github Actions pro projekt Flask+Angular

  3. Zkopírujte veřejný klíč SSH z předchozího kroku a přidat je v nastavení Github.
  4. Klikněte na OK na obrazovce v kroku 2, poté budeme přesměrováni na stránku úložiště v Plesku. Nyní musíme nakonfigurovat úložiště tak, aby bylo aktualizováno při odevzdání do hlavní větve. Chcete-li to provést, přejděte na stránku Nastavení úložiště a uložte hodnotu Webhook URL (budeme to potřebovat později při nastavování akcí Github):

    CI/CD v Github Actions pro projekt Flask+Angular

  5. Do pole Akce na obrazovce z předchozího odstavce zadejte skript pro spuštění nasazení:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    kde:

    {REPOSITORY_ABSOLUTE_PATH} - cesta ke složce prod backendového úložiště na serveru;
    {ENV} - prostředí (dev / prod), v našem případě prod;
    {DOCKER_REGISTRY_HOST} - hostitel našeho úložiště dockerů
    {TG_BOT_TOKEN} — token telegramového bota;
    {TG_CHAT_ID} — ID chatu/kanálu pro zasílání upozornění.

    Příklad skriptu:

    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. Přidejte uživatele z našeho předplatného do skupiny Docker (aby mohl spravovat kontejnery):
    sudo usermod -aG docker helloworld_admin

Vývojářské prostředí pro backendové úložiště a frontend jsou nastaveny stejným způsobem.

Průběh nasazení v Github Actions

Pojďme k nastavení první části našeho kanálu CI/CD v Github Actions.

backend

Potrubí je popsáno v soubor deploy.yml.

Ale před analýzou vyplňte tajné proměnné, které potřebujeme v Github. Chcete-li to provést, přejděte na stránku Nastavení -> Tajemství:

  • DOCKER_REGISTRY - hostitel našeho úložiště Docker (docker.helloworld.ru);
  • DOCKER_LOGIN - přihlášení do úložiště Docker;
  • DOCKER_PASSWORD - heslo k němu;
  • DEPLOY_HOST — hostitel, kde je k dispozici panel správce Plesk (příklad: helloworld.com: 8443 nebo 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - token pro nasazení do prod-repository na serveru (získali jsme ho v Deployment v Plesku str. 4);
  • DEPLOY_BACK_DEV_TOKEN - token pro nasazení do dev úložiště na serveru.

Proces nasazení je jednoduchý a skládá se ze tří hlavních kroků:

  • vytváření a publikování obrazu v našem úložišti;
  • spouštění testů v kontejneru na základě čerstvě vytvořeného obrazu;
  • nasazení do požadovaného prostředí v závislosti na větvi (dev/master).

Frontend

Soubor deploy.yml pro přední úložiště trochu odlišný od Beckova. Chybí mu krok s běžícími testy a mění názvy tokenů pro nasazení. Mimochodem, tajemství pro přední úložiště je třeba vyplnit samostatně.

Nastavení webu

Proxy provoz přes Nginx

No a dostali jsme se na konec. Zbývá pouze nakonfigurovat proxy příchozí a odchozí provoz do našeho kontejneru prostřednictvím Nginx. Tento proces jsme již probrali v kroku 5 nastavení registru Docker. Totéž by se mělo opakovat pro zadní a přední část ve vývojářských a produkčních prostředích.

Poskytnu screenshoty nastavení.

backend

CI/CD v Github Actions pro projekt Flask+Angular

Frontend

CI/CD v Github Actions pro projekt Flask+Angular
Důležité vysvětlení. Všechny adresy URL budou přesměrovány do frontendového kontejneru s výjimkou těch, které začínají /api/ - budou připojeni k zadnímu kontejneru (tj v zadním kontejneru musí všichni manipulátoři začít s /api/).

Výsledky

Nyní by měly být naše stránky dostupné na helloworld.ru a dev.helloworld.ru (prod- a dev-prostředí, v tomto pořadí).

Celkem jsme se naučili, jak připravit jednoduchou aplikaci ve Flask a Angular a nastavit kanál v Github Actions, abychom ji zavedli na server, na kterém běží Plesk.

Zduplikuji odkazy na úložiště s kódem: backend, frontend.

Zdroj: www.habr.com

Přidat komentář