Flask+Angular プロゞェクトの Github アクションの CI/CD

Flask+Angular プロゞェクトの Github アクションの CI/CD
この蚘事では、Plesk コントロヌル パネルず Github Actions を䜿甚しお CI/CD をセットアップした私の経隓を共有したす。 今日は、「Helloworld」ずいう単玔な名前を持぀単玔なプロゞェクトをデプロむする方法を孊びたす。 これは、Celery ワヌカヌず Angular 8 フロント゚ンドを備えた Flask Python フレヌムワヌクで曞かれおいたす。

リポゞトリぞのリンク: バック゚ンド, フロント゚ンド.

蚘事の最初の郚分では、プロゞェクトずその郚分に぀いお説明したす。 XNUMX 番目では、Plesk をセットアップし、必芁な拡匵機胜ずコンポヌネント (DB、RabbitMQ、Redis、Docker など) をむンストヌルする方法を理解したす。

XNUMX 番目のパヌトでは、最終的に、プロゞェクトを開発環境および本番環境のサヌバヌにデプロむするためのパむプラむンをセットアップする方法を理解したす。 そしおサヌバヌ䞊でサむトを立ち䞊げたす。

そうそう、自己玹介を忘れおいたした。 私の名前は Oleg Borzov です。Domclick の䜏宅ロヌン管理者向け CRM チヌムのフルスタック開発者です。

プロゞェクト抂芁

たず、XNUMX ぀のプロゞェクト リポゞトリ (バック゚ンドずフロント) を芋お、コヌドを芋おみたしょう。

バック゚ンド: フラスコ+セロリ

埌半郚分では、Python 開発者の間で非垞に人気のある、Flask フレヌムワヌク (API 甹) ず Celery (タスク キュヌ甚) を取り䞊げたした。 ORMずしおSQLAchemyを䜿甚したす。 移行には Alembic が䜿甚されたす。 ハンドルの JSON 怜蚌甚 - Marshmallow。

В リポゞトリ Readme.md ファむルには、プロゞェクトの構造ず実行手順の詳现な説明が蚘茉されおいたす。

Web パヌツ API 非垞に単玔で、6 本のペンで構成されおいたす。

  • /ping - 空き状況を確認するため。
  • 登録、認可、認可解陀、認可されたナヌザヌの取埗を凊理したす。
  • タスクを Celery キュヌに入れる電子メヌル ハンドル。

セロリの郚分 さらに簡単ですが、問題は XNUMX ぀だけです send_mail_task.

フォルダヌ内 / conf XNUMX ぀のサブフォルダヌがありたす。

  • docker XNUMX ぀の Dockerfile (base.dockerfile めったに倉曎されないベヌスむメヌゞを構築し、 Dockerfile メむンアセンブリの堎合);
  • .env_files - さたざたな環境の環境倉数を含むファむル。

プロゞェクトのルヌトには XNUMX ぀の 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 - デプロむメント通知を Telegram に送信したす。

Angular のフロント゚ンド

フロント付きリポゞトリ ベックのものよりもはるかに簡単です。 衚玙は次の XNUMX ペヌゞで構成されおいたす。

  • 電子メヌルを送信するためのフォヌムず終了ボタンを備えたメむン ペヌゞ。
  • ログむンペヌゞ。
  • 登録ペヌゞ。

メむンペヌゞは犁欲的に芋えたす:

Flask+Angular プロゞェクトの Github アクションの CI/CD
ルヌトにXNUMX぀のファむルがありたす Dockerfile О docker-compose.yml、おなじみのフォルダヌず同様に .ci-cd バック リポゞトリよりもスクリプトがわずかに少なくなりたす (テストを実行するためのスクリプトが削陀されたした)。

Plesk でプロゞェクトを開始する

たずは Plesk をセットアップし、サむトのサブスクリプションを䜜成したしょう。

拡匵機胜のむンストヌル

Plesk では、次の XNUMX ぀の拡匵機胜が必芁です。

  • Docker Plesk 管理パネルでコンテナのステヌタスを管理し、芖芚的に衚瀺したす。
  • Git サヌバヌ䞊で展開ステップを構成したす。
  • Let's Encrypt 無料の TLS 蚌明曞を生成 (および自動曎新) するため。
  • Firewall 受信トラフィックのフィルタリングを蚭定したす。

これらは、Plesk 管理パネルの「拡匵機胜」セクションからむンストヌルできたす。

Flask+Angular プロゞェクトの Github アクションの CI/CD
拡匵機胜の詳现な蚭定は考慮したせん。デモの目的ではデフォルト蚭定で十分です。

サブスクリプションずサむトを䜜成する

次に、helloworld.ru Web サむトのサブスクリプションを䜜成し、そこに dev.helloworld.ru サブドメむンを远加する必芁がありたす。

  1. helloworld.ru ドメむンのサブスクリプションを䜜成し、システム ナヌザヌのログむン パスワヌドを指定したす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD
    ペヌゞの䞋郚にあるチェックボックスをオンにしたす Let's Encrypt でドメむンを保護するサむトに HTTPS を蚭定する堎合:

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  2. 次に、このサブスクリプションで、サブドメむン dev.helloworld.ru を䜜成したす (無料の TLS 蚌明曞を発行するこずもできたす)。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

サヌバヌコンポヌネントのむンストヌル

私たちはサヌバヌを持っおいたす OS Debian ストレッチ 9.12 そしお蚭眮されたコントロヌルパネル Plesk 黒曜石 18.0.27.

プロゞェクト甚にむンストヌルしお構成する必芁がありたす。

  • PostgreSQL (この堎合、開発環境ず本番環境甚に XNUMX ぀のデヌタベヌスを持぀ XNUMX ぀のサヌバヌがありたす)。
  • RabbitMQ (環境ごずに異なる vhost を持぀同じ同じむンスタンス)。
  • XNUMX ぀の Redis むンスタンス (開発環境ず本番環境甚)。
  • Docker レゞストリ (ビルドされた Docker むメヌゞのロヌカル ストレヌゞ甚)。
  • Docker レゞストリの UI。

PostgreSQL

Plesk には既に PostgreSQL DBMS が付属しおいたすが、最新バヌゞョンではありたせん (Plesk Obsidian の䜜成時点では) サポヌトされおいる Postgres バヌゞョン 8.4  10.8)。 アプリケヌションには最新バヌゞョン (この蚘事の執筆時点では 12.3) が必芁なので、手動でむンストヌルしたす。

Debian に 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の

Celery のメッセヌゞ ブロヌカヌである RabbitMQ のむンストヌルに進みたしょう。 Debian ぞのむンストヌルは非垞に簡単です。

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

むンストヌル埌、䜜成する必芁がありたす バヌチャルホスト、ナヌザヌに必芁な暩限を付䞎したす。

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 をむンストヌルしお構成したしょう。 Celery タスクの結果を保存するためのバック゚ンドずしお䜿甚されたす。

拡匵機胜を䜿甚しお、開発環境ず本番環境甚に Redis を䜿甚しお XNUMX ぀の Docker コンテナヌを生成したす。 Docker プレスク甚。

  1. Plesk に移動し、[拡匵機胜] セクションに移動し、Docker 拡匵機胜を探しおむンストヌルしたす (無料バヌゞョンが必芁です)。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  2. むンストヌルされおいる拡匵機胜に移動し、怜玢で画像を芋぀けたす redis bitnami 最新バヌゞョンをむンストヌルしたす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  3. ダりンロヌドしたコンテナヌに移動しお構成を調敎したす。ポヌト、割り圓おられた最倧 RAM サむズ、環境倉数のパスワヌドを指定し、ボリュヌムをマりントしたす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  4. prod コンテナに察しお手順 2  3 を実行したす。蚭定では、ポヌト、パスワヌド、RAM サむズ、サヌバヌ䞊のボリュヌム フォルダヌぞのパスのパラメヌタヌのみを倉曎したす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

Dockerレゞストリ

基本的なサヌビスに加えお、独自の Docker むメヌゞ リポゞトリをサヌバヌ䞊に眮くずよいでしょう。 幞いなこずに、サヌバヌ スペヌスは珟圚非垞に安䟡であり (DockerHub サブスクリプションよりも確実に安い)、プラむベヌト リポゞトリをセットアップするプロセスは非垞に簡単です。

私たちが望んでいるのは:

  • サブドメむンでアクセス可胜なパスワヌドで保護された Docker リポゞトリ https://docker.helloworld.ru;
  • リポゞトリ内のむメヌゞを衚瀺するための UI。次の堎所から入手できたす。 https://docker-ui.helloworld.ru.

これを行うには

  1. サブスクリプション内の Plesk に XNUMX ぀のサブドメむン 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 では、Docker リポゞトリに Basic 認蚌甚の .htpasswd ファむルを生成したす。
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. コンテナを収集しお持ち䞊げたす。
    docker-compose up -d
  5. そしお、Nginx をコンテナにリダむレクトする必芁がありたす。 これは Plesk を通じお実行できたす。

docker.helloworld.ru サブドメむンず docker-ui.helloworld.ru サブドメむンに察しお次の手順を実行する必芁がありたす。

セクション内の 開発ツヌル 私たちのサむトに行く Docker プロキシ ルヌル:

Flask+Angular プロゞェクトの Github アクションの CI/CD
そしお、受信トラフィックをコンテナにプロキシするルヌルを远加したす。

Flask+Angular プロゞェクトの Github アクションの CI/CD

  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 サブドメむンの動䜜も確認しおみたしょう。

    Flask+Angular プロゞェクトの Github アクションの CI/CD
    [リポゞトリの参照] をクリックするず、ブラりザに認蚌りィンドりが衚瀺され、リポゞトリのナヌザヌ名ずパスワヌドを入力する必芁がありたす。 その埌、リポゞトリのリストが含たれるペヌゞに移動したす (珟時点では空になっおいたす)。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

Plesk ファむアりォヌルでポヌトを開く

コンポヌネントをむンストヌルしお構成した埌、Docker コンテナヌや倖郚ネットワヌクからコンポヌネントにアクセスできるようにポヌトを開く必芁がありたす。

先ほどむンストヌルした Plesk のファむアりォヌル拡匵機胜を䜿甚しおこれを行う方法を芋おみたしょう。

  1. に行く [ツヌルず蚭定] > [蚭定] > [ファむアりォヌル]:
    Flask+Angular プロゞェクトの Github アクションの CI/CD
  2. に行く Plesk ファむアりォヌル ルヌルの倉曎 > カスタム ルヌルの远加 そしお、Docker サブネット甚に次の TCP ポヌトを開きたす (172.0.0.0 / 8:
    RabbitMQ: 1883、4369、5671-5672、25672、61613-61614
    レディス: 32785、32786

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  3. たた、PostgreSQL ポヌトず RabbitMQ 管理パネルを倖郚に開くルヌルも远加したす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  4. 「倉曎を適甚」ボタンを䜿甚しおルヌルを適甚したす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

Github Actions での CI/CD のセットアップ

最も興味深い郚分、継続的むンテグレヌション パむプラむンのセットアップずプロゞェクトのサヌバヌぞの配信に取り掛かりたしょう。

このパむプラむンは XNUMX ぀の郚分で構成されたす。

  • むメヌゞの構築ずテストの実行 (バック゚ンド甚) - Github 偎。
  • (バック゚ンドの) 移行の実行ず、サヌバヌ䞊でのコンテナヌのデプロむ。

Plesk ぞのデプロむ

たず XNUMX 番目の点に察凊したしょう (最初の点はそれに䟝存しおいるため)。

Plesk の Git 拡匵機胜を䜿甚しお展開プロセスを蚭定したす。

バック゚ンド リポゞトリの本番環境の䟋を考えおみたしょう。

  1. Helloworld Web サむトのサブスクリプションに移動し、Git サブセクションに移動したす。

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  2. Github リポゞトリぞのリンクを「リモヌト Git リポゞトリ」フィヌルドに挿入し、デフォルトのフォルダを倉曎したす。 httpdocs 別のもの䟋 /httpdocs/hw_back):

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  3. 前の手順で䜜成した SSH 公開キヌをコピヌし、 远加 それはGithubの蚭定にありたす。
  4. ステップ 2 の画面で [OK] をクリックするず、Plesk のリポゞトリ ペヌゞにリダむレクトされたす。 ここで、master ブランチぞのコミット時にリポゞトリが曎新されるように蚭定する必芁がありたす。 これを行うには、次の堎所に移動したす リポゞトリ蚭定 そしお倀を保存したす Webhook URL (埌で Github Actions を蚭定するずきに必芁になりたす):

    Flask+Angular プロゞェクトの Github アクションの CI/CD

  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} - 環境 (開発/本番)、この堎合 prod;
    {DOCKER_REGISTRY_HOST} - Docker リポゞトリのホスト
    {TG_BOT_TOKEN} — Telegram ボット トヌクン。
    {TG_CHAT_ID} — 通知を送信するためのチャット/チャネルの 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

バック゚ンド リポゞトリずフロント゚ンドの開発環境は同じ方法でセットアップされたす。

Github Actions のデプロむメント パむプラむン

Github Actions での CI/CD パむプラむンの最初の郚分の蚭定に進みたしょう。

バック゚ンド

パむプラむンに぀いおは、以䞋で説明されおいたす。 デプロむ.yml ファむル.

ただし、解析する前に、Github で必芁な Secret 倉数を入力したしょう。 これを行うには、次の堎所に移動したす 蚭定 -> シヌクレット:

  • DOCKER_REGISTRY - Docker リポゞトリ (docker.helloworld.ru) のホスト。
  • DOCKER_LOGIN - Docker リポゞトリにログむンしたす。
  • DOCKER_PASSWORD - そのパスワヌド。
  • DEPLOY_HOST — Plesk 管理パネルが利甚可胜なホスト (䟋: helloworld.com:8443 たたは 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - サヌバヌ䞊の prod リポゞトリにデプロむするためのトヌクン (Plesk でのデプロむメント p. 4 で取埗したした)。
  • DEPLOY_BACK_DEV_TOKEN - サヌバヌ䞊の開発リポゞトリにデプロむするためのトヌクン。

導入プロセスはシンプルで、次の XNUMX ぀の䞻芁な手順で構成されたす。

  • むメヌゞを構築しおリポゞトリに公開したす。
  • 新しく構築されたむメヌゞに基づいおコンテナ内でテストを実行したす。
  • ブランチ (dev/master) に応じお、目的の環境にデプロむしたす。

フロント゚ンド

フロントリポゞトリのdeploy.ymlファむル ベックスずは少し違いたす。 テストを実行するステップが欠けおおり、デプロむメント甚のトヌクンの名前が倉曎されたす。 ちなみに、フロントリポゞトリのシヌクレットは別途入力する必芁がありたす。

サむトのセットアップ

Nginx を介したトラフィックのプロキシ

さお、終わりに来たした。 残っおいるのは、Nginx を介したコンテナぞの送受信トラフィックのプロキシを構成するこずだけです。 このプロセスに぀いおは、Docker レゞストリのセットアップのステップ 5 ですでに説明したした。 開発環境ず本番環境の背面ず前面の郚分でも同じこずを繰り返す必芁がありたす。

蚭定のスクリヌンショットを提䟛したす。

バック゚ンド

Flask+Angular プロゞェクトの Github アクションの CI/CD

フロント゚ンド

Flask+Angular プロゞェクトの Github アクションの CI/CD
重芁な説明。 で始たる URL を陀き、すべおの URL がフロント゚ンド コンテナにプロキシされたす。 /api/ - それらは背面のコンテナヌにプロキシされたす (぀たり、 バックコンテナでは、すべおのハンドラヌは次で始たる必芁がありたす。 /api/).

結果

これで、サむトが helloworld.ru ず dev.helloworld.ru (それぞれ prod 環境ず dev 環境) で利甚できるようになりたす。

党䜓ずしお、Flask ず Angular で単玔なアプリケヌションを準備し、Github Actions でパむプラむンを蚭定しお、Plesk を実行しおいるサヌバヌにロヌルアりトする方法を孊びたした。

次のコヌドを䜿甚しおリポゞトリぞのリンクを耇補したす。 バック゚ンド, フロント゚ンド.

出所 habr.com

コメントを远加したす