ProHoster > Blog > башкаруу > Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Flask+Angular долбоору үчүн Github аракеттериндеги CI/CD
Бул макалада мен Plesk Control Panel жана Github Actions аркылуу CI/CD орнотуу боюнча тажрыйбам менен бөлүшөм. Бүгүн биз жөнөкөй "Hellouorld" аталышы менен жөнөкөй долбоорду кантип колдонууну үйрөнөбүз. Ал Flask Python алкагында жазылган, сельдерей жумушчулары жана Angular 8 фронту менен.
Макаланын биринчи бөлүгүндө биз долбоорбузду жана анын бөлүктөрүн карайбыз. Экинчиден, биз Pleskти кантип орнотууну жана керектүү кеңейтүүлөрдү жана компоненттерди (DB, RabbitMQ, Redis, Docker ж.б.) орнотууну чечебиз.
Үчүнчү бөлүктө, акыры, биз иштеп чыгуу жана өндүрүш чөйрөсүндөгү серверге долбоорубузду жайылтуу үчүн түтүктү кантип орнотууну чечебиз. Анан серверде сайтты ишке киргизебиз.
Ооба, мен өзүмдү тааныштырууну унутуп калыпмын. Менин атым Олег Борзов, мен Domclickтеги ипотекалык менеджерлер үчүн CRM командасынын толук иштеп чыгуучусумун.
Долбоорго сереп
Биринчиден, эки долбоордун репозиторийлерин карап көрөлү - арткы жана алдыңкы - жана кодду карап көрөлү.
Арткы тарап: Колба+Сельдерей
Арткы бөлүгү үчүн мен Python иштеп чыгуучулары арасында абдан популярдуу болгон бир топту алдым: Flask алкагы (API үчүн) жана Сельдерей (тапшырма кезеги үчүн). SQLAchemy ORM катары колдонулат. Алембик миграция үчүн колдонулат. туткаларда JSON текшерүү үчүн - Marshmallow.
В репозиторийлер түзүмүн жана долбоорду ишке ашыруу үчүн көрсөтмөлөрдү толук сүрөттөлүшү менен Readme.md файлы бар.
Электрондук почтаны жөнөтүү формасы жана чыгуу баскычы бар башкы бет.
Кирүү барагы.
Каттоо баракчасы.
Башкы бет аскеттик көрүнөт:
Түптө эки файл бар Dockerfile и docker-compose.yml, ошондой эле тааныш папка .ci-cd арткы репозиторийге караганда бир аз азыраак скрипттер менен (тесттерди жүргүзүү үчүн алынып салынган скрипттер).
Plesk бир долбоорду баштоо
Келгиле, Pleskти орнотуу жана биздин сайтка жазылуу менен баштайлы.
Кеңейтүүлөр орнотулууда
Pleskте бизге төрт кеңейтүү керек:
Docker Plesk башкаруу панелинде контейнерлердин абалын башкаруу жана визуалдык түрдө көрсөтүү;
Аларды Кеңейтүүлөр бөлүмүндөгү Plesk администратор панели аркылуу орното аласыз:
Биз кеңейтүүлөрдүн деталдуу жөндөөлөрүн карабайбыз, демейки жөндөөлөр биздин демо максаттарыбыз үчүн иштейт.
Жазылуу жана сайт түзүү
Андан кийин, биз helloworld.ru веб-сайтыбызга жазылууну түзүп, ал жерге dev.helloworld.ru субдоменин кошушубуз керек.
helloworld.ru доменине жазылууну түзүңүз жана системанын колдонуучусу үчүн логин-паролду көрсөтүңүз:
Барактын ылдый жагындагы кутучаны белгилеңиз Let's Encrypt менен доменди коргоңузэгерде биз сайт үчүн HTTPS орнотууну кааласак:
Андан кийин, бул жазылууда dev.helloworld.ru субдоменин түзүңүз (бул үчүн сиз бекер TLS сертификатын да бере аласыз):
Сервер компоненттерин орнотуу
Бизде сервер бар OS Debian Stretch 9.12 жана орнотулган башкаруу панели Plesk Obsidian 18.0.27.
Биздин долбоор үчүн орнотуу жана конфигурациялоо керек:
PostgreSQL (биздин учурда, иштеп чыгуучу жана өндүрүштүк чөйрөлөр үчүн эки маалымат базасы бар бир сервер болот).
RabbitMQ (ошол эле, чөйрөлөр үчүн ар кандай вхосттор менен бирдей).
Эки Redis инстанциясы (иштеп чыгуучу жана өндүрүш чөйрөлөрү үчүн).
Докер реестри (курулган Docker сүрөттөрүн жергиликтүү сактоо үчүн).
Docker реестри үчүн UI.
PostgreSQL
Plesk мурунтан эле PostgreSQL DBMS менен келет, бирок акыркы версия эмес (Plesk Obsidian жазып жатканда колдоого алынган Postgres версиялары 8.4–10.8). Биз колдонмобуздун эң акыркы версиясын каалайбыз (бул жазуу учурунда 12.3), андыктан аны кол менен орнотобуз.
Интернетте Debianга Postgres орнотуу боюнча көптөгөн деталдуу көрсөтмөлөр бар (мисал), ошондуктан мен аларды майда-чүйдөсүнө чейин сүрөттөбөйм, мен жөн гана буйруктарды берем:
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
Rabbit MQ
Келгиле, сельдерей үчүн билдирүү брокери болгон RabbitMQ орнотууга өтөлү. Аны Debianга орнотуу абдан жөнөкөй:
Эми биздин тиркеме үчүн акыркы компонентти орнотуп, конфигурациялайлы - Redis. Ал Сельдерей тапшырмаларынын натыйжаларын сактоо үчүн колдоо катары колдонулат.
Кеңейтүүнү колдонуу менен иштеп чыгуучу жана продюсердик чөйрөлөр үчүн Redis менен эки Docker контейнерин көтөрөбүз Docker Plesk үчүн.
Биз Pleskке барып, Кеңейтүүлөр бөлүмүнө өтүп, Docker кеңейтүүсүн издеп, аны орнотобуз (бизге акысыз версия керек):
Орнотулган кеңейтүүгө өтүңүз, издөө аркылуу сүрөттү табыңыз redis bitnami жана акыркы версиясын орнотуу:
Жүктөлгөн контейнерге кирип, конфигурацияны тууралайбыз: портту, бөлүнгөн RAMдын максималдуу өлчөмүн, чөйрө өзгөрмөлөрүндөгү сырсөздү көрсөтүп, көлөмдү орнотобуз:
Продукт контейнери үчүн 2-3 кадамдарды аткарабыз, жөндөөлөрдөн биз жөн гана параметрлерди өзгөртөбүз: порт, сырсөз, оперативдүү эс тутумдун өлчөмү жана сервердеги көлөм папкасына жол:
Докер реестри
Негизги кызматтардан тышкары, серверге өзүңүздүн 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 Tools биздин сайтка өтүңүз Докер прокси эрежелери:
Жана биздин контейнерге келген трафикти прокси үчүн эреже кошуңуз:
Жергиликтүү машинадан контейнерибизге кире аларыбызды текшеребиз:
$ 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 субдоменинин иштешин текшерип көрөлү:
Репозиторийлерди карап чыгууну басканда, браузер авторизациялоо терезесин көрсөтөт, анда сиз репозиторийдин логин менен сырсөзүн киргизишиңиз керек болот. Андан кийин, биз репозиторийлердин тизмеси бар баракка багытталабыз (азырынча ал сиз үчүн бош):
Plesk Firewallдагы портторду ачуу
Компоненттерди орнотуп, конфигурациялагандан кийин, компоненттер Docker контейнерлеринен жана тышкы тармактан жеткиликтүү болушу үчүн портторду ачуубуз керек.
Келгиле, муну биз мурда орноткон Plesk үчүн Firewall кеңейтүүсү менен кантип жасоону карап көрөлү.
Мурунку Куралдар жана Орнотуулар > Орнотуулар > Firewall:
Мурунку Plesk Firewall эрежелерин өзгөртүү > Ыңгайлаштырылган эрежени кошуу жана Docker ички тармагы үчүн төмөнкү TCP портторун ачыңыз (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
Ошондой эле биз тышкы дүйнөгө PostgreSQL портторун жана RabbitMQ башкаруу панелдерин ача турган эрежени кошобуз:
Өзгөртүүлөрдү колдонуу баскычын колдонуп, эрежелерди колдонуңуз:
Github аракеттеринде CI/CD орнотуу
Келгиле, эң кызыктуу бөлүгүнө — үзгүлтүксүз интеграция түтүгүн орнотууга жана проектибизди серверге жеткирүүгө келели.
Бул түтүк эки бөлүктөн турат:
сүрөттү куруу жана иштеп жаткан тесттер (backend үчүн) - Github тарабында;
Миграцияларды жүргүзүү (backend үчүн) жана контейнерлерди жайылтуу - серверде.
Pleskке жайгаштыруу
Адегенде экинчи пунктка токтололу (анткени биринчиси андан көз каранды).
Биз Plesk үчүн Git кеңейтүүсүн колдонуу менен жайылтуу процессин конфигурациялайбыз.
Backend репозиторий үчүн Prod чөйрөсү менен мисалды карап көрөлү.
Биз Hellouorld веб-сайтыбызга жазылууга барып, Git бөлүмчөсүнө барабыз:
Биздин Github репозиторийибизге шилтемени "Алыскы Git репозиторий" талаасына кыстарыңыз жана демейки папканы өзгөртүңүз httpdocs башкага (мис. /httpdocs/hw_back):
Мурунку кадамдан SSH Коомдук ачкычын көчүрүңүз жана кошуу ал Github жөндөөлөрүндө.
2-кадамдагы экрандагы OK баскычын чыкылдатыңыз, андан кийин биз Pleskдеги репозиторий барагына багытталабыз. Эми биз репозиторийди башкы филиалга тапшыруу боюнча жаңыртуу үчүн конфигурациялашыбыз керек. Бул үчүн, өтүңүз Репозиторий орнотуулары жана маанини сактаңыз Webhook URL (бул бизге кийинчерээк Github аракеттерин орнотууда керек болот):
Мурунку абзацтагы экрандагы "Аракеттер" талаасына жайгаштырууну ишке киргизүү үчүн скриптти киргизиңиз:
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} - сервердеги резервдик репозиторийдин прод папкасына жол; {ENV} - чөйрө (dev / prod), биздин учурда prod; {DOCKER_REGISTRY_HOST} - биздин докер репозиторийибиздин ээси {TG_BOT_TOKEN} — Telegram ботунун белгиси; {TG_CHAT_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
Докер тобуна жазылуубуздан колдонуучуну кошуңуз (алар контейнерлерди башкара алышы үчүн):
sudo usermod -aG docker helloworld_admin
Backend репозиторий жана фронтон үчүн иштеп чыгуучу чөйрө дал ушундай жол менен орнотулган.
Github аракеттеринде жайылтуу түтүгү
Келгиле, Github аракеттеринде CI/CD түтүгүбүздүн биринчи бөлүгүн орнотууга өтөлү.
Бирок аны талдоодон мурун, келгиле, 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 - сервердеги прод-репозиторийге жайылтуу үчүн белги (биз аны Pleskте жайгаштыруудан алдык 4-б.);
DEPLOY_BACK_DEV_TOKEN - сервердеги иштеп чыгуучу репозиторийге жайылтуу үчүн белги.
Жайгаштыруу процесси жөнөкөй жана үч негизги кадамдан турат:
биздин репозиторийдеги сүрөттү түзүү жана жарыялоо;
жаңы курулган сүрөттүн негизинде контейнерде тесттерди жүргүзүү;
тармакка жараша каалаган чөйрөгө жайылтуу (dev/master).
Frontend
Алдыңкы репозиторий үчүн deploy.yml файлы Бектен анча айырмаланбайт. Бул сыноолорду жүргүзүү менен бир кадам жок жана жайылтуу үчүн Токендердин атын өзгөртөт. Баса, алдыңкы репозиторийдин сырлары өзүнчө толтурулушу керек.
Сайт орнотуу
Nginx аркылуу прокси трафик
Ооба, биз аягына жеттик. Nginx аркылуу биздин контейнерге кирүүчү жана чыгуучу трафиктин проксисин конфигурациялоо гана калды. Биз бул процессти Докер реестрин орнотуунун 5-кадамында камтыганбыз. Ошол эле нерсени иштеп чыгуучу жана продюсердик чөйрөлөрдө арткы жана алдыңкы бөлүктөр үчүн кайталоо керек.
Мен орнотуулардын скриншотторун берем.
Backend
Frontend
Маанилүү түшүндүрмө. менен башталгандардан башка бардык URL'дер фронтондук контейнерге проксиден өткөрүлөт /api/ - алар арткы контейнерге прокси болот (ошондуктан арткы контейнерде, бардык иштетүүчүлөр менен башталышы керек /api/).
натыйжалары
Эми биздин сайт helloworld.ru жана dev.helloworld.ru даректеринде болушу керек (тиешелүү түрдө prod- жана dev-environments).
Бардыгы болуп, биз Flask жана Angular тилдеринде жөнөкөй тиркемени кантип даярдоону үйрөндүк жана аны Plesk иштеткен серверге жайылтуу үчүн Github Actions программасында конвейерди орноттук.
Мен репозиторийлерге шилтемелерди код менен кайталайм: backend, frontend.