Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ 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.
Π
/ping
β Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ;- ΡΡΡΠΊΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ, Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, Π΄Π΅Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ;
- ΡΡΡΠΊΠ° Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ email, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΊΠ»Π°Π΄Π΅Ρ Π·Π°Π΄Π°ΡΠΊΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Celery.
send_mail_task
.
Π ΠΏΠ°ΠΏΠΊΠ΅
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
Π΄Π»Ρ Π΄Π΅ΠΏΠ»ΠΎΡ.
Π ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ Π½Π°ΠΌ ΠΏΠ°ΠΏΠΊΠ° β
deploy.sh
β Π·Π°ΠΏΡΡΠΊ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΡ. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΏΡΠΎΠ³ΠΎΠ½Π° ΡΠ΅ΡΡΠΎΠ² Π² Github Actions;rollback.sh
β ΠΎΡΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ;curl_tg.sh
β ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠΈ Π² Telegram.
Π€ΡΠΎΠ½ΡΠ΅Π½Π΄ Π½Π° Angular
- ΠΠ»Π°Π²Π½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° Ρ ΡΠΎΡΠΌΠΎΠΉ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ email ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Π²ΡΡ ΠΎΠ΄Π°.
- Π‘ΡΡΠ°Π½ΠΈΡΠ° Π²Ρ ΠΎΠ΄Π°.
- Π‘ΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ.
ΠΠ»Π°Π²Π½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π°ΡΠΊΠ΅ΡΠΈΡΠ½ΠΎ:
Π ΠΊΠΎΡΠ½Π΅ Π»Π΅ΠΆΠ°Ρ Π΄Π²Π° ΡΠ°ΠΉΠ»Π° Dockerfile
ΠΈ docker-compose.yml
, Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠ°Ρ Π½Π°ΠΌ ΠΏΠ°ΠΏΠΊΠ° .ci-cd
Ρ ΡΡΡΡ ΠΌΠ΅Π½ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΊΡΠΈΠΏΡΠΎΠ², ΡΠ΅ΠΌ Π² Π±ΡΠΊΠΎΠ²ΡΠΊΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ (ΡΠ±ΡΠ°Π½Ρ ΡΠΊΡΠΈΠΏΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠΎΠ²).
ΠΠ°Π²ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡ Π² Plesk
ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Plesk ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ°.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ
Π Plesk Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ ΡΠ΅ΡΡΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ:
Docker
Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ Plesk;Git
Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ°Π³Π° Π΄Π΅ΠΏΠ»ΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅;Let's Encrypt
Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ (ΠΈ Π°Π²ΡΠΎΠΏΡΠΎΠ΄Π»Π΅Π½ΠΈΡ) Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ TLS-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²;Firewall
Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ°.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π· Π°Π΄ΠΌΠΈΠ½ΠΊΡ Plesk Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Extensions:
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, Π΄Π»Ρ Π½Π°ΡΠΈΡ
Π΄Π΅ΠΌΠΎ-ΡΠ΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ ΠΈ ΡΠ°ΠΉΡΠ°
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° helloworld.ru ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ΄Π° ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ dev.helloworld.ru.
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π΄Π»Ρ Π΄ΠΎΠΌΠ΅Π½Π° helloworld.ru ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π»ΠΎΠ³ΠΈΠ½-ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
ΠΠ½ΠΈΠ·Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΡΡΠ°Π²ΠΈΠΌ Π³Π°Π»ΠΎΡΠΊΡ Secure the domain with Let’s Encrypt, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠΈΠΌ Π½Π°ΡΡΡΠΎΠΈΡΡ HTTPS Π΄Π»Ρ ΡΠ°ΠΉΡΠ°: - ΠΠ°Π»Π΅Π΅ Π² ΡΡΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ dev.helloworld.ru (Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΡΡΡΠΈΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ TLS-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ):
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
Π£ Π½Π°Ρ Π² Π½Π°Π»ΠΈΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅Ρ Ρ 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 Π½Π° 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.
- ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² Plesk, ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠ°Π·Π΄Π΅Π» Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΈΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Docker ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ (Π½Π°ΠΌ Π½ΡΠΆΠ½Π° Π±Π΅ΡΠΏΠ»Π°ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ):
- ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅, Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠΈΡΠΊ ΠΎΠ±ΡΠ°Π·
redis bitnami
ΠΈ ΡΡΠ°Π²ΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ: - ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠΊΠ°ΡΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ: ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΏΠΎΡΡ, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΠΠ£, ΠΏΠ°ΡΠΎΠ»Ρ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΈ ΠΌΠΎΠ½ΡΠΈΡΡΠ΅ΠΌ ΡΠΎΠΌ:
- ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠ°Π³ΠΈ 2-3 Π΄Π»Ρ prod-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ: ΠΏΠΎΡΡ, ΠΏΠ°ΡΠΎΠ»Ρ, ΡΠ°Π·ΠΌΠ΅Ρ ΠΠΠ£ ΠΈ ΠΏΡΡΡ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ volume Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅:
Docker Registry
ΠΠΎΠΌΠΈΠΌΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ². ΠΠ»Π°Π³ΠΎ ΠΌΠ΅ΡΡΠΎ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ ΡΠ΅ΠΉΡΠ°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎΠ΅ (ΡΠΆ ΡΠΎΡΠ½ΠΎ Π΄Π΅ΡΠ΅Π²Π»Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π° DockerHub), Π΄Π° ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡ.
ΠΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Ρ Π½Π°Ρ Π±ΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ:
- Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ Docker-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ ΠΏΠΎ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Ρ
https://docker.helloworld.ru ; - UI-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΎΠ±ΡΠ°Π·ΠΎΠ² Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ
https://docker-ui.helloworld.ru .
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ:
- Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π² Plesk Π΄Π²Π° ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Π° Π² Π½Π°ΡΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ΅: docker.helloworld.ru ΠΈ docker-ui.helloworld.ru, ΠΈ Π½Π°ΡΡΡΠΎΠΈΠΌ Π΄Π»Ρ Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ Letβs Encrypt.
- Π ΠΏΠ°ΠΏΠΊΡ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Π° 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'
- ΠΠΎΠ΄ SSH ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» .htpasswd Π΄Π»Ρ Basic-Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π² Docker-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ:
htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
- Π‘ΠΎΠ±Π΅ΡΠ΅ΠΌ ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ:
docker-compose up -d
- Π Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ Nginx Π½Π° Π½Π°ΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· Plesk.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ΄Π΅Π»Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² docker.helloworld.ru ΠΈ docker-ui.helloworld.ru:
Π ΡΠ°Π·Π΄Π΅Π»Π΅ Dev Tools Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° Π·Π°Ρ ΠΎΠ΄ΠΈΠΌ Π² Docker Proxy Rules:
Π Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ° Π² Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ:
- ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°ΡΡΡΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ:
$ 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
- Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Π° docker-ui.helloworld.ru:
ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° Browse repositories Π±ΡΠ°ΡΠ·Π΅Ρ Π²ΡΠ΄Π°ΡΡ ΠΎΠΊΠΎΡΠΊΠΎ Π΄Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΡΠ΄Π° Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π²Π²Π΅ΡΡΠΈ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΊΠΈΠ½Π΅Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² (Ρ Π²Π°Ρ ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΏΡΡΡΠΎΠΉ):
ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΡΡΡ Π² Plesk Firewall
ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ ΠΏΠΎΡΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π±ΡΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈΠ· Docker-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΈ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠ΅ΡΠΈ.
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ ΡΠ°Π½Π΅Π΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Firewall Π΄Π»Ρ Plesk.
- ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² Tools & Settings > Settings > Firewall:
- ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² 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 - Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΠΊΡΠΎΠ΅Ρ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΌΠΈΡΡ ΠΏΠΎΡΡΡ PostgreSQL ΠΈ management-ΠΏΠ°Π½Π΅Π»ΠΈ RabbitMQ:
- ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Apply Changes:
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° CI/CD Π² Github Actions
ΠΡΠΈΡΡΡΠΏΠΈΠΌ ΠΊ ΡΠ°ΠΌΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ β Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΄ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΡΠΎΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ:
- ΡΠ±ΠΎΡΠΊΠ° ΠΎΠ±ΡΠ°Π·Π° ΠΈ ΠΏΡΠΎΠ³ΠΎΠ½ ΡΠ΅ΡΡΠΎΠ² (Π΄Π»Ρ Π±ΡΠΊΠ΅Π½Π΄Π°) β Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Github;
- Π·Π°ΠΏΡΡΠΊ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΉ (Π΄Π»Ρ Π±ΡΠΊΠ΅Π½Π΄Π°) ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² β Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
ΠΠ΅ΠΏΠ»ΠΎΠΉ Π² Plesk
Π Π°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎ Π²ΡΠΎΡΡΠΌ ΠΏΡΠ½ΠΊΡΠΎΠΌ (Ρ.ΠΊ. ΠΎΡ Π½Π΅Π³ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ²ΡΠΉ).
ΠΡΠΎΡΠ΅ΡΡ Π΄Π΅ΠΏΠ»ΠΎΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Git Π΄Π»Ρ Plesk.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Ρ Prod ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ Backend ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
- ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° Helloworld ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π» Git:
- ΠΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π² ΠΏΠΎΠ»Π΅ Β«Remote Git repositoryΒ» ΡΡΡΠ»ΠΊΡ Π½Π° Π½Π°Ρ Github-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈ ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
httpdocs
Π½Π° Π΄ΡΡΠ³ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,/httpdocs/hw_back
): - ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ SSH Public key Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΡΠ°ΠΏΠ° ΠΈ
Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ Github. - ΠΠ°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΠ Π½Π° ΡΠΊΡΠ°Π½Π΅ Π² ΠΏΡΠ½ΠΊΡΠ΅ 2, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΊΠΈΠ΄ΡΠ²Π°Π΅Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² Plesk. Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΡΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ°Ρ
Π² Π²Π΅ΡΠΊΡ master. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² Repository Settings ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Webhook URL
(ΠΎΠ½ΠΎ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Github Actions): - Π ΠΏΠΎΠ»Π΅ 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
- ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π² Π³ΡΡΠΏΠΏΡ Docker (ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΌΠΎΠ³ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ):
sudo usermod -aG docker helloworld_admin
Dev-ΡΡΠ΅Π΄Π° Π΄Π»Ρ backend-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ frontend Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ.
Pipeline Π΄Π΅ΠΏΠ»ΠΎΡ Π² Github Actions
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ Π½Π°ΡΠ΅Π³ΠΎ CI/CD-ΠΏΠ°ΠΉΠΏΠ»Π°Π½Π° Π² Github Actions.
Backend
ΠΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π²
ΠΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π΅Π³ΠΎ ΡΠ°Π·Π±ΠΎΡΠΎΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π² 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
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ°ΠΉΡΠ°
ΠΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΊΠ° ΡΠ΅ΡΠ΅Π· Nginx
ΠΡ ΡΡΠΎ ΠΆ, ΠΌΡ ΠΏΠΎΠ΄ΠΎΡΠ»ΠΈ ΠΊ ΠΊΠΎΠ½ΡΡ. ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΈ ΠΈΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΡΠ°ΡΠΈΠΊΠ° Π² Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ΅ΡΠ΅Π· Nginx. ΠΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΡ ΡΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π² ΠΏΡΠ½ΠΊΡΠ΅ 5 Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Docker Registry. Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π΄Π»Ρ Π±ΡΠΊ- ΠΈ ΡΡΠΎΠ½Ρ-ΡΠ°ΡΡΠΈ Π² dev- ΠΈ prod-ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΡ .
ΠΡΠΈΠ²Π΅Π΄Ρ ΡΠΊΡΠΈΠ½Ρ Π½Π°ΡΡΡΠΎΠ΅ΠΊ.
Backend
Frontend
ΠΠ°ΠΆΠ½ΠΎΠ΅ ΡΡΠΎΡΠ½Π΅Π½ΠΈΠ΅. ΠΠΎ ΡΡΠΎΠ½ΡΠ΅Π½Π΄-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π²ΡΠ΅ URL, ΠΊΡΠΎΠΌΠ΅ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ
ΡΡ Π½Π° /api/
β ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ Π² Π±ΡΠΊ-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (ΠΏΠΎΡΡΠΎΠΌΡ Π² Π±ΡΠΊ-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ /api/
).
ΠΡΠΎΠ³ΠΈ
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°Ρ ΡΠ°ΠΉΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΠ°ΠΌ helloworld.ru ΠΈ dev.helloworld.ru (prod- ΠΈ dev-ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ).
ΠΡΠΎΠ³ΠΎ, ΠΌΡ ΡΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Flask ΠΈ Angular ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ Π² Github Actions ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π΄Π»Ρ Π΅Π³ΠΎ Π²ΡΠΊΠ°ΡΠΊΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Plesk.
ΠΡΠΎΠ΄ΡΠ±Π»ΠΈΡΡΡ ΡΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Ρ ΠΊΠΎΠ΄ΠΎΠΌ:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com