CI/CD a Github-műveletekben egy Flask+Angular projekthez

CI/CD a Github-műveletekben egy Flask+Angular projekthez
Ebben a cikkben megosztom a CI/CD beállításával kapcsolatos tapasztalataimat a Plesk Control Panel és a Github Actions segítségével. Ma megtanuljuk, hogyan telepítsünk egy egyszerű projektet a "Helloworld" névvel. A Flask Python keretrendszerben íródott, Celery dolgozókkal és Angular 8 frontenddel.

Linkek a tárolókhoz: backend, frontend.

A cikk első részében a projektünket és annak részeit tekintjük át. A másodikban kitaláljuk, hogyan állítsuk be a Plesk-et, és telepítsük a szükséges bővítményeket és összetevőket (DB, RabbitMQ, Redis, Docker stb.).

A harmadik részben végre kitaláljuk, hogyan állíthatunk be egy folyamatot projektünk szerverre való telepítéséhez fejlesztői és termékkörnyezetben. Ezután elindítjuk az oldalt a szerveren.

És igen, elfelejtettem bemutatkozni. A nevem Oleg Borzov, a Domclick jelzáloghitel-menedzsereinek CRM-csapatában teljes körű fejlesztő vagyok.

Обзор проекта

Először is nézzünk meg két projekttárat – backend és front –, és menjünk át a kódon.

Háttér: lombik+zeller

A hátsó részhez egy csomót vettem, amely nagyon népszerű a Python fejlesztők körében: a Flask keretrendszert (az API-hoz) és a Celery-t (a feladatsorhoz). Az SQLAchemy-t ORM-ként használják. Az Alembicet migrációhoz használják. JSON-érvényesítéshez a fogantyúkban – Marshmallow.

В adattárak van egy Readme.md fájl a felépítés részletes leírásával és a projekt futtatásához szükséges utasításokkal.

Web Part API meglehetősen egyszerű, 6 tollból áll:

  • /ping - a rendelkezésre állás ellenőrzésére;
  • kezeli a regisztrációt, az engedélyezést, a jogosultság megszüntetését és a jogosult felhasználó megszerzését;
  • egy e-mail leíró, amely a Celery sorba helyez egy feladatot.

Zeller rész még egyszerűbb, csak egy probléma van send_mail_task.

Mappában /konf két almappa van:

  • docker két Docker fájllal (base.dockerfile ritkán változó alapkép felépítésére és Dockerfile fő szerelvényekhez);
  • .env_files - különböző környezetekhez tartozó környezeti változókat tartalmazó fájlokkal.

A projekt gyökerében négy docker-compose fájl található:

  • docker-compose.local.db.yml helyi adatbázis létrehozása fejlesztés céljából;
  • docker-compose.local.workers.yml a dolgozó helyi felneveléséhez, adatbázis, Redis és RabbitMQ;
  • docker-compose.test.yml tesztek futtatása a telepítés során;
  • docker-compose.yml bevetésre.

És az utolsó mappa, ami érdekel - .ci-cd. Shell szkripteket tartalmaz a telepítéshez:

  • deploy.sh — a migráció és a telepítés elindítása. A kiszolgálón fut a Github Actions összeállítása és tesztek futtatása után;
  • rollback.sh - a tartályok visszaállítása az összeállítás előző verziójára;
  • curl_tg.sh - telepítési értesítések küldése a Telegramnak.

Frontend az Angularon

Tároló előlappal sokkal egyszerűbb, mint Becké. Az előlap három oldalból áll:

  • Főoldal e-mail küldési űrlappal és kilépés gombbal.
  • Bejelentkezési oldal.
  • Regisztrációs oldal.

A főoldal aszketikusan néz ki:

CI/CD a Github-műveletekben egy Flask+Angular projekthez
Két fájl van a gyökérben Dockerfile и docker-compose.yml, valamint az ismerős mappát .ci-cd valamivel kevesebb szkripttel, mint a hátsó tárolóban (a tesztek futtatásához eltávolított szkriptek).

Projekt indítása Plesken

Kezdjük a Plesk beállításával és előfizetés létrehozásával az oldalunkra.

Bővítmények telepítése

Pleskben négy bővítményre van szükségünk:

  • Docker a tárolók állapotának kezelése és vizuális megjelenítése a Plesk adminisztrációs panelen;
  • Git a telepítési lépés konfigurálásához a kiszolgálón;
  • Let's Encrypt ingyenes TLS-tanúsítványok generálása (és automatikus megújítása);
  • Firewall a bejövő forgalom szűrésének konfigurálásához.

Telepítheti őket a Plesk adminisztrációs panelen keresztül, a Bővítmények szakaszban:

CI/CD a Github-műveletekben egy Flask+Angular projekthez
A bővítmények részletes beállításait nem vesszük figyelembe, demó céljainkra az alapértelmezett beállítások megfelelnek.

Hozzon létre egy előfizetést és egy webhelyet

Ezután létre kell hoznunk egy előfizetést a helloworld.ru webhelyünkhöz, és hozzá kell adnunk a dev.helloworld.ru aldomaint.

  1. Hozzon létre egy előfizetést a helloworld.ru tartományhoz, és adja meg a rendszerfelhasználó bejelentkezési jelszavát:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez
    Jelölje be az oldal alján található négyzetet Biztosítsa a tartományt a Let's Encrypt segítségévelha HTTPS-t szeretnénk beállítani a webhelyen:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  2. Ezután ebben az előfizetésben hozzon létre egy dev.helloworld.ru aldomaint (amelyhez ingyenes TLS-tanúsítványt is kiállíthat):

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

Szerverösszetevők telepítése

Van egy szerverünk OS Debian Stretch 9.12 és telepítette a vezérlőpanelt Pleski Obszidián 18.0.27.

Telepítenünk és konfigurálnunk kell projektünkhöz:

  • PostgreSQL (esetünkben egy szerver lesz két adatbázissal a fejlesztői és prod környezetekhez).
  • RabbitMQ (ugyanaz, ugyanaz a példány különböző vhostokkal a környezetekhez).
  • Két Redis-példány (fejlesztői és termelői környezetekhez).
  • Docker Registry (a beépített Docker képek helyi tárolására).
  • UI a Docker rendszerleíró adatbázishoz.

PostgreSQL

A Plesk már tartalmazza a PostgreSQL DBMS-t, de nem a legújabb verziót (a Plesk Obsidian írásakor támogatott Postgres 8.4–10.8 verziók). Alkalmazásunkhoz a legújabb verziót szeretnénk (12.3 az írás idején), ezért manuálisan fogjuk telepíteni.

Rengeteg részletes utasítás található a Postgres telepítéséhez Debianra a neten (példa), ezért nem írom le őket részletesen, csak a parancsokat adom:

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

Tekintettel arra, hogy a PostgreSQL meglehetősen közepes alapértelmezett beállításokkal rendelkezik, szükséges a konfiguráció javítása. Ez segíteni fog nekünk számológép: be kell hajtanod a szervered paramétereit és le kell cserélned a fájlban lévő beállításokat /etc/postgresql/12/main/postgresql.confa felajánlottaknak. Itt meg kell jegyezni, hogy az ilyen számológépek nem varázslatos golyók, és az alapot pontosabban kell hangolni, a hardver, az alkalmazás és a lekérdezés bonyolultsága alapján. De ez is elég az induláshoz.

A számológép által javasolt beállításokon kívül még változtatunk postgresql.confaz alapértelmezett 5432-es port egy másikhoz (példánkban - 53983).

A konfigurációs fájl módosítása után indítsa újra a postgresql-servert a következő paranccsal:

service postgresql restart

Telepítettük és konfiguráltuk a PostgreSQL-t. Most hozzunk létre egy adatbázist, a felhasználókat fejlesztői és prod-környezetekhez, és adjunk jogokat a felhasználóknak az adatbázis kezeléséhez:

$ 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

Nyúl MQ

Térjünk át a RabbitMQ, a Celery üzenetközvetítőjének telepítésére. A telepítés Debianra meglehetősen egyszerű:

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

A telepítés után létre kell hoznunk vhosts, felhasználókat, és biztosítsa a szükséges jogokat:

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

Feleinek

Most telepítsük és konfiguráljuk az alkalmazásunk utolsó összetevőjét - a Redis-t. Háttérként lesz használva a Celery feladatok eredményeinek tárolására.

A bővítmény használatával két Docker-tárolót fogunk emelni Redis-szel dev és prod környezetekhez Docker Plesk számára.

  1. Megyünk a Plesk-be, menjünk a Bővítmények szakaszba, keressük meg a Docker bővítményt, és telepítsük (ingyenes verzióra van szükségünk):

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  2. Lépjen a telepített bővítményre, keresse meg a képet a kereséssel redis bitnami és telepítse a legújabb verziót:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  3. Bemegyünk a letöltött tárolóba, és módosítjuk a konfigurációt: adja meg a portot, a maximálisan lefoglalt RAM méretét, a jelszót a környezeti változókban, és csatolja a kötetet:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  4. A prod konténerhez a 2-3 lépéseket hajtjuk végre, a beállításokban csak a paramétereket változtatjuk meg: port, jelszó, RAM mérete és a szerveren lévő kötetmappa elérési útja:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

Docker Registry

Az alapszolgáltatások mellett jó lenne egy saját Docker képtárat is feltenni a szerverre. Szerencsére a szerverterület ma már meglehetősen olcsó (természetesen olcsóbb, mint egy DockerHub-előfizetés), és a privát adattár létrehozásának folyamata nagyon egyszerű.

Szeretnénk, ha:

Ehhez:

  1. Az előfizetésünkben hozzunk létre két aldomaint a Pleskben: docker.helloworld.ru és docker-ui.helloworld.ru, és állítsuk be a Let's Encrypt tanúsítványokat.
  2. Adja hozzá a fájlt a docker.helloworld.ru aldomain mappához docker-compose.yml ilyen tartalommal:
    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 alatt létrehozzuk a .htpasswd fájlt az alapvető engedélyezéshez a Docker-tárhelyen:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Konténerek összegyűjtése és emelése:
    docker-compose up -d
  5. És át kell irányítanunk az Nginxet a konténereinkbe. Ezt Plesken keresztül lehet megtenni.

A következő lépéseket kell elvégezni a docker.helloworld.ru és a docker-ui.helloworld.ru aldomainekhez:

Szakaszban Fejlesztő eszközök oldalunkra menjen Docker proxyszabályok:

CI/CD a Github-műveletekben egy Flask+Angular projekthez
És adjunk hozzá egy szabályt a bejövő forgalom proxyjához a tárolónkba:

CI/CD a Github-műveletekben egy Flask+Angular projekthez

  1. Ellenőrizzük, hogy a helyi gépről tudunk-e bejelentkezni a konténerünkbe:
    $ 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. Ellenőrizzük a docker-ui.helloworld.ru aldomain működését is:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez
    Ha rákattint a Tárolók böngészése gombra, a böngésző megjelenít egy engedélyezési ablakot, ahol meg kell adnia a tárhely felhasználónevét és jelszavát. Ezt követően átirányítunk egy oldalra a tárhelyek listájával (egyelőre üres lesz):

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

Portok megnyitása a Plesk Firewallban

A komponensek telepítése és konfigurálása után meg kell nyitnunk a portokat, hogy az összetevők elérhetőek legyenek a Docker konténerekből és a külső hálózatból.

Nézzük meg, hogyan kell ezt megtenni a korábban telepített Plesk tűzfalkiterjesztésével.

  1. Menj Eszközök és beállítások > Beállítások > Tűzfal:
    CI/CD a Github-műveletekben egy Flask+Angular projekthez
  2. Menj Plesk tűzfalszabályok módosítása > Egyéni szabály hozzáadása és nyissa meg a következő TCP-portokat a Docker alhálózathoz (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  3. Hozzáadunk egy szabályt is, amely megnyitja a PostgreSQL portokat és a RabbitMQ felügyeleti paneleket a külvilág felé:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  4. Alkalmazza a szabályokat a Módosítások alkalmazása gombbal:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

A CI/CD beállítása a Github Actions alkalmazásban

Térjünk rá a legérdekesebb részre – egy folyamatos integrációs folyamat felállítására és projektünk szerverre szállítására.

Ez a csővezeték két részből fog állni:

  • kép létrehozása és tesztek futtatása (a háttérhez) - a Github oldalon;
  • áttelepítések futtatása (a háttérrendszer számára) és tárolók telepítése - a kiszolgálón.

Telepítés Pleskbe

Először a második ponttal foglalkozzunk (mert az első attól függ).

A telepítési folyamatot a Plesk Git-bővítményével konfiguráljuk.

Vegyünk egy példát Prod környezettel egy háttértárhoz.

  1. Lépjünk a Helloworld webhelyünk előfizetésére, és a Git alszakaszra lépünk:

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  2. Szúrjon be egy hivatkozást a Github tárhelyünkre a „Remote Git repository” mezőbe, és módosítsa az alapértelmezett mappát httpdocs másiknak (pl. /httpdocs/hw_back):

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  3. Másolja ki az SSH nyilvános kulcsát az előző lépésből, és add hozzá a Github beállításaiban van.
  4. A 2. lépésben megnyomjuk az OK gombot a képernyőn, majd átkerülünk a Plesk tárhely oldalára. Most be kell állítanunk a tárat, hogy a fő ágra vonatkozó véglegesítések frissítve legyenek. Ehhez lépjen a következőre: Adattár beállításai és mentse el az értéket Webhook URL (Később szükségünk lesz rá a Github Actions beállításakor):

    CI/CD a Github-műveletekben egy Flask+Angular projekthez

  5. Az előző bekezdés képernyőjének Műveletek mezőjében írja be a parancsfájlt a telepítés elindításához:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    ahol:

    {REPOSITORY_ABSOLUTE_PATH} - a kiszolgálón található háttértár prod mappájának elérési útja;
    {ENV} - környezet (dev / prod), esetünkben prod;
    {DOCKER_REGISTRY_HOST} - a docker tárolónk házigazdája
    {TG_BOT_TOKEN} — Telegram bot token;
    {TG_CHAT_ID} — Az értesítések küldésére szolgáló csevegés/csatorna azonosítója.

    Szkript példa:

    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. Felveszünk egy felhasználót az előfizetésünkből a Docker-csoportba (hogy kezelni tudja a tárolókat):
    sudo usermod -aG docker helloworld_admin

A háttértár és a frontend fejlesztői környezete azonos módon van beállítva.

Telepítési folyamat a Github Actions-ben

Térjünk át a CI/CD folyamat első részének beállítására a Github Actions programban.

háttér

A csővezeték leírása a deploy.yml fájl.

De az elemzés előtt töltsük ki a titkos változókat, amelyekre szükségünk van a Githubban. Ehhez lépjen ide: Beállítások -> Titkok:

  • DOCKER_REGISTRY - Docker adattárunk gazdája (docker.helloworld.ru);
  • DOCKER_LOGIN - bejelentkezés a Docker tárolóba;
  • DOCKER_PASSWORD - jelszó hozzá;
  • DEPLOY_HOST — gazdagép, ahol a Plesk adminisztrációs panel elérhető (példa: helloworld.com: 8443 ill 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - egy token a kiszolgálón lévő prod-repositoryba való telepítéshez (ezt a Plesk telepítése, 4. oldalon kaptuk meg);
  • DEPLOY_BACK_DEV_TOKEN - token a kiszolgálón lévő fejlesztői lerakatba való telepítéshez.

A telepítési folyamat egyszerű, és három fő lépésből áll:

  • a kép elkészítése és közzététele tárhelyünkben;
  • tesztek futtatása egy tárolóban frissen épített kép alapján;
  • telepítés a kívánt környezetbe az ágtól függően (dev/master).

frontend

Az elülső tárhely deploy.yml fájlja kicsit más, mint Becké. Hiányzik belőle egy lépés a tesztek futtatásával, és megváltozik a telepítéshez szükséges tokenek neve. Az elülső adattár titkait egyébként külön kell kitölteni.

Webhely beállítása

Proxy forgalom Nginx-en keresztül

Nos, a végére értünk. Már csak a bejövő és kimenő forgalom proxyjának konfigurálása a konténerünkhöz az Nginx-en keresztül. Ezt a folyamatot már ismertettük a Docker Registry beállításának 5. lépésében. Ugyanezt meg kell ismételni a hátsó és az elülső részeknél fejlesztői és prod környezetekben.

Küldök képernyőképeket a beállításokról.

háttér

CI/CD a Github-műveletekben egy Flask+Angular projekthez

frontend

CI/CD a Github-műveletekben egy Flask+Angular projekthez
Fontos pontosítás. Az összes URL-t a kezelőfelület konténeréhez rendeli a rendszer, kivéve a következővel kezdődőket /api/ - a hátsó konténerhez kerülnek (tehát a hátsó konténerben minden kezelőnek ezzel kell kezdenie /api/).

Eredményei

Mostantól webhelyünk elérhető lesz a helloworld.ru és dev.helloworld.ru címen (prod-, illetve dev-environments).

Összességében megtanultuk, hogyan készítsünk el egy egyszerű alkalmazást a Flaskban és az Angularban, és hogyan állíthatunk be egy folyamatot a Github Actions-ben, hogy kiterjesszük a Plesk-et futtató szerverre.

Megkettőzöm a tárolókra mutató hivatkozásokat a következő kóddal: backend, frontend.

Forrás: will.com

Hozzászólás