## 왜 배포 Gateway가 필요한가
여러 서비스를 운영하는 환경에서 가장 흔한 문제 중 하나는 **신규 서비스 배포 시 기존 서비스에 영향을 주는 것**입니다. 포트 충돌, 리소스 경합, 잘못된 배포 대상 등의 문제로 운영 중인 서비스가 중단되는 사고는 생각보다 자주 발생합니다.
이번 글에서는 이러한 문제를 해결하기 위한 배포 Gateway 시스템의 설계 전략을 소개합니다.
## 핵심 설계 목표
안전한 배포 시스템을 구축하기 위해 다음 5가지 목표를 설정했습니다.
### 1. 기존 서비스 영향 최소화
신규 배포가 기존 서비스의 가용성에 영향을 주지 않도록 **배포 전 검증 단계**를 도입합니다.
### 2. 포트 충돌 자동 방지
배포 요청 시 사용 중인 포트를 자동으로 체크하고, 충돌 시 배포를 차단하거나 대체 포트를 제안합니다.
### 3. 배포 대상 제한
프로덕션 환경에서는 컨테이너 기반 배포만 허용하고, 베어메탈 직접 배포를 원천 차단하여 일관성을 유지합니다.
### 4. 배포 이력 추적
모든 배포 작업을 데이터베이스에 기록하여 **누가, 언제, 무엇을, 어디에** 배포했는지 추적 가능하게 합니다.
### 5. 빠른 롤백
문제 발생 시 이전 버전으로 즉시 복구할 수 있도록 이미지 버전 관리 및 롤백 기능을 제공합니다.
## 시스템 아키텍처 구성
### 3-Tier 구조
```
[배포 요청] → [Gateway API] → [배포 Agent] → [컨테이너 런타임]
↓
[배포 DB]
```
1. **Gateway API**: 배포 요청을 받아 검증하고 승인
2. **배포 DB**: 포트 사용 현황, 배포 이력, 서비스 메타데이터 저장
3. **배포 Agent**: 각 서버에서 실제 컨테이너 실행 (제한된 권한)
### 데이터베이스 분리 전략
배포 시스템의 DB를 별도로 분리한 이유는 다음과 같습니다.
- **보안 격리**: 배포 시스템 침해 시 비즈니스 DB 영향 차단
- **장애 격리**: DB 장애 시 영향 범위 최소화 (Blast Radius 제한)
- **권한 최소화**: 배포 계정은 배포 DB만 접근 가능
- **복구 독립성**: 배포 이력 DB를 독립적으로 백업/복구 가능
## 구현 단계별 계획
### Phase 1: 인프라 구축 (초기 2일)
- 별도 DB 서버 구성
- 배포 이력 테이블 스키마 설계
- 포트 관리 테이블 생성
- 배포 전용 계정 권한 설정
### Phase 2: API 개발 (3일)
- 배포 요청 검증 API
- 포트 충돌 체크 로직
- 배포 이력 기록 API
- 롤백 API
### Phase 3: 통합 테스트 (2일)
- 동시 배포 시나리오 테스트
- 포트 충돌 감지 테스트
- 롤백 기능 검증
### Phase 4: 기존 서비스 마이그레이션 (3일)
- 기존 배포 프로세스를 Gateway 경유로 전환
- 배포 스크립트 수정
- 모니터링 대시보드 구축
## 핵심 기능 구현 예시
### 포트 충돌 체크 로직
```python
def check_port_available(server_id: str, port: int) -> bool:
"""
배포 전 포트 사용 여부 확인
"""
query = """
SELECT service_name
FROM deployments
WHERE server_id = %s
AND port = %s
AND status = 'running'
"""
result = db.execute(query, (server_id, port))
if result:
raise PortConflictError(
f"Port {port} already used by {result[0]['service_name']}"
)
return True
```
### 배포 이력 기록
```python
@dataclass
class DeploymentRecord:
service_name: str
server_id: str
port: int
image: str
deployed_by: str
deployed_at: datetime
status: str # running, stopped, failed
def record_deployment(record: DeploymentRecord):
db.insert('deployments', record.__dict__)
```
## 보안 고려사항
1. **최소 권한 원칙**: 배포 계정은 Docker 실행 권한만 보유
2. **화이트리스트 방식**: 허용된 이미지 레지스트리만 배포 가능
3. **감사 로그**: 모든 배포 시도를 로깅
4. **승인 프로세스**: 프로덕션 배포는 2단계 승인 필요
## 운영 모니터링
배포 Gateway 도입 후 다음 지표를 추적합니다.
- 배포 성공률
- 평균 배포 소요 시간
- 롤백 빈도
- 포트 충돌 감지 횟수
- 서버별 리소스 사용률
## 결론
배포 Gateway 시스템을 도입하면 다음과 같은 효과를 얻을 수 있습니다.
- **안정성 향상**: 배포 실수로 인한 장애 감소
- **추적성 확보**: 언제든 배포 이력 조회 가능
- **빠른 복구**: 문제 발생 시 즉시 롤백
- **표준화**: 일관된 배포 프로세스 확립
초기 구축 비용은 있지만, 장기적으로 운영 안정성과 개발자 생산성을 크게 향상시킬 수 있는 투자입니다.
다음 단계로는 배포 자동화(CI/CD 연동), 카나리 배포, Blue-Green 배포 등 고급 배포 전략을 추가할 수 있습니다.