
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: , .
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.
В 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.
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.
még egyszerűbb, csak egy probléma van send_mail_task.
Mappában két almappa van:
dockerkét Docker fájllal (base.dockerfileritkán változó alapkép felépítésére ésDockerfilefő 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.ymlhelyi adatbázis létrehozása fejlesztés céljából;docker-compose.local.workers.ymla dolgozó helyi felneveléséhez, adatbázis, Redis és RabbitMQ;docker-compose.test.ymltesztek futtatása a telepítés során;docker-compose.ymlbevetésre.
És az utolsó mappa, ami érdekel - . 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
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:
Dockera tárolók állapotának kezelése és vizuális megjelenítése a Plesk adminisztrációs panelen;Gita telepítési lépés konfigurálásához a kiszolgálón;Let's Encryptingyenes TLS-tanúsítványok generálása (és automatikus megújítása);Firewalla 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 Nyújtás 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 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.
Részletes utasítások a Postgres telepítéséhez Debian rengeteg van belőle az interneten (), 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 : 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 telepítésére, ami egy üzenetközvetítő a Celeryhez. Telepítve van a következőre: Debian Ez elég 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.
- 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ű.
Szeretnénk, ha:
- jelszóval védett Docker-lerakat, amely egy aldomainről érhető el ;
- Felhasználói felület a tárban lévő képek megtekintéséhez, elérhető a következő címen: .
Ehhez:
- 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.ymlilyen 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' - 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 - Konténerek összegyűjtése és emelése:
docker-compose up -d - É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
httpdocsmásiknak (pl./httpdocs/hw_back):
- Másolja ki az SSH nyilvános kulcsát az előző lépésből, és 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ünkbenprod;
{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.
háttér
A csővezeték leírása a .
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: : 8443 ill :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
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: , .
Forrás: will.com
