103 Milestones Docker Compose - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki
๊ธฐ์ค ๋ฌธ์: KTB4-3rd-CLOUD Wiki
์ด ๋ฌธ์๋ ๋ชจ์ฌํ V1์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง, Compose ์คํ ํ๊ฒฝ, CI/CD๋ฅผ ์ธ ๊ฐ์ ๋ง์ผ์คํค์ผ๋ก ๋๋์ด ์ ์ํ๋ค. ๊ฐ ๋ง์ผ์คํค์ ๋ ๋ฆฝ์ ์ธ ์๋ฃ ์กฐ๊ฑด๊ณผ ์ฐ์ถ๋ฌผ์ ๊ฐ์ง๋ฉฐ, ์ ๋จ๊ณ์ ๊ณ์ฝ์ด ํ์ธ๋ ๋ค ๋ค์ ๋จ๊ณ๋ก ์งํํ๋ค.
์ด์ ๊ธฐ์ค์ Dev EC2์ Prod EC2๋ฅผ ๋ถ๋ฆฌํ ๋จ์ผ ํธ์คํธ Docker Compose๋ค. ๊ณ ๊ฐ์ฉ์ฑ์ด๋ ๋ฌด์ค๋จ ๋ฐฐํฌ๋ณด๋ค ํ๊ฒฝ ์ผ๊ด์ฑ, ์ฅ์ ์ํฅ ๋ฒ์ ์ถ์, ๋น ๋ฅธ ๋ณต๊ตฌ์ ์ด์ ๋จ์์ฑ์ ์ฐ์ ํ๋ค.
| ๋ง์ผ์คํค | ๋ชฉํ | ๋ด๋น ์ ์ฅ์ | ํต์ฌ ์ฐ์ถ๋ฌผ | ์๋ฃ ๊ฒ์ดํธ |
|---|---|---|---|---|
| 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์ ๋์ ์์ ํ์ง ์๋๋ค.
| ์๋น์ค | ์ญํ | ๋ด๋ถ ํฌํธ | ์ธ๋ถ ๊ณต๊ฐ |
|---|---|---|---|
| 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 | ์ง์ ๊ณต๊ฐํ์ง ์์ |
์ฌ์ฉ์
โ HTTPS / WebSocket
โผ
Nginx
โโโ / โ frontend:3000
โโโ /api/* โ backend:8080
โโโ /ws/* โ backend:8080 (HTTP/1.1 Upgrade)
โโโ /ai/* โ ai:8000 (์ ํ ๊ธฐ๋ฅ)
- 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๋ก ์ฃผ์
| ์๋น์ค | 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 ์๋ต ์๊ฐ์ ์ธก์ ํด ์กฐ์ ํ๋ค.
์ด๋ฏธ์ง๋ ์ด๋ ํ๊ทธ๊ฐ ์๋๋ผ Registry๊ฐ ๋ฐํํ Digest๋ฅผ ๋ฐฐํฌ ์๋ณ์๋ก ์ฌ์ฉํ๋ค.
dev-<sha7>
rc-v<version>-<sha7>
prod-v<version>-<sha7>
Dev์์ ๊ฒ์ฆํ ์ด๋ฏธ์ง Digest์ Prod์์ ์คํํ๋ ์ด๋ฏธ์ง Digest๋ ๋์ผํด์ผ ํ๋ค. latest, dev, prod ๊ฐ์ ์ด๋ ํ๊ทธ๋ ์กฐํ ํธ์๋ฅผ ์ํด์๋ง ์ฌ์ฉํ๋ค.
๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ผํ Linux ๋ฐํ์์์ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋น๋๋๊ณ , ์คํ์ ํ์ํ ํ์ผ๋ง ํฌํจํ production image๋ก ๋์ํ๋๋ก ๋ง๋ ๋ค.
๋น๋ ๋๊ตฌ์ ํ ์คํธ ์์กด์ฑ์ builder stage์๋ง ๋๊ณ , runtime stage๋ ์ผ๋ฐ ์ฌ์ฉ์๋ก ์คํํ๋ค. Secret, ์ด์ .env, ์ธ์ฆ์ ๊ฐ์ธ ํค, ๋ก์ปฌ ๋น๋ ๊ฒฐ๊ณผ๋ ์ด๋ฏธ์ง์ ํฌํจํ์ง ์๋๋ค.
| ์ ์ฅ์ | 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 |
- 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 ์คํ
- ์ ์ฅ์์ Gradle Wrapper๋ก dependencies, test, bootJar ์คํ
- JDK image์ JRE image ๋ถ๋ฆฌ
- plain JAR๊ฐ ์๋ ์คํ JAR๋ง runtime image์ ๋ณต์ฌ
- Actuator readiness endpoint๋ฅผ healthcheck์ผ๋ก ์ฌ์ฉ
- ์ ์ฉ non-root ์ฌ์ฉ์๋ก ํฌํธ 8080 ์คํ
- requirements.txt ๋๋ ํ๋ก์ ํธ lock file์ ๊ธฐ์ค์ผ๋ก ์์กด์ฑ ์ค์น
- ๊ฐ๋ฐ์ฉ reload๋ฅผ ์ฌ์ฉํ์ง ์์
- app.main:app import ๊ฒฝ๋ก์ /health endpoint๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ฝ์ผ๋ก ๊ณ ์
- ๋ชจ๋ธ ํ์ผ์ ์ด๋ฏธ์ง ํฌํจ, named volume, ์ธ๋ถ ์ ์ฅ์ ์ค ํ๋๋ฅผ ๋ณ๋ ๊ฒฐ์
- V1 Compose์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐํฌํ์ง ์๊ณ profile๋ก ์ ํ
- ์ ํ๋ฆฌ์ผ์ด์ ๋ณ lock file, build command, ์คํ ํฌํธ, health endpoint ํ์
- Dockerfile๊ณผ .dockerignore ์์ฑ
- ๋ก์ปฌ ๋๋ CI runner์์ unit test์ production image build ์คํ
- ์ปจํ ์ด๋๋ฅผ non-root๋ก ์คํํ๊ณ healthcheck ํ์ธ
- ์ด๋ฏธ์ง metadata์ source repository์ commit SHA ๊ธฐ๋ก
- Buildx๋ก EC2 ๋์ ํ๋ซํผ ์ด๋ฏธ์ง ์์ฑ
- Dev์์ ์ฌ์ฉํ ECR Digest๋ฅผ release manifest์ ๊ธฐ๋ก
- 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 ๋ฌธ๋ฒ๊ณผ ์ ์ ์ ์ฑ ๊ฒ์ฌ๊น์ง๋ง ์ํํ๋ค.
๋์ผํ Compose ์ ์๋ฅผ Dev์ Prod์์ ์ฌ์ฉํ๊ณ , ํ๊ฒฝ๋ณ ๊ฐ๊ณผ Secret๋ง ์๋ฒ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ค. ์ธ๋ถ ์์ฒญ์ Nginx๋ง ์์ ํ๋ฉฐ, ๋ด๋ถ ์๋น์ค์ MySQL์ ํธ์คํธ ํฌํธ๋ฅผ ๊ณต๊ฐํ์ง ์๋๋ค.
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์ ํ์ฑํํ๋ค.
- ๋ชจ๋ ์๋น์ค์ 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
/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๋ง ์ ์ฅํ๋ค.
- 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 ์์ด ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ์๋ ๊ฒ์ฆ๊ณผ ์ด๋ฏธ์ง publish๋ฅผ ๋ด๋นํ๊ณ , CLOUD ์ ์ฅ์๋ Compose release์ EC2 ๋ฐฐํฌ๋ฅผ ๋ด๋นํ๋ค. Dev๋ ์๋ ๋ฐฐํฌํ๊ณ Prod๋ ์น์ธ ํ ๋์ผํ Digest๋ฅผ ์น๊ฒฉํ๋ค.
- lock file ๊ธฐ๋ฐ ์์กด์ฑ ์ค์น
- lint์ ์ ์ ๋ถ์
- unit test ๋ฐ ํ์ํ integration test
- production Docker image build
- Secret ํฌํจ ์ฌ๋ถ์ non-root ์ ์ฑ ๊ฒ์ฌ
- ๊ฒฐ๊ณผ๋ฅผ required check๋ก ๋ณด๊ณ
PR์์๋ ECR push์ EC2 ๋ฐฐํฌ๋ฅผ ํ์ง ์๋๋ค.
- PR ๊ฒ์ฆ ์ฌ์คํ
- ๋์ ํ๋ซํผ ์ด๋ฏธ์ง build
- ECR์ dev- tag push
- Registry Digest์ source commit ๊ธฐ๋ก
- CLOUD ๋ฐฐํฌ workflow์ dev-image-published event ์ ๋ฌ
- Dev EC2์์ release manifest ๊ฐฑ์ ํ Compose deploy
- readiness์ smoke test ํต๊ณผ ์ฌ๋ถ ๊ธฐ๋ก
- Dev์์ ๊ฒ์ฆํ Digest๋ฅผ RC manifest๋ก ๊ณ ์
- rc-v- tag์ Digest ๊ธฐ๋ก
- QA ์๋ฃ ํ GitHub Environment ์น์ธ ์์ฒญ
- ์น์ธ ์ Prod EC2์ ๋์ผ Digest ๋ฐฐํฌ
- Prod readiness์ smoke test ๊ฒฐ๊ณผ ๋ณด๊ด
๋จ์ผ 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์ผ๋ก ํต์ผํ๋ค.
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๊ฐ ๊ฐ๋ฆฌํค๋ ์๋น์ค ๋ฒ์ ์ ์์๋ก ์์ง ์๋๋ค.
- migration์ ์ ํ๋ฆฌ์ผ์ด์ release์ ๋ถ๋ฆฌ๋ ๋ช ์์ ์ธ hook์ผ๋ก ์คํํ๋ค.
- backward-compatible schema๋ฅผ ๋จผ์ ๋ฐฐํฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ๊ต์ฒด ํ ๊ตฌ ์คํค๋ง๋ฅผ ์ ๊ฑฐํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ rollback์ด DB schema rollback์ ์๋ฏธํ์ง ์๋๋ค.
- Prod ๋ฐฐํฌ ์ transactional dump๋ฅผ S3์ ์ ๋ก๋ํ๊ณ ๋ณด์กด ๊ธฐ๊ฐ์ ์ ์ฉํ๋ค.
- migration ์คํจ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ํ์ง ์๊ณ ์ด์ release๋ฅผ ์ ์งํ๋ค.
| ์ฃผ์ฒด | ํ์ํ ๊ถํ |
|---|---|
| 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 ์ฌ๋ถ๋ฅผ ๋จ๊ธด๋ค.
- 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ํ์ง ์๋๋ค.
- ๋ฐฐํฌ ๊ฒฐ๊ณผ์ ๋ก๊ทธ๊ฐ ์ถ์ ๊ฐ๋ฅํ๋ค.
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 ์๋ฃ |
ํ์ฌ ๋ฌธ์๋ ์ค๊ณ์ ์๋ฃ ์กฐ๊ฑด์ ์ ์ํ ๋ก์ปฌ ๋ฌธ์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ์์ ์ค์ ์์ค์ lock file์ด ์ค๋น๋์ง ์์ ์ํ์์๋ M1์ Dockerfile ๋ฌธ๋ฒยท์ ์ฑ ๊ฒ์ฌ๋ง ๊ฐ๋ฅํ๋ฉฐ, ์ค์ image build์ health ๊ฒ์ฆ์ ์์ค ๋ฐ์ ํ ์ํํ๋ค.
๋ค์ ์์ ์ ์๋ ์์๋ก ์งํํ๋ค.
- FE/BE/AI ์ ์ฅ์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์ lock file ๋ฐ์
- M1 Dockerfile์ ์ ์ฅ์๋ณ๋ก ์์ฑํ๊ณ ๊ฒ์ฆ
- M2 Compose ํ๊ฒฝ ๋ณ์์ ECR Digest๋ฅผ Dev ์๋ฒ์ ์ฃผ์
- Dev ๋ฐฐํฌ์ smoke test ์ํ
- QA ์น์ธ ํ M3 Prod pipeline ํ์ฑํ
๋ธ๋์น์ ์ง์ ํ์ผ์ ์ถ๊ฐํ๊ฑฐ๋ commit/pushํ๋ ์์ ์ ๋ด๋น์์ ์ฌ์ ์น์ธ์ ๋ฐ์ ๋ค ์ํํ๋ค. ์น์ธ ์ ์๋ ๋ฌธ์ ์ด์๊ณผ ๋ก์ปฌ ๊ฒ์ฆ๋ง ์งํํ๋ค.