๋ฆฌ๋ ์ค ์ปจํ ์ด๋์ ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ ๊ธฐ์ ์ ์ฌ์ฉํด ์ปจํ ์ด๋๋ก์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด์ง ์คํ์์ค ํ๋ก์ ํธ
๊ธฐ์กด ๊ฐ์ํ ๊ธฐ์
๋์ปค ์ปจํ ์ด๋
๋์ปค ์ฌ์ฉ ์ => ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ๊ณผ์ ์ ํธ๋ฆฌ์ฑ! ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฆฝ์ฑ๊ณผ ํ์ฅ์ฑ!
๊นํ๋ธ ์ ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํํธ์จ์ด ๊ฐ๋ฐ Workflow๋ฅผ ์๋ํ ํ๋ CI/CD ๋๊ตฌ
์ฅ์
๋จ์
๊นํ๋ธ ์ก์ ์ ์ด์ฉํ Docker Image Build ๋ฐ Push
ํ๊ฒฝ
docker
docker-compose
nginx
gunicorn
mysql
python3.8
django(>=3.0)
nginx๋ ๋์์ ์ ์ฒ๋ฆฌ์ ํนํ๋ ์น ์๋ฒ ํ๋ก๊ทธ๋จ์ผ๋ก, Apache๋ณด๋ค ๋์์ด ๋จ์ํ๊ณ ์ ๋ฌ์ ์ญํ ๋ง ํ๋ค.
gunicorn์ Python WSGI(Web Server Gateway Interface)๋ก python์ผ๋ก ์์ฑ๋ ์น ์ดํ๋ฆฌ์ผ์ด์
๊ณผ ์๋ฒ ์ฌ์ด์ ์ธํฐํ์ด์ค ๋๋ ๊ท์น์ด๋ค.
nginx๋ ์ฌ๋ฌ๊ฐ์ ์์ฒญ์ ๋์์ ๋ฐ์์ ๋, ์ ์ ํ์ผ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ๋ก ๋๋ ค์ฃผ๊ณ ๋์ ํ์ผ์ gunicorn์ ๊ฑฐ์ณ django์๊ฒ ์์ฒญ์ ๋๊ธด๋ค.
๊ณผ์
.env
ํ์ผ์ ์์์ ์ฅ๊ณ ์ํฌ๋ฆฟ ํค๋ฅผ ์์ฑํด ์
๋ ฅํ๋ค.
Dockerfile
ํ์ผ์ ํตํด ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค. ์ด๋ฅผ ํตํด ์์ฝ๊ฒ ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ณตํด์ ๋ง๋ค ์ ์๋ค.
docker-compose.yml
ํ์ผ๋ก ๋
๋ฆฝ๋ ์ปจํ
์ด๋์ ์คํ ์ต์
์ ์ ์ํ๋ค.
docker-compose up
์ปค๋งจ๋๋ฅผ ํตํด ์ปจํ
์ด๋๋ฅผ ๊ฐ์ํ๋ค.
.env.prod
ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDS) ๋ฐ EC2 ip ์ฃผ์, ์ฅ๊ณ ์ํฌ๋ฆฟ ํค ๋ฑ์ ์
๋ ฅํ๋ค.
Github Secrets-Actions์ .env.prod
, EC2 ์๋ฒ ํผ๋ธ๋ฆญ DNS(IPv4) ์ฃผ์, ssh key (.pem) ์ ๋ฌธ์ ์ค์ ํ๋ค.
Actions ํญ์์ ์คํํ๊ฑฐ๋ master์ push ํ ๋ค ์ ์ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด Github Actions ๋๋ EC2 DNS ์ฃผ์์์ ๋ฐฐํฌ๊ฐ ์๋ฃ๋์์์ ํ์ธํ ์ ์๋ค.
๋ฌธ์ ๋ฐ์ ๋ฐ ํด๊ฒฐ
์ดํ์ ๋๋น ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ค .env
ํ์ผ๊ณผ .env.prod
ํ์ผ์ ๋์ผํ๊ฒ ์ทจ๊ธํ๋ค. ๋ ํ์ผ์ด ๊ณต์ ๊ฐ ๋๋ค๊ณ ์๊ฐํ ๊ฒ์ด๋ค.
๊ทธ๋์ prod ํ์ผ์ ๋๋น์ ๊ดํ ์ ๋ณด๋ค์ ์ ๋ถ ์ง์ด๋ฃ๊ณ ๋๋ค๊ณ ์๊ฐํ๋๋ฐ, KeyError๊ฐ ๊ณ์ ๋ฐ์ํ๋ค.
ํค ์์ฒด๊ฐ ํ๋ฆฐ์ค์๊ณ ๋ช ๋ฒ ๊ฐ์ ๊ณ ์ณ์ ๋ฃ์ด๋ณด๊ธฐ๋ ํ์ง๋ง ์๋์๋ค. ๊ทธ๋ฅ .env
ํ์ผ์ ์๊ธฐ ๋๋ฌธ์ ์ธ์๋๋ ํค ๊ฐ ์์ฒด๊ฐ ์์๋ ๊ฒ์ด๋ค.