CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
ื‘ืžืืžืจ ื–ื” ืืฉืชืฃ ืืช ื”ื—ื•ื•ื™ื” ืฉืœื™ ื‘ื”ื’ื“ืจืช CI/CD ื‘ืืžืฆืขื•ืช ืœื•ื— ื”ื‘ืงืจื” ืฉืœ Plesk ื•ืคืขื•ืœื•ืช Github. ื”ื™ื•ื ื ืœืžื“ ืื™ืš ืœืคืจื•ืก ืคืจื•ื™ืงื˜ ืคืฉื•ื˜ ืขื ื”ืฉื ื”ืœื ืžืกื•ื‘ืš "Helloworld". ื”ื•ื ื›ืชื•ื‘ ื‘ืžืกื’ืจืช Flask Python, ืขื ืขื•ื‘ื“ื™ ืกืœืจื™ ื•ื—ื–ื™ืช Angular 8.

ืงื™ืฉื•ืจื™ื ืœืžืื’ืจื™ื: ืื—ื•ืจื™, ื—ื–ื™ืชื™.

ื‘ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื”ืžืืžืจ, ื ื‘ื—ืŸ ืืช ื”ืคืจื•ื™ืงื˜ ืฉืœื ื• ื•ื—ืœืงื™ื•. ื‘ืฉื ื™ื™ื”, ื ื‘ื™ืŸ ื›ื™ืฆื“ ืœื”ื’ื“ื™ืจ ืืช Plesk ื•ืœื”ืชืงื™ืŸ ืืช ื”ื”ืจื—ื‘ื•ืช ื•ื”ืจื›ื™ื‘ื™ื ื”ื“ืจื•ืฉื™ื (DB, RabbitMQ, Redis, Docker ื•ื›ื•').

ื‘ื—ืœืง ื”ืฉืœื™ืฉื™, ืกื•ืฃ ืกื•ืฃ ื ื‘ื™ืŸ ื›ื™ืฆื“ ืœื”ื’ื“ื™ืจ ืฆื™ื ื•ืจ ืœืคืจื™ืกืช ื”ืคืจื•ื™ืงื˜ ืฉืœื ื• ืœืฉืจืช ื‘ืกื‘ื™ื‘ืช ืคื™ืชื•ื— ื•ืคืจื•ื“. ื•ืื– ื ืฉื™ืง ืืช ื”ืืชืจ ื‘ืฉืจืช.

ื•ื›ืŸ, ืฉื›ื—ืชื™ ืœื”ืฆื™ื’ ืืช ืขืฆืžื™. ืฉืžื™ ืื•ืœื’ ื‘ื•ืจื–ื•ื‘, ืื ื™ ืžืคืชื— fullstack ื‘ืฆื•ื•ืช CRM ืœืžื ื”ืœื™ ืžืฉื›ื ืชืื•ืช ื‘-Domclick.

ืกืงื™ืจืช ืคืจื•ื™ื™ืงื˜

ืจืืฉื™ืช, ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืฉื ื™ ืžืื’ืจื™ ืคืจื•ื™ืงื˜ื™ื - ืื—ื•ืจื™ ื•ืงื“ืžื™ - ื•ื ืขื‘ื•ืจ ืขืœ ื”ืงื•ื“.

ืื—ื•ืจื™: ื‘ืงื‘ื•ืง+ืกืœืจื™

ืœื—ืœืง ื”ืื—ื•ืจื™, ืœืงื—ืชื™ ื—ื‘ื•ืจื” ืฉื”ื™ื ื“ื™ ืคื•ืคื•ืœืจื™ืช ื‘ืงืจื‘ ืžืคืชื—ื™ Python: ื”ืžืกื’ืจืช ืฉืœ Flask (ืขื‘ื•ืจ ื”-API) ื•ืกืœืจื™ (ืขื‘ื•ืจ ืชื•ืจ ื”ืžืฉื™ืžื•ืช). SQLAchemy ืžืฉืžืฉ ื›-ORM. Alembic ืžืฉืžืฉ ืœื”ื’ื™ืจื•ืช. ืœืื™ืžื•ืช JSON ื‘ื™ื“ื™ื•ืช - ืžืจืฉืžืœื•.

ะ’ ืžืื’ืจื™ื ื™ืฉ ืงื•ื‘ืฅ Readme.md ืขื ืชื™ืื•ืจ ืžืคื•ืจื˜ ืฉืœ ื”ืžื‘ื ื” ื•ื”ื•ืจืื•ืช ืœื”ืคืขืœืช ื”ืคืจื•ื™ืงื˜.

Web Part API ื“ื™ ืœื ืžืกื•ื‘ืš, ืžื•ืจื›ื‘ ืž-6 ืขื˜ื™ื:

  • /ping - ืœื‘ื“ื™ืงืช ื–ืžื™ื ื•ืช;
  • ืžื˜ืคืœื™ื ืœืจื™ืฉื•ื, ื”ืจืฉืื”, ื‘ื™ื˜ื•ืœ ื”ืจืฉืื” ื•ืงื‘ืœืช ืžืฉืชืžืฉ ืžื•ืจืฉื”;
  • ื™ื“ื™ืช ื“ื•ืืจ ืืœืงื˜ืจื•ื ื™ ืฉืžื›ื ื™ืกื” ืžืฉื™ืžื” ืœืชื•ืจ ืกืœืจื™.

ื—ืœืง ืกืœืจื™ ืืคื™ืœื• ื™ื•ืชืจ ืงืœ, ื™ืฉ ืจืง ื‘ืขื™ื” ืื—ืช send_mail_task.

ื‘ืชื™ืงื™ื™ื” /conf ื™ืฉ ืฉืชื™ ืชื™ืงื™ื•ืช ืžืฉื ื”:

  • docker ืขื ืฉื ื™ Dockerfiles (base.dockerfile ืœื‘ื ื•ืช ืชืžื•ื ืช ื‘ืกื™ืก ืฉืžืฉืชื ื” ืœืขืชื™ื ืจื—ื•ืงื•ืช ื• Dockerfile ืขื‘ื•ืจ ืžื›ืœื•ืœื™ื ืขื™ืงืจื™ื™ื);
  • .env_files - ืขื ืงื‘ืฆื™ื ืขื ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ืขื‘ื•ืจ ืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช.

ื™ืฉื ื ืืจื‘ืขื” ืงื‘ืฆื™ docker-compose ื‘ื‘ืกื™ืก ื”ืคืจื•ื™ืงื˜:

  • docker-compose.local.db.yml ืœื”ืขืœื•ืช ืžืื’ืจ ืžื™ื“ืข ืžืงื•ืžื™ ืœืคื™ืชื•ื—;
  • docker-compose.local.workers.yml ืœื”ืขืœืื” ืžืงื•ืžื™ืช ืฉืœ ื”ืขื•ื‘ื“, ืžืกื“ ื”ื ืชื•ื ื™ื, Redis ื•-RabbitMQ;
  • docker-compose.test.yml ืœื”ืคืขื™ืœ ื‘ื“ื™ืงื•ืช ื‘ืžื”ืœืš ื”ืคืจื™ืกื”;
  • docker-compose.yml ืœืคืจื™ืกื”.

ื•ื”ืชื™ืงื™ื” ื”ืื—ืจื•ื ื” ืฉืื ื—ื ื• ืžืขื•ื ื™ื™ื ื™ื ื‘ื” - .ci-cd. ื”ื•ื ืžื›ื™ืœ ืกืงืจื™ืคื˜ื™ื ืฉืœ ืžืขื˜ืคืช ืœืคืจื™ืกื”:

  • deploy.sh - ื”ืฉืงืช ื”ื’ื™ืจื” ื•ืคืจื™ืกื”. ืคื•ืขืœ ืขืœ ื”ืฉืจืช ืœืื—ืจ ื‘ื ื™ื™ื” ื•ื”ืจืฆืช ื‘ื“ื™ืงื•ืช ื‘-Github Actions;
  • rollback.sh - ื—ื–ืจื” ืฉืœ ืžื›ื•ืœื•ืช ืœื’ืจืกื” ื”ืงื•ื“ืžืช ืฉืœ ื”ื”ืจื›ื‘ื”;
  • curl_tg.sh - ืฉืœื™ื—ืช ื”ื•ื“ืขื•ืช ืคืจื™ืกื” ืœื˜ืœื’ืจื.

ื—ื–ื™ืช ื‘-Angular

ืžืื’ืจ ืขื ื—ื–ื™ืช ื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜ ืžื–ื” ืฉืœ ื‘ืง. ื”ื—ื–ื™ืช ืžื•ืจื›ื‘ืช ืžืฉืœื•ืฉื” ืขืžื•ื“ื™ื:

  • ืขืžื•ื“ ืจืืฉื™ ืขื ื˜ื•ืคืก ืฉืœื™ื—ืช ืžื™ื™ืœ ื•ื›ืคืชื•ืจ ื™ืฆื™ืื”.
  • ืขืžื•ื“ ื”ืชื—ื‘ืจื•ืช.
  • ื“ืฃ ื”ืจืฉืžื”.

ื”ืขืžื•ื“ ื”ืจืืฉื™ ื ืจืื” ืกื’ืคื ื™:

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
ื™ืฉ ืฉื ื™ ืงื‘ืฆื™ื ื‘ืฉื•ืจืฉ Dockerfile ะธ docker-compose.yml, ื›ืžื• ื’ื ื”ืชื™ืงื™ื” ื”ืžื•ื›ืจืช .ci-cd ืขื ืžืขื˜ ืคื—ื•ืช ืกืงืจื™ืคื˜ื™ื ืžืืฉืจ ื‘ืžืื’ืจ ื”ืื—ื•ืจื™ (ืกืงืจื™ืคื˜ื™ื ืฉื”ื•ืกืจื• ืœื”ืคืขืœืช ื‘ื“ื™ืงื•ืช).

ื”ืชื—ืœืช ืคืจื•ื™ืงื˜ ื‘ืคืœืกืง

ื ืชื—ื™ืœ ื‘ื”ื’ื“ืจืช Plesk ื•ื™ืฆื™ืจืช ืžื ื•ื™ ืœืืชืจ ืฉืœื ื•.

ื”ืชืงื ืช ื”ืจื—ื‘ื•ืช

ื‘-Plesk, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืืจื‘ืข ื”ืจื—ื‘ื•ืช:

  • Docker ืœื ื”ืœ ื•ืœื”ืฆื™ื’ ื‘ืื•ืคืŸ ื—ื–ื•ืชื™ ืืช ืžืฆื‘ ื”ืžื›ื•ืœื•ืช ื‘ืคืื ืœ ื”ื ื™ื”ื•ืœ ืฉืœ Plesk;
  • Git ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืืช ืฉืœื‘ ื”ืคืจื™ืกื” ื‘ืฉืจืช;
  • Let's Encrypt ืœื™ืฆื•ืจ (ื•ื—ื™ื“ื•ืฉ ืื•ื˜ื•ืžื˜ื™) ืฉืœ ืชืขื•ื“ื•ืช TLS ื‘ื—ื™ื ื;
  • Firewall ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืกื™ื ื•ืŸ ืฉืœ ืชืขื‘ื•ืจื” ื ื›ื ืกืช.

ืืชื” ื™ื›ื•ืœ ืœื”ืชืงื™ืŸ ืื•ืชื ื“ืจืš ืคืื ืœ ื”ื ื™ื”ื•ืœ ืฉืœ Plesk ื‘ืกืขื™ืฃ ื”ืจื—ื‘ื•ืช:

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
ืœื ื ืฉืงื•ืœ ืืช ื”ื”ื’ื“ืจื•ืช ื”ืžืคื•ืจื˜ื•ืช ืขื‘ื•ืจ ื”ืจื—ื‘ื•ืช, ื”ื’ื“ืจื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื™ืขืฉื• ืœืžื˜ืจื•ืช ื”ื”ื“ื’ืžื” ืฉืœื ื•.

ืฆื•ืจ ืžื ื•ื™ ื•ืืชืจ

ืœืื—ืจ ืžื›ืŸ, ืขืœื™ื ื• ืœื™ืฆื•ืจ ืžื ื•ื™ ืœืืชืจ helloworld.ru ืฉืœื ื• ื•ืœื”ื•ืกื™ืฃ ืฉื ืืช ืชืช-ื”ื“ื•ืžื™ื™ืŸ dev.helloworld.ru.

  1. ืฆื•ืจ ืžื ื•ื™ ืœื“ื•ืžื™ื™ืŸ helloworld.ru ื•ืฆื™ื™ืŸ ืืช ืกื™ืกืžืช ื”ื›ื ื™ืกื” ืœืžืฉืชืžืฉ ื”ืžืขืจื›ืช:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
    ืกืžืŸ ืืช ื”ืชื™ื‘ื” ื‘ืชื—ืชื™ืช ื”ืขืžื•ื“ ืื‘ื˜ื— ืืช ื”ื“ื•ืžื™ื™ืŸ ื‘ืืžืฆืขื•ืช Let's Encryptืื ื‘ืจืฆื•ื ื ื• ืœื”ื’ื“ื™ืจ HTTPS ืขื‘ื•ืจ ื”ืืชืจ:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  2. ืœืื—ืจ ืžื›ืŸ, ื‘ืžื ื•ื™ ื–ื”, ืฆื•ืจ ืชืช-ื“ื•ืžื™ื™ืŸ dev.helloworld.ru (ืฉืขื‘ื•ืจื• ืชื•ื›ืœ ื’ื ืœื”ื ืคื™ืง ืชืขื•ื“ืช TLS ื‘ื—ื™ื ื):

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

ื”ืชืงื ืช ืจื›ื™ื‘ื™ ืฉืจืช

ื™ืฉ ืœื ื• ืฉืจืช ืขื ืžืขืจื›ืช ื”ื”ืคืขืœื” Debian Stretch 9.12 ื•ื”ืชืงื ืช ืœื•ื— ื‘ืงืจื” ืคืœืกืง ืื•ื‘ืกื™ื“ื™ืืŸ 18.0.27.

ืขืœื™ื ื• ืœื”ืชืงื™ืŸ ื•ืœื”ื’ื“ื™ืจ ืขื‘ื•ืจ ื”ืคืจื•ื™ืงื˜ ืฉืœื ื•:

  • PostgreSQL (ื‘ืžืงืจื” ืฉืœื ื•, ื™ื”ื™ื” ืฉืจืช ืื—ื“ ืขื ืฉื ื™ ืžืกื“ื™ ื ืชื•ื ื™ื ืขื‘ื•ืจ ืกื‘ื™ื‘ื•ืช dev ื•-prod).
  • RabbitMQ (ืื•ืชื• ืžื•ืคืข ืขื vhosts ืฉื•ื ื™ื ืขื‘ื•ืจ ืกื‘ื™ื‘ื•ืช).
  • ืฉื ื™ ืžื•ืคืขื™ Redis (ืœืกื‘ื™ื‘ื•ืช ืžืคืชื—ื™ื ื•ืคืจื•ื“ื™ื).
  • Docker Registry (ืœืื—ืกื•ืŸ ืžืงื•ืžื™ ืฉืœ ืชืžื•ื ื•ืช Docker ื‘ื ื•ื™ื•ืช).
  • ืžืžืฉืง ืžืฉืชืžืฉ ืขื‘ื•ืจ ืจื™ืฉื•ื Docker.

PostgreSQL

Plesk ื›ื‘ืจ ืžื’ื™ืข ืขื PostgreSQL DBMS, ืื‘ืœ ืœื ื”ื’ืจืกื” ื”ืื—ืจื•ื ื” (ื‘ื–ืžืŸ ื›ืชื™ื‘ืช Plesk Obsidian ะฟะพะดะดะตั€ะถะธะฒะฐะป Postgres ื’ืจืกืื•ืช 8.4โ€“10.8). ืื ื—ื ื• ืจื•ืฆื™ื ืืช ื”ื’ืจืกื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ ืขื‘ื•ืจ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• (12.3 ื‘ื–ืžืŸ ื›ืชื™ื‘ืช ืฉื•ืจื•ืช ืืœื”), ืื– ื ืชืงื™ืŸ ืื•ืชื” ื‘ืื•ืคืŸ ื™ื“ื ื™.

ื™ืฉ ื”ืจื‘ื” ื”ื•ืจืื•ืช ืžืคื•ืจื˜ื•ืช ืœื”ืชืงื ืช Postgres ื‘ื“ื‘ื™ืืŸ ื‘ืจืฉืช (ื“ื•ื’ืžื”), ืื– ืื ื™ ืœื ืืชืืจ ืื•ืชื ื‘ืคื™ืจื•ื˜, ืื ื™ ืจืง ืืชืŸ ืืช ื”ืคืงื•ื“ื•ืช:

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

ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉืœ-PostgreSQL ื™ืฉ ื”ื’ื“ืจื•ืช ื‘ืจื™ืจืช ืžื—ื“ืœ ื‘ื™ื ื•ื ื™ื•ืช ืœืžื“ื™, ื™ืฉ ืฆื•ืจืš ืœืชืงืŸ ืืช ื”ืชืฆื•ืจื”. ื–ื” ื™ืขื–ื•ืจ ืœื ื• ืžื—ืฉื‘ื•ืŸ: ืืชื” ืฆืจื™ืš ืœื ื”ื•ื’ ื‘ืคืจืžื˜ืจื™ื ืฉืœ ื”ืฉืจืช ืฉืœืš ื•ืœื”ื—ืœื™ืฃ ืืช ื”ื”ื’ื“ืจื•ืช ื‘ืงื•ื‘ืฅ /etc/postgresql/12/main/postgresql.confืœืืœื” ื”ืžื•ืฆืขื™ื. ื™ืฉ ืœืฆื™ื™ืŸ ื›ืืŸ ืฉืžื—ืฉื‘ื•ื ื™ื ื›ืืœื” ืื™ื ื ื›ื“ื•ืจ ืงืกื, ื•ื™ืฉ ืœื›ื•ื•ืŸ ืืช ื”ื‘ืกื™ืก ื‘ืฆื•ืจื” ืžื“ื•ื™ืงืช ื™ื•ืชืจ, ื‘ื”ืชื‘ืกืก ืขืœ ื”ื—ื•ืžืจื”, ื”ืืคืœื™ืงืฆื™ื” ื•ืžื•ืจื›ื‘ื•ืช ื”ืฉืื™ืœืชื•ืช ืฉืœืš. ืื‘ืœ ื–ื” ืžืกืคื™ืง ื›ื“ื™ ืœื”ืชื—ื™ืœ.

ื‘ื ื•ืกืฃ ืœื”ื’ื“ืจื•ืช ื”ืžื•ืฆืขื•ืช ืขืœ ื™ื“ื™ ื”ืžื—ืฉื‘ื•ืŸ, ืื ื• ื’ื ืžืฉื ื™ื postgresql.confื™ืฆื™ืืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ 5432 ืœืื—ืจืช (ื‘ื“ื•ื’ืžื” ืฉืœื ื• - 53983).

ืœืื—ืจ ืฉื™ื ื•ื™ ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”, ื”ืคืขืœ ืžื—ื“ืฉ ืืช postgresql-server ืขื ื”ืคืงื•ื“ื”:

service postgresql restart

ื”ืชืงื ื• ื•ื”ื’ื“ืจื ื• ืืช PostgreSQL. ื›ืขืช ื‘ื•ืื• ื ื™ืฆื•ืจ ืžืกื“ ื ืชื•ื ื™ื, ืžืฉืชืžืฉื™ื ืขื‘ื•ืจ ืกื‘ื™ื‘ื•ืช ืžืคืชื—ื™ื ื•ืคืจื•ื“ื™ื, ื•ื ื™ืชืŸ ืœืžืฉืชืžืฉื™ื ื–ื›ื•ื™ื•ืช ืœื ื”ืœ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื:

$ 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

ื‘ื•ืื• ื ืขื‘ื•ืจ ืœื”ืชืงื ืช RabbitMQ, ืžืชื•ื•ืš ื”ื•ื“ืขื•ืช ืขื‘ื•ืจ ืกืœืจื™. ื”ืชืงื ืชื• ื‘ื“ื‘ื™ืืŸ ื”ื™ื ื“ื™ ืคืฉื•ื˜ื”:

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

ืœืื—ืจ ื”ื”ืชืงื ื”, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื™ืฆื•ืจ vhosts, ืžืฉืชืžืฉื™ื ื•ืœื”ืขื ื™ืง ืืช ื”ื–ื›ื•ื™ื•ืช ื”ื“ืจื•ืฉื•ืช:

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

ื›ืขืช ื‘ื•ืื• ื ืชืงื™ืŸ ื•ื ืงื‘ืข ืืช ื”ืจื›ื™ื‘ ื”ืื—ืจื•ืŸ ืขื‘ื•ืจ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• - Redis. ื–ื” ื™ืฉืžืฉ ื›ืงืฆื” ืื—ื•ืจื™ ืœืื—ืกื•ืŸ ื”ืชื•ืฆืื•ืช ืฉืœ ืžืฉื™ืžื•ืช ืกืœืจื™.

ืื ื• ื ืขืœื” ืฉื ื™ ืžื›ื•ืœื•ืช Docker ืขื Redis ืขื‘ื•ืจ ืกื‘ื™ื‘ื•ืช ืคื™ืชื•ื— ื•ืคืจื•ื“ ื‘ืืžืฆืขื•ืช ื”ื”ืจื—ื‘ื” Docker ืขื‘ื•ืจ ืคืœืกืง.

  1. ืื ื—ื ื• ื”ื•ืœื›ื™ื ืœ- Plesk, ืขื•ื‘ืจื™ื ืœืงื˜ืข ื”ืจื—ื‘ื•ืช, ืžื—ืคืฉื™ื ืืช ื”ืจื—ื‘ืช Docker ื•ืžืชืงื™ืŸ ืื•ืชื” (ืื ื—ื ื• ืฆืจื™ื›ื™ื ื’ืจืกื” ื—ื™ื ืžื™ืช):

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  2. ืขื‘ื•ืจ ืืœ ื”ืชื•ืกืฃ ื”ืžื•ืชืงืŸ, ืžืฆื ืืช ื”ืชืžื•ื ื” ื‘ืืžืฆืขื•ืช ื”ื—ื™ืคื•ืฉ redis bitnami ื•ื”ืชืงืŸ ืืช ื”ื’ืจืกื” ื”ืื—ืจื•ื ื”:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  3. ืื ื• ื ื›ื ืกื™ื ืœืงื•ื ื˜ื™ื™ื ืจ ืฉื”ื•ืจื“ืช ื•ืžืชืื™ื ืืช ื”ืชืฆื•ืจื”: ืฆื™ื™ืŸ ืืช ื”ื™ืฆื™ืื”, ืืช ื’ื•ื“ืœ ื”-RAM ื”ืžืงืกื™ืžืœื™ ืฉื”ื•ืงืฆื”, ืืช ื”ืกื™ืกืžื” ื‘ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื”, ื•ืชืขืœื” ืืช ืขื•ืฆืžืช ื”ืงื•ืœ:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  4. ืื ื• ืžื‘ืฆืขื™ื ืืช ืฉืœื‘ื™ื 2-3 ืขื‘ื•ืจ ืžื™ื›ืœ ื”-prod, ื‘ื”ื’ื“ืจื•ืช ืื ื• ืžืฉื ื™ื ืจืง ืืช ื”ืคืจืžื˜ืจื™ื: ื™ืฆื™ืื”, ืกื™ืกืžื”, ื’ื•ื“ืœ RAM ื•ื ืชื™ื‘ ืœืชื™ืงื™ื™ืช ื”ื ืคื— ื‘ืฉืจืช:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

ื“ื•ืงืจ ืจื™ืฉื•ื

ื‘ื ื•ืกืฃ ืœืฉื™ืจื•ืชื™ื ื”ื‘ืกื™ืกื™ื™ื, ื–ื” ื™ื”ื™ื” ื ื—ืžื“ ืœืฉื™ื ืžืื’ืจ ืชืžื•ื ื•ืช Docker ืžืฉืœืš ื‘ืฉืจืช. ืœืžืจื‘ื” ื”ืžื–ืœ, ืฉื˜ื— ื”ืฉืจืช ื”ื•ื ื›ืขืช ื–ื•ืœ ืœืžื“ื™ (ื‘ื•ื•ื“ืื™ ื–ื•ืœ ื™ื•ืชืจ ืžืžื ื•ื™ DockerHub), ื•ื”ืชื”ืœื™ืš ืฉืœ ื”ืงืžืช ืžืื’ืจ ืคืจื˜ื™ ื”ื•ื ืคืฉื•ื˜ ืžืื•ื“.

ืื ื—ื ื• ืจื•ืฆื™ื ืฉื™ื”ื™ื” ืœื ื•:

  • ืžืื’ืจ Docker ืžื•ื’ืŸ ื‘ืกื™ืกืžื” ื ื’ื™ืฉ ื‘ืชืช-ื“ื•ืžื™ื™ืŸ https://docker.helloworld.ru;
  • ืžืžืฉืง ืžืฉืชืžืฉ ืœืฆืคื™ื™ื” ื‘ืชืžื•ื ื•ืช ื‘ืžืื’ืจ, ื–ืžื™ืŸ ื‘ https://docker-ui.helloworld.ru.

ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช:

  1. ื‘ื•ืื• ื ื™ืฆื•ืจ ืฉื ื™ ืชืช-ื“ื•ืžื™ื™ื ื™ื ื‘-Plesk ื‘ืžื ื•ื™ ืฉืœื ื•: docker.helloworld.ru ื•-docker-ui.helloworld.ru, ื•ื ืงื‘ืข ืขื‘ื•ืจื ืื™ืฉื•ืจื™ Let's Encrypt.
  2. ื”ื•ืกืฃ ืืช ื”ืงื•ื‘ืฅ ืœืชื™ืงื™ื™ืช ืชืช ื”ื“ื•ืžื™ื™ืŸ docker.helloworld.ru docker-compose.yml ืขื ืชื•ื›ืŸ ื›ื–ื”:
    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'
    

  3. ืชื—ืช SSH, ื ื™ืฆื•ืจ ืืช ืงื•ื‘ืฅ ื”-.htpasswd ืขื‘ื•ืจ ื”ืจืฉืื” ื‘ืกื™ืกื™ืช ื‘ืžืื’ืจ Docker:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. ืื™ืกื•ืฃ ื•ื”ืจื ืžื›ื•ืœื•ืช:
    docker-compose up -d
  5. ื•ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืคื ื•ืช ืืช Nginx ืœืงื•ื ื˜ื™ื™ื ืจื™ื ืฉืœื ื•. ื ื™ืชืŸ ืœืขืฉื•ืช ื–ืืช ื“ืจืš Plesk.

ื™ืฉ ืœื‘ืฆืข ืืช ื”ืฉืœื‘ื™ื ื”ื‘ืื™ื ืขื‘ื•ืจ ืชืช-ื”ื“ื•ืžื™ื™ื ื™ื docker.helloworld.ru ื•-docker-ui.helloworld.ru:

ื‘ืกืขื™ืฃ ื›ืœื™ื Dev ืœืืชืจ ืฉืœื ื• ืขื‘ื•ืจ ืืœ ื›ืœืœื™ ืคืจื•ืงืกื™ ืฉืœ Docker:

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
ื•ื”ื•ืกืฃ ื›ืœืœ ืœืชืขื‘ื•ืจื” ื ื›ื ืกืช ืฉืœ ืคืจื•ืงืกื™ ืœืžื›ื•ืœื” ืฉืœื ื•:

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  1. ืื ื—ื ื• ื‘ื•ื“ืงื™ื ืฉืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ื™ื›ื ืก ืœืžื™ื›ืœ ืฉืœื ื• ืžื”ืžื›ื•ื ื” ื”ืžืงื•ืžื™ืช:
    $ 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
  2. ื‘ื•ืื• ื ื‘ื“ื•ืง ื’ื ืืช ืคืขื•ืœืช ืชืช-ื”ื“ื•ืžื™ื™ืŸ docker-ui.helloworld.ru:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
    ื›ืืฉืจ ืชืœื—ืฅ ืขืœ ืขื™ื•ืŸ ื‘ืžืื’ืจื™ื, ื”ื“ืคื“ืคืŸ ื™ืฆื™ื’ ื—ืœื•ืŸ ื”ืจืฉืื” ื‘ื• ืชืฆื˜ืจืš ืœื”ื–ื™ืŸ ืืช ืฉื ื”ืžืฉืชืžืฉ ื•ื”ืกื™ืกืžื” ืขื‘ื•ืจ ื”ืžืื’ืจ. ืœืื—ืจ ืžื›ืŸ, ื ื•ืขื‘ืจ ืœื“ืฃ ืขื ืจืฉื™ืžืช ืžืื’ืจื™ื (ื‘ื™ื ืชื™ื™ื ื”ื™ื ืชื”ื™ื” ืจื™ืงื” ืขื‘ื•ืจื›ื):

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

ืคืชื™ื—ืช ื™ืฆื™ืื•ืช ื‘ื—ื•ืžืช ื”ืืฉ ืฉืœ Plesk

ืœืื—ืจ ื”ืชืงื ืช ื•ื”ื’ื“ืจืช ื”ืจื›ื™ื‘ื™ื, ืขืœื™ื ื• ืœืคืชื•ื— ืคื•ืจื˜ื™ื ื›ืš ืฉื”ืจื›ื™ื‘ื™ื ื™ื”ื™ื• ื ื’ื™ืฉื™ื ืžืžื›ื•ืœื•ืช Docker ื•ืžื”ืจืฉืช ื”ื—ื™ืฆื•ื ื™ืช.

ื‘ื•ืื• ื ืจืื” ื›ื™ืฆื“ ืœืขืฉื•ืช ื–ืืช ื‘ืืžืฆืขื•ืช ืชื•ืกืฃ ื—ื•ืžืช ื”ืืฉ ืขื‘ื•ืจ Plesk ืฉื”ืชืงื ื• ืงื•ื“ื ืœื›ืŸ.

  1. ืœืš ืœ ื›ืœื™ื ื•ื”ื’ื“ืจื•ืช > ื”ื’ื“ืจื•ืช > ื—ื•ืžืช ืืฉ:
    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
  2. ืœืš ืœ ืฉื ื” ืืช ื›ืœืœื™ ื—ื•ืžืช ื”ืืฉ ืฉืœ Plesk > ื”ื•ืกืฃ ื›ืœืœ ืžื•ืชืื ืื™ืฉื™ืช ื•ืคืชื— ืืช ื™ืฆื™ืื•ืช ื”-TCP ื”ื‘ืื•ืช ืขื‘ื•ืจ ืจืฉืช ื”ืžืฉื ื” ืฉืœ Docker (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  3. ื ื•ืกื™ืฃ ื’ื ื›ืœืœ ืฉื™ืคืชื— ืืช ื™ืฆื™ืื•ืช PostgreSQL ื•ืคืื ืœื™ ื ื™ื”ื•ืœ RabbitMQ ืœืขื•ืœื ื”ื—ื™ืฆื•ืŸ:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  4. ื”ื—ืœ ืืช ื”ื›ืœืœื™ื ื‘ืืžืฆืขื•ืช ื›ืคืชื•ืจ ื”ื—ืœ ืฉื™ื ื•ื™ื™ื:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

ื”ื’ื“ืจืช CI/CD ื‘ืคืขื•ืœื•ืช Github

ื‘ื•ื ื ืจื“ ืœื—ืœืง ื”ืžืขื ื™ื™ืŸ ื‘ื™ื•ืชืจ - ื”ืงืžืช ืฆื™ื ื•ืจ ืื™ื ื˜ื’ืจืฆื™ื” ืจืฆื™ืฃ ื•ื”ืขื‘ืจืช ื”ืคืจื•ื™ืงื˜ ืฉืœื ื• ืœืฉืจืช.

ืฆื™ื ื•ืจ ื–ื” ื™ื›ืœื•ืœ ืฉื ื™ ื—ืœืงื™ื:

  • ื‘ื ื™ื™ืช ืชืžื•ื ื” ื•ื”ืคืขืœืช ื‘ื“ื™ืงื•ืช (ืขื‘ื•ืจ ื”ืงืฆื” ื”ืื—ื•ืจื™) - ื‘ืฆื“ Github;
  • ื”ืคืขืœืช ื”ืขื‘ืจื•ืช (ืขื‘ื•ืจ ื”-backend) ื•ืคืจื™ืกื” ืฉืœ ืงื•ื ื˜ื™ื™ื ืจื™ื - ื‘ืฉืจืช.

ืคืจื•ืก ืœ- Plesk

ื ืขืกื•ืง ืชื—ื™ืœื” ื‘ื ืงื•ื“ื” ื”ืฉื ื™ื™ื” (ื›ื™ ื”ืจืืฉื•ื ื” ืชืœื•ื™ื” ื‘ื”).

ืื ื• ื ื’ื“ื™ืจ ืืช ืชื”ืœื™ืš ื”ืคืจื™ืกื” ื‘ืืžืฆืขื•ืช ืชื•ืกืฃ Git ืขื‘ื•ืจ Plesk.

ืฉืงื•ืœ ื“ื•ื’ืžื” ืขื ืกื‘ื™ื‘ืช Prod ืขื‘ื•ืจ ืžืื’ืจ Backend.

  1. ืื ื—ื ื• ืขื•ื‘ืจื™ื ืœืžื ื•ื™ ืฉืœ ืืชืจ Helloworld ืฉืœื ื• ื•ื ื›ื ืกื™ื ืœืกืขื™ืฃ ื”ืžืฉื ื” ืฉืœ Git:

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  2. ื”ื›ื ืก ืงื™ืฉื•ืจ ืœืžืื’ืจ Github ืฉืœื ื• ืœืฉื“ื” "Remote Git repository" ื•ืฉื ื” ืืช ืชื™ืงื™ื™ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ httpdocs ืœืื—ืจ (ืœืžืฉืœ. /httpdocs/hw_back):

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  3. ื”ืขืชืง ืืช ืžืคืชื— SSH Public ืžื”ืฉืœื‘ ื”ืงื•ื“ื ื• ื”ื•ืกืฃ ื–ื” ื‘ื”ื’ื“ืจื•ืช Github.
  4. ืœื—ืฅ ืขืœ ืื™ืฉื•ืจ ืขืœ ื”ืžืกืš ื‘ืฉืœื‘ 2, ื•ืœืื—ืจ ืžื›ืŸ ื ืคื ื” ืœื“ืฃ ื”ืžืื’ืจ ื‘- Plesk. ื›ืขืช ืขืœื™ื ื• ืœื”ื’ื“ื™ืจ ืืช ื”ืžืื’ืจ ื›ืš ืฉื™ืขื•ื“ื›ืŸ ื‘ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ืœืกื ื™ืฃ ื”ืจืืฉื™. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขื‘ื•ืจ ืืœ ื”ื’ื“ืจื•ืช ืžืื’ืจ ื•ืœืฉืžื•ืจ ืืช ื”ืขืจืš Webhook URL (ื ืฆื˜ืจืš ืืช ื–ื” ืžืื•ื—ืจ ื™ื•ืชืจ ื‘ืขืช ื”ื’ื“ืจืช Github Actions):

    CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

  5. ื‘ืฉื“ื” ืคืขื•ืœื•ืช ื‘ืžืกืš ืžื”ืคืกืงื” ื”ืงื•ื“ืžืช, ื”ื–ืŸ ืืช ื”ืกืงืจื™ืคื˜ ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ื”ืคืจื™ืกื”:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    ืฉื:

    {REPOSITORY_ABSOLUTE_PATH} - ื ืชื™ื‘ ืœืชื™ืงื™ื™ืช ื”-prod ืฉืœ ืžืื’ืจ ื”ืงืฆื” ื”ืื—ื•ืจื™ ื‘ืฉืจืช;
    {ENV} - ืกื‘ื™ื‘ื” (dev / prod), ื‘ืžืงืจื” ืฉืœื ื• prod;
    {DOCKER_REGISTRY_HOST} - ื”ืžืืจื— ืฉืœ ืžืื’ืจ ื”ื“ื•ืงืจ ืฉืœื ื•
    {TG_BOT_TOKEN} - ืืกื™ืžื•ืŸ ื‘ื•ื˜ ืฉืœ ื˜ืœื’ืจื;
    {TG_CHAT_ID} - ืžื–ื”ื” ื”ืฆ'ืื˜/ืขืจื•ืฅ ืœืฉืœื™ื—ืช ื”ื•ื“ืขื•ืช.

    ื“ื•ื’ืžื” ืœืกืงืจื™ืคื˜:

    cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
    .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
  6. ื”ื•ืกืฃ ืžืฉืชืžืฉ ืžื”ืžื ื•ื™ ืฉืœื ื• ืœืงื‘ื•ืฆืช Docker (ื›ื“ื™ ืฉื™ื•ื›ืœ ืœื ื”ืœ ืงื•ื ื˜ื™ื™ื ืจื™ื):
    sudo usermod -aG docker helloworld_admin

ืกื‘ื™ื‘ืช ื”-dev ืขื‘ื•ืจ ืžืื’ืจ ื”ืงืฆื” ื”ืื—ื•ืจื™ ื•ื”-frontend ืžื•ื’ื“ืจื™ื ื‘ืื•ืชื• ืื•ืคืŸ.

ืฆื™ื ื•ืจ ืคืจื™ืกื” ื‘-Github Actions

ื‘ื•ืื• ื ืขื‘ื•ืจ ืœื”ื’ื“ืจืช ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ืฆื™ื ื•ืจ ื”-CI/CD ืฉืœื ื• ื‘-Github Actions.

ืงืฆื” ืื—ื•ืจื™

ื”ืฆื™ื ื•ืจ ืžืชื•ืืจ ื‘ ืงื•ื‘ืฅ deploy.yml.

ืื‘ืœ ืœืคื ื™ ืฉื ื ืชื— ืื•ืชื•, ื‘ื•ืื• ื ืžืœื ืืช ื”ืžืฉืชื ื™ื Secret ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ื‘-Github. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขื‘ื•ืจ ืืœ ื”ื’ื“ืจื•ืช -> ืกื•ื“ื•ืช:

  • DOCKER_REGISTRY - ื”ืžืืจื— ืฉืœ ืžืื’ืจ Docker ืฉืœื ื• (docer.helloworld.ru);
  • DOCKER_LOGIN - ื›ื ื™ืกื” ืœืžืื’ืจ Docker;
  • DOCKER_PASSWORD - ืกื™ืกืžื” ืืœื™ื•;
  • DEPLOY_HOST - ืžืืจื— ืฉื‘ื• ืคืื ืœ ื”ื ื™ื”ื•ืœ ืฉืœ Plesk ื–ืžื™ืŸ (ืœื“ื•ื’ืžื”: helloworld.com: 8443 ืื• 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - ืืกื™ืžื•ืŸ ืœืคืจื™ืกื” ืœ-prod-repository ื‘ืฉืจืช (ืงื™ื‘ืœื ื• ืื•ืชื• ื‘-Deployment in Plesk ืขืž' 4);
  • DEPLOY_BACK_DEV_TOKEN - ืืกื™ืžื•ืŸ ืœืคืจื™ืกื” ืœืžืื’ืจ ื”ืคื™ืชื•ื— ื‘ืฉืจืช.

ืชื”ืœื™ืš ื”ืคืจื™ืกื” ื”ื•ื ืคืฉื•ื˜ ื•ืžื•ืจื›ื‘ ืžืฉืœื•ืฉื” ืฉืœื‘ื™ื ืขื™ืงืจื™ื™ื:

  • ื‘ื ื™ื™ื” ื•ืคืจืกื•ื ืฉืœ ื”ืชืžื•ื ื” ื‘ืžืื’ืจ ืฉืœื ื•;
  • ื”ืคืขืœืช ื‘ื“ื™ืงื•ืช ื‘ืžื™ื›ืœ ื”ืžื‘ื•ืกืกืช ืขืœ ืชืžื•ื ื” ื˜ืจื™ื™ื” ืฉื ื‘ื ืชื”;
  • ืคืจื™ืกื” ืœืกื‘ื™ื‘ื” ื”ืจืฆื•ื™ื” ื‘ื”ืชืื ืœืกื ื™ืฃ (dev/master).

ืžืžืฉืง

ืงื•ื‘ืฅ deploy.yml ืขื‘ื•ืจ ื”ืžืื’ืจ ื”ืงื“ืžื™ ืงืฆืช ืฉื•ื ื” ืžื–ื” ืฉืœ ื‘ืง. ื—ืกืจ ืœื• ืฉืœื‘ ื‘ื”ืคืขืœืช ื‘ื“ื™ืงื•ืช ื•ืžืฉื ื” ืืช ืฉืžื•ืช ื”ืืกื™ืžื•ื ื™ื ืœืคืจื™ืกื”. ืกื•ื“ื•ืช ืœืžืื’ืจ ื”ืงื“ืžื™, ืื’ื‘, ืฆืจื™ืš ืœืžืœื ื‘ื ืคืจื“.

ื”ื’ื“ืจืช ืืชืจ

ื”ืขื‘ืจืช ืชืขื‘ื•ืจื” ื“ืจืš Nginx

ื•ื‘ื›ืŸ, ื”ื’ืขื ื• ืœืกื•ืฃ. ื ื•ืชืจ ืจืง ืœื”ื’ื“ื™ืจ ืืช ื”ืคืจื•ืงืกื™ ืฉืœ ืชืขื‘ื•ืจื” ื ื›ื ืกืช ื•ื™ื•ืฆืืช ืœืงื•ื ื˜ื™ื™ื ืจ ืฉืœื ื• ื“ืจืš Nginx. ื›ื‘ืจ ื›ื™ืกื™ื ื• ืืช ื”ืชื”ืœื™ืš ื”ื–ื” ื‘ืฉืœื‘ 5 ืฉืœ ื”ื’ื“ืจืช Docker Registry. ื™ืฉ ืœื—ื–ื•ืจ ืขืœ ืื•ืชื• ื”ื“ื‘ืจ ืขื‘ื•ืจ ื”ื—ืœืงื™ื ื”ืื—ื•ืจื™ื™ื ื•ื”ืงื“ืžื™ื™ื ื‘ืกื‘ื™ื‘ื•ืช ืžืคืชื—ื™ื ื•ืคืจื•ื“ื™ื.

ืื ื™ ืื‘ื™ื ืฆื™ืœื•ืžื™ ืžืกืš ืฉืœ ื”ื”ื’ื“ืจื•ืช.

ืงืฆื” ืื—ื•ืจื™

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular

ืžืžืฉืง

CI/CD ื‘-Github Actions ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Flask+Angular
ื”ื‘ื”ืจื” ื—ืฉื•ื‘ื”. ื›ืœ ื›ืชื•ื‘ื•ืช ื”-URL ื™ืงื‘ืœื• ืคืจื•ืงืกื™ ืœืžื›ื•ืœืช ื”ื—ื–ื™ืช, ืžืœื‘ื“ ืืœื” ืฉืžืชื—ื™ืœื•ืช ื‘- /api/ - ื”ื ื™ื•ืขื‘ืจื• ืืœ ื”ืžื™ื›ืœ ื”ืื—ื•ืจื™ (ื›ืš ื‘ืžื™ื›ืœ ื”ืื—ื•ืจื™, ื›ืœ ื”ืžื˜ืคืœื™ื ื—ื™ื™ื‘ื™ื ืœื”ืชื—ื™ืœ ืขื /api/).

ืชื•ืฆืื•ืช ืฉืœ

ื›ืขืช ื”ืืชืจ ืฉืœื ื• ืืžื•ืจ ืœื”ื™ื•ืช ื–ืžื™ืŸ ื‘ื›ืชื•ื‘ื•ืช helloworld.ru ื•-dev.helloworld.ru (Prod- ื•-dev-environments, ื‘ื”ืชืืžื”).

ื‘ืกืš ื”ื›ืœ ืœืžื“ื ื• ืื™ืš ืœื”ื›ื™ืŸ ืืคืœื™ืงืฆื™ื” ืคืฉื•ื˜ื” ื‘-Flask ื•-Angular ื•ื”ืงืžื ื• ืฆื™ื ื•ืจ ื‘-Github Actions ื›ื“ื™ ืœื’ืœื’ืœ ืื•ืชื” ืœืฉืจืช ืฉืžืจื™ืฅ ืืช Plesk.

ืื ื™ ืืฉื›ืคืœ ืืช ื”ืงื™ืฉื•ืจื™ื ืœืžืื’ืจื™ื ืขื ื”ืงื•ื“: ืื—ื•ืจื™, ื—ื–ื™ืชื™.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”