
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: , .
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.
В existuje soubor Readme.md s podrobným popisem struktury a pokyny pro spuštění projektu.
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.
ještě jednodušší, je tu jen jeden problém send_mail_task.
Ve složce jsou dvě podsložky:
dockerse dvěma Dockerfile (base.dockerfilevytvořit zřídka se měnící základní image aDockerfilepro 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.ymlvytvořit místní databázi pro vývoj;docker-compose.local.workers.ymlpro místní vychování pracovníka, databáze, Redis a RabbitMQ;docker-compose.test.ymlspouštět testy během nasazení;docker-compose.ymlpro nasazení.
A poslední složka, která nás zajímá - . 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
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:

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í:
Dockerspravovat a vizuálně zobrazovat stav kontejnerů v panelu správce Plesk;Gitpro konfiguraci kroku nasazení na serveru;Let's Encryptgenerovat (a automaticky obnovovat) bezplatné certifikáty TLS;Firewallpro 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 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ě.
Подробных инструкций по установке Postgres на Debian в сети полно (), 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 : 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
Перейдем к установке RabbitMQ — брокера сообщений для Celery. Ставится он на Debian достаточно просто:
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.
- 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 bitnamia 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ý.
Chceme mít:
- heslem chráněné úložiště Docker přístupné na subdoméně ;
- Uživatelské rozhraní pro prohlížení obrázků v úložišti, dostupné na .
Za tímto účelem:
- 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.ymls 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' - Pod SSH vygenerujeme soubor .htpasswd pro základní autorizaci v úložišti Docker:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Sbírat a zvedat kontejnery:
docker-compose up -d - 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
httpdocsk jinému (např./httpdocs/hw_back):
- Zkopírujte veřejný klíč SSH z předchozího kroku a 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.
backend
Potrubí je popsáno v .
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: : 8443 nebo :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
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.
Zduplikuji odkazy na úložiště s kódem: , .
Zdroj: www.habr.com
















