
Amin'ity lahatsoratra ity dia hizara ny traikefako amin'ny fametrahana CI/CD amin'ny fampiasana ny Plesk Control Panel sy Github Actions aho. Androany isika dia hianatra ny fomba fametrahana tetikasa tsotra miaraka amin'ny anarana tsy sarotra "Helloworld". Izy io dia voasoratra ao amin'ny rafitra Flask Python, miaraka amin'ny mpiasa Selery sy ny lohany Angular 8.
Rohy mankany amin'ny repository: , .
Ao amin'ny tapany voalohany amin'ny lahatsoratra dia hojerentsika ny tetikasantsika sy ny ampahany aminy. Amin'ny faharoa, hojerentsika ny fomba fametrahana Plesk sy fametrahana ireo fanitarana sy singa ilaina (DB, RabbitMQ, Redis, Docker, sns.).
Amin'ny ampahany fahatelo dia ho hitantsika amin'ny farany ny fomba fametrahana fantsona amin'ny fametrahana ny tetikasantsika amin'ny mpizara amin'ny tontolo dev sy prod. Ary avy eo dia hanomboka ny tranokala amin'ny mpizara izahay.
Ary eny, hadinoko ny nampahafantatra ny tenako. Oleg Borzov no anarako, mpamorona feno stack ao amin'ny ekipa CRM ho an'ny tompon'andraikitra amin'ny fampindramam-bola ao amin'ny Domclick aho.
Fandinihana ny tetikasa
Voalohany, andeha hojerentsika ireo tahiry tetikasa roa - backend sy front - ary mandehana amin'ny code.
Backend: Flask+Seleria
Ho an'ny ampahany aoriana dia naka andiana izay malaza be amin'ny mpamorona Python aho: ny rafitra Flask (ho an'ny API) sy Selery (ho an'ny filaharana asa). SQLAchemy dia ampiasaina ho ORM. Alembic dia ampiasaina amin'ny fifindra-monina. Ho an'ny fanamarinana JSON amin'ny tànana - Marshmallow.
В misy rakitra Readme.md misy famaritana amin'ny antsipiriany momba ny rafitra sy ny torolàlana amin'ny fampandehanana ny tetikasa.
tena tsotra, ahitana penina 6:
/ping- hanamarina ny fisiany;- mitantana ny fisoratana anarana, ny fanomezan-dàlana, ny fanafoanana ny fahazoan-dàlana ary ny fahazoana mpampiasa nahazo alalana;
- tantana mailaka izay mametraka asa ao amin'ny filaharana Selery.
Mbola tsotra kokoa izany, tsy misy afa-tsy olana iray send_mail_task.
Ao anaty folder misy subfolders roa:
dockermiaraka amin'ny Dockerfiles roa (base.dockerfilehanorina sary fototra tsy dia miova aryDockerfileho an'ny fivoriambe lehibe);.env_files- miaraka amin'ny rakitra misy fari-piainan'ny tontolo iainana ho an'ny tontolo samihafa.
Misy rakitra docker-compose efatra ao amin'ny fototry ny tetikasa:
docker-compose.local.db.ymlmanangana tahiry eo an-toerana ho an'ny fampandrosoana;docker-compose.local.workers.ymlho an'ny fananganana mpiasa eo an-toerana, angon-drakitra, Redis ary RabbitMQ;docker-compose.test.ymlho an'ny fanaovana fitiliana mandritra ny fametrahana;docker-compose.ymlho an'ny fametrahana.
Ary ny lahatahiry farany mahaliana antsika - . Misy script shell ho an'ny fametrahana:
deploy.sh- fanombohana ny fifindra-monina sy ny fametrahana. Mihazakazaka amin'ny mpizara aorian'ny fananganana sy fanaovana fitsapana amin'ny Github Actions;rollback.sh- famerenana ny kaontenera amin'ny dikan-teny teo aloha tamin'ny fivoriambe;curl_tg.sh- fandefasana fampandrenesana fandefasana amin'ny Telegram.
Frontend in angular
tsotra kokoa noho ny an'i Beck. Ny pejy voalohany dia misy pejy telo:
- Pejy lehibe misy endrika fandefasana mailaka sy bokotra fivoahana.
- Pejy fidirana.
- Pejy fisoratana anarana.
Ny pejy fototra dia toa ascetic:

Misy rakitra roa eo amin'ny fakany Dockerfile и docker-compose.yml, ary koa ny fampirimana mahazatra .ci-cd miaraka amin'ny sora-baventy kely kokoa noho ny ao amin'ny trano fitehirizam-bokatra (escrits nesorina ho an'ny fitsapana).
Manomboka tetikasa ao Plesk
Andao hanomboka amin'ny fananganana Plesk ary mamorona famandrihana ho an'ny tranokalanay.
Fametrahana fanitarana
Ao amin'ny Plesk, mila fanitarana efatra isika:
Dockerho an'ny fitantanana sy fanehoana an-tsary ny toetry ny kaontenera ao amin'ny tontonana admin Plesk;Gitmandrindra ny dingana fametrahana amin'ny mpizara;Let's Encrypthamokatra (sy fanavaozana ho azy) mari-pankasitrahana TLS maimaim-poana;Firewallhandrindra ny sivana ny fifamoivoizana miditra.
Azonao atao ny mametraka azy ireo amin'ny alàlan'ny tontonana admin Plesk ao amin'ny fizarana Extensions:

Tsy handinika ny fanamafisana amin'ny antsipiriany amin'ny fanitarana izahay; ho an'ny tanjonay demo dia mety ny fikandrana default.
Mamorona famandrihana sy tranokala
Manaraka, mila mamorona famandrihana ho an'ny tranokalanay helloworld.ru ary ampio ny subdomain dev.helloworld.ru ao.
- Mamorona famandrihana ho an'ny sehatra helloworld.ru ary ambarao ny tenimiafina fidirana ho an'ny mpampiasa rafitra:

Jereo ny boaty eo amin'ny faran'ny pejy Arovy ny sehatra amin'ny Let's Encryptraha te hanangana HTTPS ho an'ny tranokala izahay:
- Manaraka, amin'ity famandrihana ity, mamorona subdomain dev.helloworld.ru (izay ahafahanao mamoaka taratasy fanamarinana TLS maimaim-poana ihany koa):

Fametrahana ireo singa mpizara
Manana mpizara izahay OS Debian Mihenjana 9.12 ary napetraka ny tontonana fanaraha-maso Plesk Obsidian 18.0.27.
Mila mametraka sy manitsy ny tetikasantsika isika:
- PostgreSQL (amin'ny tranga misy antsika dia hisy mpizara iray misy tahiry roa ho an'ny tontolo dev sy prod).
- RabbitMQ (zavatra mitovy, ohatra iray misy vhosts samihafa ho an'ny tontolo iainana).
- Ohatra roa Redis (ho an'ny tontolo dev sy prod).
- Docker Registry (ho an'ny fitahirizana ny sary Docker voaangona eo an-toerana).
- UI ho an'ny rejisitra Docker.
PostgreSQL
Plesk dia efa tonga miaraka amin'ny PostgreSQL DBMS, fa tsy ny dikan-teny farany (tamin'ny fotoana nanoratana ny Plesk Obsidian Postgres versions 8.4–10.8). Mila ny kinova farany indrindra ho an'ny fampiharanay izahay (12.3 amin'ny fotoana anoratana), ka hametraka azy amin'ny tanana izahay.
Подробных инструкций по установке Postgres на Debian в сети полно (), noho izany dia tsy hamariparitra azy ireo amin'ny antsipiriany aho, hanome ny baiko fotsiny aho:
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
Raha jerena fa ny PostgreSQL dia manana toe-javatra mahazatra mahazatra, dia ilaina ny manitsy ny fanitsiana. Hanampy antsika izany : mila miditra ny paramètre mpizara ianao ary manolo ny fikandrana ao amin'ny rakitra /etc/postgresql/12/main/postgresql.confamin'ireo atolotra. Marihina eto fa ny kajy toy izany dia tsy bala majika, ary ny fototra dia tokony amboarina tsara kokoa, mifototra amin'ny fitaovanao, ny fampiharana ary ny fahasarotan'ny fanontanianao. Fa izany dia ampy hanombohana.
Ho fanampin'ny fanovana naroson'ny kajy, dia miova koa izahay postgresql.confny port default 5432 mankany amin'ny iray hafa (amin'ny ohatra - 53983).
Aorian'ny fanovana ny rakitra fikirakirana, avereno indray ny postgresql-server miaraka amin'ny baiko:
service postgresql restart
Nametraka sy nanamboatra PostgreSQL izahay. Andeha isika hamorona database, mpampiasa ho an'ny dev- sy prod-environment, ary manome zo ny mpampiasa hitantana ny angona:
$ 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
Ny bitro MQ
Перейдем к установке 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
Aorian'ny fametrahana dia mila mamorona isika vhosts, mpampiasa ary omeo ny zo ilaina:
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
Andeha isika hametraka sy amboary ny singa farany ho an'ny fampiharana - Redis. Izy io dia ampiasaina ho backend hitahiry ny vokatry ny asa Selery.
Hanangana kaontenera Docker roa miaraka amin'i Redis ho an'ny tontolo dev sy prod mampiasa ny fanitarana Docker ho an'ny Plesk.
- Mandehana any amin'ny Plesk, mankanesa any amin'ny fizarana Extensions, tadiavo ny fanitarana Docker ary apetraho (mila ny dikan-teny maimaim-poana izahay):

- Mandehana any amin'ny fanitarana napetraka, tadiavo ny sary amin'ny alàlan'ny fikarohana
redis bitnamiary apetraho ny kinova farany:
- Mandehana ao amin'ny fitoeran-javatra alaina ary amboary ny fanitsiana: mamaritra ny seranana, ny haben'ny RAM natokana indrindra, ny tenimiafina ao amin'ny fari-piainan'ny tontolo iainana, ary apetraho ny volume:

- Manao dingana 2-3 ho an'ny container prod izahay, amin'ny toe-javatra dia manova ny mari-pamantarana fotsiny izahay: seranan-tsambo, tenimiafina, haben'ny RAM ary lalana mankany amin'ny lahatahiry volume amin'ny server:

Docker Registry
Ho fanampin'ny serivisy fototra, tsara ny mametraka ny tahirin-tsarin'ny Docker anao manokana amin'ny mpizara. Soa ihany fa lafo be izao ny habaka mpizara (azo antoka fa mora kokoa noho ny famandrihana DockerHub), ary tena tsotra ny fizotran'ny fananganana tahiry manokana.
Te hanana:
- Ny tahiry Docker voaaro amin'ny tenimiafina azo alaina amin'ny alàlan'ny subdomain ;
- UI hijerena sary ao amin'ny tahiry, hita ao amin'ny .
Mba hanaovana izany:
- Andao hamorona subdomains roa ao amin'ny Plesk amin'ny famandrihanay: docker.helloworld.ru sy docker-ui.helloworld.ru, ary amboary ny mari-pankasitrahana Let's Encrypt ho azy ireo.
- Ampio ao amin'ny docker.helloworld.ru ny rakitra subdomain
docker-compose.ymlmiaraka amin'ny atiny toy izao: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' - Eo ambanin'ny SSH dia hamorona rakitra .htpasswd ho an'ny fanomezan-dàlana fototra ao amin'ny tahiry Docker izahay:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Manangona sy manangana kaontenera:
docker-compose up -d - Ary mila mamindra an'i Nginx mankany amin'ny fitoeranay izahay. Azo atao amin'ny Plesk izany.
Mila atao ireto dingana manaraka ireto ho an'ny docker.helloworld.ru sy docker-ui.helloworld.ru subdomains:
fizarana DevTools mankany amin'ny tranokalanay Fitsipika Docker Proxy:

Ary ampio fitsipika amin'ny proxy ny fifamoivoizana miditra ao amin'ny fitoeranay:

- Manamarina izahay fa afaka miditra ao amin'ny fitoeranay avy amin'ny milina eo an-toerana izahay:
$ 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 - Andeha hojerentsika koa ny fiasan'ny docker-ui.helloworld.ru subdomain:

Rehefa tsindrio ny Browse repository, ny navigateur dia hampiseho varavarankely fanomezan-dàlana izay ilainao hampidirana ny solon'anarana sy ny tenimiafina ho an'ny tahiry. Aorian'izay dia hafindra any amin'ny pejy misy lisitr'ireo trano fitehirizam-bokatra isika (amin'izao fotoana izao dia ho foana ho anao izany):
Manokatra seranana ao amin'ny Plesk Firewall
Aorian'ny fametrahana sy fametrahana ireo singa dia mila manokatra ny seranana isika mba hahafahan'ireo singa azo idirana amin'ny container Docker sy ny tambajotra ivelany.
Andao hojerentsika ny fomba hanaovana izany amin'ny alàlan'ny fanitarana Firewall ho an'ny Plesk izay napetrakay teo aloha.
- Mandeha Tools & Settings > Settings > Firewall:

- Mandeha Ovao ny fitsipiky ny Plesk Firewall > Ampio fitsipika manokana ary sokafy ireto port TCP manaraka ireto ho an'ny subnet Docker (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Averina: 32785, 32786
- Hanampy fitsipika ihany koa izahay izay hanokatra ny seranan-tsambo PostgreSQL sy ny tontolon'ny fitantanana RabbitMQ amin'ny tontolo ivelany:

- Ampiharo ny fitsipika mampiasa ny bokotra Apply Changes:

Mametraka CI/CD ao amin'ny Github Actions
Andeha isika hidina any amin'ny ampahany mahaliana indrindra - ny fametrahana fantsona fampidirana mitohy sy ny fandefasana ny tetikasantsika amin'ny mpizara.
Ity pipeline ity dia ahitana fizarana roa:
- manangana sary sy manao fitsapana (ho an'ny backend) - eo amin'ny lafiny Github;
- mihazakazaka fifindra-monina (ho an'ny backend) sy ny fametrahana fitoeran-javatra - amin'ny mpizara.
Hiverina any amin'ny Plesk
Andeha hojerentsika aloha ny teboka faharoa (fa miankina amin'io ny voalohany).
Hamboarina ny fizotran'ny fametrahana amin'ny alàlan'ny fanitarana Git ho an'ny Plesk.
Andeha hojerentsika ohatra miaraka amin'ny tontolo Prod ho an'ny tahiry Backend.
- Mandeha amin'ny famandrihana ny tranokalanay Helloworld izahay ary mandehana any amin'ny fizarana Git:

- Apetaho ao amin'ny saha "Remote Git repository" ny rohy mankany amin'ny tahiry Github ary ovay ny lahatahiry default
httpdocsamin'ny hafa (oh./httpdocs/hw_back):
- Adikao ny fanalahidy SSH Public avy amin'ny dingana teo aloha ary ao amin'ny fikandrana Github izy io.
- Tsindrio OK eo amin'ny efijery amin'ny dingana 2, aorian'izay dia halefa any amin'ny pejy fitahirizana ao Plesk isika. Ankehitriny dia mila manamboatra ny tahiry isika mba havaozina amin'ny commits amin'ny sampana master. Mba hanaovana izany, mandehana any Toeram-pivarotana ary tehirizo ny sandany
Webhook URL(mila izany isika any aoriana rehefa manangana Github Actions):
- Ao amin'ny saha Actions eo amin'ny efijery avy amin'ny paragrafy teo aloha, ampidiro ny script hanombohana ny fametrahana:
cd {REPOSITORY_ABSOLUTE_PATH} .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}izay:
{REPOSITORY_ABSOLUTE_PATH}- lalana mankany amin'ny lahatahiry prod amin'ny tahiry backend amin'ny mpizara;
{ENV}- tontolo iainana (dev / prod), amin'ny tranga misy antsikaprod;
{DOCKER_REGISTRY_HOST}- ny mpampiantrano ny fitehirizana docker
{TG_BOT_TOKEN}- famantarana bot Telegram;
{TG_CHAT_ID}- ID amin'ny chat/channel handefasana fampandrenesana.Ohatra amin'ny script:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/ .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890 - Manampia mpampiasa avy amin'ny famandrihanay amin'ny vondrona Docker (mba ahafahan'izy ireo mitantana container):
sudo usermod -aG docker helloworld_admin
Ny tontolo dev ho an'ny tahiry backend sy ny frontend dia napetraka amin'ny fomba mitovy.
Fametrahana fantsona ao amin'ny Github Actions
Andao hiroso amin'ny fametrahana ny ampahany voalohany amin'ny fantsona CI/CD ao amin'ny Github Actions.
Backend
Ny pipeline dia voalaza ao amin'ny .
Fa alohan'ny hamakiana azy dia andao fenoy ny fari-piadidiana miafina ilaintsika ao amin'ny Github. Mba hanaovana izany, mandehana any Settings -> Tsiambaratelo:
DOCKER_REGISTRY- ny mpampiantrano ny tahiry Docker (docker.helloworld.ru);DOCKER_LOGIN- midira ao amin'ny tahiry Docker;DOCKER_PASSWORD- tenimiafina ho azy;DEPLOY_HOST- mpampiantrano izay misy ny tontonana admin Plesk (ohatra: : 8443 na :8443);DEPLOY_BACK_PROD_TOKEN- mari-pamantarana amin'ny fametrahana ny prod-repository amin'ny server (nahazo izany izahay tao amin'ny Deployment in Plesk p. 4);DEPLOY_BACK_DEV_TOKEN- mari-pamantarana ho an'ny fametrahana amin'ny tahiry dev amin'ny mpizara.
Tsotra ny fizotran'ny fametrahana ary misy dingana telo lehibe:
- fananganana sy famoahana ny sary ao amin'ny fitahirizanay;
- manao fitsapana ao anaty fitoeran-javatra mifototra amin'ny sary vao namboarina;
- deployment amin'ny tontolo tiana miankina amin'ny sampana (dev/master).
frontend
tsy misy hafa amin'ny an'i Bekov. Mandalo ny dingana amin'ny fanaovana andrana ary manova ny anaran'ireo famantarana hapetraka. Ny tsiambaratelo ho an'ny tahiry eo anoloana, raha ny marina, dia mila fenoina misaraka.
Fametrahana tranokala
Fifamoivoizana amin'ny alàlan'ny Nginx
Eny, tonga amin'ny farany isika. Ny hany sisa tavela dia ny manamboatra proxy ny fifamoivoizana miditra sy mivoaka mankany amin'ny fitoeranay amin'ny Nginx. Efa nandrakotra ity dingana ity izahay tamin'ny dingana 5 amin'ny fametrahana ny Docker Registry. Ny zavatra mitovy dia mila averina amin'ny faritra aoriana sy eo anoloana amin'ny tontolo dev sy prod.
Hanome pikantsarin'ny fandrindrana aho.
Backend

frontend

Ва. Ny URL rehetra dia hafindra amin'ny fitoeran'entana eo anoloana, afa-tsy ireo manomboka amin'ny /api/ - izy ireo dia ho proxied amin'ny fitoeran-javatra aoriana (so ao amin'ny kaontenera aoriana, ny mpitantana rehetra dia tsy maintsy manomboka amin'ny /api/).
vokatra
Ankehitriny ny tranokalanay dia tokony ho hita ao amin'ny helloworld.ru sy dev.helloworld.ru (prod- sy dev-environments, tsirairay avy).
Amin'ny fitambarany, nianatra ny fomba hanomanana fampiharana tsotra ao amin'ny Flask sy Angular izahay ary nanangana fantsona ao amin'ny Github Actions mba hanodina azy amin'ny mpizara mihazakazaka Plesk.
Hanova ny rohy mankany amin'ny tahiry miaraka amin'ny code aho: , .
Source: www.habr.com
















