
Tässä artikkelissa jaan kokemukseni CI/CD:n määrittämisestä Plesk Control Panelin ja Github Actionsin avulla. Tänään opimme ottamaan käyttöön yksinkertaisen projektin yksinkertaisella nimellä "Helloworld". Se on kirjoitettu Flask Python -kehyksessä Celery työntekijöiden ja Angular 8 -käyttöliittymän kanssa.
Linkkejä arkistoihin: , .
Artikkelin ensimmäisessä osassa tarkastellaan projektiamme ja sen osia. Toisessa selvitämme, kuinka Plesk määritetään ja tarvittavat laajennukset ja komponentit asennetaan (DB, RabbitMQ, Redis, Docker jne.).
Kolmannessa osassa selvitämme vihdoin, kuinka luodaan putki projektimme käyttöönottamiseksi palvelimelle kehitys- ja tuotantoympäristössä. Ja sitten käynnistämme sivuston palvelimella.
Ja kyllä, unohdin esitellä itseni. Nimeni on Oleg Borzov, olen täysi-kehittäjä Domclickin asuntolainajohtajien CRM-tiimissä.
Hankkeen yleiskatsaus
Tarkastellaan ensin kahta projektivarastoa - tausta- ja etuosa - ja käydään läpi koodi.
Taustaosa: Flask+Sellery
Takaosaan otin joukon, joka on melko suosittu Python-kehittäjien keskuudessa: Flask-kehyksen (API) ja Selery (tehtäväjonoa varten). SQLAchemyä käytetään ORM:na. Alembiciä käytetään muuttoihin. JSON-vahvistukseen kahvoissa - Marshmallow.
В siellä on Readme.md-tiedosto, jossa on yksityiskohtainen kuvaus projektin rakenteesta ja ohjeet projektin suorittamiseen.
melko mutkaton, koostuu 6 kynästä:
/ping- tarkistaa saatavuuden;- käsittelee rekisteröintiä, valtuutusta, valtuutuksen poistamista ja valtuutetun käyttäjän hankkimista;
- sähköpostikahva, joka asettaa tehtävän Selleri-jonoon.
vielä helpompaa, on vain yksi ongelma send_mail_task.
Kansiossa on kaksi alikansiota:
dockerkahdella Docker-tiedostolla (base.dockerfilerakentaa harvoin muuttuva peruskuva jaDockerfilepääkokoonpanoille);.env_files- tiedostoilla, joissa on ympäristömuuttujia eri ympäristöille.
Projektin ytimessä on neljä Docker-kirjoitustiedostoa:
docker-compose.local.db.ymlkehittää paikallinen tietokanta;docker-compose.local.workers.ymltyöntekijän paikalliseen kasvattamiseen, tietokanta, Redis ja RabbitMQ;docker-compose.test.ymlsuorittaa testejä käyttöönoton aikana;docker-compose.ymlkäyttöönottoa varten.
Ja viimeinen kansio, josta olemme kiinnostuneita - . Se sisältää shell-skriptit käyttöönottoa varten:
deploy.sh— Siirron ja käyttöönoton käynnistäminen. Toimii palvelimella Github Actionsin testien luomisen ja suorittamisen jälkeen;rollback.sh- säiliöiden palautus kokoonpanon edelliseen versioon;curl_tg.sh- käyttöönottoilmoitusten lähettäminen Telegramille.
Etuosa Angularissa
paljon yksinkertaisempi kuin Beckin. Etupuoli koostuu kolmesta sivusta:
- Pääsivu, jossa on sähköpostin lähetyslomake ja poistumispainike.
- Sisäänkirjautumissivu.
- Rekisteröintisivu.
Pääsivu näyttää askeettiselta:

Jutussa on kaksi tiedostoa Dockerfile и docker-compose.yml, sekä tuttu kansio .ci-cd hieman vähemmän komentosarjoja kuin takavarastossa (poistettu komentosarjat testien suorittamista varten).
Projektin aloittaminen Pleskissä
Aloitetaan perustamalla Plesk ja luomalla tilaus sivustollemme.
Laajennusten asentaminen
Pleskissä tarvitsemme neljä laajennusta:
Dockerhallita ja näyttää visuaalisesti säilöjen tilaa Plesk-hallintapaneelissa;Gitkäyttöönottovaiheen määrittäminen palvelimella;Let's Encryptluoda (ja uusia) ilmaisia TLS-varmenteita;Firewallmäärittääksesi saapuvan liikenteen suodatuksen.
Voit asentaa ne Plesk-hallintapaneelin kautta Laajennukset-osiossa:

Emme ota huomioon laajennusten yksityiskohtaisia asetuksia, oletusasetukset käyvät esittelytarkoituksiin.
Luo tilaus ja sivusto
Seuraavaksi meidän on luotava tilaus helloworld.ru-verkkosivustollemme ja lisättävä sinne dev.helloworld.ru-aliverkkotunnus.
- Luo tilaus helloworld.ru-verkkotunnukselle ja määritä järjestelmän käyttäjän kirjautumissalasana:

Valitse sivun alareunassa oleva valintaruutu Suojaa verkkotunnus Let's Encryptilläjos haluamme määrittää HTTPS:n sivustolle:
- Luo seuraavaksi tässä tilauksessa aliverkkotunnus dev.helloworld.ru (jolle voit myös myöntää ilmaisen TLS-varmenteen):

Palvelinkomponenttien asentaminen
Meillä on palvelin OS Debian Venytys 9.12 ja asennettu ohjauspaneeli Pleskin obsidiaani 18.0.27.
Meidän on asennettava ja määritettävä projektiamme:
- PostgreSQL (tapauksessamme on yksi palvelin, jossa on kaksi tietokantaa dev- ja prod-ympäristöille).
- RabbitMQ (sama, sama ilmentymä eri vhostilla ympäristöille).
- Kaksi Redis-instanssia (kehittäjä- ja tuotantoympäristöille).
- Docker-rekisteri (rakennettujen Docker-kuvien paikalliseen tallentamiseen).
- Docker-rekisterin käyttöliittymä.
PostgreSQL
Plesk sisältää jo PostgreSQL DBMS:n, mutta ei uusinta versiota (kirjoitushetkellä Plesk Obsidian Postgres-versiot 8.4–10.8). Haluamme sovelluksellemme uusimman version (12.3 tätä kirjoitettaessa), joten asennamme sen manuaalisesti.
Tarkat ohjeet Postgresin asentamiseen Debian sitä on paljon internetissä (), joten en kuvaa niitä yksityiskohtaisesti, annan vain komennot:
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
Koska PostgreSQL:llä on melko keskinkertaiset oletusasetukset, on välttämätöntä säätää kokoonpanoa. Tämä auttaa meitä : sinun on syötettävä palvelimesi parametrit ja vaihdettava tiedoston asetukset /etc/postgresql/12/main/postgresql.conftarjotuille. Tässä on syytä huomata, että tällaiset laskimet eivät ole taikaluoteja, ja pohja tulisi virittää tarkemmin laitteistosi, sovelluksesi ja kyselysi monimutkaisuuden perusteella. Mutta tämä riittää aloittamiseen.
Muutamme myös laskimen ehdottamien asetusten lisäksi postgresql.confoletusportti 5432 toiseen (esimerkissämme - 53983).
Kun olet vaihtanut asetustiedoston, käynnistä postgresql-server uudelleen komennolla:
service postgresql restart
Olemme asentaneet ja määrittäneet PostgreSQL:n. Luodaan nyt tietokanta, käyttäjät dev- ja prod-ympäristöihin ja annamme käyttäjille oikeudet hallita tietokantaa:
$ 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
Siirrytäänpä asentamaan RabbitMQ, Celerylle tarkoitettu viestivälitystyökalu. Se on asennettuna Debian Se on melko yksinkertaista:
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
Asennuksen jälkeen meidän on luotava vhosts, käyttäjiä ja myönnä tarvittavat oikeudet:
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
Asennamme ja määritetään nyt sovelluksemme viimeinen komponentti - Redis. Sitä käytetään taustaohjelmana selleritehtävien tulosten tallentamiseen.
Nostamme kaksi Docker-konttia Rediksen kanssa kehitys- ja tuotantoympäristöihin laajennuksen avulla Docker Pleskille.
- Menemme Pleskiin, siirrymme Laajennukset-osioon, etsimme Docker-laajennuksen ja asennamme sen (tarvitsemme ilmaisen version):

- Siirry asennettuun laajennukseen, etsi kuva haun kautta
redis bitnamija asenna uusin versio:
- Siirrymme ladattuihin säilöön ja säädämme kokoonpanoa: määritä portti, suurin varattu RAM-koko, salasana ympäristömuuttujissa ja asenna asema:

- Suoritamme vaiheet 2-3 prod-säiliölle, asetuksissa muutamme vain parametreja: portti, salasana, RAM-muistin koko ja polku palvelimen taltiokansioon:

Docker-rekisteri
Peruspalvelujen lisäksi olisi kiva laittaa oma Docker-kuvavarasto palvelimelle. Onneksi palvelintila on nyt melko halpaa (varmasti halvempaa kuin DockerHub-tilaus), ja yksityisen tietovaraston perustaminen on hyvin yksinkertaista.
Haluamme saada:
- salasanalla suojattu Docker-arkisto, joka on käytettävissä aliverkkotunnuksessa ;
- Käyttöliittymä kuvien katseluun arkistossa, saatavilla osoitteessa .
Voit tehdä tämän seuraavasti:
- Luodaan kaksi aliverkkotunnusta Pleskiin tilauksessamme: docker.helloworld.ru ja docker-ui.helloworld.ru ja määritetään Let's Encrypt -varmenteet niille.
- Lisää tiedosto docker.helloworld.ru-aliverkkotunnuskansioon
docker-compose.ymltällaisella sisällöllä: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:ssa luomme .htpasswd-tiedoston perusvaltuutusta varten Docker-tietovarastoon:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password - Kerää ja nosta kontit:
docker-compose up -d - Ja meidän on ohjattava Nginx konttiihimme. Tämä voidaan tehdä Pleskin kautta.
Seuraavat vaiheet on suoritettava docker.helloworld.ru- ja docker-ui.helloworld.ru-aliverkkotunnuksille:
Luokasta Kehitystyökalut sivumme mene osoitteeseen Dockerin välityspalvelimen säännöt:

Ja lisää sääntö saapuvan liikenteen välityspalvelimelle säilöimme:

- Tarkistamme, että voimme kirjautua konttiimme paikalliselta koneelta:
$ 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 - Tarkastetaan myös docker-ui.helloworld.ru-aliverkkotunnuksen toiminta:

Kun napsautat Selaa tietovarastoja, selain näyttää valtuutusikkunan, jossa sinun on syötettävä arkiston käyttäjätunnus ja salasana. Sen jälkeen meidät siirretään sivulle, jossa on luettelo arkistoista (toistaiseksi se on sinulle tyhjä):
Porttien avaaminen Plesk Firewallissa
Kun komponentit on asennettu ja määritetty, meidän on avattava portit, jotta komponentit ovat käytettävissä Docker-säiliöistä ja ulkoisesta verkosta.
Katsotaanpa, kuinka tämä tehdään käyttämällä aiemmin asentamaamme Pleskin palomuurilaajennusta.
- Mene Työkalut ja asetukset > Asetukset > Palomuuri:

- Mene Muokkaa Plesk-palomuurisääntöjä > Lisää mukautettu sääntö ja avaa seuraavat Docker-aliverkon TCP-portit (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
- Lisäämme myös säännön, joka avaa PostgreSQL-portit ja RabbitMQ-hallintapaneelit ulkomaailmalle:

- Ota sääntöjä käyttöön Käytä muutokset -painikkeella:

CI/CD:n määrittäminen Github Actionsissa
Siirrytään mielenkiintoisimpaan osaan - jatkuvan integraatioputken perustamiseen ja projektimme toimittamiseen palvelimelle.
Tämä putki koostuu kahdesta osasta:
- kuvan luominen ja testien suorittaminen (taustajärjestelmälle) - Githubin puolella;
- siirtojen suorittaminen (taustajärjestelmälle) ja säiliöiden käyttöönotto - palvelimella.
Ota käyttöön Pleskiin
Käsitellään ensin toista kohtaa (koska ensimmäinen riippuu siitä).
Määritämme käyttöönottoprosessin Pleskin Git-laajennuksella.
Harkitse esimerkkiä taustatietovaraston Prod-ympäristöstä.
- Siirrymme Helloworld-verkkosivustomme tilaukseen ja siirrymme Git-alaosioon:

- Lisää linkki Github-tietovarastoon "Remote Git repository" -kenttään ja vaihda oletuskansio
httpdocstoiselle (esim./httpdocs/hw_back):
- Kopioi julkinen SSH-avain edellisestä vaiheesta ja se on Githubin asetuksissa.
- Napsauta OK näytöllä vaiheessa 2, minkä jälkeen meidät ohjataan Pleskin arkistosivulle. Nyt meidän on määritettävä arkisto päivitettäväksi päähaaratoimituksissa. Voit tehdä tämän siirtymällä osoitteeseen Arkiston asetukset ja tallenna arvo
Webhook URL(Tarvitsemme sitä myöhemmin, kun määrität Github Actionsin):
- Kirjoita edellisen kappaleen näytön Toiminnot-kenttään komentosarja käynnistääksesi käyttöönoton:
cd {REPOSITORY_ABSOLUTE_PATH} .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}jos:
{REPOSITORY_ABSOLUTE_PATH}- polku palvelimen taustatietovaraston prod-kansioon;
{ENV}- ympäristö (dev / prod), meidän tapauksessammeprod;
{DOCKER_REGISTRY_HOST}- telakointivarastomme isäntä
{TG_BOT_TOKEN}— Telegram-bot-tunnus;
{TG_CHAT_ID}— Chatin/kanavan tunnus ilmoitusten lähettämistä varten.Esimerkki skriptistä:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/ .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890 - Lisää käyttäjä tilauksestamme Docker-ryhmään (jotta hän voi hallita säilöjä):
sudo usermod -aG docker helloworld_admin
Taustavaraston ja käyttöliittymän kehittäjäympäristö määritetään samalla tavalla.
Käyttöönottoputki Github Actionsissa
Siirrytään CI/CD-putken ensimmäisen osan määrittämiseen Github Actionsissa.
taustaosa
Putkilinja on kuvattu kohdassa .
Mutta ennen sen jäsentämistä, täytämme salaiset muuttujat, joita tarvitsemme Githubissa. Voit tehdä tämän siirtymällä osoitteeseen Asetukset -> Salaisuudet:
DOCKER_REGISTRY- Docker-arkistomme isäntä (docker.helloworld.ru);DOCKER_LOGIN- kirjaudu sisään Docker-arkistoon;DOCKER_PASSWORD- salasana siihen;DEPLOY_HOST- isäntä, jossa Plesk-hallintapaneeli on käytettävissä (esimerkki: : 8443 tai :8443);DEPLOY_BACK_PROD_TOKEN- Token käyttöönottoa varten palvelimella olevaan prod-varastoon (saimme sen Pleskin käyttöönotossa s. 4);DEPLOY_BACK_DEV_TOKEN- tunnus palvelimen kehittäjävarastoon käyttöön ottamista varten.
Käyttöönottoprosessi on yksinkertainen ja koostuu kolmesta päävaiheesta:
- kuvan rakentaminen ja julkaiseminen arkistossamme;
- testien suorittaminen säilössä, joka perustuu juuri rakennettuun kuvaan;
- käyttöönotto haluttuun ympäristöön haarasta riippuen (dev/master).
Frontend
hieman erilainen kuin Beckin. Siitä puuttuu vaihe testien suorittamiseksi ja se muuttaa käyttöönoton tokenien nimet. Etuvaraston salaisuudet on muuten täytettävä erikseen.
Sivuston määritys
Välityspalvelinliikenne Nginxin kautta
No, olemme tulleet loppuun. On vain määritettävä saapuvan ja lähtevän liikenteen välityspalvelin konttiin Nginxin kautta. Olemme jo käsitelleet tämän prosessin Dockerin rekisterin asennuksen vaiheessa 5. Sama tulee toistaa taka- ja etuosille kehitys- ja tuoteympäristöissä.
Annan kuvakaappauksia asetuksista.
taustaosa

Frontend

Tärkeä selvennys. Kaikki URL-osoitteet välitetään käyttöliittymäsäilölle, paitsi ne, jotka alkavat /api/ - ne välitetään takakonttiin (niin takasäiliössä kaikkien käsittelijöiden on aloitettava /api/).
Tulokset
Nyt sivustomme pitäisi olla saatavilla osoitteessa helloworld.ru ja dev.helloworld.ru (tuote- ja dev-ympäristöt, vastaavasti).
Kaiken kaikkiaan opimme valmistelemaan yksinkertaisen sovelluksen Flaskissa ja Angularissa ja määrittämään Github Actionsissa putkilinjan, jolla se julkaistaan Plesk-palvelimelle.
Kopioin linkit arkistoihin koodilla: , .
Lähde: will.com
