
Selles artiklis jagan oma kogemusi CI/CD seadistamisest Plesk'i juhtpaneeli ja Github Actions'i abil. TÀna Ôpime, kuidas rakendada lihtsat projekti nimega "Helloworld", mis on kirjutatud Python'i raamistiku Flask abil, Celery töötluse ja Angular 8 esipaneeliga.
Aadressid hoidlatele: , .
Artikli esimeses osas vaatame meie projekti ja selle komponente. Teises osas uurime, kuidas seadistada Plesk ja installida vajalikud laiendused ja komponendid (andmebaas, RabbitMQ, Redis, Docker jne).
Kolmandas osas uurime, kuidas seadistada tööprotsess meie projekti juurutamiseks serverisse arendus- ja tootmisvahendites. SeejÀrel kÀivitame veebilehe serveris.
Ja jah, unustasin tutvustada. Minu nimi on Oleg Borzov, olen tÀisvirna arendaja CRM meeskonnas, mis tegeleb kodulaenude halduritega Domklik'is.
Projekti ĂŒlevaade
Alustame kahe projekti hoidla â tagumise ja esipaneeli â uurimisest ja vaatame koodi.
Tagaplaan: Flask+Celery
Tagumise osa jaoks valisin piisavalt populaarse kombinatsiooni Python'i arendajate seas: raamistik Flask (API jaoks) ja Celery (ĂŒlesannete jĂ€rjekorra jaoks). ORM-ina kasutatakse SQLAlchemy't. Migratsioonide jaoks kasutatakse Alembic'ut. JSON-i valideerimiseks manipulatsioonides kasutatakse Marshmallow't.
Uues on olemas fail Readme.md, mis sisaldab ĂŒksikasjalikku kirjeldust struktuurist ja projekti kĂ€ivitamise juhiseid.
on piisavalt lihtne, koosneb kuuest lÔpp-punktist:
/pingâ kĂ€ttesaadavuse kontrollimiseks;- lĂ”pp-punktid registreerimiseks, autoriseerimiseks, deauthoriseerimiseks ja autoriseeritud kasutaja saamiseks;
- lĂ”pp-punkt e-kirja saatmiseks, mis lisab ĂŒlesande Celery jĂ€rjekorda.
on veel lihtsam, seal on ainult ĂŒks ĂŒlesanne send_mail_task.
Kaustas on kaks alamkausta:
dockerkahe Docker-failiga (base.dockerfileharva muudetava pĂ”hifoto kogumise jaoks jaDockerfilepeamiste kogumite jaoks);.env_filesâ failide komplektid keskkonnamuutujate jaoks erinevates keskkondades.
Projekti juures on neli docker-compose faili:
docker-compose.local.db.ymlkohaliku andmebaasi seadistamiseks arenduseks;docker-compose.local.workers.ymlkohaliku töötluse, andmebaasi, Redis'i ja RabbitMQ ĂŒles tĂ”stmiseks;docker-compose.test.ymltestide lĂ€biviimiseks paigaldamisel;docker-compose.ymljuurutamiseks.
Ja viimane huvitav kaust, Sisaldab ĂŒlekande shell-skripte:
deploy.shâ migratsioonide ja juurutamise kĂ€ivitamiseks. KĂ€ivitatakse serveris pĂ€rast kogumist ja testide lĂ€biviimist Github Actions'is;rollback.shâ konteinerite tagasiviimine eelmisse versiooncurl_tg.shâ teavituste saatmine Telegrami kĂ€ivitamise kohta.
Frontend Angularil
on mĂ€rksa lihtsam kui backend. Frontend koosneb kolmest lehekĂŒljest:
- Pealehe, kus on e-posti saatmise vorm ja vÀljumise nupp.
- Sisestamise leht.
- Registreerimise leht.
Pealeht on tagasihoidlik:

Juurdes on kaks faili Dockerfile ja docker-compose.yml, samuti tuttav kaust .ci-cd mÔnevÔrra vÀhem skripte kui backend'i hoidlas (testide kÀivitamise skriptid on eemaldatud).
Loome projekti Pleskis
Alustame Pleski seadistamisega ja tellimuse loomisega meie saidile.
Lisandmoodulite installimine
Pleskis vajame nelja lisandmoodulit:
Dockerkonteinerite haldamiseks ja nende oleku visuaalseks kuvamiseks Pleski administraatoris;Gitserveri juurutamise etapi seadistamiseks;Let's Encrypttasuta TLS-sertifikaatide genereerimiseks (ja automaatseks pikendamiseks);Tulekahjusissetuleva liikluse filtreerimise seadistamiseks.
Saame need installida Pleski administraatoris, vaates Extensions:

Detailset seadistust me ei kÀsitle, meie demoteks sobivad vaikesÀtet.
Tellimuse ja saidi loomine
SeejÀrel peame looma tellimuse meie saidile helloworld.ru ja lisama sinna alldomeeni dev.helloworld.ru.
- Loome tellimuse domeenile helloworld.ru ja mÀÀrame sĂŒsteemi kasutaja sisselogimise ja parooli:

Lehe allosas paneme linnukese Secure the domain with Letâs Encrypt, kui soovime seadistada saidile HTTPS:
- SeejÀrel loome selles tellimuses alldomeeni dev.helloworld.ru (millele saab samuti vÀlja anda tasuta TLS-sertifikaadi):

Serverikomponentide installimine
Meil on olemas server, millel OS Debian Stretch 9.12 ja paigaldatud juhtimispaneel Plesk Obsidian 18.0.27.
Peame installima ja seadistama oma projekti jaoks:
- PostgreSQL (meie puhul on ĂŒks server kahe andmebaasiga dev- ja prod-keskkondade jaoks).
- RabbitMQ (sama, ĂŒks instants erinevate vhost'idega keskkondade jaoks).
- Kaks Redis'i instantsi (dev- ja prod-keskkondade jaoks).
- Docker Registry (kogutud Docker-piltide kohaliku salvestamise jaoks).
- Docker registry UI-liides.
PostgreSQL
Pleskiga kaasneb juba PostgreSQL andmebaas, kuid mitte kĂ”ige uuema versiooniga (artikli kirjutamise ajal toetas Plesk Obsidian Postgres versioonid 8.4â10.8). Meie soovime oma rakendusele kĂ”ige uuemat versiooni (12.3 artikli kirjutamise ajal), seega installime selle kĂ€sitsi.
Interneti on palju ĂŒksikasjalikke juhiseid Postgresi installimiseks Debianile (), seega ei hakka ma neid ĂŒksikasjalikult kirjeldama, lihtsalt toon vĂ€lja kĂ€sud:
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
Arvestades, et PostgreSQL-i vaikeseaded on piisavalt keskpÀrased, tuleb konfiguratsiooni kindlasti kohandada. Sellega aitab meid : peate sisestama oma serveri parameetrid ja muutma seadeid failis /etc/postgresql/12/main/postgresql.confpakutud vÀÀrtustega. Siinkohal tasub mÀrkida, et sellised kalkulaatorid ei ole maagilised lahendused ning andmebaasi tuleks tÀpsemalt hÀÀlestada, lÀhtudes teie riistvarast, rakendusest ja pÀringute keerukusest. Kuid selleks, et alustada, on see piisav.
Lisaks kalkulaatori pakutud seadetele muudame postgresql.confvaikimisi pordi 5432 teiseks (meie nĂ€ites â 53983).
PÀrast konfiguratsioonifaili muutmist taaskÀivitame postgresql-serveri kÀsuga:
service postgresql restart
Oleme installinud ja seadistanud PostgreSQL-i. NĂŒĂŒd loome andmebaasid, kasutajad dev- ja prod-keskkondade jaoks ning anname kasutajatele Ă”igused andmebaaside haldamiseks:
$ 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
Liigume RabbitMQ installimise juurde â sĂ”numite edastaja Celery jaoks. Seda on Debianile piisavalt lihtne installida:
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
PÀrast installimist peame looma vhosts, kasutajad ja andma vajalikud Ôigused:
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
NĂŒĂŒd installime ja seadistame meie rakenduse viimase koostisosade â Redis. Seda kasutatakse bakenina Celery ĂŒlesannete tulemuste salvestamiseks.
Me tĂ”stame kaks Docker-konteinerit Redis ĂŒles dev- ja prod-keskkondade jaoks laienduse abil Docker Pleskile.
- Siseneme Pleski, lÀheme laienduste jaotisse, otsime Docker laiendust ja installime selle (me vajame tasuta versiooni):

- LĂ€heme installitud laiendusse, leiame pildi otsingu kaudu
redis bitnamija paigaldame viimase versiooni:
- Siseneme alla laaditud konteinerisse ja kohandame konfiguratsiooni: mÀÀrame pordi, maksimaalse eraldatud RAM-i suuruse, parooli keskkonnamuutujates ja montime mahu:

- Kordame samme 2-3 prod-konteineri jaoks, muutes ainult seadistusi: port, parool, RAM-i suurus ja faili tee serveris:

Docker Registry
Lisaks pÔhiteenustele oleks tore serverisse paigaldada oma Docker-piltide repositoorium. TÀnapÀeval on serverites koht piisavalt odav (kindlasti odavam kui DockerHub'i tellimus) ja privaatse repositooriumi paigaldamine on vÀga lihtne.
Me tahame, et meil oleks installitud:
- parooliga kaitstud Docker-repositoorium, millele pÀÀseb juurde alamdomeeni kaudu ;
- Kasutajaliides piltide vaatamiseks repositooriumis, saadaval aadressil .
Selleks:
- Loome Pleskis kaks alamdomeeni meie tellimuses: docker.helloworld.ru ja docker-ui.helloworld.ru, ning seadistame nende jaoks Letâs Encrypt sertifikaadid.
- Alamdomeeni docker.helloworld.ru kausta lisame faili
docker-compose.ymlsellise sisuga: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' - SSH kaudu genereerime faili .htpasswd Docker-repositooriumi Basic-autoriseerimise jaoks:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Kogume ja tĂ”stame konteinerid ĂŒles:
Vaatame lihtsat nÀidet. - Ja peame suunama Nginxi meie konteineritele. Seda saab teha Pleski kaudu.
JÀrgmiseks tuleb teostada jÀrgmised toimingud alamdomeenidel docker.helloworld.ru ja docker-ui.helloworld.ru:
Jaotises Dev Tools siseneme meie saidile Docker Proxy Rules:

Ja lisame reegli sissetuleva liikluse suunamiseks meie konteinerisse:

- Kontrollime, et saaksime oma konteinerisse autentida kohalikust masinast:
$ 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 - Samuti kontrollime alamdomeeni docker-ui.helloworld.ru tööd.

Kui vajutate nuppu Browse repositories, avab brauser autentimise akna, kuhu tuleb sisestada kasutajanimi ja parool repole. PĂ€rast seda suunatakse meid repo nimekirja lehele (praegu on see tĂŒhi):
Avame pordid Plesk Firewallis.
PÀrast komponentide installimist ja seadistamist peame avama pordid, et need oleksid Docker-konteineritest ja vÀlisest vÔrgust ligipÀÀsetavad.
Vaadakem, kuidas seda teha, vÔttes nÀiteks varem installitud Firewall laiendust Pleskile.
- Liigume Tools & Settings > Settings > Firewall:

- Liigume Muuda Plesk Firewall reegleid > Lisa kohandatud reegel ja avame jĂ€rgmised TCP-pordid Docker alamsĂŒsteemi jaoks (172.0.0.0/8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
- Lisame ka reegli, mis avab vÀlist maailma PostgreSQL ja RabbitMQ haldustööriistaribade pordid:

- Rakendame reeglid nuppu Apply Changes abi.

CI/CD seadistamine Github Actionsis
Alustame kĂ”ige huvitavama osaga â meie projekti pideva integreerimise ja kohaletoimetamise toru seadistamisega serverisse.
See toru koosneb kahest osast:
- pildi koostamine ja testide lĂ€biviimine (tagapinnal) â Githubis;
- rĂ€nde kĂ€itamine (tagapinnal) ja konteinerite deploy â serveris.
Deploy Pleskis
Hakkame esmalt tegelema teise punktiga (sest see sÔltub esimesest).
Seadistame deploy Protsessi Pleski Git laienduse abil.
Vaatame nÀidet Prod keskkonna kohta tagapinna repole.
- Logime sisse meie saidi Helloworld tellimusse ja liigume Git alasperesse:

- Kopeerime vÀljal "Remote Git repository" link meie Github repository ja muutame vaikimisi kausta
httpdocsteiseks (nÀiteks,/httpdocs/hw_back):
- Kopeerime SSH avaliku vÔtme eelmisest etapist ja selle Githubi seadetes.
- Klikkame OK ekraanil punktis 2, seejĂ€rel suunatakse meid Pleski repo lehele. NĂŒĂŒd peame seadistama repo uuendamise, kui teeme master haru commite. Selleks liigume Repository Settings ja salvestame vÀÀrtuse
Webhook URL(me vajame seda hiljem Github Actionsi seadistamisel):
- Eelneva ekraani Actions vÀljal sisestame skripti deploy kÀivitamiseks:
cd {REPOSITORY_ABSOLUTE_PATH} .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}kus:
{REPOSITORY_ABSOLUTE_PATH}â tee prod tagapinna repo kausta serveris;
{ENV}â keskkond (dev/prod), meie puhulprod;
{DOCKER_REGISTRY_HOST}â meie docker repo host
{TG_BOT_TOKEN}â Telegrami boti token;
{TG_CHAT_ID}â Chat/channel ID for sending notifications.Script example:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/ .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890 - Adding a user from our subscription to the Docker group (so they can manage containers):
sudo usermod -aG docker helloworld_admin
The development environment for the backend repository and frontend is configured similarly.
Deployment pipeline in Github Actions
We proceed to configure the first part of our CI/CD pipeline in Github Actions.
Backend
The pipeline is described in .
But before we examine it, let's fill in the necessary Secret variables in Github. For that, go to Settings -> Secrets:
DOCKER_REGISTRYâ the host of our Docker repository (docker.helloworld.ru);DOCKER_LOGINâ login to the Docker repository;DOCKER_PASSWORDâ password for it;DEPLOY_HOSTâ the host where the Plesk admin panel is accessible (example: :8443 or :8443);DEPLOY_BACK_PROD_TOKENâ token for deployment to the prod repository on the server (we obtained it in Deployment in Plesk p. 4);DEPLOY_BACK_DEV_TOKENâ token for deployment to the dev repository on the server.
The deployment process is simple and consists of three main steps:
- building and publishing the image in our repository;
- running tests in a container based on the freshly built image;
- deployment to the desired environment depending on the branch (dev/master).
Frontend
does not differ much from the backend one. It lacks the step to run tests and changes the names of the tokens for deployment. Secrets for the frontend repository, by the way, need to be filled in separately.
Site Configuration
Traffic proxying through Nginx
Well, we have reached the end. We just need to configure the proxying of incoming and outgoing traffic to our container via Nginx. We already covered this process in step 5 of Docker Registry setup. The same needs to be repeated for the backend and frontend parts in dev and prod environments.
I will provide screenshots of the settings.
Backend

Frontend

Important clarification. All URLs except those starting with will be proxied to the frontend container, /api/ â they will be proxied to the backend container (therefore, in the backend container, all handlers must start with /api/).
Summary
Now our site should be accessible at helloworld.ru and dev.helloworld.ru (prod and dev environments respectively).
In summary, we learned how to prepare a simple application using Flask and Angular, and set up a pipeline in Github Actions for its deployment to a server managed by Plesk.
I will duplicate the links to the repositories with the code: , .
Allikas: habr.com
















