CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular
αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ CI/CD αžŠαŸ„αž™αž”αŸ’αžšαžΎ Plesk Control Panel αž“αž·αž„ Github ActionsαŸ” αžαŸ’αž„αŸƒαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αž˜αž·αž“αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ "Helloworld" αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž”αžαžŽαŸ’αžŒ Flask Python αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αž»αž‚αŸ’αž‚αž›αž·αž€ Celery αž“αž·αž„ Angular 8 frontend αŸ”

αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αŸ– αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™, αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αž.

αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αž“αŸƒαž’αžαŸ’αžαž”αž‘ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αžΈαž–αžΈαžš αž™αžΎαž„αž“αžΉαž„αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ†αž‘αžΎαž„ Plesk αž“αž·αž„αžŠαŸ†αž‘αžΎαž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ αž“αž·αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž…αžΆαŸ†αž”αžΆαž…αŸ‹ (DB, RabbitMQ, Redis, Docker αž‡αžΆαžŠαžΎαž˜)αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž‘αžΈαž”αžΈ αž‘αžΈαž”αŸ†αž•αž»αžαž™αžΎαž„αž“αžΉαž„αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžšαŸ€αž”αž…αŸ†αž”αŸ†αž–αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ dev αž“αž·αž„αž•αž›αž·αžαž•αž›αŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž“αžΉαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αž”αžΆαž‘ αžαŸ’αž‰αž»αŸ†αž—αŸ’αž›αŸαž…αžŽαŸ‚αž“αžΆαŸ†αžαŸ’αž›αž½αž“αŸ” αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊ Oleg Borzov αžαŸ’αž‰αž»αŸ†αž‡αžΆαž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž fullstack αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜ CRM αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαžΆαž€αŸ‹αž€αž˜αŸ’αž…αžΈαž“αŸ… Domclick αŸ”

αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžƒαŸ’αž›αžΆαŸ†αž„αž‚αž˜αŸ’αžšαŸ„αž„αž…αŸ†αž“αž½αž“αž–αžΈαžš - αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αž - αž αžΎαž™αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΌαžŠαŸ”

αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ– Flask + Celery

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž™αž€αž”αžŽαŸ’αžαž»αŸ†αžŠαŸ‚αž›αž–αŸαž‰αž“αž·αž™αž˜αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ PythonαŸ– αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ Flask (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ API) αž“αž·αž„ Celery (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αž½αžšαž€αž·αž…αŸ’αž…αž€αžΆαžš) αŸ” SQLAchemy αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆ ORM αŸ” Alembic αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž»αž–αž›αž—αžΆαž– JSON αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž‘αžΆαž‰ - Marshmallow αŸ”

Π’ αžƒαŸ’αž›αžΆαŸ†αž„ αž˜αžΆαž“αž―αž€αžŸαžΆαžš Readme.md αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž“αŸƒαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„αŸ”

Web Part API αžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹, αž˜αžΆαž“ 6 αž”αŸŠαž·αž…:

  • /ping - αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αžΆαž–αž’αžΆαž…αžšαž€αž”αžΆαž“;
  • αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž αž€αžΆαžšαžŠαž€αžŸαž·αž‘αŸ’αž’αž· αž“αž·αž„αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ”
  • αž…αŸ†αžŽαž»αž…αž‘αžΆαž‰αž’αŸŠαžΈαž˜αŸ‚αž›αžŠαŸ‚αž›αžŠαžΆαž€αŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž½αžš Celery αŸ”

αž•αŸ’αž“αŸ‚αž€ Celery αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ 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 - αž•αŸ’αž‰αžΎαž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž’αŸ†αž–αžΈαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹ Telegram αŸ”

αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαž“αŸ…αž›αžΎ Angular

αžƒαŸ’αž›αžΆαŸ†αž„αž‡αžΆαž˜αž½αž™αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αž αžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž„ Beck αŸ” αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαž˜αžΆαž“αž”αžΈαž‘αŸ†αž–αŸαžšαŸ–

  • αž‘αŸ†αž–αŸαžšαž˜αŸαžŠαŸ‚αž›αž˜αžΆαž“αž‘αž˜αŸ’αžšαž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‰αžΎαž’αŸŠαžΈαž˜αŸ‚αž› αž“αž·αž„αž”αŸŠαžΌαžαž»αž„αž…αŸαž‰αŸ”
  • αž‘αŸ†αž–αŸαžšαž…αžΌαž›αŸ”
  • αž‘αŸ†αž–αŸαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αŸ”

αž‘αŸ†αž–αŸαžšβ€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αž˜αžΎαž›β€‹αž‘αŸ…β€‹αž˜αžΆαž“β€‹αž—αžΆαž–β€‹αž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αŸ–

CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular
αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž–αžΈαžšαž“αŸ…αž«αžŸ Dockerfile ΠΈ docker-compose.ymlαž€αŸαžŠαžΌαž…αž‡αžΆαžαžαžŠαŸ‚αž›αž’αŸ’αž›αžΆαž”αŸ‹αžŸαŸ’αž‚αžΆαž›αŸ‹ .ci-cd αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαž·αž…αž‡αžΆαž„αž”αž“αŸ’αžαž·αž…αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αžšαŸ„αž™ (αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ‚αž›αž”αžΆαž“αžŠαž€αž…αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš)αŸ”

αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸ… Plesk

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ 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. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‡αžΆαžœαž“αŸαŸ‡ αž”αž„αŸ’αž€αžΎαž subdomain dev.helloworld.ru (αžŠαŸ‚αž›αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž…αŸαž‰αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš TLS αžŠαŸ„αž™αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž•αž„αžŠαŸ‚αžš)αŸ–

    CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαž˜αžΆαžŸαž—αžΆαž‚αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αž™αžΎαž„αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαž˜αž½αž™ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Debian Stretch 9.12 αž“αž·αž„αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž•αŸ’αž‘αžΆαŸ†αž„αž”αž‰αŸ’αž‡αžΆ Plesk Obsidian 18.0.27.

αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

  • PostgreSQL (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αžΉαž„αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž•αž›αž·αžαž•αž›)αŸ”
  • RabbitMQ (αžŠαžΌαž…αž‚αŸ’αž“αžΆ, αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ vhosts αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“) αŸ”
  • αž€αžšαžŽαžΈ Redis αž–αžΈαžš (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“ dev αž“αž·αž„αž•αž›αž·αžαž•αž›) αŸ”
  • Docker Registry (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αž»αž€αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαžšαžΌαž”αž—αžΆαž– Docker αžŠαŸ‚αž›αž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹)αŸ”
  • UI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž»αŸ‡αž”αž‰αŸ’αž‡αžΈ Docker αŸ”

PostgreSQL

Plesk αž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™ PostgreSQL DBMS αžšαž½αž…αž αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αž„αŸ’αž’αžŸαŸ‹αž‘αŸ (αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžš 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 αž‘αžΎαž„αžœαž·αž‰αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

service postgresql restart

αž™αžΎαž„αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ PostgreSQL αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ dev- αž“αž·αž„ prod-environments αž αžΎαž™αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΌαžœαžŸαž·αž‘αŸ’αž’αž·αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ–

$ 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. αž™αžΎαž„αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž”αžΆαž“αž‘αžΆαž‰αž™αž€ αž αžΎαž™αž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ– αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ’αžšαž€ αž‘αŸ†αž αŸ† RAM αž’αžαž·αž”αžšαž˜αžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€ αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“ αž“αž·αž„αž˜αŸ‰αŸ„αž“αž€αž˜αŸ’αžšαž·αžαžŸαŸ†αž‘αŸαž„αŸ–

    CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

  4. αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž‡αŸ†αž αžΆαž“αž‘αžΈ 2-3 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž»αž„αžαžΊαž“αŸαžš prod αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ– αž…αŸ’αžšαž€ αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž‘αŸ†αž αŸ† RAM αž“αž·αž„αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž€αž˜αŸ’αžšαž·αžαžŸαŸ†αž‘αŸαž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ–

    CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

αž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡ Docker

αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžšαžΌαž”αž—αžΆαž– 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 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ 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
    αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž…αž»αž…αž›αžΎ Browse repositories αž“αŸ„αŸ‡ browser αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž•αŸ’αž‘αžΆαŸ†αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαž αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž› username αž“αž·αž„ password αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ repositoryαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ…αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαžƒαŸ’αž›αžΆαŸ†αž„ (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαž›αž“αŸαŸ‡ αžœαžΆαž“αžΉαž„αž‘αž‘αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€)αŸ–

    CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

αž€αžΆαžšαž”αžΎαž€αž…αŸ’αžšαž€αž“αŸ…αž€αŸ’αž“αž»αž„ Plesk Firewall

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αžΆαžŸαž—αžΆαž‚ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΎαž€αž…αŸ’αžšαž€αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“αž–αžΈ Docker containers αž“αž·αž„αž”αžŽαŸ’αžαžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ…αŸ”

αžαŸ„αŸ‡αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ Firewall αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 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 Actions

αž…αžΌαžšαž™αžΎαž„αž…αž»αŸ‡αž‘αŸ…αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αŸ†αž•αž»αž - αž”αž„αŸ’αž€αžΎαžαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αž”αŸ†αž–αž„αŸ‹αž“αŸαŸ‡αž“αžΉαž„αž˜αžΆαž“αž–αžΈαžšαž•αŸ’αž“αŸ‚αž€αŸ–

  • αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™) - αž“αŸ…αž•αŸ’αž“αŸ‚αž€αžαžΆαž„ Github;
  • αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€ (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™) αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž»αž„αžαžΊαž“αŸαžš - αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ… Plesk

αž…αžΌαžšβ€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž…αŸ†αžŽαž»αž…β€‹αž‘αžΈβ€‹αž–αžΈαžšβ€‹αž‡αžΆβ€‹αž˜αž»αž“β€‹αžŸαž·αž“ (αž–αŸ’αžšαŸ„αŸ‡β€‹αž…αŸ†αžŽαž»αž…β€‹αž‘αžΈβ€‹αž˜αž½αž™β€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αžœαžΆ)αŸ”

αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ Git αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Plesk αŸ”

αž–αž·αž…αžΆαžšαžŽαžΆαž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž˜αž½αž™αž”αžšαž·αžŸαŸ’αžαžΆαž“ Prod αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ Backend αŸ”

  1. αž™αžΎαž„αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž‡αžΆαžœαž‚αŸαž αž‘αŸ†αž–αŸαžš Helloworld αžšαž”αžŸαŸ‹αž™αžΎαž„ αž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αžšαž„ GitαŸ–

    CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

  2. αž”αž‰αŸ’αž…αžΌαž›αžαŸ†αžŽαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„ Github αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› "αžƒαŸ’αž›αžΆαŸ†αž„ Git αž–αžΈαž…αž˜αŸ’αž„αžΆαž™" αž αžΎαž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαžαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ httpdocs αž‘αŸ…αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αž§αŸ” /httpdocs/hw_back):

    CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

  3. αž…αž˜αŸ’αž›αž„αžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆ SSH αž–αžΈαž‡αŸ†αž αžΆαž“αž˜αž»αž“ αž“αž·αž„ αž”αž“αŸ’αžαŸ‚αž˜ αžœαžΆαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ 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 αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„ backend αž“αŸ…αž›αžΎ server;
    {ENV} - αž”αžšαž·αžŸαŸ’αžαžΆαž“ (dev / prod) αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” prod;
    {DOCKER_REGISTRY_HOST} - αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„ docker αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”
    {TG_BOT_TOKEN} - αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹ Telegram bot;
    {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 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ backend αž“αž·αž„ frontend αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αž‘αžΎαž„αžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αž”αŸ†αž–αž„αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αž“αŸƒαž”αŸ†αž–αž„αŸ‹ CI/CD αžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ”

αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ αž―αž€αžŸαžΆαžš deploy.yml.

αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž˜αž»αž“β€‹αž–αŸαž›β€‹αž‰αŸ‚αž€β€‹αžœαžΆ αžŸαžΌαž˜β€‹αž”αŸ†αž–αŸαž‰β€‹αž’αžαŸαžšβ€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž€αŸ’αž“αž»αž„ Github αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ -> αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„:

  • DOCKER_REGISTRY - αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„ Docker αžšαž”αžŸαŸ‹αž™αžΎαž„ (docker.helloworld.ru);
  • DOCKER_LOGIN - αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ Docker;
  • DOCKER_PASSWORD - αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ…αžœαžΆ;
  • DEPLOY_HOST - αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž›αž”αž“αŸ’αž‘αŸ‡αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Plesk αž˜αžΆαž“ (αž§αž‘αžΆαž αžšαžŽαŸαŸ– Helloworld.ru: 8443 ឬ 123.4.56.78αŸ– ៨ៀៀ៣);
  • DEPLOY_BACK_PROD_TOKEN - αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹ prod-repository αž“αŸ…αž›αžΎ server (αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ Deployment in Plesk p. 4);
  • DEPLOY_BACK_DEV_TOKEN - αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ dev αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž˜αžΆαž“αž”αžΈαž‡αŸ†αž αžΆαž“αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αŸ–

  • αž€αžΆαžšαž€αžŸαžΆαž„αž“αž·αž„αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αžšαžΌαž”αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž™αžΎαž„;
  • αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αžαŸ’αž˜αžΈαŸ—αŸ”
  • αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžŸαžΆαžαžΆ (dev/master) αŸ”

Frontend αŸ”

αž―αž€αžŸαžΆαžš deploy.yml αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžαžΆαž„αž˜αž»αž αžαž»αžŸαž‚αŸ’αž“αžΆαž”αž“αŸ’αžαž·αž…αž”αž“αŸ’αžαž½αž…αž–αžΈ Beck's αŸ” αžœαžΆαžαŸ’αžœαŸ‡αž‡αŸ†αž αžΆαž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžαžΆαž„αž˜αž»αžαžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž”αŸ†αž–αŸαž‰αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ”

αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αŸαž αž‘αŸ†αž–αŸαžš

αž…αžšαžΆαž…αžšαž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈαžαžΆαž˜αžšαž™αŸˆ Nginx

αž™αžΎαž„β€‹αž”αžΆαž“β€‹αž˜αž€β€‹αžŠαž›αŸ‹β€‹αž‘αžΈβ€‹αž”αž‰αŸ’αž…αž”αŸ‹β€‹αž αžΎαž™αŸ” αžœαžΆαž“αŸ…αžŸαž›αŸ‹αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈαž“αŸƒαž…αžšαžΆαž…αžšαž…αžΌαž›αž“αž·αž„αž…αŸαž‰αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αžαžΆαž˜αžšαž™αŸˆ Nginx αŸ” αž™αžΎαž„αž”αžΆαž“αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αž‘αžΈ 5 αž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Docker Registry αŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αžŠαŸ‚αžšαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αž“αž·αž„αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ dev αž“αž·αž„αž•αž›αž·αžαž•αž›αŸ”

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ”

CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ Github Actions αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ Flask+Angular

Frontend αŸ”

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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹