Skip to content

Commit 2186626

Browse files
f-lab-pizclaude
andcommitted
feat: 무중단 배포에 DB 마이그레이션 통합
- deploy.sh에 alembic upgrade head 자동 실행 추가 - 배포 순서: 빌드 → 마이그레이션 → 서버 재시작 - 마이그레이션 실패 시 배포 자동 중단 (exit 1) - plan.md에 무중단 배포 마이그레이션 전략 상세 문서화 핵심 설계: 1. 서버 재시작 전에 마이그레이션 선행 적용 2. Fail-Fast: 마이그레이션 실패 시 즉시 배포 중단 3. 마이그레이션 전/후 상태를 alembic current로 로깅 무중단 배포 전략: - 하위 호환 마이그레이션: 컬럼 추가(nullable), 인덱스 추가 - 주의 필요: 컬럼 삭제, NOT NULL 제약 → 2단계 배포 필요 학습 포인트: - nullable 컬럼 추가로 구 버전 서버와 호환성 유지 - 마이그레이션과 코드 배포를 분리하여 안전성 확보 - 배포 전 스키마 변경으로 다운타임 최소화 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent e35dc3b commit 2186626

File tree

2 files changed

+94
-7
lines changed

2 files changed

+94
-7
lines changed

deploy.sh

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,26 @@ echo "=== 무중단 배포 시작 ==="
1111
echo "1. 새 이미지 빌드 중..."
1212
docker-compose build
1313

14+
# 데이터베이스 마이그레이션 실행
15+
echo ""
16+
echo "2. 데이터베이스 마이그레이션 실행..."
17+
echo " - 현재 마이그레이션 상태 확인"
18+
docker-compose run --rm app1 alembic current
19+
20+
echo " - 마이그레이션 적용 (upgrade head)"
21+
if docker-compose run --rm app1 alembic upgrade head; then
22+
echo " - 마이그레이션 완료!"
23+
else
24+
echo " - 오류: 마이그레이션 실패! 배포를 중단합니다."
25+
exit 1
26+
fi
27+
28+
echo " - 마이그레이션 후 상태 확인"
29+
docker-compose run --rm app1 alembic current
30+
1431
# app1 배포
1532
echo ""
16-
echo "2. app1 배포 시작..."
33+
echo "3. app1 배포 시작..."
1734
echo " - app1 Graceful Shutdown 시작 (SIGTERM 전송)"
1835
docker-compose stop -t 30 app1
1936

@@ -38,12 +55,12 @@ echo " - app1 배포 완료!"
3855

3956
# 중간 대기 (안정화)
4057
echo ""
41-
echo "3. 잠시 대기 중 (20초)..."
58+
echo "4. 잠시 대기 중 (20초)..."
4259
sleep 20
4360

4461
# app2 배포
4562
echo ""
46-
echo "4. app2 배포 시작..."
63+
echo "5. app2 배포 시작..."
4764
echo " - app2 Graceful Shutdown 시작 (SIGTERM 전송)"
4865
docker-compose stop -t 30 app2
4966

plan.md

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,80 @@ alembic upgrade head
159159
- down_revision이 자동으로 이전 마이그레이션을 참조
160160
- upgrade/downgrade가 정확히 반대 동작 수행
161161

162-
#### 6-3. 무중단 배포 통합
163-
- [ ] deploy.sh에 마이그레이션 자동화
164-
- [ ] 배포 전 마이그레이션 실행
165-
- [ ] 실패 시 롤백 로직
162+
#### 6-3. 무중단 배포 통합 ✅
163+
deploy.sh 스크립트에 데이터베이스 마이그레이션을 통합했습니다.
164+
165+
**배포 프로세스 (개선 후):**
166+
```
167+
1. 이미지 빌드
168+
2. 데이터베이스 마이그레이션 실행 ← 새로 추가!
169+
3. app1 배포 (Graceful Shutdown)
170+
4. 안정화 대기
171+
5. app2 배포 (Graceful Shutdown)
172+
```
173+
174+
**마이그레이션 통합 로직:**
175+
```bash
176+
# 2. 데이터베이스 마이그레이션 실행
177+
echo "2. 데이터베이스 마이그레이션 실행..."
178+
echo " - 현재 마이그레이션 상태 확인"
179+
docker-compose run --rm app1 alembic current
180+
181+
echo " - 마이그레이션 적용 (upgrade head)"
182+
if docker-compose run --rm app1 alembic upgrade head; then
183+
echo " - 마이그레이션 완료!"
184+
else
185+
echo " - 오류: 마이그레이션 실패! 배포를 중단합니다."
186+
exit 1
187+
fi
188+
189+
echo " - 마이그레이션 후 상태 확인"
190+
docker-compose run --rm app1 alembic current
191+
```
192+
193+
**핵심 설계 원칙:**
194+
195+
1. **서버 재시작 전에 마이그레이션**
196+
- 스키마 변경을 먼저 적용
197+
- 이후 새 코드로 서버 재시작
198+
- 스키마-코드 호환성 보장
199+
200+
2. **실패 시 배포 중단 (Fail-Fast)**
201+
- `set -e`로 오류 시 즉시 중단
202+
- 마이그레이션 실패 시 `exit 1`
203+
- 불완전한 배포 방지
204+
205+
3. **마이그레이션 상태 추적**
206+
- 배포 전/후 `alembic current` 로그
207+
- 어떤 마이그레이션이 적용되었는지 확인 가능
208+
- 트러블슈팅 용이
209+
210+
**무중단 배포 시 마이그레이션 전략:**
211+
212+
**하위 호환 마이그레이션 (Backward Compatible):**
213+
- ✅ 컬럼 추가 (nullable=True)
214+
- ✅ 인덱스 추가
215+
- ✅ 새 테이블 추가
216+
- → 구 버전 서버가 계속 동작 가능
217+
218+
**주의가 필요한 마이그레이션:**
219+
- ⚠️ 컬럼 삭제
220+
- ⚠️ NOT NULL 제약 추가
221+
- ⚠️ 컬럼명 변경
222+
- → 2단계 배포 필요 (Blue-Green)
223+
224+
**2단계 배포 예시 (컬럼 삭제 시):**
225+
```
226+
1차 배포: 코드에서 컬럼 사용 중단 (읽기만)
227+
대기 기간: 모든 서버가 새 코드로 전환
228+
2차 배포: DB에서 컬럼 실제 삭제
229+
```
230+
231+
**학습 포인트:**
232+
- 마이그레이션은 애플리케이션 코드와 별개로 동작
233+
- 배포 전 마이그레이션으로 다운타임 최소화
234+
- nullable 컬럼으로 하위 호환성 유지
235+
- 실패 시 자동 중단으로 안전성 확보
166236

167237
#### 6-4. 데이터 마이그레이션
168238
- [ ] 데이터 변환 마이그레이션 작성

0 commit comments

Comments
 (0)