
Di vê gotarê de, ez ê ezmûna xwe di sazkirina CI/CD de bi karanîna panela kontrolê ya Plesk û Çalakiyên Github re parve bikim. Îro em ê fêr bibin ka meriv çawa projeyek hêsan bi navê hêsan "Helloworld" saz dike. Ew di çarçoveya Python Flask de, bi karkerên li Celery û pêşekek li Angular 8 ve hatî nivîsandin.
Girêdanên depoyan: , .
Di beşa yekem a gotarê de em ê li projeya xwe û beşên wê binêrin. Di ya duyemîn de, em ê fêr bibin ka meriv çawa Plesk mîheng dike û pêvekirin û hêmanên pêwîst saz dike (DB, RabbitMQ, Redis, Docker, hwd.).
Di beşa sêyemîn de, em ê di dawiyê de fêhm bikin ka meriv çawa boriyek ji bo bicîhkirina projeya xwe li serverek di hawîrdorek dev û prod de saz dike. Û paşê em ê malperê li ser serverê bidin destpêkirin.
Û erê, min ji bîr kir ku ez xwe bidim naskirin. Navê min Oleg Borzov e, ez di tîmê CRM-ê de ji bo rêveberên deyndana mortgage-ê li Domklik pêşdebirek tev-stack im.
Projeya giştî
Pêşîn, bila em li du depoyên projeyê binihêrin - paşverû û pêş - û kodê bişopînin.
Beşa paşîn: Flask + Celery
Ji bo paşîn-dawiyê, min berhevokek ku di nav pêşdebirên Python de pir populer e hilda: çarçoveya Flask (ji bo API) û Celery (ji bo rêza peywirê). SQLAchemy wekî ORM tê bikar anîn. Alembic ji bo koçberan tê bikaranîn. Ji bo pejirandina JSON di destan de - Marshmallow.
В Dosyayek Readme.md heye ku bi hûrgulî ravekirin û rêwerzên ji bo destpêkirina projeyê heye.
pir hêsan, ji 6 destan pêk tê:
/ping- kontrolkirina hebûna;- ji bo qeydkirin, destûrkirin, nedestûrkirin û wergirtina bikarhênerek destûrdar digire;
- destekek ji bo şandina e-nameyek ku peywirê dixe rêza Celery.
Ew hê hêsantir e, tenê pirsgirêkek heye send_mail_task.
Di peldankê de du binpeldank hene:
dockerbi du Dockerfiles (base.dockerfileji bo avakirina image bingehîn ku kêm diguhere ûDockerfileji bo civînên sereke);.env_files- bi pelên bi guhêrbarên jîngehê ji bo derdorên cihêreng.
Di koka projeyê de çar pelên docker-compose hene:
docker-compose.local.db.ymlji bo pêşveçûnê databasek herêmî bilind bikin;docker-compose.local.workers.ymlji bo bilindkirina herêmî ya xebatkar, databas, Redis û RabbitMQ;docker-compose.test.ymlji bo ceribandinên di dema sazkirinê de xebitandin;docker-compose.ymlji bo belavkirinê.
Û peldanka dawî ya balkêş ji bo me ye . Ew ji bo bicîhkirinê nivîsarên şêlê vedihewîne:
deploy.sh- destpêkirina koçberî û belavkirinê. Piştî çêkirin û ceribandinên di Github Actions de li ser serverê hate destpêkirin;rollback.sh- konteynirên vegerandina guhertoya berê ya civînê;curl_tg.sh- şandina agahdariyên bicîhkirinê ji Telegram re.
Frontend di Angular de
ji ya Bekov pir sadetir e. Pêşî ji sê rûpelan pêk tê:
- Rûpelê malê bi formek ji bo şandina e-nameyê û bişkokek derketinê.
- Rûpelê têketinê.
- Rûpelê qeydkirinê.
Rûpelê sereke asketî xuya dike:

Di root de du pel hene Dockerfile и docker-compose.yml, û her weha peldanka naskirî .ci-cd bi hejmarek piçûktir a nivîsan ji depoya paşîn (nivîsên ji bo ceribandinên xebitandinê hatine rakirin).
Li Plesk projeyek dest pê dike
Ka em bi sazkirina Plesk û afirandina abonetiyek ji bo malpera xwe dest pê bikin.
Sazkirina pêvekan
Di Plesk de ji me re çar dirêjkirin hewce ne:
Dockerji bo rêvebirin û xuyangkirina rewşa konteyneran di panela rêveberê Plesk de;Gitji bo mîhengkirina pêngava bicihkirinê li ser serverê;Let's Encryptji bo hilberîna (û oto-nûvekirina) sertîfîkayên TLS yên belaş;Firewallji bo fîlterkirina seyrûsefera hatinî mîheng bikin.
Hûn dikarin wan bi navgîniya panelê rêveberê Plesk di beşa Pêvekan de saz bikin:

Em ê ji bo mebestên xwe yên demo veavakirina berfireh nagirin, mîhengên xwerû dê guncan bin.
Abonetiyek û malperek çêbikin
Dûv re, pêdivî ye ku em ji bo malpera xwe abonetiyek helloworld.ru çêbikin û subdomain dev.helloworld.ru li wir zêde bikin.
- Em ji bo domaina helloworld.ru abonetiyê diafirînin û şîfreya têketinê ji bo bikarhênerê pergalê diyar dikin:

Qutiya li binê rûpelê kontrol bikin Bi Let's Encrypt domainê ewle bikin, heke em dixwazin HTTPS ji bo malperê mîheng bikin:
- Dûv re, di vê abonetiyê de, em subdomainek dev.helloworld.ru diafirînin (ji bo vê yekê hûn dikarin sertîfîkayek TLS ya belaş jî bidin):

Sazkirina pêkhateyên serverê
Em xwedî server bi OS Debian Dirêjkirin 9.12 û panelê kontrolê saz kirin Plesk Obsidian 18.0.27.
Divê em ji bo projeya xwe saz bikin û mîheng bikin:
- PostgreSQL (di doza me de dê serverek bi du databasên ji bo hawîrdorên dev û prod hebe).
- RabbitMQ (eynî tişt, yek mînakek bi vhostên cihêreng ji bo hawîrdoran).
- Du mînakên Redis (ji bo hawîrdorên dev û prod).
- Docker Registry (ji bo hilanîna herêmî ya wêneyên Docker ên berhevkirî).
- Navbera UI ji bo qeydkirina Docker.
PostgreSQL
Plesk jixwe bi DBMSek PostgreSQL tê, lê ne guhertoya herî dawî (di dema nivîsandina Plesk Obsidian de Guhertoyên Postgres 8.4–10.8). Em ji bo serîlêdana xwe guhertoya herî dawî (12.3 di dema nivîsandinê de) dixwazin, ji ber vê yekê em ê wê bi destan saz bikin.
Rêwerzên berfireh li ser sazkirina Postgres li ser Debian gelek li ser înternetê heye (), ji ber vê yekê ez ê wan bi hûrgulî nebêjim, ez ê tenê fermanan bidim:
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
Bihesibînin ku PostgreSQL xwedan mîhengên xwerû yên pir navîn e, pêdivî ye ku meriv veavakirinê biguhezîne. Ev dê alîkariya me bike : Pêdivî ye ku hûn pîvanên servera xwe têkevin û mîhengên pelê biguhezînin /etc/postgresql/12/main/postgresql.confji yên ku hatine pêşniyar kirin. Li vir divê were zanîn ku hesabkerên weha ne guleyek efsûnî ne, û pêdivî ye ku bingeh li ser bingeha hardware, serîlêdan û tevliheviya pirsên we bi hûrgulî were guheztin. Lê ev ji bo destpêkirinê bes e.
Ji bilî mîhengên ku ji hêla hesabker ve têne pêşniyar kirin, em jî diguherînin postgresql.confporta xwerû 5432 ji yekî din re tê veqetandin (di mînaka me de - 53983).
Piştî ku pelê veavakirinê biguhezîne, bi fermanê re servera postgresql ji nû ve saz bike:
service postgresql restart
Me PostgreSQL saz kir û mîheng kir. Naha em databasek, bikarhênerên ji bo hawîrdorên dev û prod biafirînin, û mafên bikarhêneran bidin ku databasê birêve bibin:
$ 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
Werin em derbasî sazkirina RabbitMQ bibin, ku brokerek peyaman ji bo Celery ye. Ew li ser hatiye sazkirin Debian Ew pir hêsan e:
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
Piştî sazkirinê divê em çêbikin vhosts, bikarhêneran û mafên pêwîst bidin:
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 ".*" ".*" ".*"
Redis
Naha em ji bo serîlêdana xwe pêkhateya paşîn saz bikin û mîheng bikin - Redis. Ew ê wekî paşverû were bikar anîn da ku encamên karên Celery hilîne.
Em ê du konteynerên Docker bi Redis re ji bo hawîrdorên dev û prod bi karanîna dirêjkirinê rakin Docker ji bo Plesk.
- Herin Plesk, biçin beşa Extensions, li dirêjkirina Docker bigerin û wê saz bikin (hewceya me bi guhertoya belaş heye):

- Herin pêveka sazkirî, wêneyê bi lêgerînê bibînin
redis bitnamiû guhertoya herî dawî saz bikin:
- Em diçin nav konteynera dakêşandî û veavakirinê eyar dikin: portê, mezinahiya herî zêde ya RAM-ê ya veqetandî, şîfreya di guhêrbarên hawîrdorê de destnîşan bikin, û hejmûnê siwar bikin:

- Em gavên 2-3 ji bo konteynerê prod pêk tînin, di mîhengan de em tenê pîvanan diguhezînin: port, şîfre, mezinahiya RAM û rêça peldanka volumê ya li ser serverê:

Docker Registry
Digel karûbarên bingehîn, dê xweş be ku hûn depoya wêneya xweya Docker-ê li ser serverê saz bikin. Xwezî, cîhê li ser serveran naha pir erzan e (bê guman ji abonetiya DockerHub erzantir e), û pêvajoya sazkirina depoyek taybet pir hêsan e.
Em dixwazin hebin:
- Depoya Docker a bi şîfreya parastî ku bi navgîniya subdomain ve tê gihîştin ;
- Navbera UI ji bo dîtina wêneyan di depoyê de, li ser peyda dibe .
Ji bo vê kirin:
- Ka em di abonetiya xwe de li Plesk du subdomain biafirînin: docker.helloworld.ru û docker-ui.helloworld.ru, û ji bo wan sertîfîkayên Let's Encrypt mîheng bikin.
- Pelê zêde bike peldanka subdomainê docker.helloworld.ru
docker-compose.ymlbi naverok bi vî rengî: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' - Di bin SSH de, em ê pelek .htpasswd ji bo destûrnameya bingehîn di depoya Docker de biafirînin:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Ka em konteyneran berhev bikin û rakin:
docker-compose up -d - Û em hewce ne ku Nginx berbi konteynerên xwe vegerînin. Ev dikare bi rêya Plesk were kirin.
Pêdivî ye ku gavên jêrîn ji bo bindomayên docker.helloworld.ru û docker-ui.helloworld.ru bêne kirin:
beşa Dev Tools malpera me biçe Rêbazên Proxy Docker:

Û qaîdeyek ji bo prokskirina seyrûsefera hatinê li konteynera me zêde bikin:

- Em kontrol dikin ku em dikarin ji makîneya herêmî têkevin konteynera xwe:
$ 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 - Werin em di heman demê de xebata bindomaina docker-ui.helloworld.ru jî kontrol bikin:

Dema ku hûn li ser Depoyan Bigerin bikirtînin, gerok dê pencereyek destûrnameyê nîşan bide ku hûn hewce ne ku têketin û şîfreya depoyê têkevin. Piştî vê yekê em ê ber bi rûpelek bi navnîşek depoyan ve werin rêve kirin (ji bo nuha ew ê vala be):
Vekirina portan di Plesk Firewall de
Piştî sazkirin û mîhengkirina pêkhateyan, pêdivî ye ku em benderan vekin da ku pêkhate ji konteynerên Docker û tora derveyî bigihîjin.
Ka em bibînin ka meriv çawa vê yekê bi karanîna mînaka dirêjkirina Firewall-ê ji bo Plesk-ê ku me berê saz kiriye, dike.
- Biçe Amûr & Mîheng > Mîheng > Firewall:

- Biçe Rêgezên Plesk Firewall biguherînin> Rêzika Xweser lê zêde bikin û portên TCP-ê yên jêrîn ji bo jêrtora Docker vekin (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
- Em ê qaîdeyek jî lê zêde bikin ku dê portên PostgreSQL û panela rêveberiya RabbitMQ ji cîhana derve re veke:

- Bi karanîna bişkojka Guhertinên Serlêdan, qaîdeyan bicîh bînin:

Di Çalakiyên Github de CI/CD saz kirin
Ka em biçin beşa herî balkêş - sazkirina boriyek entegrasyonê ya domdar û gihandina projeya xwe ji serverê re.
Ev boriyê dê ji du beşan pêk were:
- avakirina wêneyê û ceribandinên xebitandinê (ji bo paşîn) - li aliyê Github;
- destpêkirina koçberan (ji bo paşîn) û danîna konteyneran li ser serverê.
Li Plesk bicîh bikin
Ka em pêşî bi xala duyemîn re mijûl bibin (ji ber ku ya yekem bi wê ve girêdayî ye).
Em ê pêvajoya bicîhkirinê bi karanîna dirêjkirina Git ji bo Plesk mîheng bikin.
Ka em li mînakek bi hawîrdora Prod-ê ji bo depoyek Backend-ê binêrin.
- Em diçin abonetiya malpera xwe ya Helloworld û diçin binbeşa Git:

- Zencîreya depoya meya Github-ê li qada "Depoya Git-ya Dûr" bixin û peldanka xwerû biguherînin.
httpdocsji yê din re (mînak,/httpdocs/hw_back):
- Mifteya Giştî ya SSH-ê ji gava berê kopî bikin û ew di mîhengên Github de.
- Di qonaxa 2-ê de li ser ekranê OK bikirtînin, piştî ku em ber bi rûpela depoyê ya li Plesk ve têne rêve kirin. Naha pêdivî ye ku em depoyê mîheng bikin da ku dema ku meriv bi şaxê masterê ve girêdayî ye nûve bike. Ji bo vê yekê, biçin Mîhengên Depoyê û nirxê xilas bike
Webhook URL(Em ê paşê vê yekê hewce bikin dema ku Çalakiyên Github saz bikin):
- Li qada Çalakiyên li ser ekranê ji paragrafa berê, skrîptê têkevin da ku dest bi danînê bikin:
cd {REPOSITORY_ABSOLUTE_PATH} .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}derê
{REPOSITORY_ABSOLUTE_PATH}- riya peldanka depoya paşîn a prod ya li ser serverê;
{ENV}- jîngehê (dev / prod), di doza me deprod;
{DOCKER_REGISTRY_HOST}- mêvandarê depoya meya dokerê
{TG_BOT_TOKEN}- Token bot Telegram;
{TG_CHAT_ID}- Nasnameya chat / kanalê ji bo şandina agahdariyan.Mînaka skrîptê:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/ .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890 - Em bikarhênerek ji abonetiya xwe li koma Docker zêde dikin (da ku ew bikaribe konteyneran birêve bibe):
sudo usermod -aG docker helloworld_admin
Jîngeha Dev ji bo depoya paşîn û pêşiyê bi heman rengî têne mîheng kirin.
Xeta Berhevkirina Berbi Çalakiyên Github
Werin em biçin sazkirina beşa yekem a xeta xweya CI/CD-ê di Çalakiyên Github de.
Backend
Xeta boriya tê de tê şirove kirin .
Lê berî parskirina wê, em guhêrbarên Veşartî yên ku em li Github hewce ne tije bikin. Ji bo vê yekê, biçin Mîheng -> Veşartî:
DOCKER_REGISTRY- mêvandarê depoya meya Docker (docker.helloworld.ru);DOCKER_LOGIN- têkevin depoya Docker;DOCKER_PASSWORD- şîfreya wê;DEPLOY_HOST- mêvandarek ku panela rêveberiya Plesk li ser heye (mînak: :8443 an :8443);DEPLOY_BACK_PROD_TOKEN- nîşanek ji bo danîna depoya prod ya li ser serverê (me ew di Deployment in Plesk, gav 4 de wergirt);DEPLOY_BACK_DEV_TOKEN- nîşanek ji bo bicihkirina depoya dev a li ser serverê.
Pêvajoya sazkirinê hêsan e û ji sê gavên sereke pêk tê:
- avakirin û weşandina wêneyê di depoya me de;
- ceribandinên di konteynerê de li ser bingeha wêneyek nû hatî berhev kirin;
- bicihkirina li hawîrdora xwestinê li gorî şaxê (dev / master).
Frontend
ji ya Bekov ne pir cuda ye. Ew gavê ceribandinên xebitandinê winda dike û navên nîşanan ji bo bicîhkirinê diguhezîne. Veşartî ji bo depoya pêşiyê, bi awayê, pêdivî ye ku ji hev cuda bêne dagirtin.
Sazkirina malperê
Bi navgîniya Nginx ve seyrûsefera proxying
Erê, em gihîştin dawiyê. Tiştê ku dimîne ev e ku meriv proxykirina seyrûsefera hatin û derketinê ya li konteynera me bi navgîniya Nginx ve mîheng bike. Me berê vê pêvajoyê di gava 5-ê ya sazkirina Docker Registry de vegirtiye. Pêdivî ye ku heman tişt ji bo beşên paş û pêş ên di hawîrdorên dev û prod de were dubare kirin.
Ez ê dîmenên mîhengan peyda bikim.
Backend

Frontend

Dibe ku. Hemî URL dê li konteynera pêşiyê werin veguheztin, ji bilî yên ku bi wan dest pê dikin /api/ - ew ê berbi konteynera paşîn ve werin girêdan (wiha di konteynera paşîn de, divê hemî hilber dest pê bikin /api/).
Encam
Naha divê malpera me li helloworld.ru û dev.helloworld.ru (bi rêzê, hawîrdorên prod û dev) bigihîje.
Bi tevahî, em fêr bûn ka meriv çawa di Flask û Angular de serîlêdanek hêsan amade dike û di Github Actions de boriyek saz dike da ku wê ji serverek ku Plesk dimeşîne rabike.
Ez ê girêdanên depoyan bi kodê dubare bikim: , .
Source: www.habr.com
