Во оваа статија, ќе го споделам моето искуство за поставување CI/CD со користење на контролниот панел Plesk и Github Actions. Денес ќе научиме како да распоредиме едноставен проект со некомплицирано име „Helloworld“. Напишано е во рамката на Flask Python, со работници на Celery и Angular 8 преден дел.
Во првиот дел од статијата ќе го разгледаме нашиот проект и неговите делови. Во втората, ќе сфатиме како да го поставиме Plesk и да ги инсталираме потребните екстензии и компоненти (DB, RabbitMQ, Redis, Docker, итн.).
Во третиот дел, конечно ќе откриеме како да поставиме цевковод за распоредување на нашиот проект на сервер во околина на dev и prod. И тогаш ќе ја стартуваме страницата на серверот.
И да, заборавив да се претставам. Моето име е Олег Борзов, јас сум fullstack програмер во тимот на CRM за менаџери со хипотеки во Domclick.
Преглед на проектот
Прво, ајде да погледнеме во две складишта на проекти - задни и предни - и да го разгледаме кодот.
Заден крај: колба + целер
За задниот дел, зедов куп што е доста популарен меѓу развивачите на Python: рамката Flask (за API) и Celery (за редот за задачи). SQLAchemy се користи како ORM. Alembic се користи за миграции. За валидација на JSON во рачки - Marshmallow.
В складишта има датотека Readme.md со детален опис на структурата и инструкции за водење на проектот.
Web Part API доста некомплицирано, се состои од 6 пенкала:
/ping - да се провери достапноста;
се справува со регистрација, овластување, деовластување и добивање овластен корисник;
рачка за е-пошта што става задача во редот за целер.
Дел од целер уште полесно, има само еден проблем send_mail_task.
Главна страница со формулар за испраќање е-пошта и копче за излез.
Страница за најавување.
Страница за регистрација.
Главната страница изгледа аскетски:
Во коренот има две датотеки Dockerfile и docker-compose.yml, како и познатата папка .ci-cd со малку помалку скрипти отколку во задното складиште (отстранети скрипти за извршување тестови).
Започнување на проект во Плеск
Да почнеме со поставување на Plesk и создавање претплата за нашата страница.
Инсталирање на екстензии
Во Plesk ни требаат четири екстензии:
Docker за управување и визуелно прикажување на статусот на контејнерите во административниот панел на Plesk;
Git да го конфигурирате чекорот за распоредување на серверот;
Let's Encrypt за генерирање (и автоматско обновување) бесплатни TLS сертификати;
Firewall да го конфигурирате филтрирањето на дојдовниот сообраќај.
Можете да ги инсталирате преку административниот панел на Plesk во делот Екстензии:
Ние нема да ги разгледаме деталните поставки за екстензии, стандардните поставки ќе служат за нашите демо цели.
Креирање на претплата и веб-страница
Следно, треба да создадеме претплата за нашата веб-страница helloworld.ru и да го додадеме поддоменот dev.helloworld.ru таму.
Направете претплата за доменот helloworld.ru и наведете ја лозинката за најава за корисникот на системот:
Проверете го полето на дното на страницата Обезбедете го доменот со Let's Encryptако сакаме да поставиме HTTPS за страницата:
Следно, во оваа претплата, креирајте поддомен dev.helloworld.ru (за кој исто така можете да издадете бесплатен TLS сертификат):
Инсталирање на серверски компоненти
Имаме сервер со ОС Debian Stretch 9.12 и инсталиран контролен панел Плеск обсидијан 18.0.27.
Треба да инсталираме и конфигурираме за нашиот проект:
PostgreSQL (во нашиот случај, ќе има еден сервер со две бази на податоци за dev и prod околини).
RabbitMQ (ист, ист пример со различни vhost за околини).
Два примери на Redis (за dev и prod околини).
Docker Registry (за локално складирање на вградени Docker слики).
UI за Docker регистарот.
PostgreSQL
Plesk веќе доаѓа со PostgreSQL DBMS, но не и најновата верзија (во моментот на пишување Plesk Obsidian поддржан Постгрес верзии 8.4–10.8). Ја сакаме најновата верзија за нашата апликација (12.3 во моментот на пишување), па ќе ја инсталираме рачно.
Има многу детални упатства за инсталирање Postgres на Debian на мрежата (пример), затоа нема да ги опишам детално, само ќе ги дадам командите:
Имајќи предвид дека PostgreSQL има прилично просечни стандардни поставки, неопходно е да се поправи конфигурацијата. Ова ќе ни помогне калкулатор: треба да ги внесете параметрите на вашиот сервер и да ги замените поставките во датотеката /etc/postgresql/12/main/postgresql.confна понудените. Овде треба да се забележи дека таквите калкулатори не се волшебна точка, а основата треба да се намести попрецизно, врз основа на вашиот хардвер, апликација и сложеност на барањето. Но, ова е доволно за да започнете.
Покрај поставките предложени од калкулаторот, ние исто така се менуваме postgresql.confстандардната порта 5432 на друга (во нашиот пример - 53983).
Откако ќе ја смените конфигурациската датотека, рестартирајте го postgresql-серверот со командата:
service postgresql restart
Инсталиравме и конфигуриравме PostgreSQL. Сега ајде да создадеме база на податоци, корисници за средини за развој и прод, и да им дадеме на корисниците права да управуваат со базата на податоци:
$ 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
Зајакот MQ
Ајде да продолжиме со инсталирање на RabbitMQ, брокер за пораки за Celery. Инсталирањето на Debian е прилично едноставно:
Сега да ја инсталираме и конфигурираме последната компонента за нашата апликација - Redis. Ќе се користи како заднина за складирање на резултатите од задачите на Целер.
Ќе подигнеме два Docker контејнери со Redis за средини за развој и производство со користење на наставката Docker за Плеск.
Одиме во Plesk, одиме во делот Extensions, ја бараме екстензијата Docker и ја инсталираме (ни треба бесплатна верзија):
Одете до инсталираната екстензија, пронајдете ја сликата преку пребарувањето redis bitnami и инсталирај ја најновата верзија:
Влегуваме во преземениот контејнер и ја прилагодуваме конфигурацијата: наведете ја портата, максималната доделена големина на RAM меморијата, лозинката во променливите на околината и монтирајте ја јачината на звукот:
Ги извршуваме чекорите 2-3 за контејнерот за производи, во поставките ги менуваме само параметрите: порта, лозинка, големина на RAM и патека до папката за јачина на звук на серверот:
Докер регистар
Покрај основните услуги, би било убаво да поставите сопствено складиште за слики на Docker на серверот. За среќа, просторот на серверот сега е прилично евтин (секако поевтин од претплатата на DockerHub), а процесот на поставување приватно складиште е многу едноставен.
Ајде да создадеме два поддомени во Plesk во нашата претплата: docker.helloworld.ru и docker-ui.helloworld.ru и да ги конфигурираме Let's Encrypt сертификатите за нив.
Додајте ја датотеката во папката на поддоменот docker.helloworld.ru docker-compose.yml со ваква содржина:
И ние треба да го пренасочиме Nginx кон нашите контејнери. Ова може да се направи преку Plesk.
Следниве чекори треба да се направат за поддомените docker.helloworld.ru и docker-ui.helloworld.ru:
Во делот Dev Алатки нашата страница одете на Правила за докер прокси:
И додадете правило за дојдовниот сообраќај на прокси во нашиот контејнер:
Проверуваме дали можеме да се најавиме во нашиот контејнер од локалната машина:
$ 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
Ајде да ја провериме и работата на поддоменот docker-ui.helloworld.ru:
Кога ќе кликнете на Browse repositories, прелистувачот ќе прикаже прозорец за авторизација каде што ќе треба да ги внесете корисничкото име и лозинката за складиштето. После тоа, ќе бидеме префрлени на страница со список на складишта (засега ќе биде празна за вас):
Отворање порти во заштитниот ѕид на Plesk
Откако ќе ги инсталираме и конфигурираме компонентите, треба да ги отвориме портите така што компонентите се достапни од контејнерите на Docker и надворешната мрежа.
Ајде да видиме како да го направиме ова користејќи ја наставката за заштитен ѕид за Plesk што ја инсталиравме порано.
Оди до Алатки и поставки > Поставки > Заштитен ѕид:
Оди до Изменете ги правилата за заштитниот ѕид на Plesk > Додајте приспособено правило и отворете ги следните TCP порти за подмрежата Docker (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Редис: 32785, 32786
Исто така, ќе додадеме правило кое ќе ги отвори портите PostgreSQL и панелите за управување со RabbitMQ кон надворешниот свет:
Применете ги правилата користејќи го копчето Примени промени:
Поставување CI/CD во Github Actions
Ајде да се спуштиме на најинтересниот дел - поставување на цевковод за континуирана интеграција и доставување на нашиот проект до серверот.
Овој гасовод ќе се состои од два дела:
градење слика и извршување на тестови (за задниот дел) - на страната Github;
лансирање миграции (за задниот дел) и распоредување контејнери на серверот.
Распоредете во Плеск
Ајде прво да се справиме со втората точка (затоа што првата зависи од тоа).
Ќе го конфигурираме процесот на распоредување користејќи ја наставката Git за Plesk.
Размислете за пример со Prod околина за складиште за Backend.
Одиме на претплатата на нашата веб-страница Helloworld и одиме во потсекцијата Git:
Вметнете врска до нашето складиште Github во полето „Remote Git repository“ и променете ја стандардната папка httpdocs на друг (на пр. /httpdocs/hw_back):
Копирајте го јавниот клуч SSH од претходниот чекор и додадете е во поставките за Github.
Кликнете OK на екранот во чекор 2, по што ќе бидеме пренасочени на страницата за складиште во Plesk. Сега треба да го конфигурираме складиштето да се ажурира за обврзувања на главната гранка. За да го направите ова, одете на Поставки на складиштето и зачувајте ја вредноста Webhook URL (ова ќе ни треба подоцна при поставување на Github Actions):
Во полето Дејства на екранот од претходниот пасус, внесете ја скриптата за стартување на распоредувањето:
cd {REPOSITORY_ABSOLUTE_PATH}
.ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}
каде што:
{REPOSITORY_ABSOLUTE_PATH} - патека до папката prod на складиштето на заднината на серверот; {ENV} - околина (dev / prod), во нашиот случај prod; {DOCKER_REGISTRY_HOST} - домаќин на нашето складиште за докер {TG_BOT_TOKEN} — Телеграмски бот токен; {TG_CHAT_ID} — ID на разговор/канал за испраќање известувања.
Пример за скрипта:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
.ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
Додајте корисник од нашата претплата во групата Docker (за да може да управува со контејнерите):
sudo usermod -aG docker helloworld_admin
Околината на dev за складиштето на заднината и предниот дел се поставени на ист начин.
Распоредување на гасоводот во Github Actions
Ајде да продолжиме со поставувањето на првиот дел од нашиот гасовод за CI/CD во Github Actions.
Но, пред да го анализираме, ајде да ги пополниме Тајните променливи што ни се потребни во Github. За да го направите ова, одете на Поставки -> Тајни:
DOCKER_REGISTRY - домаќин на нашето складиште Docker (docker.helloworld.ru);
DOCKER_LOGIN - најавете се во складиштето Docker;
DOCKER_PASSWORD - лозинка за неа;
DEPLOY_HOST — домаќин каде што е достапен административниот панел на Plesk (пример: helloworld.com: 8443 или 123.4.56.78:8443);
DEPLOY_BACK_PROD_TOKEN - токен за распоредување во складиштето за производство на серверот (го добивме во Deployment во Plesk стр. 4);
DEPLOY_BACK_DEV_TOKEN - токен за распоредување во складиштето на dev на серверот.
Процесот на распоредување е едноставен и се состои од три главни чекори:
градење и објавување на сликата во нашето складиште;
извршување на тестови во контејнер врз основа на свежо изградена слика;
распоредување во саканата средина во зависност од гранката (dev/master).
интерфејс
Датотеката deploy.yml за предното складиште не се разликува многу од онаа на Беков. Недостасува чекор со извршување на тестови и ги менува имињата на токените за распоредување. Тајните за предното складиште, патем, треба да се пополнат посебно.
Поставување на страницата
Прокси сообраќај преку Nginx
Па, дојдовме до крајот. Останува само да го конфигурираме проксирањето на дојдовниот и појдовниот сообраќај до нашиот контејнер преку Nginx. Веќе го опфативме овој процес во чекор 5 од поставувањето на Docker Registry. Истото треба да се повтори за задните и предните делови во средини за развој и прод.
Ќе дадам слики од екранот на поставките.
Заднинската
интерфејс
важно уточнување. Сите URL-адреси ќе бидат проксирани до контејнерот на предниот дел, освен оние што почнуваат со /api/ - тие ќе бидат поврзани со задниот контејнер (така во задниот контејнер, сите ракувачи мора да започнат со /api/).
Резултатите од
Сега нашата страница треба да биде достапна на helloworld.ru и dev.helloworld.ru (прод- и де-средини, соодветно).
Севкупно, научивме како да подготвиме едноставна апликација во Flask и Angular и да поставиме цевковод во Github Actions за да ја пренесеме на сервер кој работи на Plesk.