
I roto i tenei tuhinga, ka tohatohahia e au taku wheako ki te whakatu CI / CD ma te whakamahi i te Paewhiri Mana Plesk me nga Mahi a Github. I tenei ra ka ako tatou me pehea te whakatakoto i tetahi kaupapa ngawari me te ingoa ngawari "Helloworld". Kua tuhia ki roto i te anga Flask Python, me nga kaimahi Herewi me te Angular 8 o mua.
Hononga ki nga putunga: , .
I te wahanga tuatahi o te tuhinga, ka titiro tatou ki ta tatou kaupapa me ona wahanga. I te tuarua, ka whakaarohia e matou me pehea te whakarite i te Plesk me te whakauru i nga taapiri me nga waahanga e tika ana (DB, RabbitMQ, Redis, Docker, etc.).
I te wahanga tuatoru, ka mutu ka whakaaro tatou me pehea te whakarite i te paipa mo te tuku i a maatau kaupapa ki tetahi kaimau i roto i te taiao dev me te prod. Na ka whakarewahia e matou te pae i runga i te tūmau.
Ae, kua wareware ahau ki te whakaatu i ahau. Ko Oleg Borzov toku ingoa, he kaiwhakawhanake tonu ahau i roto i te roopu CRM mo nga kaiwhakahaere mokete i Domclick.
Kaupapa Kaupapa
Tuatahi, kia tirohia e rua nga putunga kaupapa - muri me mua - ka haere ki runga i te waehere.
Whakamuri: Flask+Celery
Mo te taha o muri, i mau ahau i tetahi paihere e tino rongonui ana i waenga i nga kaiwhakawhanake Python: te anga Flask (mo te API) me te Celery (mo te rarangi mahi). Ka whakamahia te SQLAchemy hei ORM. Ka whakamahia te Alembic mo nga heke. Mo te whakamana JSON i roto i nga kakau - Marshmallow.
В he konae Readme.md me te whakamaarama taipitopito o te hanganga me nga tohutohu mo te whakahaere i te kaupapa.
tino uaua, e 6 nga pene:
/ping- ki te tirotiro i te waatea;- ka mau mo te rehitatanga, te whakamanatanga, te whakakore i te mana me te whiwhi i tetahi kaiwhakamahi whai mana;
- he kakau imeera e tuu ana i tetahi mahi ki te rarangi herewi.
he maamaa ake, kotahi anake te raru send_mail_task.
Kei te kōpaki e rua nga kōpakiroto:
dockerme nga konae Docker e rua (base.dockerfileki te hanga i te ahua onge te hurihanga me teDockerfilemo nga huihuinga matua);.env_files- me nga konae me nga taurangi taiao mo nga taiao rereke.
E wha nga konae tito docker kei te putake o te kaupapa:
docker-compose.local.db.ymlki te whakaara i tetahi putunga raraunga o te rohe mo te whanaketanga;docker-compose.local.workers.ymlmo te whakaara ake i te kaimahi, te putunga korero, Redis me RabbitMQ;docker-compose.test.ymlki te whakahaere i nga whakamatautau i te wa e tukuna ana;docker-compose.ymlmo te whakatakotoranga.
A ko te kōpaki whakamutunga e hiahia ana matou - . Kei roto nga tuhinga anga mo te horahanga:
deploy.sh— te whakarewatanga o te heke me te tuku. Ka rere i runga i te tūmau i muri i te hanga me te whakahaere i nga whakamatautau i roto i nga Mahi a Github;rollback.sh- te huri i nga ipu ki te putanga o mua o te huihuinga;curl_tg.sh- te tuku panui whakamohiotanga ki Telegram.
Tuhinga o mua i te Angular
he maamaa ake i a Beck. E toru nga wharangi o mua:
- Te wharangi matua me te puka mo te tuku imeera me te paatene puta.
- Whārangi takiuru.
- Whārangi rehitatanga.
Ko te wharangi matua he ahua whakakeke:

E rua nga konae kei te putake Dockerfile и docker-compose.yml, me te kōpaki taunga .ci-cd he iti ake nga tuhinga i te putunga o muri (kua tangohia nga tuhinga hei whakahaere i nga whakamatautau).
Te tiimata i tetahi kaupapa i Plesk
Me timata ma te whakatu i a Plesk me te hanga ohaurunga mo to maatau papaanga.
Tāuta toronga
I Plesk, me wha nga toronga:
Dockerki te whakahaere me te whakaatu kanohi i te mana o nga ipu kei te papa whakahaere o Plesk;Gitki te whirihora i te taahiraa tuku i runga i te tūmau;Let's Encryptki te whakaputa (me te whakahou-aunoa) tiwhikete TLS kore utu;Firewallki te whirihora i te tātari o nga waka taumai.
Ka taea e koe te whakauru i a raatau ma te roopu whakahaere Plesk i te waahanga Toronga:

E kore matou e whakaaro ki nga tautuhinga taipitopito mo nga taapiri, ka mahia e nga tautuhinga taunoa mo o maatau kaupapa demo.
Waihangahia he ohaurunga me te pae
I muri mai, me hanga he ohaurunga mo ta maatau paetukutuku helloworld.ru me te taapiri i te dev.helloworld.ru subdomain ki reira.
- Waihangahia he ohaurunga mo te rohe helloworld.ru ka whakapūtā te takiuru-kupuhipa mo te kaiwhakamahi pūnaha:

Tirohia te pouaka kei raro o te wharangi Whakaorangia te rohe ki a Let's Encryptki te hiahia matou ki te whakarite HTTPS mo te pae:
- I muri mai, i tenei ohaurunga, hangahia he subdomain dev.helloworld.ru (ka taea hoki e koe te tuku tiwhikete TLS kore utu):

Tāuta Wae Tūmau
He tūmau kei a matou OS Debian Totoro 9.12 me te paewhiri mana kua whakauruhia Plesk Obsidian 18.0.27.
Me whakauru me te whirihora mo ta maatau kaupapa:
- PostgreSQL (i roto i ta maatau keehi, ka kotahi te tūmau me nga papaa raraunga e rua mo nga taiao dev me te prod).
- RabbitMQ (he rite, he tauira me nga vhosts rereke mo nga taiao).
- E rua nga tauira Redis (mo nga taiao dev me te whakaputa).
- Rehita Docker (mo te rokiroki a rohe o nga whakaahua Docker kua hangaia).
- UI mo te rehita Docker.
PostgreSQL
Kua tae mai a Plesk me te PostgreSQL DBMS, engari ehara i te putanga hou (i te wa e tuhi ana a Plesk Obsidian Putanga Postgres 8.4–10.8). Kei te pirangi matou ki te putanga hou mo ta maatau tono (12.3 i te wa o tenei tuhinga), na ka whakauruhia e matou ma te ringa.
Ngā tohutohu taipitopito mō te tāuta i ngā Postgres ki Debian he nui kei runga i te ipurangi (), no reira kare au e whakaahua taipitopito, ka hoatu noa e au nga whakahau:
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
Ki te whakaaro ko te PostgreSQL he iti noa nga tautuhinga taunoa, me whakatika te whirihoranga. Ka awhina tenei i a maatau : me peia e koe nga tawhā o to tūmau me te whakakapi i nga tautuhinga i roto i te konae /etc/postgresql/12/main/postgresql.confki te hunga e tapaea ana. Me tohuhia i konei ehara enei tatauranga i te matā makutu, a me tino tika ake te hanga o te turanga, i runga i to taputapu, tono, me te uaua o te patai. Engari he nui tenei hei timata.
I tua atu i nga tautuhinga i whakaarohia e te taatai, ka huri ano matou postgresql.confte tauranga taunoa 5432 ki tetahi atu (i ta maatau tauira - 53983).
I muri i te huri i te konae whirihoranga, whakaara ano i te postgresql-server me te whakahau:
service postgresql restart
Kua whakauruhia, kua whirihorahia e matou te PostgreSQL. Inaianei me hanga he patengi raraunga, nga kaiwhakamahi mo nga taiao dev me te whakaputanga, me te tuku mana ki nga kaiwhakamahi ki te whakahaere i te paataka raraunga:
$ 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
RabbitMQ
Me neke atu tātou ki te tāuta i a RabbitMQ, he kaihokohoko karere mō Celery. Kua tāutahia ki runga Debian He tino māmā noa iho:
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
I muri i te whakaurunga, me hanga e tatou vhosts, nga kaiwhakamahi me te tuku i nga mana tika:
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
Inaianei me whakauru me te whirihora i te waahanga whakamutunga mo ta maatau tono - Redis. Ka whakamahia hei tuara mo te penapena i nga hua o nga mahi herewi.
Ka whakaarahia e matou nga ipu Docker e rua me te Redis mo te dev me nga taiao prod ma te whakamahi i te toronga Docker mo Plesk.
- Ka haere matou ki Plesk, haere ki te waahanga Toronga, rapua te toronga Docker me te whakauru (me whai putanga kore utu):

- Haere ki te toronga kua whakauruhia, kimihia te ahua ma te rapu
redis bitnamika tāuta i te putanga hōu:
- Ka haere matou ki roto i te ipu kua tangohia ka whakatika i te whirihoranga: tohua te tauranga, te rahi o te rahinga RAM kua tohatohahia, te kupuhipa i roto i nga taurangi taiao, ka whakairihia te rōrahi:

- Ka mahia e matou nga waahanga 2-3 mo te ipu prod, i roto i nga tautuhinga ka huri noa i nga tawhā: te tauranga, te kupuhipa, te rahi o te RAM me te ara ki te kōpaki rōrahi i runga i te tūmau:

Rehita Docker
I tua atu i nga ratonga taketake, he pai ki te whakauru i a koe ake putunga whakaahua Docker ki runga i te tūmau. Waimarie, he iti noa te mokowā tūmau (he iti ake te utu i te ohaurunga DockerHub), a he tino ngawari te mahi ki te whakatu i tetahi putunga motuhake.
E hiahia ana matou ki te whai:
- Ko te putunga Docker kua tiakina e te kupuhipa ka uru ki runga rohe-roto ;
- UI mo te maataki i nga whakaahua kei roto i te putunga, kei te waatea i .
Hei mahi i tenei:
- Me hanga e rua nga roheroto i Plesk i roto i ta maatau ohaurunga: docker.helloworld.ru me docker-ui.helloworld.ru, me te whirihora i nga tiwhikete Kia Whakamuna ma ratou.
- Tāpirihia te konae ki te kōpaki roheroto docker.helloworld.ru
docker-compose.ymlme nga ihirangi penei: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' - I raro i te SSH, ka whakaputahia e matou te konae .htpasswd mo te whakamanatanga taketake i roto i te putunga Docker:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Kohikohi me te hiki ipu:
docker-compose up -d - A me huri ano a Nginx ki o tatou ipu. Ka taea tenei ma Plesk.
Ko nga mahi e whai ake nei me mahi mo te docker.helloworld.ru me te docker-ui.helloworld.ru subdomains:
wāhanga Utauta Taputapu haere to tatou pae ki Ture Takawaenga Docker:

Ka taapirihia he ture hei takawaenga i nga waka taumai ki ta maatau ipu:

- Ka tirohia e matou ka taea e matou te takiuru ki ta matou ipu mai i te miihini o te rohe:
$ 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 - Me tirohia ano te mahi o te docker-ui.helloworld.ru subdomain:

Ka paato koe ki te Tirotiro i nga whare pupuri, ka whakaatu te kaitirotiro i te matapihi whakamanatanga me whakauru koe i te ingoa kaiwhakamahi me te kupuhipa mo te putunga. I muri i tera, ka whakawhitia matou ki tetahi wharangi me te rarangi o nga putunga (mo tenei wa, ka noho kau mo koe):
Te whakatuwhera i nga tauranga i Plesk Firewall
I muri i te whakauru me te whirihora i nga waahanga, me whakatuwhera nga tauranga kia uru mai nga waahanga mai i nga ipu Docker me te whatunga o waho.
Kia kite tatou me pehea te mahi ma te whakamahi i te toronga Pātūahi mo Plesk i whakauruhia e matou i mua.
- Haere ki Utauta & Tautuhinga> Tautuhinga> Patuahi:

- Haere ki Whakarerekē Ture Pātūahi Plesk > Tāpiri Ture Ritenga ka whakatuwhera i nga tauranga TCP e whai ake nei mo te kupengaroto Docker (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
- Ka taapirihia he ture hei whakatuwhera i nga tauranga PostgreSQL me nga panui whakahaere RabbitMQ ki te ao o waho:

- Hoatu nga ture ma te whakamahi i te paatene Hoatu Huringa:

Te whakatu CI/CD ki nga Mahi a Github
Me heke ki te waahanga tino whakamere - te whakarite i te paipa whakauru tonu me te tuku i ta tatou kaupapa ki te tūmau.
E rua nga wahanga o tenei pipeline:
- te hanga whakaahua me te whakahaere i nga whakamatautau (mo te tuara) - kei te taha o Github;
- rere hekenga (mo te tuara) me te whakatakoto ipu - i runga i te tūmau.
Tukuna ki Plesk
Me mahi ki te take tuarua i te tuatahi (na te mea ka whakawhirinaki te tuatahi ki runga).
Ka whirihorahia e matou te mahinga tuku ma te whakamahi i te toronga Git mo Plesk.
Whakaarohia he tauira me te taiao Prod mo te putunga Putunga.
- Ka haere matou ki te ohaurunga o ta maatau paetukutuku a Helloworld ka haere ki te waahanga-iti o Git:

- Whakauruhia he hononga ki ta maatau putunga Github ki te mara "Remote Git repository" ka huri i te kōpaki taunoa
httpdocski tetahi atu (hei tauira./httpdocs/hw_back):
- Tāruatia te kī SSH Public mai i te taahiraa o mua me te kei roto i nga tautuhinga Github.
- Paatohia te OK i runga i te mata i te taahiraa 2, muri iho ka tukuna atu ki te wharangi putunga i Plesk. Inaianei me whirihora i te putunga kia whakahoutia i runga i nga mahi ki te peka matua. Ki te mahi i tenei, haere ki Tautuhinga Pupuri me te tiaki i te uara
Webhook URL(ka hiahia matou i muri mai i te wa e whakarite ana i nga Mahi a Github):
- I roto i te mara Hohenga i runga i te mata mai i te kowae o mua, whakauruhia te tuhinga hei whakarewa i te tukunga:
cd {REPOSITORY_ABSOLUTE_PATH} .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}kei hea:
{REPOSITORY_ABSOLUTE_PATH}- ara ki te kōpaki prod o te putunga o muri i runga i te tūmau;
{ENV}- taiao (dev / prod), i roto i to maatau takeprod;
{DOCKER_REGISTRY_HOST}- te kaihautu o ta matou putunga putunga
{TG_BOT_TOKEN}— Tohu karetao Telegram;
{TG_CHAT_ID}— ID o te korerorero / hongere mo te tuku whakamohiotanga.Tauira hōtuhi:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/ .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890 - Tāpirihia he kaiwhakamahi mai i ta maatau ohaurunga ki te roopu Docker (kia taea e ratou te whakahaere ipu):
sudo usermod -aG docker helloworld_admin
Ko te taiao dev mo te rehitatanga o muri me te pito o mua kua rite te whakarite.
Hoatuhia te paipa i roto i nga Hohenga Github
Me neke whakamua ki te whakatuu i te waahanga tuatahi o ta maatau paipa CI/CD i roto i nga Mahi a Github.
Tuhinga
Ko te pipeline e whakaahuatia ana i roto .
Engari i mua i te panui, me whakakiia nga taurangi ngaro e hiahiatia ana e tatou i Github. Ki te mahi i tenei, haere ki Tautuhinga -> Nga mea ngaro:
DOCKER_REGISTRY- te kaihautu o ta matou putunga Docker (docker.helloworld.ru);DOCKER_LOGIN- takiuru ki te putunga Docker;DOCKER_PASSWORD- kupuhipa ki reira;DEPLOY_HOST— kaihautu kei te waatea te roopu whakahaere Plesk (tauira: : 8443 ranei :8443);DEPLOY_BACK_PROD_TOKEN- he tohu mo te tuku ki te putunga prod-repository i runga i te tūmau (i whiwhi matou i te Deployment in Plesk p. 4);DEPLOY_BACK_DEV_TOKEN- tohu mo te tuku ki te putunga dev i runga i te tūmau.
He ngawari te tukanga tuku, e toru nga waahanga matua:
- te hanga me te whakaputa i te ahua ki roto i ta maatau putunga;
- te whakahaere i nga whakamatautau i roto i tetahi ipu i runga i te ahua hou i hangaia;
- te tuku ki te taiao e hiahiatia ana i runga i te peka (dev/master).
frontend
He rereke te rereke mai i a Beck. Karekau he taahiraa ki te whakahaere i nga whakamatautau me te whakarereke i nga ingoa o nga tohu mo te tuku. Ko nga mea ngaro mo te rehitatanga o mua, na te ara, me whakakii motuhake.
Tatūnga pae
Te takawaenga waka ma Nginx
Kaati, kua tae tatou ki te mutunga. Ka noho tonu ki te whirihora i te takawaenga o nga waka taumai me te puta atu ki ta maatau ipu ma Nginx. Kua hipokina e matou tenei tukanga i te taahiraa 5 o te tatūnga Rehita Docker. Me whakahoki ano mo nga waahanga o muri me o mua i roto i nga taiao dev me te prod.
Ka hoatu e ahau nga whakaahua o nga tautuhinga.
Tuhinga

frontend

Tuhinga o mua. Ka tukuna nga URL katoa ki te ipu o mua, haunga era ka timata mai /api/ - ka tukuna ki te ipu o muri (na i roto i te ipu o muri, me timata nga kaikawe katoa /api/).
Ngā putanga
Inaianei kei te waatea to maatau pae ki helloworld.ru me dev.helloworld.ru (prod- me dev-taiao, ia).
I te katoa, i ako matou me pehea te whakarite i tetahi tono ngawari i roto i te Flask me te Angular me te whakarite i tetahi paipa i roto i nga Mahi a Github hei huri atu ki tetahi tūmau e whakahaere ana i a Plesk.
Ka tāruahia e ahau nga hononga ki nga whare pupuri me te waehere: , .
Source: will.com
