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.
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.
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:
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í:
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.
Vytvořte předplatné pro doménu helloworld.ru a zadejte přihlašovací heslo pro uživatele systému:
Zaškrtněte políčko v dolní části stránky Zabezpečte doménu pomocí Let's Encryptpokud chceme pro web nastavit HTTPS:
Dále v tomto předplatném vytvořte subdoménu dev.helloworld.ru (pro kterou můžete také vydat bezplatný certifikát TLS):
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:
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á:
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.
Přejdeme na Plesk, přejděte do sekce Rozšíření, vyhledejte rozšíření Docker a nainstalujte jej (potřebujeme bezplatnou verzi):
Přejděte na nainstalované rozšíření a vyhledejte obrázek pomocí vyhledávání redis bitnami a nainstalovat nejnovější verzi:
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:
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:
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ý.
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.
Přidejte soubor do složky subdomény docker.helloworld.ru docker-compose.yml s obsahem jako je tento:
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:
A přidejte pravidlo pro proxy příchozí provoz do našeho kontejneru:
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
Pojďme také zkontrolovat fungování subdomény docker-ui.helloworld.ru:
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á):
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.
Jít do Nástroje a nastavení > Nastavení > Firewall:
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
Přidáme také pravidlo, které otevře porty PostgreSQL a panely správy RabbitMQ do vnějšího světa:
Použijte pravidla pomocí tlačítka Použít změny:
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ě.
Přejdeme na předplatné našeho webu Helloworld a přejdeme do podsekce Git:
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):
Zkopírujte veřejný klíč SSH z předchozího kroku a přidat je v nastavení Github.
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):
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
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.
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
Frontend
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.