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.
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.
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:
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:
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.
Hozzon létre egy előfizetést a helloworld.ru tartományhoz, és adja meg a rendszerfelhasználó bejelentkezési jelszavát:
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:
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):
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:
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ű:
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.
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):
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:
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:
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:
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ű.
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.
Adja hozzá a fájlt a docker.helloworld.ru aldomain mappához docker-compose.yml ilyen tartalommal:
É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:
És adjunk hozzá egy szabályt a bejövő forgalom proxyjához a tárolónkba:
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
Ellenőrizzük a docker-ui.helloworld.ru aldomain működését is:
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):
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.
Menj Eszközök és beállítások > Beállítások > Tűzfal:
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
Hozzáadunk egy szabályt is, amely megnyitja a PostgreSQL portokat és a RabbitMQ felügyeleti paneleket a külvilág felé:
Alkalmazza a szabályokat a Módosítások alkalmazása gombbal:
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.
Lépjünk a Helloworld webhelyünk előfizetésére, és a Git alszakaszra lépünk:
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):
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.
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):
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
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.
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
frontend
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.