Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
d18fc50
chore: 중복 스크린샷 폴더 삭제 (images/v1-load-test/로 통합)
DOGYUN0903 Mar 10, 2026
7495386
feat: V2 스케일 아웃 인프라 구성 (3대 앱서버 + 모니터링 분리)
DOGYUN0903 Mar 11, 2026
71cc489
fix: Prometheus 메트릭에 application 태그 추가
DOGYUN0903 Mar 11, 2026
207bde8
merge: merge 커밋
DOGYUN0903 Mar 12, 2026
6459ea6
chore: V2 배포 트리거용 주석 추가
DOGYUN0903 Mar 12, 2026
349c4ac
test: 로드밸런서 검증용 헬스체크 API 추가
DOGYUN0903 Mar 12, 2026
ad9e879
refactor: 헬스체크 수정
DOGYUN0903 Mar 12, 2026
d7d56ef
feat: add redis-backed session storage
DOGYUN0903 Mar 12, 2026
15766e6
fix : Redis 세션 저장소 활성화
DOGYUN0903 Mar 12, 2026
0969c6b
fix : 배포 환경변수에 Redis 설정 추가
DOGYUN0903 Mar 12, 2026
00bd541
chore : 배포 워크플로 트리거
DOGYUN0903 Mar 12, 2026
e0e5888
chore: 깃허브 액션 트리거
DOGYUN0903 Mar 12, 2026
9a279c8
chore: 깃허브 액션 트리거
DOGYUN0903 Mar 12, 2026
fa66907
refactor: 설정 파일 수정
DOGYUN0903 Mar 12, 2026
8d01f9d
fix : Redis 세션 초기화 설정 추가
DOGYUN0903 Mar 12, 2026
b757da4
fix : Redis 세션 네임스페이스 명시
DOGYUN0903 Mar 12, 2026
d8a4886
refactor: 캐시 TTL 수정 (5초 -> 30초)
DOGYUN0903 Mar 12, 2026
fc25d43
feat : Redis 공용 캐시 매니저 적용
DOGYUN0903 Mar 12, 2026
16fb20a
fix : Redis 캐시 직렬화 설정 보완
DOGYUN0903 Mar 12, 2026
660f403
docs : README V2 스케일아웃 내용 정리
DOGYUN0903 Mar 13, 2026
e546249
feat : 딜 캐시 구조 분리 및 목록 캐시 적용
DOGYUN0903 Mar 13, 2026
5aa9446
docs : README 캐시 전략 정리
DOGYUN0903 Mar 13, 2026
aaf0e85
fix : Redis 캐시 타입 메타데이터 범위 확장
DOGYUN0903 Mar 13, 2026
27e5be4
fix : 관리형 Redis 제약에 맞춰 목록 캐시 무효화 방식 변경
DOGYUN0903 Mar 13, 2026
0a4342b
docs : README 캐시 검증 스크린샷 추가
DOGYUN0903 Mar 13, 2026
4695a21
docs : README 주문 병목 전환 흐름 추가
DOGYUN0903 Mar 13, 2026
d57b3ce
feat : Redisson 분산 락 기반 주문 경로 추가
DOGYUN0903 Mar 13, 2026
9dd0787
fix : Redisson 락 대기 시간 조정
DOGYUN0903 Mar 13, 2026
0785824
fix : Redisson 실무형 대기 시간 조정
DOGYUN0903 Mar 13, 2026
c59e467
feat : Redis Lua 기반 재고 차감 경로 추가
DOGYUN0903 Mar 13, 2026
2318b93
chore : 주문 경로 타이밍 로그 추가
DOGYUN0903 Mar 13, 2026
d7e5213
chore : .gitignore에 .gradle-user-home, .claude 추가
DOGYUN0903 Mar 16, 2026
b7d836d
docs : 시스템 아키텍처 이미지 추가 (MVP, V1, V2)
DOGYUN0903 Mar 16, 2026
e5ed69b
docs : 유저 플로우 다이어그램 추가
DOGYUN0903 Mar 16, 2026
5373db9
docs : V2 부하 테스트 결과 이미지 추가
DOGYUN0903 Mar 16, 2026
f773cc2
docs : 부하 테스트 JMeter 시나리오 추가
DOGYUN0903 Mar 16, 2026
5501891
docs : README 전면 개선
DOGYUN0903 Mar 16, 2026
2f29cc6
test : DealService, PaymentService, ReviewService 테스트 수정
DOGYUN0903 Mar 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 136 additions & 13 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
# workflow 이름
name: flashdeal-ci/cd
# Redis session deploy trigger comment

on:
push:
branches:
- dev
- v1/optimization
- v2/scale-out
paths:
- 'src/**'
- 'build.gradle'
- 'settings.gradle'
- 'Dockerfile'
- 'docker-compose.prod.yml'
- 'monitoring/**'
- '.github/workflows/**'

jobs:
# ==================================
Expand Down Expand Up @@ -57,7 +58,7 @@ jobs:
docker push ${{ secrets.DOCKERHUB_USERNAME }}/flash-deal:latest

# ==================================
# Job 2: 모니터링 서버 배포 (Prometheus target 업데이트)
# Job 2: 모니터링 서버 배포 (Prometheus + Grafana)
# ==================================
deploy-monitoring:
needs: build
Expand Down Expand Up @@ -95,40 +96,48 @@ jobs:
metrics_path: '/actuator/prometheus'
static_configs:
- targets:
- '${{ secrets.NCP_APP_PRIVATE_IP }}:8080'
- '${{ secrets.NCP_APP_IP_1 }}:8080'
- '${{ secrets.NCP_APP_IP_2 }}:8080'
- '${{ secrets.NCP_APP_IP_3 }}:8080'
labels:
group: 'flash-deal-v1'
group: 'flash-deal-v2'
EOF

docker compose down || true
docker compose up -d
docker compose ps

# ==================================
# Job 3: App 서버 배포
# Job 3: App 서버 1 배포 (모니터링 서버 경유)
# ==================================
deploy-app:
deploy-app-1:
needs: build
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Copy files to app server
- name: Copy files to app server 1
uses: appleboy/scp-action@master
with:
host: ${{ secrets.NCP_APP_IP }}
host: ${{ secrets.NCP_APP_IP_1 }}
username: root
key: ${{ secrets.NCP_SSH_KEY }}
proxy_host: ${{ secrets.NCP_MONITORING_IP }}
proxy_username: root
proxy_key: ${{ secrets.NCP_SSH_KEY }}
source: "docker-compose.prod.yml"
target: "/root/flashdeal-app"

- name: Deploy to app server
- name: Deploy to app server 1
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_APP_IP }}
host: ${{ secrets.NCP_APP_IP_1 }}
username: root
key: ${{ secrets.NCP_SSH_KEY }}
proxy_host: ${{ secrets.NCP_MONITORING_IP }}
proxy_username: root
proxy_key: ${{ secrets.NCP_SSH_KEY }}
script: |
cd /root/flashdeal-app

Expand All @@ -143,6 +152,8 @@ jobs:
NCP_ACCESS_KEY=${{ secrets.NCP_ACCESS_KEY }}
NCP_SECRET_KEY=${{ secrets.NCP_SECRET_KEY }}
NCP_DEFAULT_IMAGE_URL=${{ secrets.NCP_DEFAULT_IMAGE_URL }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
SPRING_PROFILES_ACTIVE=prod
EOF

Expand All @@ -153,10 +164,122 @@ jobs:
docker compose -f docker-compose.prod.yml ps

# ==================================
# Job 4: 배포 결과 확인
# Job 4: App 서버 2 배포 (모니터링 서버 경유)
# ==================================
deploy-app-2:
needs: build
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Copy files to app server 2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.NCP_APP_IP_2 }}
username: root
key: ${{ secrets.NCP_SSH_KEY }}
proxy_host: ${{ secrets.NCP_MONITORING_IP }}
proxy_username: root
proxy_key: ${{ secrets.NCP_SSH_KEY }}
source: "docker-compose.prod.yml"
target: "/root/flashdeal-app"

- name: Deploy to app server 2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_APP_IP_2 }}
username: root
key: ${{ secrets.NCP_SSH_KEY }}
proxy_host: ${{ secrets.NCP_MONITORING_IP }}
proxy_username: root
proxy_key: ${{ secrets.NCP_SSH_KEY }}
script: |
cd /root/flashdeal-app

cat > .env << EOF
MYSQL_HOST=${{ secrets.MYSQL_HOST }}
MYSQL_DBNAME=${{ secrets.MYSQL_DBNAME }}
MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
TOSS_SECRET_KEY=${{ secrets.TOSS_SECRET_KEY }}
TOSS_BASE_URL=${{ secrets.TOSS_BASE_URL }}
NCP_ACCESS_KEY=${{ secrets.NCP_ACCESS_KEY }}
NCP_SECRET_KEY=${{ secrets.NCP_SECRET_KEY }}
NCP_DEFAULT_IMAGE_URL=${{ secrets.NCP_DEFAULT_IMAGE_URL }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
SPRING_PROFILES_ACTIVE=prod
EOF

docker compose -f docker-compose.prod.yml down || true
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/flash-deal:latest
docker image prune -f
docker compose -f docker-compose.prod.yml up -d
docker compose -f docker-compose.prod.yml ps

# ==================================
# Job 5: App 서버 3 배포 (모니터링 서버 경유)
# ==================================
deploy-app-3:
needs: build
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Copy files to app server 3
uses: appleboy/scp-action@master
with:
host: ${{ secrets.NCP_APP_IP_3 }}
username: root
key: ${{ secrets.NCP_SSH_KEY }}
proxy_host: ${{ secrets.NCP_MONITORING_IP }}
proxy_username: root
proxy_key: ${{ secrets.NCP_SSH_KEY }}
source: "docker-compose.prod.yml"
target: "/root/flashdeal-app"

- name: Deploy to app server 3
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_APP_IP_3 }}
username: root
key: ${{ secrets.NCP_SSH_KEY }}
proxy_host: ${{ secrets.NCP_MONITORING_IP }}
proxy_username: root
proxy_key: ${{ secrets.NCP_SSH_KEY }}
script: |
cd /root/flashdeal-app

cat > .env << EOF
MYSQL_HOST=${{ secrets.MYSQL_HOST }}
MYSQL_DBNAME=${{ secrets.MYSQL_DBNAME }}
MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
TOSS_SECRET_KEY=${{ secrets.TOSS_SECRET_KEY }}
TOSS_BASE_URL=${{ secrets.TOSS_BASE_URL }}
NCP_ACCESS_KEY=${{ secrets.NCP_ACCESS_KEY }}
NCP_SECRET_KEY=${{ secrets.NCP_SECRET_KEY }}
NCP_DEFAULT_IMAGE_URL=${{ secrets.NCP_DEFAULT_IMAGE_URL }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
REDIS_PORT=${{ secrets.REDIS_PORT }}
SPRING_PROFILES_ACTIVE=prod
EOF

docker compose -f docker-compose.prod.yml down || true
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/flash-deal:latest
docker image prune -f
docker compose -f docker-compose.prod.yml up -d
docker compose -f docker-compose.prod.yml ps

# ==================================
# Job 6: 배포 결과 확인
# ==================================
verify:
needs: [deploy-monitoring, deploy-app]
needs: [deploy-monitoring, deploy-app-1, deploy-app-2, deploy-app-3]
runs-on: ubuntu-latest
steps:
- name: Deployment Status
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,11 @@ out/
### VS Code ###
.vscode/

# Gradle user home (CI cache)
.gradle-user-home/

# Claude Code
.claude/

# Environment variables
.env
Loading
Loading