@@ -20,31 +20,47 @@ if [ ! -f "deploy/docker-compose.prod.yml" ]; then
20
20
exit 1
21
21
fi
22
22
23
- # 현재 실행 중인 컨테이너 중지 및 제거
24
- echo " 기존 컨테이너 중지 중..."
25
- docker-compose -f deploy/docker-compose.prod.yml down --remove-orphans || true
26
-
27
- # GitHub Container Registry에서 최신 이미지 풀
23
+ # GitHub Container Registry에서 최신 이미지 풀 (Zero-downtime을 위해 먼저 실행)
28
24
echo " 최신 이미지 다운로드 중..."
29
- echo " GHCR 이미진 Pull: ghcr.io/projectvg/projectvgapi:latest"
30
- docker-compose -f deploy/docker-compose.prod.yml pull
25
+ echo " GHCR 이미지 Pull: ghcr.io/projectvg/projectvgapi:latest"
26
+ docker-compose -f deploy/docker-compose.prod.yml pull projectvg-api
31
27
32
28
# 이미지 풀 후 확인
33
29
if ! docker images ghcr.io/projectvg/projectvgapi:latest | grep -q latest; then
34
30
echo " ERROR: 이미지 풀에 실패했습니다. GitHub Container Registry 인증을 확인하세요."
35
31
exit 1
36
32
fi
37
33
38
- # 서비스 시작
39
- echo " 서비스 시작 중..."
40
- docker-compose -f deploy/docker-compose.prod.yml up -d
34
+ # 기존 API 컨테이너만 중지 및 제거 (Zero-downtime strategy)
35
+ echo " 기존 API 컨테이너 교체 중..."
36
+ echo " 현재 실행중인 컨테이너 확인:"
37
+ docker ps -f " name=projectvg-api"
38
+
39
+ docker-compose -f deploy/docker-compose.prod.yml stop projectvg-api || true
40
+ docker-compose -f deploy/docker-compose.prod.yml rm -f projectvg-api || true
41
+
42
+ # 새 이미지로 API 서비스만 시작
43
+ echo " 새 이미지로 API 서비스 시작 중..."
44
+ docker-compose -f deploy/docker-compose.prod.yml up -d projectvg-api
41
45
42
46
# 서비스 상태 확인
43
- echo " 서비스 상태 확인 중..."
44
- sleep 10
47
+ # 빌드 후 불필요한 이미지 정리
48
+ echo " 이전 이미지 정리 중..."
49
+ old_images=$( docker images ghcr.io/projectvg/projectvgapi -f " dangling=true" -q)
50
+ if [ ! -z " $old_images " ]; then
51
+ docker rmi $old_images -f 2> /dev/null || true
52
+ echo " 이전 이미지 정리 완료"
53
+ else
54
+ echo " 정리할 이전 이미지 없음"
55
+ fi
56
+
57
+ # 컨테이너 상태 확인
58
+ echo " API 컨테이너 상태 확인 중..."
59
+ sleep 3
45
60
46
- # 컨테이너 상태 출력
47
- docker-compose -f deploy/docker-compose.prod.yml ps
61
+ # API 컨테이너 상태만 출력
62
+ echo " API 컨테이너 상태:"
63
+ docker ps -f " name=projectvg-api"
48
64
49
65
# 헬스체크 (API가 응답하는지 확인)
50
66
echo " 헬스체크 수행 중..."
70
86
71
87
if [ $retry_count -eq $max_retries ]; then
72
88
echo " ERROR: API 서버가 시작되지 않았습니다. 로그를 확인하세요."
73
- echo " API 컨테이너 로그:"
74
- echo " Docker 컨테이너 상태:"
89
+ echo " API 컨테이너 상태:"
75
90
docker ps -a --filter name=projectvg-api
76
- echo " "
91
+ echo " API 컨테이너 로그 (최근 50줄): "
77
92
docker-compose -f deploy/docker-compose.prod.yml logs --tail=50 projectvg-api
93
+
94
+ echo " 롤백을 수행하시겠습니까? 이전 이미지로 복구할 수 있습니다."
78
95
exit 1
79
96
fi
80
97
@@ -83,6 +100,14 @@ echo "배포가 성공적으로 완료되었습니다!"
83
100
echo " API 엔드포인트: http://localhost:7910"
84
101
echo " 헬스체크: http://localhost:7910/health"
85
102
86
- # 로그 출력 (선택적)
87
- echo " 최근 로그:"
88
- docker-compose -f deploy/docker-compose.prod.yml logs --tail=20
103
+ # 최근 API 로그 출력
104
+ echo " 최근 API 로그 (20줄):"
105
+ docker-compose -f deploy/docker-compose.prod.yml logs --tail=20 projectvg-api
106
+
107
+ # 배포 완료 상태 요약
108
+ echo " "
109
+ echo " === 배포 완료 상태 요약 ==="
110
+ echo " API 컨테이너:"
111
+ docker ps --format " table {{.Names}}\t{{.Status}}\t{{.Ports}}" -f " name=projectvg-api"
112
+ echo " 이미지 정보:"
113
+ docker images --format " table {{.Repository}}:{{.Tag}}\t{{.CreatedAt}}\t{{.Size}}" ghcr.io/projectvg/projectvgapi:latest
0 commit comments