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.
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.
В arkistot siellä on Readme.md-tiedosto, jossa on yksityiskohtainen kuvaus projektin rakenteesta ja ohjeet projektin suorittamiseen.
Varasto edessä 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:
Docker hallita ja näyttää visuaalisesti säilöjen tilaa Plesk-hallintapaneelissa;
Plesk sisältää jo PostgreSQL DBMS:n, mutta ei uusinta versiota (kirjoitushetkellä Plesk Obsidian tuettu Postgres-versiot 8.4–10.8). Haluamme sovelluksellemme uusimman version (12.3 tätä kirjoitettaessa), joten asennamme sen manuaalisesti.
Verkossa on paljon yksityiskohtaisia ohjeita Postgresin asentamiseen Debianiin (esimerkki), joten en kuvaa niitä yksityiskohtaisesti, annan vain komennot:
Koska PostgreSQL:llä on melko keskinkertaiset oletusasetukset, on välttämätöntä säätää kokoonpanoa. Tämä auttaa meitä laskin: 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
Jatketaan RabbitMQ:n, Seleryn viestivälittäjän, asentamiseen. Sen asentaminen Debianiin on melko yksinkertaista:
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 bitnami ja 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.
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.yml tällaisella sisällöllä:
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ä).
Siirrymme Helloworld-verkkosivustomme tilaukseen ja siirrymme Git-alaosioon:
Lisää linkki Github-tietovarastoon "Remote Git repository" -kenttään ja vaihda oletuskansio httpdocs toiselle (esim. /httpdocs/hw_back):
Kopioi julkinen SSH-avain edellisestä vaiheesta ja lisäämällä 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 tapauksessamme prod; {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.
Mutta ennen sen jäsentämistä, täytämme salaiset muuttujat, joita tarvitsemme Githubissa. Voit tehdä tämän siirtymällä osoitteeseen Asetukset -> Salaisuudet:
DEPLOY_HOST - isäntä, jossa Plesk-hallintapaneeli on käytettävissä (esimerkki: helloworld.com: 8443 tai 123.4.56.78: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
Etuvaraston deploy.yml-tiedosto 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.