Flask+Angular ํ”„๋กœ์ ํŠธ์šฉ Github ์ž‘์—…์˜ CI/CD

Flask+Angular ํ”„๋กœ์ ํŠธ์šฉ Github ์ž‘์—…์˜ CI/CD
์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Plesk ์ œ์–ดํŒ ๋ฐ Github ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ CI/CD๋ฅผ ์„ค์ •ํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๋ณต์žกํ•˜์ง€ ์•Š์€ ์ด๋ฆ„ "Helloworld"๋กœ ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. Celery ์ž‘์—…์ž ๋ฐ Angular 8 ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ํ•จ๊ป˜ Flask Python ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ €์žฅ์†Œ ๋งํฌ: ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ.

์ด ๊ธฐ์‚ฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์™€ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ์—์„œ๋Š” Plesk๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ•„์š”ํ•œ ํ™•์žฅ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ(DB, RabbitMQ, Redis, Docker ๋“ฑ)๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ๋Š” ์ตœ์ข…์ ์œผ๋กœ ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์„œ๋ฒ„์— ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋ฒ„์—์„œ ์‚ฌ์ดํŠธ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„ค, ์ œ ์†Œ๊ฐœ๋ฅผ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ด๋ฆ„์€ Oleg Borzov์ž…๋‹ˆ๋‹ค. ์ €๋Š” Domclick์˜ ๋ชจ๊ธฐ์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์œ„ํ•œ CRM ํŒ€์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

๋จผ์ € ๋ฐฑ์—”๋“œ์™€ ํ”„๋ŸฐํŠธ์˜ ๋‘ ํ”„๋กœ์ ํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ: ํ”Œ๋ผ์Šคํฌ+์…€๋Ÿฌ๋ฆฌ

๋’ท๋ถ€๋ถ„์—์„œ๋Š” Python ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๊ฝค ์ธ๊ธฐ ์žˆ๋Š” Flask ํ”„๋ ˆ์ž„์›Œํฌ(API์šฉ)์™€ Celery(์ž‘์—… ๋Œ€๊ธฐ์—ด์šฉ)๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. SQLAchemy๋Š” ORM์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Alembic์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค์˜ JSON ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ - Marshmallow.

ะ’ ์ €์žฅ์†Œ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ์ง€์นจ์ด ํฌํ•จ๋œ Readme.md ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ํŒŒํŠธ API ๋งค์šฐ ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋ฉฐ 6๊ฐœ์˜ ํŽœ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • /ping - ์ด์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
  • ๋“ฑ๋ก, ์Šน์ธ, ์Šน์ธ ์ทจ์†Œ ๋ฐ ์Šน์ธ๋œ ์‚ฌ์šฉ์ž ํš๋“์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์…€๋Ÿฌ๋ฆฌ ๋Œ€๊ธฐ์—ด์— ์ž‘์—…์„ ๋„ฃ๋Š” ์ด๋ฉ”์ผ ํ•ธ๋“ค.

์…€๋Ÿฌ๋ฆฌ ๋ถ€๋ถ„ ๋” ์‰ฌ์›Œ๋„ ๋ฌธ์ œ๋Š” ํ•˜๋‚˜๋ฟ send_mail_task.

ํด๋”์— /conf ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • docker ๋‘ ๊ฐœ์˜ 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์˜ ํ”„๋ŸฐํŠธ์—”๋“œ

์ „๋ฉด์ด ์žˆ๋Š” ์ €์žฅ์†Œ Beck๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์•ž๋ฉด์€ ์„ธ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ์–‘์‹๊ณผ ์ข…๋ฃŒ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ธฐ๋ณธ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€.
  • ๋“ฑ๋ก ํŽ˜์ด์ง€.

๋ฉ”์ธ ํŽ˜์ด์ง€๋Š” ๊ธˆ์š•์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Flask+Angular ํ”„๋กœ์ ํŠธ์šฉ Github ์ž‘์—…์˜ CI/CD
๋ฃจํŠธ์— ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Dockerfile ะธ docker-compose.yml, ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์นœ์ˆ™ํ•œ ํด๋” .ci-cd ๋ฐฑ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ณด๋‹ค ์•ฝ๊ฐ„ ์ ์€ ์ˆ˜์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์œ„ํ•ด ์ œ๊ฑฐ๋œ ์Šคํฌ๋ฆฝํŠธ).

Plesk์—์„œ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘

Plesk๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ๊ตฌ๋…์„ ์ƒ์„ฑํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜

Plesk์—๋Š” ๋„ค ๊ฐ€์ง€ ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Docker Plesk ๊ด€๋ฆฌ์ž ํŒจ๋„์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด
  • Git ์„œ๋ฒ„์—์„œ ๋ฐฐํฌ ๋‹จ๊ณ„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Let's Encrypt ๋ฌด๋ฃŒ TLS ์ธ์ฆ์„œ ์ƒ์„ฑ(๋ฐ ์ž๋™ ๊ฐฑ์‹ )
  • Firewall ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ํ•„ํ„ฐ๋ง์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„น์…˜์˜ Plesk ๊ด€๋ฆฌ์ž ํŒจ๋„์„ ํ†ตํ•ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Flask+Angular ํ”„๋กœ์ ํŠธ์šฉ Github ์ž‘์—…์˜ CI/CD
ํ™•์žฅ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์„ค์ •์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ ์„ค์ •์€ ๋ฐ๋ชจ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋… ๋ฐ ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ์œผ๋กœ helloworld.ru ์›น์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ๊ตฌ๋…์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— 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 ๋ฐ๋น„์•ˆ ์ŠคํŠธ๋ ˆ์น˜ 9.12 ๊ทธ๋ฆฌ๊ณ  ์„ค์น˜๋œ ์ œ์–ดํŒ ํ”Œ๋ ˆ์Šคํฌ ํ‘์š”์„ 18.0.27.

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์„ค์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • PostgreSQL(์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค).
  • RabbitMQ(ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์ผํ•˜๊ณ  ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค).
  • 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

์…€๋Ÿฌ๋ฆฌ์šฉ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์ธ 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๋กœ ๋‘ ๊ฐœ์˜ 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 ์ด๋ฏธ์ง€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์„œ๋ฒ„์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์„œ๋ฒ„ ๊ณต๊ฐ„์€ ์ด์ œ ๋งค์šฐ ์ €๋ ดํ•˜๊ณ (ํ™•์‹คํžˆ 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์—์„œ Docker ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ธ์ฆ์„ ์œ„ํ•œ .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 ํ•˜์œ„ ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜์—์„œ ๊ฐœ๋ฐœ ๋„๊ตฌ ์šฐ๋ฆฌ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ ๋„์ปค ํ”„๋ก์‹œ ๊ทœ์น™:

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):
    ํ† ๋ผMQ: 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 ์ž‘์—…์—์„œ CI/CD ์„ค์ •

๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ธ ์ง€์†์ ์ธ ํ†ตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Github ์ธก์—์„œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰(๋ฐฑ์—”๋“œ์šฉ)
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰(๋ฐฑ์—”๋“œ์šฉ) ๋ฐ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ - ์„œ๋ฒ„์—์„œ.

Plesk์— ๋ฐฐํฌ

๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋จผ์ € ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด ์ด์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

Plesk์šฉ Git ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ Prod ํ™˜๊ฒฝ์˜ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

  1. Helloworld ์›น ์‚ฌ์ดํŠธ ๊ตฌ๋…์œผ๋กœ ์ด๋™ํ•˜์—ฌ Git ํ•˜์œ„ ์„น์…˜์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Flask+Angular ํ”„๋กœ์ ํŠธ์šฉ Github ์ž‘์—…์˜ CI/CD

  2. Github ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ "์›๊ฒฉ Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ" ํ•„๋“œ์— ์‚ฝ์ž…ํ•˜๊ณ  ๊ธฐ๋ณธ ํด๋”๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. httpdocs ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ (์˜ˆ. /httpdocs/hw_back):

    Flask+Angular ํ”„๋กœ์ ํŠธ์šฉ Github ์ž‘์—…์˜ CI/CD

  3. ์ด์ „ ๋‹จ๊ณ„์—์„œ SSH ๊ณต๊ฐœ ํ‚ค๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋‹ค Github ์„ค์ •์— ์žˆ์Šต๋‹ˆ๋‹ค.
  4. 2๋‹จ๊ณ„ ํ™”๋ฉด์—์„œ ํ™•์ธ์„ ํด๋ฆญํ•˜๋ฉด Plesk์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์ปค๋ฐ‹์—์„œ ์—…๋ฐ์ดํŠธ๋˜๋„๋ก ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ • ๊ทธ๋ฆฌ๊ณ  ๊ฐ’์„ ์ €์žฅ 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} - ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํ™˜๊ฒฝ(dev / prod) prod;
    {DOCKER_REGISTRY_HOST} - ๋„์ปค ์ €์žฅ์†Œ์˜ ํ˜ธ์ŠคํŠธ
    {TG_BOT_TOKEN} โ€” ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡ ํ† ํฐ;
    {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 ์ž‘์—…์˜ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ

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-repository์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ(Plesk์˜ ๋ฐฐํฌ p. 4์—์„œ ์–ป์—ˆ์Œ)
  • DEPLOY_BACK_DEV_TOKEN - ์„œ๋ฒ„์˜ ๊ฐœ๋ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ์ž…๋‹ˆ๋‹ค.

๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ„๋‹จํ•˜๋ฉฐ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ €์žฅ์†Œ์— ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰
  • ๋ธŒ๋žœ์น˜(dev/master)์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ŸฐํŠธ ์—”๋“œ

์ „๋ฉด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์šฉ deploy.yml ํŒŒ์ผ ๋ฒก๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์—†์œผ๋ฉฐ ๋ฐฐํฌ์šฉ ํ† ํฐ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋‚˜์ €๋‚˜ ์ „๋ฉด ์ €์žฅ์†Œ์˜ ๋น„๋ฐ€์€ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ดํŠธ ์„ค์ •

Nginx๋ฅผ ํ†ตํ•œ ํ”„๋ก์‹œ ํŠธ๋ž˜ํ”ฝ

๊ธ€์Ž„, ์šฐ๋ฆฌ๋Š” ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. Nginx๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋กœ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋งŒ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. Docker Registry ์„ค์ •์˜ 5๋‹จ๊ณ„์—์„œ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด๋ฏธ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค. dev ๋ฐ prod ํ™˜๊ฒฝ์—์„œ ํ›„๋ฉด ๋ฐ ์ „๋ฉด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ์Šคํฌ๋ฆฐ ์ƒท์„ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€