103 Milestones Docker Compose - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki

Docker Compose ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ๋งˆ์ผ์Šคํ†ค

๊ธฐ์ค€ ๋ฌธ์„œ: KTB4-3rd-CLOUD Wiki

0. ๋ฌธ์„œ ๋ชฉ์ 

์ด ๋ฌธ์„œ๋Š” ๋ชจ์—ฌํƒ€ V1์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€, Compose ์‹คํ–‰ ํ™˜๊ฒฝ, CI/CD๋ฅผ ์„ธ ๊ฐœ์˜ ๋งˆ์ผ์Šคํ†ค์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ •์˜ํ•œ๋‹ค. ๊ฐ ๋งˆ์ผ์Šคํ†ค์€ ๋…๋ฆฝ์ ์ธ ์™„๋ฃŒ ์กฐ๊ฑด๊ณผ ์‚ฐ์ถœ๋ฌผ์„ ๊ฐ€์ง€๋ฉฐ, ์•ž ๋‹จ๊ณ„์˜ ๊ณ„์•ฝ์ด ํ™•์ธ๋œ ๋’ค ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

์šด์˜ ๊ธฐ์ค€์€ Dev EC2์™€ Prod EC2๋ฅผ ๋ถ„๋ฆฌํ•œ ๋‹จ์ผ ํ˜ธ์ŠคํŠธ Docker Compose๋‹ค. ๊ณ ๊ฐ€์šฉ์„ฑ์ด๋‚˜ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ณด๋‹ค ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ, ์žฅ์•  ์˜ํ–ฅ ๋ฒ”์œ„ ์ถ•์†Œ, ๋น ๋ฅธ ๋ณต๊ตฌ์™€ ์šด์˜ ๋‹จ์ˆœ์„ฑ์„ ์šฐ์„ ํ•œ๋‹ค.

1. ๋งˆ์ผ์Šคํ†ค ์š”์•ฝ

๋งˆ์ผ์Šคํ†ค ๋ชฉํ‘œ ๋‹ด๋‹น ์ €์žฅ์†Œ ํ•ต์‹ฌ ์‚ฐ์ถœ๋ฌผ ์™„๋ฃŒ ๊ฒŒ์ดํŠธ
M1 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Docker Image ๊ตฌ์„ฑ FE, BE, AI ์„œ๋น„์Šค๋ณ„ Dockerfile, .dockerignore, ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธยท์ด๋ฏธ์ง€ ๋นŒ๋“œยท์ปจํ…Œ์ด๋„ˆ health ํ†ต๊ณผ
M2 Docker Compose ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ CLOUD compose.yaml, Nginx, ํ™˜๊ฒฝ ํŒŒ์ผ, ์šด์˜ ์Šคํฌ๋ฆฝํŠธ Compose configยท๊ธฐ๋™ยท๋ผ์šฐํŒ…ยท๋ฐ์ดํ„ฐ ์˜์†์„ฑ ํ†ต๊ณผ
M3 Docker Compose ๊ธฐ๋ฐ˜ CI/CD ๊ตฌ์„ฑ CLOUD, GitHub Actions ECR publish, SSM deploy, release manifest, rollback Dev ์ž๋™ ๋ฐฐํฌยทProd ์Šน์ธยทsmokeยทrollback ํ†ต๊ณผ

M1์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ €์žฅ์†Œ์— Dockerfile์„ ์ œ๊ณตํ•˜๋Š” ๋‹จ๊ณ„๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค๋ฅผ CLOUD ์ €์žฅ์†Œ๋กœ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ CLOUD๊ฐ€ Dockerfile์„ ๋Œ€์‹  ์†Œ์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. ๊ณตํ†ต ์•„ํ‚คํ…์ฒ˜์™€ ์šด์˜ ๊ณ„์•ฝ

2.1 ์„œ๋น„์Šค ๊ตฌ์„ฑ

์„œ๋น„์Šค ์—ญํ•  ๋‚ด๋ถ€ ํฌํŠธ ์™ธ๋ถ€ ๊ณต๊ฐœ
Nginx TLS ์ข…๋ฃŒ, ๊ฒฝ๋กœ ๋ผ์šฐํŒ…, WebSocket proxy 80/443 ํ˜ธ์ŠคํŠธ 80/443๋งŒ ๊ณต๊ฐœ
frontend Next.js SSR 3000 ์ง์ ‘ ๊ณต๊ฐœํ•˜์ง€ ์•Š์Œ
backend Spring Boot API/WebSocket 8080 ์ง์ ‘ ๊ณต๊ฐœํ•˜์ง€ ์•Š์Œ
ai FastAPI ์ถ”๋ก  API 8000 ์ง์ ‘ ๊ณต๊ฐœํ•˜์ง€ ์•Š์Œ, V1 ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ
mysql ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ 3306 ์ง์ ‘ ๊ณต๊ฐœํ•˜์ง€ ์•Š์Œ

2.2 ์š”์ฒญ ๋ผ์šฐํŒ…

์‚ฌ์šฉ์ž
  โ”‚ HTTPS / WebSocket
  โ–ผ
Nginx
  โ”œโ”€โ”€ /        โ†’ frontend:3000
  โ”œโ”€โ”€ /api/*   โ†’ backend:8080
  โ”œโ”€โ”€ /ws/*    โ†’ backend:8080 (HTTP/1.1 Upgrade)
  โ””โ”€โ”€ /ai/*    โ†’ ai:8000 (์„ ํƒ ๊ธฐ๋Šฅ)

2.3 ๋„คํŠธ์›Œํฌ์™€ ๋ฐ์ดํ„ฐ

  • moyeota-app-APP_ENV: Nginx, frontend, backend, ์„ ํƒ์ ์ธ ai ์—ฐ๊ฒฐ
  • moyeota-db-APP_ENV: backend์™€ mysql๋งŒ ์—ฐ๊ฒฐ
  • MySQL ๋ฐ์ดํ„ฐ๋Š” moyeota-mysql-APP_ENV named volume์— ์ €์žฅ
  • ์•ฑ ์ปจํ…Œ์ด๋„ˆ ๊ต์ฒด์™€ DB ๋ฐ์ดํ„ฐ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋ถ„๋ฆฌ
  • ์ธ์ฆ์„œ์™€ Secret์€ ์ด๋ฏธ์ง€์— ๋„ฃ์ง€ ์•Š๊ณ  ์„œ๋ฒ„์˜ ์ œํ•œ๋œ ๊ฒฝ๋กœ์—์„œ read-only๋กœ ์ฃผ์ž…

2.4 ์ดˆ๊ธฐ ๋ฆฌ์†Œ์Šค ๊ฐ€์„ค

์„œ๋น„์Šค CPU ๋ฉ”๋ชจ๋ฆฌ Swap ๋น„๊ณ 
nginx 0.25 128 MB ์—†์Œ ์™ธ๋ถ€ ์ง„์ž…์ 
frontend 0.50 512 MB ์—†์Œ SSR
backend 0.75 768 MB 256 MB JVM heap์€ ๋ณ„๋„ ์ œํ•œ
mysql 0.50 768 MB ์—†์Œ InnoDB buffer pool ์ดˆ๊ธฐ 384 MB
ai ๋ณ„๋„ ์ธก์ • ๋ณ„๋„ ์ธก์ • ๋ณ„๋„ ์ธก์ • V1 ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ

์œ„ ๊ฐ’์€ ์šด์˜ ๋ณด์žฅ๊ฐ’์ด ์•„๋‹Œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์‹œ์ž‘์ ์ด๋‹ค. OOM, CPU throttling, GC pause, WebSocket ์—ฐ๊ฒฐ ์ˆ˜, DB connection ๋Œ€๊ธฐ์™€ p95/p99 ์‘๋‹ต ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด ์กฐ์ •ํ•œ๋‹ค.

2.5 ์ด๋ฏธ์ง€ ์‹๋ณ„์ž

์ด๋ฏธ์ง€๋Š” ์ด๋™ ํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ Registry๊ฐ€ ๋ฐ˜ํ™˜ํ•œ Digest๋ฅผ ๋ฐฐํฌ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

dev-<sha7>
rc-v<version>-<sha7>
prod-v<version>-<sha7>

Dev์—์„œ ๊ฒ€์ฆํ•œ ์ด๋ฏธ์ง€ Digest์™€ Prod์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ด๋ฏธ์ง€ Digest๋Š” ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. latest, dev, prod ๊ฐ™์€ ์ด๋™ ํƒœ๊ทธ๋Š” ์กฐํšŒ ํŽธ์˜๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

3. M1 - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Docker Image ๊ตฌ์„ฑ

3.1 ๋ชฉํ‘œ

๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ผํ•œ Linux ๋Ÿฐํƒ€์ž„์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋นŒ๋“œ๋˜๊ณ , ์‹คํ–‰์— ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ํฌํ•จํ•œ production image๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.

๋นŒ๋“œ ๋„๊ตฌ์™€ ํ…Œ์ŠคํŠธ ์˜์กด์„ฑ์€ builder stage์—๋งŒ ๋‘๊ณ , runtime stage๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•œ๋‹ค. Secret, ์šด์˜ .env, ์ธ์ฆ์„œ ๊ฐœ์ธ ํ‚ค, ๋กœ์ปฌ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋Š” ์ด๋ฏธ์ง€์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

3.2 ์ €์žฅ์†Œ๋ณ„ ์‚ฐ์ถœ๋ฌผ

์ €์žฅ์†Œ Dockerfile ๊ณ„์•ฝ ์‹คํ–‰ ๋ช…๋ น health ๊ณ„์•ฝ
FE Node.js ๊ธฐ๋ฐ˜ Next.js standalone ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ node server.js ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ / HTTP 2xx
BE JDK ๋นŒ๋“œ + JRE ์‹คํ–‰, Gradle Wrapper ์‚ฌ์šฉ java -jar /app/app.jar /actuator/health/readiness HTTP 2xx
AI Python venv builder + slim runtime uvicorn app.main:app /health HTTP 2xx

FE

  • package-lock.json์„ ๊ธฐ์ค€์œผ๋กœ npm ci ์‹คํ–‰
  • npm run test --if-present ํ›„ npm run build
  • next.config์— output: standalone ์„ค์ •
  • runtime image์—๋Š” .next/standalone, .next/static, public๋งŒ ๋ณต์‚ฌ
  • node ์‚ฌ์šฉ์ž๋กœ ํฌํŠธ 3000 ์‹คํ–‰

BE

  • ์ €์žฅ์†Œ์˜ Gradle Wrapper๋กœ dependencies, test, bootJar ์‹คํ–‰
  • JDK image์™€ JRE image ๋ถ„๋ฆฌ
  • plain JAR๊ฐ€ ์•„๋‹Œ ์‹คํ–‰ JAR๋งŒ runtime image์— ๋ณต์‚ฌ
  • Actuator readiness endpoint๋ฅผ healthcheck์œผ๋กœ ์‚ฌ์šฉ
  • ์ „์šฉ non-root ์‚ฌ์šฉ์ž๋กœ ํฌํŠธ 8080 ์‹คํ–‰

AI

  • requirements.txt ๋˜๋Š” ํ”„๋กœ์ ํŠธ lock file์„ ๊ธฐ์ค€์œผ๋กœ ์˜์กด์„ฑ ์„ค์น˜
  • ๊ฐœ๋ฐœ์šฉ reload๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
  • app.main:app import ๊ฒฝ๋กœ์™€ /health endpoint๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์•ฝ์œผ๋กœ ๊ณ ์ •
  • ๋ชจ๋ธ ํŒŒ์ผ์€ ์ด๋ฏธ์ง€ ํฌํ•จ, named volume, ์™ธ๋ถ€ ์ €์žฅ์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณ„๋„ ๊ฒฐ์ •
  • V1 Compose์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ  profile๋กœ ์„ ํƒ

3.3 M1 ๊ตฌํ˜„ ์ˆœ์„œ

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ lock file, build command, ์‹คํ–‰ ํฌํŠธ, health endpoint ํ™•์ •
  2. Dockerfile๊ณผ .dockerignore ์ž‘์„ฑ
  3. ๋กœ์ปฌ ๋˜๋Š” CI runner์—์„œ unit test์™€ production image build ์‹คํ–‰
  4. ์ปจํ…Œ์ด๋„ˆ๋ฅผ non-root๋กœ ์‹คํ–‰ํ•˜๊ณ  healthcheck ํ™•์ธ
  5. ์ด๋ฏธ์ง€ metadata์— source repository์™€ commit SHA ๊ธฐ๋ก
  6. Buildx๋กœ EC2 ๋Œ€์ƒ ํ”Œ๋žซํผ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
  7. Dev์—์„œ ์‚ฌ์šฉํ•  ECR Digest๋ฅผ release manifest์— ๊ธฐ๋ก

3.4 M1 ์™„๋ฃŒ ๊ธฐ์ค€

  • FE, BE, AI ๊ฐ ์ €์žฅ์†Œ์— production Dockerfile์ด ์žˆ๋‹ค.
  • ๊ฐ ์ €์žฅ์†Œ์— .dockerignore๊ฐ€ ์žˆ๊ณ  .env, .git, build cache๊ฐ€ ์ œ์™ธ๋œ๋‹ค.
  • ๊นจ๋—ํ•œ CI runner์—์„œ ํ…Œ์ŠคํŠธ์™€ ์ด๋ฏธ์ง€ ๋นŒ๋“œ๊ฐ€ ์žฌํ˜„๋œ๋‹ค.
  • runtime stage๊ฐ€ root๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ์ด๋ฏธ์ง€์— Secret๊ณผ ์ธ์ฆ์„œ ๊ฐœ์ธ ํ‚ค๊ฐ€ ์—†๋‹ค.
  • FE SSR, BE HTTP/WebSocket, AI ํ•ต์‹ฌ endpoint๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • ์„ธ ์ด๋ฏธ์ง€์˜ healthcheck๊ฐ€ ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์— ํ†ต๊ณผํ•œ๋‹ค.
  • ๋ฐฐํฌ ๋Œ€์ƒ EC2 ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.

M1์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์™€ lock file์ด ์กด์žฌํ•ด์•ผ ์‹ค์ œ build ๊ฒ€์ฆ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ €์žฅ์†Œ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๋™์•ˆ์—๋Š” Dockerfile ๋ฌธ๋ฒ•๊ณผ ์ •์  ์ •์ฑ… ๊ฒ€์‚ฌ๊นŒ์ง€๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

4. M2 - Docker Compose ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

4.1 ๋ชฉํ‘œ

๋™์ผํ•œ Compose ์ •์˜๋ฅผ Dev์™€ Prod์—์„œ ์‚ฌ์šฉํ•˜๊ณ , ํ™˜๊ฒฝ๋ณ„ ๊ฐ’๊ณผ Secret๋งŒ ์„œ๋ฒ„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ์™ธ๋ถ€ ์š”์ฒญ์€ Nginx๋งŒ ์ˆ˜์‹ ํ•˜๋ฉฐ, ๋‚ด๋ถ€ ์„œ๋น„์Šค์™€ MySQL์€ ํ˜ธ์ŠคํŠธ ํฌํŠธ๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.

4.2 CLOUD ์‚ฐ์ถœ๋ฌผ

compose.yaml
compose.ai.yaml
nginx/
  Dockerfile
  nginx.conf
  conf.d/
deploy/
  runtime.env.example
  release.env.example
  README.md
scripts/
  deploy.sh
  rollback.sh
  smoke-test.sh
  backup-mysql.sh

compose.ai.yaml์€ AI๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ overlay๋กœ ์ ์šฉํ•œ๋‹ค. ๊ธฐ๋ณธ V1 ์‹คํ–‰์€ COMPOSE_AI_ENABLED=false๋กœ ๋‘๊ณ , AI๊ฐ€ ํ•„์š”ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ๋งŒ profile์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

4.3 ์„œ๋น„์Šค ์‹คํ–‰ ๊ทœ์น™

  • ๋ชจ๋“  ์„œ๋น„์Šค์— restart: unless-stopped ์ ์šฉ
  • MySQL health ํ†ต๊ณผ ํ›„ migration๊ณผ backend ๊ธฐ๋™
  • backend์™€ frontend health ํ†ต๊ณผ ํ›„ Nginx ๊ธฐ๋™
  • Compose service_healthy์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด timeout์„ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • ๋กœ๊ทธ๋Š” ์ปจํ…Œ์ด๋„ˆ stdout/stderr๋กœ ๋‚ด๋ณด๋‚ด๊ณ  rotation ์ ์šฉ
  • no-new-privileges, read-only Secret mount, ์ตœ์†Œ Linux capability๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ

๊ถŒ์žฅ ๊ธฐ๋™ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

mysql healthy
  โ†’ migration
  โ†’ backend ready
  โ†’ frontend ready
  โ†’ nginx
  โ†’ HTTP/WebSocket smoke test

4.4 ํ™˜๊ฒฝ ๋ถ„๋ฆฌ

/opt/moyeota/
โ”œโ”€โ”€ compose.yaml
โ”œโ”€โ”€ compose.ai.yaml
โ”œโ”€โ”€ nginx/
โ”œโ”€โ”€ runtime.env       # ํ™˜๊ฒฝ๋ณ„ Secret, ๊ถŒํ•œ 600
โ”œโ”€โ”€ release.env       # ์ด๋ฏธ์ง€ Digest, ๊ถŒํ•œ 600
โ””โ”€โ”€ scripts/

runtime.env์—๋Š” DB ๋น„๋ฐ€๋ฒˆํ˜ธ, JWT Secret, ์™ธ๋ถ€ API ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ  Git์— commitํ•˜์ง€ ์•Š๋Š”๋‹ค. release.env์—๋Š” ์„œ๋น„์Šค๋ณ„ immutable ECR reference๋งŒ ์ €์žฅํ•œ๋‹ค.

4.5 M2 ์™„๋ฃŒ ๊ธฐ์ค€

  • docker compose config๊ฐ€ Dev์™€ Prod์—์„œ ๋ชจ๋‘ ์„ฑ๊ณตํ•œ๋‹ค.
  • ํ˜ธ์ŠคํŠธ์—๋Š” Nginx 80/443๋งŒ ๊ณต๊ฐœ๋œ๋‹ค.
  • MySQL volume์ด ์ปจํ…Œ์ด๋„ˆ ๊ต์ฒด ํ›„์—๋„ ์œ ์ง€๋œ๋‹ค.
  • MySQL, backend, frontend healthcheck๊ฐ€ ํ†ต๊ณผํ•œ๋‹ค.
  • /, /api, /ws ๋ผ์šฐํŒ…๊ณผ WebSocket Upgrade๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.
  • AI profile์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ๊ธฐ๋ณธ V1 ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • CPUยท๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ๊ณผ log rotation์ด ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋œ๋‹ค.
  • ์ธ์ฆ์„œ์™€ Secret์ด image layer ๋˜๋Š” Git history์— ๋‚จ์ง€ ์•Š๋Š”๋‹ค.
  • docker compose down ํ›„ down -v ์—†์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์กด๋œ๋‹ค.

5. M3 - Docker Compose ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ

5.1 ๋ชฉํ‘œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ €์žฅ์†Œ๋Š” ๊ฒ€์ฆ๊ณผ ์ด๋ฏธ์ง€ publish๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , CLOUD ์ €์žฅ์†Œ๋Š” Compose release์™€ EC2 ๋ฐฐํฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. Dev๋Š” ์ž๋™ ๋ฐฐํฌํ•˜๊ณ  Prod๋Š” ์Šน์ธ ํ›„ ๋™์ผํ•œ Digest๋ฅผ ์Šน๊ฒฉํ•œ๋‹ค.

5.2 CI ํ๋ฆ„

Pull Request

  1. lock file ๊ธฐ๋ฐ˜ ์˜์กด์„ฑ ์„ค์น˜
  2. lint์™€ ์ •์  ๋ถ„์„
  3. unit test ๋ฐ ํ•„์š”ํ•œ integration test
  4. production Docker image build
  5. Secret ํฌํ•จ ์—ฌ๋ถ€์™€ non-root ์ •์ฑ… ๊ฒ€์‚ฌ
  6. ๊ฒฐ๊ณผ๋ฅผ required check๋กœ ๋ณด๊ณ 

PR์—์„œ๋Š” ECR push์™€ EC2 ๋ฐฐํฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

dev ๋ฐ˜์˜

  1. PR ๊ฒ€์ฆ ์žฌ์‹คํ–‰
  2. ๋Œ€์ƒ ํ”Œ๋žซํผ ์ด๋ฏธ์ง€ build
  3. ECR์— dev- tag push
  4. Registry Digest์™€ source commit ๊ธฐ๋ก
  5. CLOUD ๋ฐฐํฌ workflow์— dev-image-published event ์ „๋‹ฌ
  6. Dev EC2์—์„œ release manifest ๊ฐฑ์‹  ํ›„ Compose deploy
  7. readiness์™€ smoke test ํ†ต๊ณผ ์—ฌ๋ถ€ ๊ธฐ๋ก

main ๋ฐ˜์˜

  1. Dev์—์„œ ๊ฒ€์ฆํ•œ Digest๋ฅผ RC manifest๋กœ ๊ณ ์ •
  2. rc-v- tag์™€ Digest ๊ธฐ๋ก
  3. QA ์™„๋ฃŒ ํ›„ GitHub Environment ์Šน์ธ ์š”์ฒญ
  4. ์Šน์ธ ์‹œ Prod EC2์— ๋™์ผ Digest ๋ฐฐํฌ
  5. Prod readiness์™€ smoke test ๊ฒฐ๊ณผ ๋ณด๊ด€

5.3 ๋ฐฐํฌ ๋ฐฉ์‹

๋‹จ์ผ EC2์™€ Docker Compose ์šด์˜์—์„œ๋Š” Recreate ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ต์ฒดํ•˜๋Š” ์งง์€ ์ค‘๋‹จ๊ณผ ๊ธฐ์กด WebSocket ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์šด์˜์ƒ ํ—ˆ์šฉํ•˜๊ณ , ๋Œ€์‹  readiness์™€ rollback์„ ๋ฐฐํฌ ๊ฒŒ์ดํŠธ๋กœ ๋‘”๋‹ค.

release manifest ๊ฒ€์ฆ
  โ†’ ECR login
  โ†’ ์ด๋ฏธ์ง€ pull
  โ†’ (Prod) MySQL backup
  โ†’ migration hook
  โ†’ docker compose up -d --wait
  โ†’ readiness / smoke
  โ”œโ”€โ”€ ์„ฑ๊ณต: release ๊ธฐ๋ก
  โ””โ”€โ”€ ์‹คํŒจ: ์ด์ „ manifest๋กœ rollback

๋ฐฐํฌ๋Š” EC2์— SSH๋กœ ์ž„์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  SSM Run Command๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•œ๋‹ค. Dev์—์„œ๋งŒ ์ž„์‹œ SSH ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์šด์˜ ๋ฐฐํฌ ๊ฒฝ๋กœ๋Š” SSM์œผ๋กœ ํ†ต์ผํ•œ๋‹ค.

5.4 Release manifest

RELEASE_ID=prod-v1.0.0-abcdef1
FRONTEND_IMAGE=000000000000.dkr.ecr.ap-northeast-2.amazonaws.com/moyeota/fe@sha256:<digest>
BACKEND_IMAGE=000000000000.dkr.ecr.ap-northeast-2.amazonaws.com/moyeota/be@sha256:<digest>
NGINX_IMAGE=000000000000.dkr.ecr.ap-northeast-2.amazonaws.com/moyeota/nginx@sha256:<digest>
AI_IMAGE=000000000000.dkr.ecr.ap-northeast-2.amazonaws.com/moyeota/ai@sha256:<digest>

๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋Š” mutable tag๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ , ํ—ˆ์šฉ๋œ ECR repository์™€ sha256 Digest ํ˜•์‹๋งŒ ํ†ต๊ณผ์‹œํ‚จ๋‹ค. Release manifest๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์„œ๋น„์Šค ๋ฒ„์ „์„ ์ž„์˜๋กœ ์„ž์ง€ ์•Š๋Š”๋‹ค.

5.5 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค migration๊ณผ rollback

  • migration์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ release์™€ ๋ถ„๋ฆฌ๋œ ๋ช…์‹œ์ ์ธ hook์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
  • backward-compatible schema๋ฅผ ๋จผ์ € ๋ฐฐํฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ต์ฒด ํ›„ ๊ตฌ ์Šคํ‚ค๋งˆ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ rollback์ด DB schema rollback์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Prod ๋ฐฐํฌ ์ „ transactional dump๋ฅผ S3์— ์—…๋กœ๋“œํ•˜๊ณ  ๋ณด์กด ๊ธฐ๊ฐ„์„ ์ ์šฉํ•œ๋‹ค.
  • migration ์‹คํŒจ ์‹œ ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ธฐ๋™ํ•˜์ง€ ์•Š๊ณ  ์ด์ „ release๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

5.6 ๊ถŒํ•œ๊ณผ ๊ด€์ธก์„ฑ

์ฃผ์ฒด ํ•„์š”ํ•œ ๊ถŒํ•œ
GitHub Actions OIDC๋กœ ECR push, S3 bundle upload, SSM command ์‹คํ–‰
Dev/Prod EC2 ECR pull, S3 backup upload, CloudWatch Logs, SSM agent
์šด์˜์ž GitHub Environment ์Šน์ธ, release์™€ rollback ์‹คํ–‰

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ Nginx ๋กœ๊ทธ๋Š” CloudWatch Logs๋กœ ์ „๋‹ฌํ•œ๋‹ค. ๋ฐฐํฌ๋งˆ๋‹ค release ID, source commit, image Digest, health ๊ฒฐ๊ณผ, rollback ์—ฌ๋ถ€๋ฅผ ๋‚จ๊ธด๋‹ค.

5.7 M3 ์™„๋ฃŒ ๊ธฐ์ค€

  • PR์—์„œ ํ…Œ์ŠคํŠธ์™€ production image build๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • dev merge ์‹œ ECR immutable image์™€ Digest๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • Dev ๋ฐฐํฌ๊ฐ€ repository_dispatch์™€ SSM์œผ๋กœ ์ž๋™ ์‹คํ–‰๋œ๋‹ค.
  • Prod๋Š” GitHub Environment ์Šน์ธ ์—†์ด๋Š” ๋ฐฐํฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Dev ๊ฒ€์ฆ Digest์™€ Prod ๋ฐฐํฌ Digest๊ฐ€ ๋™์ผํ•˜๋‹ค.
  • ๋ฐฐํฌ ์ „ release manifest์™€ runtime env ๊ฒ€์ฆ์ด ์‹คํ–‰๋œ๋‹ค.
  • readiness์™€ HTTP/WebSocket smoke test๊ฐ€ ๋ฐฐํฌ ๊ฒŒ์ดํŠธ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • Prod ๋ฐฐํฌ ์ „ MySQL backup์ด S3์— ์ƒ์„ฑ๋œ๋‹ค.
  • ์‹คํŒจ ์‹œ ์ด์ „ application image๋กœ rollbackํ•  ์ˆ˜ ์žˆ๋‹ค.
  • migration ์‹คํŒจ ์‹œ DB์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ•จ๊ป˜ rollbackํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐฐํฌ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๊ฐ€ ์ถ”์  ๊ฐ€๋Šฅํ•˜๋‹ค.

6. ๋งˆ์ผ์Šคํ†ค ์˜์กด์„ฑ๊ณผ ์ง„ํ–‰ ์ˆœ์„œ

M1 Dockerfile / ์ด๋ฏธ์ง€ ๊ณ„์•ฝ
  โ†“
M2 Compose / health / ๋„คํŠธ์›Œํฌ / ๋ฐ์ดํ„ฐ ์˜์†์„ฑ
  โ†“
M3 ECR publish / SSM deploy / ์Šน์ธ / rollback
์ˆœ์„œ ์ž‘์—… ์„ ํ–‰ ์กฐ๊ฑด ๊ฒฐ๊ณผ
1 FEยทBEยทAI build contract ํ™•์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์™€ lock file M1 Dockerfile
2 ์ด๋ฏธ์ง€ build ๋ฐ health ๊ฒ€์ฆ M1 ECR Digest
3 Dev Compose ๊ธฐ๋™๊ณผ ๋ผ์šฐํŒ… ๊ฒ€์ฆ M1, M2 Dev release
4 Dev ์ž๋™ ๋ฐฐํฌ ์—ฐ๊ฒฐ M2 CI/CD Dev gate
5 QA์™€ Prod ์Šน์ธ ์—ฐ๊ฒฐ Dev gate RC/Prod release
6 ์žฅ์•  ์ฃผ์ž… ๋ฐ rollback ๋ฆฌํ—ˆ์„ค Prod release M3 ์™„๋ฃŒ

7. ํ˜„์žฌ ์ƒํƒœ์™€ ๋‹ค์Œ ์ž‘์—…

ํ˜„์žฌ ๋ฌธ์„œ๋Š” ์„ค๊ณ„์™€ ์™„๋ฃŒ ์กฐ๊ฑด์„ ์ •์˜ํ•œ ๋กœ์ปฌ ๋ฌธ์„œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ €์žฅ์†Œ์˜ ์‹ค์ œ ์†Œ์Šค์™€ lock file์ด ์ค€๋น„๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋Š” M1์˜ Dockerfile ๋ฌธ๋ฒ•ยท์ •์ฑ… ๊ฒ€์‚ฌ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ค์ œ image build์™€ health ๊ฒ€์ฆ์€ ์†Œ์Šค ๋ฐ˜์˜ ํ›„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋‹ค์Œ ์ž‘์—…์€ ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

  1. FE/BE/AI ์ €์žฅ์†Œ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์™€ lock file ๋ฐ˜์˜
  2. M1 Dockerfile์„ ์ €์žฅ์†Œ๋ณ„๋กœ ์ž‘์„ฑํ•˜๊ณ  ๊ฒ€์ฆ
  3. M2 Compose ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ECR Digest๋ฅผ Dev ์„œ๋ฒ„์— ์ฃผ์ž…
  4. Dev ๋ฐฐํฌ์™€ smoke test ์ˆ˜ํ–‰
  5. QA ์Šน์ธ ํ›„ M3 Prod pipeline ํ™œ์„ฑํ™”

๋ธŒ๋žœ์น˜์— ์ง์ ‘ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ commit/pushํ•˜๋Š” ์ž‘์—…์€ ๋‹ด๋‹น์ž์˜ ์‚ฌ์ „ ์Šน์ธ์„ ๋ฐ›์€ ๋’ค ์ˆ˜ํ–‰ํ•œ๋‹ค. ์Šน์ธ ์ „์—๋Š” ๋ฌธ์„œ ์ดˆ์•ˆ๊ณผ ๋กœ์ปฌ ๊ฒ€์ฆ๋งŒ ์ง„ํ–‰ํ•œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ