-
Notifications
You must be signed in to change notification settings - Fork 2
๐ CICD ๊ตฌ์กฐ ์์
์ ์ฅ ๊ณต๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๊ธฐ์กด ncloud ์๋ฒ์์
์น ์๋ฒ๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด์๋ ๋ถํ์ํ ๋ฆฌ์์ค๋ฅผ ์ค์ฌ์ผ ํ๋ค.
๊ธฐ์กด์๋ GitHub Actions์์ ncloud ์๋ฒ์ ์ ๊ทผํ์ฌ,
์ ์ฅ๋ git local storage์์ git pull ์ ์งํํ๋ค.
์ดํ์ ํ๋ก์ ํธ๋ฅผ ๋์ปค ํ์ผ๋ก ๋น๋ ๋ฐ ์คํํ๋ค.
ํ์ง๋ง, ๋์ปค ํ์ผ์ ์ฅ์ ์ ์ด๋ฏธ์ง๋ง ๊ฐ์ง๊ณ ์ด๋ ํ๊ฒฝ์์๋ ์คํ์ํฌ ์ ์๋ค๋ ๊ฒ์ด๊ณ ,
์ด์ ๊น์ง ๊ทธ ์ฅ์ ์ ํ์ฉํ์ง ๋ชปํ๋ค๊ณ ์๊ฐ๋์ด ๊ตฌ์กฐ๋ฅผ ์์ ํ๊ฒ ๋์๋ค.
์ฐ์ ๋์ปค ์ด๋ฏธ์ง๋ก ๋น๋ํ๋ ์ญํ ์ GitHub Actions์ ๋ถ๋ฐฐํ๊ธฐ๋ก ํ๋ค.
- ์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ ncloud ์๋ฒ์ github ํ๋ก์ ํธ ํ์ผ์ ์ ์ฅํ์ง ์์๋ ๋๋ค.
์์๊ฐ์ด ํ์ ๋, GitHub Actions์์๋ ํ๋ก์ ํธ๋ฅผ ๋ถ๋ฌ์์ docker ์ด๋ฏธ์ง๋ก ๋น๋ํ๊ณ ,
Docker Hub์ pushํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
ncloud ์๋ฒ์์๋ Docker Hub์์ ์ต์ ์ด๋ฏธ์ง๋ฅผ pullํ๊ณ ์ ์ฅ๋ compose ํ์ผ์ ์คํ์์ผ์ผ ํ๋ค.
- ๋ชจ๋ ธ๋ ํฌ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ ์ด๋ฏธ์ง๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค.
- ๋ ์ด๋ฏธ์ง๋ฅผ ํจ๊ป ์คํํ๊ธฐ ์ํด compose๋ก ๊ด๋ฆฌ๋๊ณ ์๋ค.
Docker Hub์ Docker Image ์ฌ๋ฆฌ๊ธฐ
์ ์ฌ์ง์๋์ปค compose ํ์ผ์ ์คํ์ํค๊ณ ๋ฌ ๋ก๊ทธ์ด๋ค.
์ด ๋ก๊ทธ์์ 6379
ํฌํธ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋ณด๊ณ redis ์ฐ๊ฒฐ์ด ์๋์ด์๋ ๊ฒ์ ์ ์ ์์๋ค.
redis ์ฐ๊ฒฐ์ ํ๊ธฐ ์ํด์๋ .env ์ค์ ์ด ํ์ํ๋ค.
๊นํ๋ธ ์ ์ฅ์์๋ .env ํ์ผ์ด ๋ค์ด๊ฐ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฒ์ .env ํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ ,
๊ฐ์ง๊ณ ์๋ ์ด๋ฏธ์ง๊ฐ .env ํ์ผ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
๊ฒ์ํด๋ณธ ๊ฒฐ๊ณผ, env_file ์ด๋ผ๋ ์ต์
์ ํตํด์ .env ํ์ผ์ ๋งคํ์์ผ์ค ์ ์์๋ค.
๊ทธ๋ ๊ฒ ncloud ์๋ฒ์ server.env์ client.env ํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ ,
๊ฐ ์ด๋ฏธ์ง์ ๋ง๊ฒ .env ํ์ผ์ ๊ฐ์ง๋๋ก ์ค์ ํ๋ค.
server-green:
image: "rdyjun/inear-server:latest"
container_name: server-green
expose:
- '3000'
env_file:
- ./server.env # ์ด ๋ถ๋ถ
environment:
- NODE_ENV=development
networks:
- webapp
# healthcheck ์์ ์ ๊ฑฐ
restart: unless-stopped
client:
image: "rdyjun/inear-client:latest"
container_name: client
expose:
- '5173'
env_file:
- ./client.env # ์ด ๋ถ๋ถ
environment:
- NODE_ENV=development
networks:
- webapp
restart: unless-stopped
์ ์ค์ ์ ํตํ ๊ฒฐ๊ณผ๋โฆ
ํจ๊ณผ๋ ๋๋จํ๋ค!
redis ์ฐ๊ฒฐ์ด ์ ์ด๋ฃจ์ด์ ธ ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์๋ค.
์ ์ ๋ณด์ ๊ฐ์ด ์๋ฒ๊ฐ ์ ๋๋ก ์คํ๋๊ณ ์์์๋ ์ค์ ์๋ฒ์ ์ ์์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์์ธํ ๋ณด๋, react-router-dom
์ด ์ ๋๋ก ์ค์น๋์ง ์์ ๋ฌธ์ ๋ก ๋ณด์ธ๋ค.
์๊ฐํด๋ณด๋, ์ด์ (24.11.15) ์ด ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ , ํด๊ฒฐํ๊ธฐ ์ํ ๋ธ๋์น๋ฅผ mergeํ๋ค.
๊ทธ๋์ ์ด ๋ฌธ์ ์ ๋ํด์๋ dev ๋ธ๋์น๋ฅผ merge ํ๊ณ ๋ค์ ํด๋ณด๋ฉด ๊ด์ฐฎ์์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์๊น ์์๋ ์ค๋ฅ๋ ์์ด์ก๋ค.
์ง๊ธ ๋ณด์ด๋ ํ๋ฉด์์๋ ๋ฌธ์ ์์ด nginx, react, nest๊ฐ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๋น์์๋ ์น ๋ธ๋ผ์ฐ์ ์ ๊ทผ์ด ๋ ์ค ์์๋คโฆ
ํ์ง๋ง ์ด๊น์์ด cloudflare์ Error ํ์ด์ง๋ง ๋ณด์๋ค..
์์ธ์ด ๋ญ๊น๋ฅผ ๊ณ ๋ฏผํด๋ดค๋ค.
- server ๋๋ client ํ๋ก์ ํธ๊ฐ ์๋ชป๋๋ค
- ์ด๊ฑด ๋ด๊ฐ ๋ณด๊ธฐ์ ์๋์๋ค.
- ๋ก๊ทธ๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐฉํ๋ฒฝ?
- ๋ฐฐํฌ ๋ฐฉ์์ ๋ฐ๊พธ๊ธฐ ์ ์๋ ์ ์ ์๋๋ ๊ฒ์ ์๊ฐํด๋ณด๋ฉด, ๋ฐฉํ๋ฒฝ์ ์์ธ์ด ์๋๋ค.
- ๊ทธ๋ผ nginx๊ฐ ๋ฌธ์ ์ธ๊ฐ?
- ๊ทธ๋ ๋ค. nginx๊ฐ ๋ฌธ์ ์๋ค.
๊ฐ์ฅ ๋จผ์ ์ด ๋ฌธ์ ๋ฅผ ์ดํดํ ์ ์์ด์ GPT์๊ฒ ์ง๋ฌธํ๋ค.
docker ps ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๊ณ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ฌ๋ผ๊ณ ํ๋๋,
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f3f397d0de4 rdyjun/inear-nginx:latest "/docker-entrypoint.โฆ" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp nginx
24dd46260274 rdyjun/inear-server:latest "docker-entrypoint.sโฆ" 5 seconds ago Up 4 seconds 3000/tcp server-green
4c464b8d4863 rdyjun/inear-client:latest "docker-entrypoint.sโฆ" 37 minutes ago Up 4 seconds 5173/tcp client
์ ๋ฌธ์ฅ์์ PORTS๋ฅผ ๋ณด๊ณ ํธ์คํธ์ ๋ ธ์ถ๋์ง ์์ ์ํ๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆฌํ์ฌ docker-compose.yml ํ์ผ์ expose๋ฅผ ์ง์ฐ๊ณ ports: 3000:3000๊ณผ ports: 5173:5173์ ์ถ๊ฐํ๋ค.
์ฌ์ ํ ์๋ํ์ง ์์๋ค.
์ด ๋ถ๋ถ์ ์์ด์๋ ๋ฐฐํฌ ๋ฐฉ์์ ์์ ํ๊ธฐ ์ ์๋ ์ด ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ์๊ธฐ์, ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ๋ค์ ๋๋ ค ๋์๋ค.
๊ทธ๋ฌ๋ฉด ๋๋์ฒด ๋ญ๊ฐ ๋ฌธ์ ์ง?
์ด๋ฐ์ ๋ฐ ์์
์ ํด๋ณด๋ ค๊ณ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ ์ค์ ls๋ฅผ ์
๋ ฅํ๊ฒ ๋์๋ค.
๊ทธ๋ฐ๋ฐ, ์๋ ์์๋ nginx ํ์ผ์ด ์๊ฒผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ฒ ์๋ ์ ์ฅ์์ ๊ธฐ๋กํ nginx ํ์ผ์ ๋ฎ์ด์์๋ณด๋ฉด ์ด๋จ๊น๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋โฆ ์ฑ๊ณตํ๋ค..!
Dockerfile ๋ด๋ถ์ COPY nginx.conf๋ง ์์ฑ๋์ด์๋ ๊ฒ์ ํ์ธํ๋ค.
FROM nginx:alpine
COPY nginx.conf
nginx.conf๋ ์ด๋ฏธ์ง์์ ๊ฐ์ง๊ณ ์์ง๋ง, conf.d/default.conf
๊ฐ ๋๋ฝ๋์ด ๊ทธ๋ฐ ๋ฌธ์ ์๋ค.
docker compose๋ฅผ ํ์ธํด๋ณด๋ ์๋์ ๊ฐ์ด
๋ก์ปฌ์ ./nginx/conf.d
๋ฅผ ์ด๋ฏธ์ง์ ๊ฐ์ ธ์, /etc/nginx/conf.d:ro
์ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
์ด๋ฌํ ์์ธ์ผ๋ก test ๋๋ ํ ๋ฆฌ์ nginx ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์๊ณ ,
/etc/nginx/conf.d/default.conf
๊ฐ ์ด๊ธฐํ๋์ด ์ ๋๋ก nginx๊ฐ ์ญํ ์ ์ํํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
์ด ๋ด์ฉ์ ๋ํ ์ฆ๋ช
์, ๊ธฐ์กด nginx/conf.d/default.conf
ํ์ผ์ ๊ทธ๋๋ก test ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌํ๊ณ ,
docker compose๋ฅผ ์คํ์ํจ ๊ฒฐ๊ณผ๋ก ๋ณผ ์ ์์๋ค.
๊ฒฐ๊ณผ๋ ์ ๋๋ก ํ์ด์ง๊ฐ ๋์ค๊ฒ ๋์๋ค.
๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ํด์ ์๋ฒ ์ด๋ฏธ์ง๋ ๊ทธ๋ฆฐ/๋ธ๋ฃจ ๋ฐฐํฌ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฐ๋ฐ ํด๋ผ์ด์ธํธ๋? ํด๋ผ์ด์ธํธ๋ ๋๊ฐ์ด ๊ทธ๋ฆฐ/๋ธ๋ฃจ ๋ฐฐํฌ ๋ฐฉ์์ฒ๋ผ
5173/5174๋ก ๋๋์ด์ ๋ฐฐํฌํด์ผ ํ๋ค.
๋ฌผ๋ก ํด๋ผ์ด์ธํธ ํน์ฑ์ ๊ผญ ๊ทธ๋ฆฐ/๋ธ๋ฃจ๋ก ๋๋์ง ์์๋ ๋๋ค.
GitHub Actions์์ buildํ ํด๋ผ์ด์ธํธ ํ์ผ์ ์๋ฒ๋ก ๋ณต์ฌํ๊ณ ,
ํด๋น ํ์ผ์ด nginx์์ ์ ์ ํ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋ค๋ง, ์ด ๋ฐฉ์์ ์ฌ์ฉํ์ ๋์ ๋ฌธ์ ์ ์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ด๋ค.
์ฐ์ ์ ๊ฐ๋ฅํ ์ปค๋ฐ ๋ฒ์ ์ ๋ง์ถ์ด ๋กค๋ฐฑํ ์ ์๋๋ก
ํด๋ผ์ด์ธํธ ํ๋ก์ ํธ ํ์ผ๋ 5173 / 5174๋ก ํฌํธ๋ฅผ ๋ฐ๊พธ์ด ์งํํด๋ณผ ๊ณํ์ด๋ค.
์๋ฒ๋ฅผ 3001๋ฒ ํฌํธ๋ก ์คํํ๋ ค๊ณ deploy.sh์ ์๋ฒ env ํ์ผ์ PORT:3000์ PORT:3001๋ก ๋ฐ๊พธ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฐ๋ฐ, PORT:๋ฅผ ํ์ฑํ๋ ๊ณผ์ ์์ REDIS_PORT:๋ ํ์ฑ๋์ด ํฌํธ๊ฐ ๋ฐ๋๋ ๋ฌธ์ ๊ฐ ์์๋ค ํํ;;
์ดํ ๊ณผ์ ์์ PORT๋ฅผ ๋ฐ๊พธ์ด์ ์คํํ์ง ์์๋ ๋์ด์ ์ด ๋ถ๋ถ์ด ์ ๊ฑฐ๋์๊ณ , ๊ฒฐ๊ตญ ํด๊ฒฐ๋์๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ๊ทธ๋ฆฐ/๋ธ๋ฃจ๋ก ๋์ฐ๋ ค๋ฉด, ์๋ก ๋ค๋ฅธ ํฌํธ๋ก ์คํํด์ผ ํ๋ค.
๊ทธ ์ด์ ๋ ์ด๋ฏธ ํ ์๋ฒ๊ฐ ์คํ์ค์ธ ์ํ์์ ๋์์ ๋ค๋ฅธ ์๋ฒ๋ฅผ ๋์ฐ๊ณ ,
ํธ๋ํฝ์ ์ฎ๊ธฐ๊ณ , ํธ๋ํฝ์ด ์ฎ๊ฒจ์ก์ ๋, ๊ธฐ์กด ์๋ฒ๋ฅผ ์ข
๋ฃํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ง๊ธ์ ๊ตฌ์กฐ์์๋ ์๋ฒ๊ฐ 3000ํฌํธ์ด๊ณ , ํด๋ผ์ด์ธํธ๊ฐ 5173 ํฌํธ๋ฅผ ์ด๋ค.
๊ทธ๋์ 1์ฉ ๋ํ 3001, 5174๋ฅผ ์ฐ๋ ค๊ณ ํ๋ค.
๋ค๋ง, ์ฌ๊ธฐ์์ ๋ฌธ์ ๊ฐ server์์๋ .env์์ PORT:3000
, PORT:3001
๊ณผ ๊ฐ์ด ์์ ํด์
์คํํ๋ฉด ํด๋น ํฌํธ๋ก ์คํ์ด ๋์ง๋ง, ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ์ง์ ํฌํจ๋์ด์๋ ์ค์ ํ์ผ๋ค์ ๊ฑด๋๋ ค์ผ ํ๋คโฆ.
๊ทธ๋ฆฌํ์ฌ ์๋ฒ์ ๊ฐ์ด PORT ๋ฒํธ๋ฅผ ์์ ํ์ง ์๊ณ , ๋์ปค ์ปจํ
์ด๋์ ์ธ๋ถ ํฌํธ, ๋ด๋ถ ํฌํธ๋ฅผ ๊ฑด๋๋ ค ๋ณด๊ธฐ๋ก ํ๋ค.
docker-compose ํ์ผ์ ์ต์
์ผ๋ก expose
์ ports
๊ฐ ์์๋ค.
expose๋ ์ปจํ
์ด๋๊ฐ ์ฐ๊ฒฐํ๊ธฐ ์ํ ํฌํธ์ด๊ณ
ports๋ ์ค์ ์ธ๋ถ์์ ์ ๊ทผํ ํฌํธ๋ฅผ ์ค์ ํ ์ ์์๋ค.
์ฐ์ ์ nginx์๋ง ์ํตํด์ผ ํ๊ธฐ ๋๋ฌธ์ ports๋ ๊ฑด๋๋ฆฌ์ง ์๊ธฐ๋ก ํ๋ค.
๊ทธ๋ ๊ฒ expose์์ 5174:5173์ ์๋ํด๋ดค๋ค.
nginx์ client port ์ค์ ์ ๋ฐ๊ฟ์คฌ์์๋ bad gateway๊ฐ ๋์๋ค.
์ด ๋ถ๋ถ์ ports์ ์ ์ฉํด๋ ๋ง์ฐฌ๊ฐ์ง์๋ค.
์ ์๋์์์ ๋ฌธ์ ์ ์ expose๋ port:port ๊ตฌ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
port:port ๊ตฌ์กฐ์์์ ์ port๋ ํธ์คํธ(๋ฌผ๋ฆฌ ์ปดํจํฐ)๊ฐ ์ธ๋ถ์ ์ด์ด๋๋ ํฌํธ์ด๊ณ
๋ค์ port๊ฐ ๋ด๋ถ 3000๋ฒ ํฌํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ตฌ์กฐ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๋ฐฉ์์ ์ค๋ ์๊ฐ ๋์ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ธ์งํ๋คโฆ
๋ค๋ง, ๊ณ์ํด์ ํ๋ค๋ณด๋ ํ ๊ฐ์ง ๊นจ๋ฌ์ ๊ฒ์ด ์์๋ค.
๊ฐ ์ปจํ
์ด๋๊ฐ ์๋ก ๋ค๋ฅธ ํฌํธ๊ฐ ์๋์ด๋ ๋๋ค๋ ์ฌ์ค์ด๋ค.
์ด ์ฌ์ค์ ์๊ณ ํด๊ฒฐํ ์ ์๋ค๋ ์๋๊ฐ๊ณผ ์ด์ ์์ผ ์์๋ค๋ ์๊ดด๊ฐ์ ๋๊ผ์ง๋ง
์๊ฐ์ด ์๊ธฐ์ ๋น ๋ฅด๊ฒ ์ ์ฉํด๋ดค๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก client-blue, client-green, server-blue, server-green 4๊ฐ์ ์ปจํ
์ด๋๋ฅผ ๊ฐ๊ฐ
3000ํฌํธ์ 5173 ํฌํธ๋ก ์ด ์ ์์๋คโฆ ๐
์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋, ๊ฐ ์ปจํ
์ด๋๊ฐ ๋ค์์คํ์ด์ค๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ํฌํธ๊ฐ ์ถฉ๋๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ฒ ์๋ธ ํด๋ผ์ด์ธํธ์ ์๋ธ ์๋ฒ ์ปจํ
์ด๋๋ฅผ ๋์ฐ๊ณ ์คํ์ค์ด๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ปจํ
์ด๋๋ฅผ ์ข
๋ฃํ๊ฒ๋ ์์ฑํ์๋ค.
์์์ ํด๋ผ์ด์ธํธ ํ๋ก์ ํธ ํ์ผ์ 5173/5174๋ก ํ๋ค๊ณ ํ์๋ค.
์ด๊ฑธ ์ค์ ๋ก ๊ตฌํํ์ผ๋ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์๋ค.
ํ์ด์ง๊ฐ ๋๋ฌด ๋๋ฆฌ๊ฒ ๋ก๋๋๋ค.
์ฌ์ฉ์์๊ฒ ์์ด์ ํฐ ํ๋ฉด์ 2์ด ์ด์ ๋
ธ์ถํ๋ ๊ฒ์ด ์ฉ ์ข์ ๊ฒฝํ์ ์๋๋ผ๊ณ ์๊ฐํ๋ค.
๊ฒฐ๊ตญ ๋์ปค ํ๋ธ์์์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ ์งํ๋ฉด์ ์๋ฒ๋ฅผ ์ ์งํ๊ฒ ๋ค๋ ๊ฟ์ ๋ฌด๋์ก๋ค.
๊ทธ๋ ๊ฒ ๋ฐฉ๋ฒ์ ์ฐพ๋ค๊ฐ ์๋ฒ์์ 5173๋ฒ ํฌํธ๋ก ํด๋ผ์ด์ธํธ ํ์ผ์ ์คํ์ํค๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ ํ์ ์๋๋ผ๋ ๊ฒ์ ์๊ฒ๋์๋ค. ๊ทธ๋ ๊ฒ client ์ด๋ฏธ์ง๋ฅผ ์ง์ฐ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์ ๊ฐ๋ฆผ๊ธธ์ด ์๊ธด๋ค.
- scp๋ก ๋๊ฒจ์ ์คํ์ค์ธ nginx๊ฐ ํด๋น ํ์ผ์ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
- nginx ์ด๋ฏธ์ง์ client ์ ์ ํ์ผ์ ํฌํจ์ํค๊ณ , ์๋ฒ์ฒ๋ผ blue/green ๊ธฐ๋ฒ ์ฌ์ฉ
์ด์ ์ ์ ํ์ ๊ฐ๋ฆผ๊ธธ์์๋ scp๊ฐ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์๋๊ธฐ ๋๋ฌธ์
nginx ์ด๋ฏธ์ง์ ํฌํจ์ํค๊ณ ์ด ์ด๋ฏธ์ง๋ฅผ ๋ฒ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ค.
๊ทธ๋ ๊ฒ docker actions ์คํฌ๋ฆฝํธ์ client ํ์ผ์ build ์ํค๊ณ nginx Dockerfile์์ COPY ํ๋ค.
client๋ฅผ ๋น๋์ํฌ ๋ yarn --cwd๋ก ํด๋น ๋๋ ํ ๋ฆฌ์์ ์คํ๋๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ yarn build๋ฅผ ์ํด์ yarn install์ด ์ ํ๋์ด์ผ ํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ด์ง๊ฐ ๋์์ก๊ณ , ๋ธ๋ผ์ฐ์ ์์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ ๋ณด๋ค ๋น ๋ฅธ ์๋๋ก ๋ถ๋ฌ์ฌ ์ ์์๋ค.
์ฌ๊ธฐ์ ๋์ธ์ค ์์์ผ๋..
nginx์ client ์ด๋ฏธ์ง๋ฅผ ํฌํจํ๊ณ nginx-green, nginx-blue๋ก ๊ด๋ฆฌํ๋ ค๊ณ ํ์ผ๋,
nginx์ 80ํฌํธ๋ ํธ์คํธ์ ์ํด ์ธ๋ถ์ ์ง์ ๋
ธ์ถ๋๋ ํฌํธ๋ก ์ค๋ณต์ด ๋ถ๊ฐ๋ฅ ํ๋ค..
์ด์ ๋ํด ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณผ์ง, nginx์์ client ํ์ผ์ ๋ถ๋ฆฌํ ์ง๋ฅผ ๊ณ ๋ฏผํ๋๋ฐ,
nginx์ ๋
๋ฆฝ์ ์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ด ๋ฌธ์ ํด๊ฒฐ๋ ๊ฐ๋ฅํ๊ณ , ๊ตฌ์กฐ์์ผ๋ก ๋ ๋์ ๊ฒ ๊ฐ์์ ๋ถ๋ฆฌํ๊ธฐ๋ก ํ์๋ค.
nginx ์ด๋ฏธ์ง๋ ๋ฑํ ์ฝ๋ ํํธ์์ ๋ฐ๋ ๋ถ๋ถ์ด ์๋ค๊ณ ์๊ฐ๋์ด github actions์์ ์์ ํ ์ ๊ฑฐํ์๋ค.
์๋ฒ์์ docker-compose-nginx.yml๋ก ๊ด๋ฆฌ
buildํ client dist ํ์ผ์ ๋ํด์๋ ์๋ฒ์ ํน์ ๋๋ ํ ๋ฆฌ๋ก scp ๋ช
๋ น์ด๋ฅผ ํตํด ์ ์กํ์๋ค.
์คํ์ค์ธ nginx๊ฐ ์ ์ก๋ distํ์ผ์ ์ฌ์ฉํ๊ธฐ ์ํด์ nginx์ default.conf ํ์ผ์ ์์ ํด์ฃผ์ด์ผ ํ๋ค.
- nginx๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ ์น ํ์ผ ๊ฒฝ๋ก
- ํ์ผ์ด ์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฒญ ํ์ ๋ ๋๋ ํ ๋ฆฌ์ ๊ธฐ๋ณธ ๋ฐํ ํ์ผ์ ์ง์
- ์๋ฅผ ๋ค์ด /๊ฒฝ๋ก๋ ๋๋ ํ ๋ฆฌ์ด๋ค. /์๋ํ ๊ธฐ๋ณธ ๋ฐํ ํ์ผ์ index.html๋ก ์ง์ ํ๋ฉด ๊ฐ ๋๋ ํ ๋ฆฌ๋ก ์์ฒญ์ด ์์ ๋, ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ index.html์ ๋ฐํํ๋ ๊ตฌ์กฐ์ด๋ค.
- ์ง๊ธ์ nginx์ distํ์ผ์ด root๊ธฐ ๋๋ฌธ์ /๋ก ์์ฒญ์ด ์ค๋ฉด dist ๋๋ ํ ๋ฆฌ ๋ด์ index.html์ด ์คํ๋๋ค.
- try_files๋ ๋ค์ด์จ ์์ฒญ์ ๋ํด
$uri
ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด$uri/
๋ก ๋ค์ ์ฐพ์๋ณด๊ณ ์ด๋ง์ ์์ผ๋ฉด/index.html
์ ๋ฐํํ๋๋ก ํ๋ ์ค์ ์ด๋ค.
์ ์ธ๊ฐ์ง ์ค์ ์ค ๊ฐ์ฅ ์ค์ํ ์ค์ ์ root /usr/share/nginx/html/dist-green;
์ด๋ค.
์ด๊ฒ ์ค์ dist๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ์๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
location / {
root /usr/share/nginx/html/dist-green;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด dist-green์ด ๋ช
์๋์ด์๋ค.
์ง์ ๋ฒ์ ์ ๋ฐฑ์
ํ๊ธฐ ์ํด distํ์ผ์ ๋ฎ์ด์์ฐ๋ ๊ฐ๋
๋ณด๋ค dist-green dist-blue๋ฅผ ๋ง๋ค๋๋ก ํ๋ค.
ํฐ ํ๋ฆ์ github actions์์ nginx์ distํ์ผ๋ก ์ ์กํ๊ณ , deploy.sh์์ distํ์ผ์ cpํ์ฌ ๊ฐ ์ปฌ๋ฌ์ ๋ง๊ฒ dist-green์ด๋ dist-blue๋ก ๋ฎ์ด์์ฐ๊ฒ ํ๋ค.
์ด๋ ๊ฒ ํ์ ๋ ํด๋ผ์ด์ธํธ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ dist-blue๋ฅผ ์คํ์ค์ด๋ผ๋ฉด dist-green์ ์คํํ๊ณ dist-blue๋ฅผ ์ข ๋ฃํ ์ ์๋ค.
์ด๊ธฐ์๋ dist-green์ด๋ dist-blue๋ก cpํ๊ณ rmํ์๋๋ฐ, ๊ทธ๋ ๊ฒ ํ์ง ์์ ์ด์ ๋
deploy.sh์์ ์คํ๋ ๋ dist ๋๋ ํ ๋ฆฌ๊ฐ ๋ฌด์กฐ๊ฑด ์๋ค๊ณ ๊ฐ์ ํ๊ณ blue๋ green์ผ๋ก ๋ณต์ฌํ๋๋ฐ,
GitHub Actions์ scp ์์ด ์๋ฒ์์ green๊ณผ blue๋ก ์ ํํ ๋ ์์๊ฐ์ ์ด์ ๋ก dist ํ์ผ์ด ํ์ํด์ rmํ์ง ์๊ณ ๋๊ฒ ๋์๋ค.
์ ๊ณผ์ ํ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผํ์ ๋, ํ์ด์ง๋ ์ ๋์์ก๋ค.
๊ทธ๋ฐ๋ฐโฆ ์๋ฒ๊ฐ ์ ๋์์ง๋ ๊ฒ ์ฒ๋ผ ๋ณด์๋ค..
์ ํํ ์๊ธฐํ๋ฉด docker logs๋ก ๋ณธ ์๋ฒ ๋ก๊ทธ๋ ์ ์์ ์ผ๋ก nestjs๊ฐ ์คํ๋์๋ค๊ณ ๋์ค์ง๋ง,
api๊ฐ ์๋ํ์ง ์์ ๋ฌธ์ ์๋ค.
๋๋ ์ด ๋ฌธ์ ๊ฐ ๋จ์ํ
- ์๋ฒ๊ฐ ๋๋ฆฌ๊ฒ ์ผ์ง๋ ๊ฑด๊ฐ?
- ํฌํธ์ ๋ฌธ์ ๊ฐ ์๋?
- ๋คํธ์ํฌ๊ฐ ๋ค๋ฅธ๊ฐ?
๋ผ๊ณ ์๊ฐํ๋ค.
์ฐ์ ์ ๊ฐ์ ๋คํธ์ํฌ ํ๊ฒฝ์ธ์ง ํ์ธํ๋ค.
docker inspect webapp
์ด ๋์ ๊ฐ์ ๋คํธ์ํฌ ํ๊ฒฝ์ ์์๋คโฆ
๊ทธ๋ผ ํฌํธ ๋ฌธ์ ์ธ๊ฐ?
์ฌ์ค ํฌํธ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ ์ ๊ฐ์๊ธฐ swagger์ /api ๊ฐ ์ ์๋๋ ๊ฒ์ ํ์ธํ๋ค. ํฌํธ์ ๋ฌธ์ ๋ ์๋๋ผ๊ณ ์๊ฐํ๋ค.
๋ง์ง๋ง์ผ๋ก ์๋ฒ๊ฐ ๋๋ฆฌ๊ฒ ์ผ์ง๋ ๊ฑด์ง์ ๋ํ ์๋ฌธ์ ๊ฐ์ง๊ฒ ๋์๋ค.
์๋ฒ๋ ๊ตฌํ์ ๋ง์ด ํด๋์ง ์์์ ๋๋ฆฌ๊ฒ ๋์ํ ์ด์ ๊ฐ ์์๊ณ ,
์๋ฒ๊ฐ ์ผ์ก๋ค๋ ๋ก๊ทธ๋ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์๋ค.
๊ทธ๋์ ์ผ๋จ ํ์ผ์ ํ๋์ฉ ์ด์๋ค. ๊ทธ๋ฌ๋ค๊ฐ deploy.sh๋ฅผ ์ด๊ฒ ๋์๋ค.
health์ฒดํฌ ํ ์ ์์ ์ผ๋ก health ์ฒดํฌ๊ฐ ๋์์ ๋ nginx ์ค์ ์ ์์ ํ๋๋ก ํ๋๋ฐ,
health ์ฒดํฌ๊ฐ starting์ผ๋ก ๋์ค๋ ๋ฌธ์ ์๋ค..
๊ทธ๋์ ํจ์๋ฅผ ์์ฑํ์ฌ 5์ด ๊ฐ๊ฒฉ์ผ๋ก health ์ฒดํฌ๋ฅผ ํ๋๋ก ํ๊ณ , starting์ด ์๋ ์ํ๊ฐ ๋์์ ๋
์ด ํจ์ ๊ฐ์ ๋ฐํํ๊ธฐ๋ก ํ๋ค.
๊ฒฐ๊ณผ๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ /api ๋ฅผ ํ์ธํด๋ณผ ์ ์์๋ค.
์ด์ ๋ํด docker compose ํ์ผ์๋ ์ฌ์๋ ์ฟจํ์์ ์ค์ ํ ์ ์๋ค๋ ๊ฒ์ด ๊ธฐ์ต๋์
docker compose ํ์ผ์ ์ด๋ป๊ฒ ์ค์ ์ด ๋์ด์๋์ง ํ์ธํด๋ณด๊ฒ ๋์๋ค.
docker compose ํ์ผ์ 1m30s๋ก ๋์ด ์์๋ค..
์ด ๋ถ๋ถ ๋๋ฌธ์๋ ์๋ฒ๊ฐ ๋ฆ๊ฒ ์์๋ ๊ฒ์ด ์๋๊ฐ๋ผ๋ ์๊ฐ์ด๋ ๋ค.
server ์ปจํ
์ด๋๋ ์คํ๋๊ณ ์ผ๋ง ์ง๋์ง ์์ healthyํ ์ํ๋ก ๋ฐ๋๊ฒ ๋์๋ค.
๋ํ blue/green ๋ณ๊ฒฝ ๊ณผ์ ์์ health ์ฒดํฌ ํ ๊ธฐ์กด ์๋ฒ๋ฅผ ๋ซ๊ฒ๋ ์์ฑํ๋ค ๋ณด๋,
request๋ ๋์์์ด ์ ๋ฌ๋์๋ค.
ํ๋ก ํธ ๋ํ ์ค์ ํ์ผ์ ๋ฐ๊พธ๊ณ reloadํ๋ ์ฆ์ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ด ๋ฐฐํฌ๊ฐ ๋๊ณ ์๋ค.
๐ ffmpeg๋ stderr๋ก ๋๋ฒ๊น
์ ํ๋ ์ด์
๐ HLS ํ๋กํ ์ฝ์ ๊ดํ ์ ๋ฆฌ ๋ฐ FFmpeg ์ฌ์ฉ๊ธฐ
๐ ๋นํธ๋ tsconfig.json์ด ์ธ ๊ฐ?
๐ NestJS ๊ธฐ๋ณธ ๊ฐ๋
- Modules
๐ Socket.io ์ต(๊ฐ)์ ํ
๐ ๋์ปค์ nginx์ ์ฌ์ฉ๊ธฐ
๐ ๋ถํํ
์คํธ๋ฅผ ํด๋ณด์
๐ FSD ์ฌ์ฉ๊ธฐ, ๊ทผ๋ฐ ์ด์ ๋๋ง์ ๊ท์น์ ๊ณ๋ค์ธ
๐ CICD ๊ตฌ์กฐ ์์
๐ ์จ๋ฒ ๋จ์๋ก ์คํธ๋ฆฌ๋ฐ ํ๊ธฐ (with HLS)
๐ HLS๋ก ์์
์ฃผ๊ณ ๋ฐ๊ธฐ
๐ vite + react + typescript ํ๊ฒฝ์์ path alias ์ค์
๐ React Scan์ด ๋ญ์ฃ ?
๐ ๋ก์ปฌ ํ๊ฒฝ ๊ฐ๋ฐ ๋ชจ๋ ๋ฐฐํฌ
๐ ์จ๋ฒ ์ ์ฒด๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ค๊ณ ? (with HLS)
๐ ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํ
์คํธ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
๐ ์๋ก๊ณ ์นจ ์ HLS ERROR
๐ input ํ๊ทธ์ ํ๊ธ ์
๋ ฅ ํ, Enter๋ฅผ ๋๋ฅด๋ฉด ํจ์๊ฐ ๋๋ฒ ํธ์ถ๋๋ ์ค๋ฅ
๐ nginx proxy pass๋ฅผ ๋ฐ๊ฟจ๋๋ ์๊ธด ์๋ฌ - ์ค์จ๊ฑฐ ์ธ์ ๋ฌธ์
๐ ๋ฐฐํฌ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ-์๋ฒ WS handshake
๐ ๋ ๋๋ง ๋ฒ์ธ์ ํ๋!
๐ ๊ทธ๋ผ์ด๋ ๋ฃฐ
๐ฅ ํ์ ์๊ฐ
๐ ์ฝ๋ & ๊น ์ปจ๋ฒค์
๐ณ ๊น branch ์ ๋ต
๐ ๋
ธ์
๋ฌธ์ ์ ์ฅ์
๐จ ํผ๊ทธ๋ง
๐งโ๐ป ๊ธฐํ ๊ณต์ ๋ฐํ ์๋ฃ
๐ค 2์ฃผ์ฐจ ๋ฐํ ์๋ฃ
๐ ๋ฐฑ๋ก๊ทธ
๐ 1์ฃผ์ฐจ
๐ 2์ฃผ์ฐจ
๐ 3์ฃผ์ฐจ
๐ 4์ฃผ์ฐจ
๐ 5์ฃผ์ฐจ
๐๏ธ 1์ฃผ์ฐจ
๐๏ธ 2์ฃผ์ฐจ
๐๏ธ 3์ฃผ์ฐจ
๐๏ธ 4์ฃผ์ฐจ
๐๏ธ 5์ฃผ์ฐจ
โจ 1์ฃผ์ฐจ
โจ 2์ฃผ์ฐจ
โจ 3์ฃผ์ฐจ
โจ 4์ฃผ์ฐจ