CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular
Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я подСлюсь своим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ настройки CI/CD с использованиСм ΠΏΠ°Π½Π΅Π»ΠΈ управлСния Plesk ΠΈ Github Actions. БСгодня Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с нСзамысловатым Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«HelloworldΒ». Он написан Π½Π° Python-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ Flask, с Π²ΠΎΡ€ΠΊΠ΅Ρ€Π°ΠΌΠΈ Π½Π° Celery ΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ΠΎΠΌ Π½Π° Angular 8.

Бсылки Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ: бэкСнд, Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ посмотрим Π½Π° наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π΅Π³ΠΎ части. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” разбСрСмся, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Plesk ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (Π‘Π”, RabbitMQ, Redis, Docker ΠΈ Ρ‚.Π΄.).

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ части ΠΌΡ‹, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, разбСрСмся, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ для дСплоя нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° сСрвСр Π² dev- ΠΈ prod-срСду. А ΠΏΠΎΡ‚ΠΎΠΌ запустим сайт Π½Π° сСрвСрС.

И Π΄Π°, Π·Π°Π±Ρ‹Π» ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒΡΡ. МСня Π·ΠΎΠ²ΡƒΡ‚ ОлСг Π‘ΠΎΡ€Π·ΠΎΠ², я fullstack-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ CRM для ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΈΠΏΠΎΡ‚Π΅Ρ‡Π½ΠΎΠ³ΠΎ крСдитования Π² Π”ΠΎΠΌΠΊΠ»ΠΈΠΊ.

ΠžΠ±Π·ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Для Π½Π°Ρ‡Π°Π»Π° рассмотрим Π΄Π²Π° рСпозитория ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” бэкСнда ΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π° β€” ΠΈ пробСТимся ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ.

БэкСнд-Ρ‡Π°ΡΡ‚ΡŒ: Flask+Celery

Для бэк-части я взял достаточно ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΡƒΡŽ срСди Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² связку: Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Flask (для API) ΠΈ Celery (для ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π·Π°Π΄Π°Ρ‡). Π’ качСствС ORM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ SQLAchemy. Для ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ примСняСтся Alembic. Для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ JSON Π² Ρ€ΡƒΡ‡ΠΊΠ°Ρ… β€” Marshmallow.

Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» Readme.md с ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ описаниСм структуры ΠΈ инструкциями для запуска ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

API Π²Π΅Π±-части достаточно нСзамысловатый, состоит ΠΈΠ· 6 Ρ€ΡƒΡ‡Π΅ΠΊ:

  • /ping β€” для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ доступности;
  • Ρ€ΡƒΡ‡ΠΊΠΈ для рСгистрации, Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ получСния Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ;
  • Ρ€ΡƒΡ‡ΠΊΠ° для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ email, которая ΠΊΠ»Π°Π΄Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΊΡƒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Celery.

Celery-Ρ‡Π°ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‚Π°ΠΌ всСго ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡ΠΊΠ° send_mail_task.

Π’ ΠΏΠ°ΠΏΠΊΠ΅ /conf Π»Π΅ΠΆΠ°Ρ‚ Π΄Π²Π΅ ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΈ:

  • docker с двумя Docker-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ (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. Π’ Π½Π΅ΠΉ Π»Π΅ΠΆΠ°Ρ‚ shell-скрипты для развёртывания:

  • deploy.sh β€” запуск ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ дСплоя. ЗапускаСтся Π½Π° сСрвСрС послС сборки ΠΈ ΠΏΡ€ΠΎΠ³ΠΎΠ½Π° тСстов Π² Github Actions;
  • rollback.sh β€” ΠΎΡ‚ΠΊΠ°Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ сборки;
  • curl_tg.sh β€” ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ Π² Telegram.

Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Π½Π° Angular

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с Ρ„Ρ€ΠΎΠ½Ρ‚ΠΎΠΌ сильно ΠΏΡ€ΠΎΡ‰Π΅ бэковского. Π€Ρ€ΠΎΠ½Ρ‚ состоит ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… страниц:

  • Главная страница с Ρ„ΠΎΡ€ΠΌΠΎΠΉ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ email ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π°.
  • Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π²Ρ…ΠΎΠ΄Π°.
  • Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° рСгистрации.

Главная страница выглядит аскСтично:

CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular
Π’ ΠΊΠΎΡ€Π½Π΅ Π»Π΅ΠΆΠ°Ρ‚ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° Dockerfile ΠΈ docker-compose.yml, Π° Ρ‚Π°ΠΊΠΆΠ΅ знакомая Π½Π°ΠΌ ΠΏΠ°ΠΏΠΊΠ° .ci-cd с Ρ‡ΡƒΡ‚ΡŒ мСньшим количСством скриптов, Ρ‡Π΅ΠΌ Π² бэковском Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (ΡƒΠ±Ρ€Π°Π½Ρ‹ скрипты для запуска тСстов).

Π—Π°Π²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Plesk

НачнСм с настройки Plesk ΠΈ создания подписки для нашСго сайта.

Установка Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

Π’ Plesk Π½Π°ΠΌ понадобятся Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ:

  • Docker для управлСния ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния состояния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ Plesk;
  • Git для настройки шага дСплоя Π½Π° сСрвСрС;
  • Let's Encrypt для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΈ автопродлСния) бСсплатных TLS-сСртификатов;
  • Firewall для настройки Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ входящСго Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°.

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π°Π΄ΠΌΠΈΠ½ΠΊΡƒ Plesk Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Extensions:

CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular
Π”Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ настройку Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΌΡ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, для Π½Π°ΡˆΠΈΡ… Π΄Π΅ΠΌΠΎ-Ρ†Π΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ подписки ΠΈ сайта

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ подписку для нашСго сайта helloworld.ru ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ dev.helloworld.ru.

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ подписку для Π΄ΠΎΠΌΠ΅Π½Π° helloworld.ru ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈΠ½-ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для систСмного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular
    Π’Π½ΠΈΠ·Ρƒ страницы ставим Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Secure the domain with Let’s Encrypt, Ссли Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ HTTPS для сайта:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  2. Π”Π°Π»Π΅Π΅ Π² этой подпискС создаСм ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ dev.helloworld.ru (для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ бСсплатный TLS-сСртификат):

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

Установка сСрвСрных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Π£ нас Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ сСрвСр с OS Debian Stretch 9.12 ΠΈ установлСнной панСлью управлСния Plesk Obsidian 18.0.27.

Нам Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ для нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

  • PostgreSQL (Π² нашСм случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ сСрвСр с двумя Π‘Π” для dev- ΠΈ prod-срСды).
  • RabbitMQ (Ρ‚ΠΎ ΠΆΠ΅ самоС, ΠΎΠ΄ΠΈΠ½ инстанс с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ vhosts для срСд).
  • Π”Π²Π° инстанса Redis (для dev- ΠΈ prod-срСды).
  • Docker Registry (для локального хранСния собранных Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ²).
  • UI-интСрфСйс для Docker registry.

PostgreSQL

Π’ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ с Plesk ΡƒΠΆΠ΅ ΠΈΠ΄Π΅Ρ‚ Π‘Π£Π‘Π” PostgreSQL, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ самой свСТСй вСрсии (Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ Plesk Obsidian ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» Postgres вСрсий 8.4–10.8). ΠœΡ‹ ΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ для своСго прилоТСния ΡΠ°ΠΌΡƒΡŽ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ (12.3 Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ), поэтому Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… инструкций ΠΏΠΎ установкС Postgres Π½Π° Debian Π² сСти ΠΏΠΎΠ»Π½ΠΎ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€), поэтому ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Ρƒ, просто ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

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. Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим Π‘Π”, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ для dev- ΠΈ prod-срСд, ΠΈ Π²Ρ‹Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΏΡ€Π°Π²Π° Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π‘Π”:

$ 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 β€” Π±Ρ€ΠΎΠΊΠ΅Ρ€Π° сообщСний для Celery. Бтавится ΠΎΠ½ Π½Π° 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

ПослС установки Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ 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. Он Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ бэкСнд для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π·Π°Π΄Π°Ρ‡ Celery.

ΠœΡ‹ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅ΠΌ Π΄Π²Π° Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с Redis ΠΏΠΎΠ΄ dev- ΠΈ prod-срСды с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Docker для Plesk.

  1. Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Plesk, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ€Π°Π·Π΄Π΅Π» Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΈΡ‰Π΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Docker ΠΈ устанавливаСм Π΅Π³ΠΎ (Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° бСсплатная вСрсия):

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  2. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² установлСнноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· поиск ΠΎΠ±Ρ€Π°Π· redis bitnami ΠΈ ставим послСднюю Π²Π΅Ρ€ΡΠΈΡŽ:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  3. Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² скачанный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ: ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΡ€Ρ‚, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ выдСляСмый Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠžΠ—Π£, ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния, ΠΈ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠΌ:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  4. ВыполняСм шаги 2-3 для prod-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π² настройках Ρ‚ΠΎΠ»ΡŒΠΊΠΎ мСняСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΠΏΠΎΡ€Ρ‚, ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠžΠ—Π£ ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ volume Π½Π° сСрвСрС:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

Docker Registry

Помимо Π±Π°Π·ΠΎΠ²Ρ‹Ρ… сСрвисов Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° сСрвСр собствСнный Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ². Π‘Π»Π°Π³ΠΎ мСсто Π½Π° сСрвСрах сСйчас достаточно дСшСвоС (ΡƒΠΆ Ρ‚ΠΎΡ‡Π½ΠΎ дСшСвлС подписки Π½Π° DockerHub), Π΄Π° ΠΈ процСсс установки ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ рСпозитория ΠΎΡ‡Π΅Π½ΡŒ прост.

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ нас Π±Ρ‹Π»ΠΈ установлСны:

  • Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ Docker-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, доступный ΠΏΠΎ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Ρƒ https://docker.helloworld.ru;
  • UI-интСрфСйс для просмотра ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, доступный ΠΏΠΎ адрСсу 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 для Basic-Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² 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 Tools нашСго сайта Π·Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Docker Proxy Rules:

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
    ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° Browse repositories Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ выдаст окошко для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΡƒΠ΄Π° Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ввСсти Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для рСпозитория. ПослС Ρ‡Π΅Π³ΠΎ нас ΠΏΠ΅Ρ€Π΅ΠΊΠΈΠ½Π΅Ρ‚ Π½Π° страницу со списком Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² (Ρƒ вас ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ пустой):

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΡ€Ρ‚Ρ‹ Π² Plesk Firewall

ПослС установки ΠΈ настройки ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ доступны ΠΈΠ· Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈ внСшнСй сСти.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ установлСнного Π½Π°ΠΌΠΈ Ρ€Π°Π½Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Firewall для Plesk.

  1. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Tools & Settings > Settings > Firewall:
    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular
  2. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Modify Plesk Firewall Rules > Add Custom Rule ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 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 ΠΈ management-ΠΏΠ°Π½Π΅Π»ΠΈ RabbitMQ:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  4. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ Apply Changes:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

Настройка CI/CD Π² Github Actions

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊ самой интСрСсной части β€” настройкС ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ доставки нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΄ΠΎ сСрвСра.

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

  • сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΈ ΠΏΡ€ΠΎΠ³ΠΎΠ½ тСстов (для бэкСнда) β€” Π½Π° сторонС Github;
  • запуск ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ (для бэкСнда) ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² β€” Π½Π° сСрвСрС.

Π”Π΅ΠΏΠ»ΠΎΠΉ Π² Plesk

РазбСрСмся сначала со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠΌ (Ρ‚.ΠΊ. ΠΎΡ‚ Π½Π΅Π³ΠΎ зависит ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ).

ΠŸΡ€ΠΎΡ†Π΅ΡΡ дСплоя ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Git для Plesk.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Prod ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ для Backend рСпозитория.

  1. Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² подписку нашСго сайта Helloworld ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π» Git:

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  2. ВставляСм Π² ΠΏΠΎΠ»Π΅ Β«Remote Git repositoryΒ» ссылку Π½Π° наш Github-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ мСняСм ΠΏΠ°ΠΏΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ httpdocs Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, /httpdocs/hw_back):

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  3. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ SSH Public key с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ этапа ΠΈ добавляСм Π΅Π³ΠΎ Π² настройках Github.
  4. НаТимаСм ОК Π½Π° экранС Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 2, послС Ρ‡Π΅Π³ΠΎ нас ΠΏΠ΅Ρ€Π΅ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅Ρ‚ Π½Π° страницу рСпозитория Π² Plesk. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ рСпозитория ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°Ρ… Π² Π²Π΅Ρ‚ΠΊΡƒ master. Для этого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Repository Settings ΠΈ сохраняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Webhook URL (ΠΎΠ½ΠΎ Π½Π°ΠΌ понадобится ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΡ€ΠΈ настройкС Github Actions):

    CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

  5. Π’ ΠΏΠΎΠ»Π΅ Actions Π½Π° экранС ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° Π²Π²ΠΎΠ΄ΠΈΠΌ скрипт для запуска дСплоя:
    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 backend-рСпозитория Π½Π° сСрвСрС;
    {ENV} β€” срСда (dev/prod), Π² нашСм случаС 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

Dev-срСда для backend-рСпозитория ΠΈ frontend Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ.

Pipeline дСплоя в Github Actions

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ настройкС ΠΏΠ΅Ρ€Π²ΠΎΠΉ части нашСго CI/CD-ΠΏΠ°ΠΉΠΏΠ»Π°Π½Π° Π² Github Actions.

Backend

Пайплайн описываСтся Π² Ρ„Π°ΠΉΠ»Π΅ deploy.yml.

Но ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π² Github Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Secret-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Для этого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Settings -> Secrets:

  • DOCKER_REGISTRY β€” хост нашСго Docker-рСпозитория (docker.helloworld.ru);
  • DOCKER_LOGIN β€” Π»ΠΎΠ³ΠΈΠ½ ΠΊ Docker-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡŽ;
  • DOCKER_PASSWORD β€” ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΊ Π½Π΅ΠΌΡƒ;
  • DEPLOY_HOST β€” хост, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ доступна Π°Π΄ΠΌΠΈΠ½ΠΊΠ° Plesk (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: helloworld.ru:8443 ΠΈΠ»ΠΈ 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN β€” Ρ‚ΠΎΠΊΠ΅Π½ для дСплоя Π² prod-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° сСрвСрС (ΠΌΡ‹ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π² Π Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π² Plesk ΠΏ. 4);
  • DEPLOY_BACK_DEV_TOKEN β€” Ρ‚ΠΎΠΊΠ΅Π½ для дСплоя Π² dev-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° сСрвСрС.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ дСплоя прост ΠΈ состоит ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… основных шагов:

  • сборка ΠΈ публикация ΠΎΠ±Ρ€Π°Π·Π° Π² нашСм Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ;
  • запуск тСстов Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π½Π° Π±Π°Π·Π΅ свСТСсобранного ΠΎΠ±Ρ€Π°Π·Π°;
  • Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ срСду Π² зависимости ΠΎΡ‚ Π²Π΅Ρ‚ΠΊΠΈ (dev/master).

Frontend

Π€Π°ΠΉΠ» deploy.yml для Ρ„Ρ€ΠΎΠ½Ρ‚-рСпозитория ΠΌΠ°Π»ΠΎ Ρ‡Π΅ΠΌ отличаСтся ΠΎΡ‚ бэковского. Π’ Π½Π΅ΠΌ отсутствуСт шаг с запуском тСстов ΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ названия Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² для дСплоя. Π‘Π΅ΠΊΡ€Π΅Ρ‚Ρ‹ для Ρ„Ρ€ΠΎΠ½Ρ‚-рСпозитория, кстати, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

Настройка сайта

ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· Nginx

Ну Ρ‡Ρ‚ΠΎ ΠΆ, ΠΌΡ‹ подошли ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ проксированиС входящСго ΠΈ исходящСго Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π² наш ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Ρ‡Π΅Ρ€Π΅Π· Nginx. Π­Ρ‚ΠΎΡ‚ процСсс ΠΌΡ‹ ΡƒΠΆΠ΅ рассмотрСли Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 5 настройки Docker Registry. Π’ΠΎ ΠΆΠ΅ самоС Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ для бэк- ΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚-части Π² dev- ΠΈ prod-окруТСниях.

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ скрины настроСк.

Backend

CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular

Frontend

CI/CD Π² Github Actions для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Flask+Angular
Π’Π°ΠΆΠ½ΠΎΠ΅ ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅. Π’ΠΎ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ всС URL, ΠΊΡ€ΠΎΠΌΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° /api/ β€” ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ проксированы Π² бэк-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (поэтому Π² бэк-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с /api/).

Π˜Ρ‚ΠΎΠ³ΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш сайт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ доступСн ΠΏΠΎ адрСсам helloworld.ru ΠΈ dev.helloworld.ru (prod- ΠΈ dev-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ соотвСтствСнно).

Π˜Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Flask ΠΈ Angular ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² Github Actions ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ для Π΅Π³ΠΎ Π²Ρ‹ΠΊΠ°Ρ‚ΠΊΠΈ Π½Π° сСрвСр ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Plesk.

ΠŸΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽ сссылки Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с ΠΊΠΎΠ΄ΠΎΠΌ: бэкСнд, Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com