
Katika makala hii, nitashiriki uzoefu wangu wa kusanidi CI/CD kwa kutumia paneli ya kudhibiti Plesk na Vitendo vya Github. Leo tutajifunza jinsi ya kupeleka mradi rahisi kwa jina rahisi "Helloworld". Imeandikwa katika Flask ya mfumo wa Python, na wafanyikazi huko Celery na sehemu ya mbele katika Angular 8.
Viungo kwa hazina: , .
Katika sehemu ya kwanza ya makala tutaangalia mradi wetu na sehemu zake. Katika pili, tutajua jinsi ya kusanidi Plesk na kufunga upanuzi muhimu na vipengele (DB, RabbitMQ, Redis, Docker, nk).
Katika sehemu ya tatu, hatimaye tutajua jinsi ya kusanidi bomba la kupeleka mradi wetu kwa seva katika mazingira ya uboreshaji na uzalishaji. Na kisha tutazindua tovuti kwenye seva.
Na ndio, nilisahau kujitambulisha. Jina langu ni Oleg Borzov, mimi ni msanidi programu kamili katika timu ya CRM kwa wasimamizi wa mikopo ya nyumba huko Domklik.
Muhtasari wa mradi
Kwanza, hebu tuangalie hazina mbili za mradi - backend na mbele - na kupitia kanuni.
Sehemu ya nyuma: Flask+Celery
Kwa mwisho, nilichukua mchanganyiko ambao ni maarufu sana kati ya watengenezaji wa Python: Mfumo wa Flask (kwa API) na Celery (kwa foleni ya kazi). SQLAchemy inatumika kama ORM. Alembic hutumiwa kwa uhamiaji. Kwa uthibitisho wa JSON katika vipini - Marshmallow.
Π Kuna faili ya Readme.md yenye maelezo ya kina ya muundo na maagizo ya kuanzisha mradi.
rahisi sana, lina vipini 6:
/ping- kuangalia upatikanaji;- hushughulikia usajili, uidhinishaji, uondoaji idhini na kupata mtumiaji aliyeidhinishwa;
- mpini wa kutuma barua pepe ambayo huweka kazi kwenye foleni ya Selari.
Ni rahisi zaidi, kuna shida moja tu send_mail_task.
Katika folda kuna folda ndogo mbili:
dockerna Dockerfiles mbili (base.dockerfilekujenga picha ya msingi ambayo mara chache hubadilika naDockerfilekwa makusanyiko makuu);.env_files- na faili zilizo na anuwai za mazingira kwa mazingira tofauti.
Kuna faili nne za kutunga docker kwenye mzizi wa mradi:
docker-compose.local.db.ymlkuinua hifadhidata ya ndani kwa ajili ya maendeleo;docker-compose.local.workers.ymlkwa uinuaji wa ndani wa mfanyakazi, hifadhidata, Redis na RabbitMQ;docker-compose.test.ymlkwa ajili ya kuendesha vipimo wakati wa kupelekwa;docker-compose.ymlkwa ajili ya kupelekwa.
Na folda ya mwisho ya kupendeza kwetu ni . Inayo maandishi ya ganda kwa kupelekwa:
deploy.sh- kuzindua uhamiaji na kupelekwa. Imezinduliwa kwenye seva baada ya kujenga na kuendesha majaribio katika Vitendo vya Github;rollback.sh- vyombo vya kurudisha nyuma kwa toleo la awali la mkutano;curl_tg.sh- kutuma arifa za kupelekwa kwa Telegraph.
Mbele katika Angular
rahisi zaidi kuliko ya Bekov. Sehemu ya mbele ina kurasa tatu:
- Ukurasa kuu ulio na fomu ya kutuma barua pepe na kitufe cha kutoka.
- Ukurasa wa kuingia.
- Ukurasa wa usajili.
Ukurasa kuu unaonekana kuwa mzuri:

Kuna faili mbili kwenye mizizi Dockerfile ΠΈ docker-compose.yml, pamoja na folda inayojulikana .ci-cd na idadi ndogo kidogo ya hati kuliko kwenye hazina ya nyuma (hati za kufanya majaribio zimeondolewa).
Kuanzisha mradi katika Plesk
Wacha tuanze kwa kusanidi Plesk na kuunda usajili kwa tovuti yetu.
Inasakinisha viendelezi
Katika Plesk tunahitaji viendelezi vinne:
Dockerkudhibiti na kuonyesha hali ya vyombo kwenye paneli ya msimamizi wa Plesk;Gitkusanidi hatua ya kupeleka kwenye seva;Let's Encryptkwa ajili ya kuzalisha (na kusasisha kiotomatiki) vyeti vya bure vya TLS;Firewallkusanidi uchujaji wa trafiki inayoingia.
Unaweza kuzisakinisha kupitia paneli ya msimamizi wa Plesk katika sehemu ya Viendelezi:

Hatutazingatia usanidi wa kina wa viendelezi; kwa madhumuni yetu ya onyesho, mipangilio chaguomsingi itafaa.
Kuunda usajili na tovuti
Ifuatayo, tunahitaji kuunda usajili kwa tovuti yetu helloworld.ru na kuongeza subdomain dev.helloworld.ru huko.
- Tunaunda usajili kwa kikoa cha helloworld.ru na kutaja nenosiri la kuingia kwa mtumiaji wa mfumo:

Angalia kisanduku chini ya ukurasa Linda kikoa kwa kutumia Let's Encrypt, ikiwa tunataka kusanidi HTTPS kwa tovuti:
- Ifuatayo, katika usajili huu, tunaunda kikoa kidogo dev.helloworld.ru (ambacho unaweza pia kutoa cheti cha bure cha TLS):

Inasakinisha vipengele vya seva
Tuna seva na OS Debian Kunyoosha 9.12 na imewekwa jopo la kudhibiti Plesk Obsidian 18.0.27.
Tunahitaji kusakinisha na kusanidi kwa mradi wetu:
- PostgreSQL (kwa upande wetu, kutakuwa na seva moja iliyo na hifadhidata mbili za mazingira ya dev na prod).
- RabbitMQ (sawa, mfano sawa na vhosts tofauti kwa mazingira).
- Matukio mawili ya Redis (kwa mazingira ya dev na prod).
- Usajili wa Docker (kwa uhifadhi wa ndani wa picha za Docker zilizokusanywa).
- Kiolesura cha UI cha Usajili wa Docker.
PostgreSQL
Plesk tayari inakuja na PostgreSQL DBMS, lakini sio toleo la hivi karibuni (wakati wa kuandika Plesk Obsidian Matoleo ya Postgres 8.4β10.8). Tunataka toleo jipya zaidi la programu yetu (12.3 wakati wa kuandika), kwa hivyo tutaisakinisha sisi wenyewe.
Maagizo ya kina kuhusu kusakinisha Postgres kwenye Debian Kuna mengi kwenye mtandao (), kwa hivyo sitazielezea kwa undani, nitatoa amri tu:
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
Kwa kuzingatia kwamba PostgreSQL ina mipangilio chaguo-msingi ya wastani, ni muhimu kurekebisha usanidi. Hii itatusaidia : unahitaji kuingiza vigezo vya seva yako na kubadilisha mipangilio kwenye faili /etc/postgresql/12/main/postgresql.confkwa waliopendekezwa. Hapa ni lazima ieleweke kwamba calculators vile si risasi uchawi, na msingi lazima tuned kwa usahihi zaidi, kwa kuzingatia vifaa yako, maombi na utata wa maswali. Lakini hii inatosha kuanza.
Mbali na mipangilio iliyopendekezwa na calculator, tunabadilisha pia postgresql.confbandari chaguo-msingi 5432 imepewa nyingine (kwa mfano wetu - 53983).
Baada ya kubadilisha faili ya usanidi, fungua upya seva ya postgresql kwa amri:
service postgresql restart
Tulisakinisha na kusanidi PostgreSQL. Sasa hebu tuunde hifadhidata, watumiaji wa mazingira ya usanifu na uzalishaji, na tuwape watumiaji haki za kudhibiti hifadhidata:
$ 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
SunguraMQ
Tuendelee kusakinisha RabbitMQ, dalali wa ujumbe wa Celery. Imewekwa kwenye Debian Ni rahisi sana:
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
Baada ya ufungaji tunahitaji kuunda wenyeji, watumiaji na kutoa haki zinazohitajika:
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 ".*" ".*" ".*"
Rejea
Sasa hebu tusakinishe na kusanidi sehemu ya mwisho ya programu yetu - Redis. Itatumika kama backend kuhifadhi matokeo ya kazi Celery.
Tutainua kontena mbili za Docker na Redis kwa mazingira ya dev na prod kwa kutumia kiendelezi Docker kwa Plesk.
- Nenda kwa Plesk, nenda kwa sehemu ya Viendelezi, tafuta kiendelezi cha Docker na usakinishe (tunahitaji toleo la bure):

- Nenda kwenye kiendelezi kilichowekwa, pata picha kupitia utafutaji
redis bitnamina usakinishe toleo jipya zaidi:
- Tunaingia kwenye chombo kilichopakuliwa na kurekebisha usanidi: taja bandari, ukubwa wa juu wa RAM uliotengwa, nenosiri katika vigezo vya mazingira, na weka kiasi:

- Tunafanya hatua 2-3 kwa chombo cha prod, katika mipangilio tunabadilisha tu vigezo: bandari, nenosiri, ukubwa wa RAM na njia ya folda ya kiasi kwenye seva:

Usajili wa Docker
Mbali na huduma za kimsingi, itakuwa nzuri kusakinisha hazina yako ya picha ya Docker kwenye seva. Kwa bahati nzuri, nafasi kwenye seva sasa ni nafuu kabisa (kwa hakika ni nafuu zaidi kuliko usajili kwa DockerHub), na mchakato wa kufunga hifadhi ya kibinafsi ni rahisi sana.
Tunataka kuwa na:
- hazina ya Doka iliyolindwa na nenosiri inayofikiwa kupitia kikoa kidogo ;
- Kiolesura cha kiolesura cha kutazama picha kwenye hifadhi, kinapatikana kwa .
Kwa hili:
- Wacha tuunde vikoa vidogo viwili katika usajili wetu katika Plesk: docker.helloworld.ru na docker-ui.helloworld.ru, na tusanidi cheti cha Let's Encrypt kwa ajili yao.
- Ongeza faili kwenye folda ya kikoa cha docker.helloworld.ru
docker-compose.ymlna maudhui haya: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' - Chini ya SSH, tutaunda faili ya .htpasswd kwa uidhinishaji wa Msingi katika hazina ya Docker:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Wacha tukusanye na kuinua vyombo:
docker-compose up -d - Na tunahitaji kuelekeza Nginx kwenye vyombo vyetu. Hii inaweza kufanywa kupitia Plesk.
Hatua zifuatazo zinahitajika kufanywa kwa vikoa vidogo vya docker.helloworld.ru na docker-ui.helloworld.ru:
Katika sehemu Vyombo vya vifaa tovuti yetu kwenda Sheria za Wakala wa Docker:

Na ongeza sheria ya kuwasilisha trafiki inayoingia kwenye kontena letu:

- Tunaangalia kuwa tunaweza kuingia kwenye kontena letu kutoka kwa mashine ya ndani:
$ 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 - Wacha tuangalie utendakazi wa docker-ui.helloworld.ru subdomain:

Unapobofya Vinjari hazina, kivinjari kitaonyesha dirisha la uidhinishaji ambapo utahitaji kuingiza kuingia na nenosiri kwa hifadhi. Baada ya hapo tutaelekezwa kwenye ukurasa ulio na orodha ya hazina (kwa sasa itakuwa tupu):
Kufungua bandari katika Plesk Firewall
Baada ya kufunga na kusanidi vipengele, tunahitaji kufungua bandari ili vipengele viweze kupatikana kutoka kwa vyombo vya Docker na mtandao wa nje.
Hebu tuone jinsi ya kufanya hivyo kwa kutumia mfano wa kiendelezi cha Firewall kwa Plesk ambacho tulisakinisha hapo awali.
- Enda kwa Zana na Mipangilio > Mipangilio > Firewall:

- Enda kwa Rekebisha Kanuni za Firewall za Plesk > Ongeza Kanuni Maalum na ufungue bandari zifuatazo za TCP kwa subnet ya Docker (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
- Pia tutaongeza sheria ambayo itafungua bandari za PostgreSQL na paneli ya usimamizi ya RabbitMQ kwa ulimwengu wa nje:

- Tumia sheria kwa kutumia kitufe cha Omba Mabadiliko:

Kuanzisha CI/CD katika Vitendo vya Github
Wacha tufikie sehemu ya kupendeza zaidi - kusanidi bomba la ujumuishaji endelevu na kuwasilisha mradi wetu kwa seva.
Bomba hili litakuwa na sehemu mbili:
- kujenga picha na vipimo vya kukimbia (kwa backend) - upande wa Github;
- kuzindua uhamiaji (kwa nyuma) na kupeleka vyombo kwenye seva.
Sambaza kwa Plesk
Wacha tushughulike na hatua ya pili kwanza (kwani ya kwanza inategemea).
Tutasanidi mchakato wa kupeleka kwa kutumia kiendelezi cha Git cha Plesk.
Wacha tuangalie mfano na mazingira ya Prod kwa hazina ya Backend.
- Tunaenda kwa usajili wa tovuti yetu ya Helloworld na kwenda kwa kifungu kidogo cha Git:

- Ingiza kiunga cha hazina yetu ya Github kwenye uwanja wa "Remote Git hazina" na ubadilishe folda chaguo-msingi.
httpdocskwa mwingine (kwa mfano,/httpdocs/hw_back):
- Nakili kitufe cha Umma cha SSH kutoka kwa hatua ya awali na katika mipangilio ya Github.
- Bonyeza OK kwenye skrini katika hatua ya 2, baada ya hapo tunaelekezwa kwenye ukurasa wa hifadhi huko Plesk. Sasa tunahitaji kusanidi hazina ili kusasishwa kwenye ahadi kwa tawi kuu. Ili kufanya hivyo, nenda kwa Mipangilio ya Hifadhi na kuokoa thamani
Webhook URL(tutahitaji hii baadaye wakati wa kusanidi Vitendo vya Github):
- Katika sehemu ya Vitendo kwenye skrini kutoka kwa aya iliyotangulia, ingiza hati ili kuanza kupeleka:
cd {REPOSITORY_ABSOLUTE_PATH} .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}ambapo:
{REPOSITORY_ABSOLUTE_PATH}- njia ya folda ya uwekaji kumbukumbu ya nyuma kwenye seva;
{ENV}- mazingira (dev/prod), kwa upande wetuprod;
{DOCKER_REGISTRY_HOST}- mwenyeji wa hazina yetu ya docker
{TG_BOT_TOKEN}- ishara ya bot ya Telegraph;
{TG_CHAT_ID}- Kitambulisho cha gumzo/kituo cha kutuma arifa.Hati ya mfano:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/ .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890 - Tunaongeza mtumiaji kutoka kwa usajili wetu kwa kikundi cha Docker (ili aweze kudhibiti vyombo):
sudo usermod -aG docker helloworld_admin
Mazingira ya Dev ya hazina ya nyuma na ya mbele yamesanidiwa kwa njia ile ile.
Bomba la Usambazaji kwa Vitendo vya Github
Wacha tuendelee kusanidi sehemu ya kwanza ya bomba letu la CI/CD katika Vitendo vya Github.
Backend
Bomba limeelezewa ndani .
Lakini kabla ya kuichanganua, wacha tujaze vijiti vya Siri tunazohitaji katika Github. Ili kufanya hivyo, nenda kwa Mipangilio -> Siri:
DOCKER_REGISTRY- mwenyeji wa hazina yetu ya Docker (docker.helloworld.ru);DOCKER_LOGIN- ingia kwenye hazina ya Docker;DOCKER_PASSWORD- nenosiri kwa ajili yake;DEPLOY_HOST- mwenyeji ambaye paneli ya msimamizi wa Plesk inapatikana (mfano: : 8443 au :8443);DEPLOY_BACK_PROD_TOKEN- ishara ya kupelekwa kwenye hifadhi ya prod kwenye seva (tuliipokea katika Usambazaji katika Plesk, hatua ya 4);DEPLOY_BACK_DEV_TOKEN- ishara kwa ajili ya kupelekwa kwenye hazina ya dev kwenye seva.
Mchakato wa kupeleka ni rahisi na una hatua tatu kuu:
- kujenga na kuchapisha picha katika hazina yetu;
- kufanya vipimo kwenye chombo kulingana na picha mpya iliyokusanywa;
- kupelekwa kwa mazingira yanayotakiwa kulingana na tawi (dev/master).
frontend
sio tofauti sana na Bekov. Inakosa hatua ya kufanya majaribio na kubadilisha majina ya tokeni za kupelekwa. Siri za hazina ya mbele, kwa njia, zinahitaji kujazwa tofauti.
Mpangilio wa tovuti
Kuwakilisha trafiki kupitia Nginx
Naam, tumefika mwisho. Kilichosalia ni kusanidi utumaji wakala wa trafiki inayoingia na kutoka kwa kontena letu kupitia Nginx. Tayari tumeshughulikia mchakato huu katika hatua ya 5 ya kusanidi Usajili wa Docker. Kitu kimoja kinahitaji kurudiwa kwa sehemu za nyuma na za mbele katika mazingira ya dev na prod.
Nitatoa viwambo vya mipangilio.
Backend

frontend

Ufafanuzi muhimu. URL zote zitawekwa kama seva kwa chombo cha mbele, isipokuwa zile zinazoanza /api/ - watawekwa kwenye kontena la nyuma (kwa hivyo kwenye chombo cha nyuma, washikaji wote lazima waanze na /api/).
Matokeo ya
Sasa tovuti yetu inapaswa kupatikana kwenye helloworld.ru na dev.helloworld.ru (mazingira ya prod na dev, kwa mtiririko huo).
Kwa jumla, tulijifunza jinsi ya kuandaa programu rahisi katika Flask na Angular na kusanidi bomba katika Vitendo vya Github kwa kuisambaza kwa seva inayoendesha Plesk.
Nitatoa nakala za viungo kwenye hazina na nambari: , .
Chanzo: mapenzi.com
