배포 프로세스 - prgrms-web-devcourse-final-project/WEB4_5_GAEPPADAK_BE GitHub Wiki
이 문서는 개발에 빠진 닭(team04-kkokkio
) 팀의kkokkio
프로젝트의 배포 프로세스를 정리한 내용을 담고 있습니다. 현재 kkokkio
프로젝트는 CI/CD 자동화를 기반으로 GitHub Actions
, Docker
, EC2
, RDS
, Doppler
를 사용하여 개발 환경에 안정적으로 배포합니다.
graph TD
subgraph GitHub
A1["PR 생성 (main 브랜치)"]
A2["리뷰어 자동 할당"]
A3["자동 테스트 실행"]
A4{"테스트 성공 여부"}
A5["PR 리뷰 및 머지"]
end
subgraph GitHub Actions 자동 배포
B1["Tag 생성 및 GitHub Release"]
B2["Docker 이미지 Build & Push"]
B3["EC2 접속 후 이미지 Pull"]
B4["기존 컨테이너 중지 및 최신 이미지 실행"]
end
subgraph 서비스 배포
C1["EC2"]
C2["RDS"]
C3["Docker"]
C4["Doppler"]
end
%% 메인 흐름
A1 --> A2 --> A3 --> A4
A4 -- 성공 --> A5 --> B1 --> B2 --> B3 --> B4
%% 실패 루트
A4 -- 실패 --> F1["코드 재작성"] --> A1
%% 외부 시스템 연결
B4 --> C1
C1 --> C2
C1 --> C3
B4 --> C4
graph TD
subgraph EC2_인스턴스
Backend["Docker: Backend App<br/>포트 8080"]
Redis["Docker: Redis<br/>포트 6379"]
Backend --> Redis
end
Doppler["Doppler<br/>(Secrets 관리)"]
RDS["RDS (MySQL)<br/>VPC 내부"]
Doppler --> Backend
Backend --> RDS
- EC2 인스턴스 내에서 백엔드와 Redis는 사용자 정의 Docker 네트워크(common)를 통해 통신
- 백엔드에서 Doppler로부터 환경변수를 주입받고, RDS(MySQL)는 VPC 내부에서 연결
단계 | 설명 |
---|---|
1 | 개발 완료 후 main 브랜치로 Pull Request를 생성 |
2 | 자동 테스트가 실행되어 코드의 유효성을 검증 |
3 | 테스트가 통과하면 PR 리뷰 및 머지를 진행한다. 테스트 실패 시, 코드 수정 후 다시 PR을 등록 |
4 | PR이 main 브랜치에 머지되면 GitHub Actions의 deploy-prd.yml 워크플로우가 실행됨. 해당 작업은 새로운 태그(v-prd-날짜 )를 생성하고 GitHub Release를 발행 |
5 | 릴리즈 이후, 태그를 기반으로 Dockerfile.prd를 이용해 Docker 이미지를 빌드하며 GitHub Container Registry(GHCR)에 Push됨 |
6 | 이후 GitHub Actions가 AWS SSM(AWS Systems Manager)을 사용해 EC2 인스턴스에 접속하고, latest 태그의 이미지를 Pull한 후 기존 컨테이너를 중단함 |
7 | 새로 Pull한 이미지로 컨테이너를 실행하며, --restart always 로 설정되어 시스템 재시작에도 자동 복구됨 |
main
브랜치에서 다음 파일 변경 시 배포 워크플로우가 트리거 됨
-
backend/src/**
, build.gradle
Dockerfile.prd
.github/workflows/**
- 백엔드 서버(Spring Boot)는 EC2 인스턴스에서 Docker 컨테이너로 실행
- Redis는 같은 EC2 내에서 별도의 Docker 컨테이너로 실행되며,
-network common
옵션으로 백엔드와 동일한 네트워크에서 연결 - 데이터베이스는 AWS RDS(MySQL)이며, VPC 내부에서 EC2 인스턴스와 통신 가능하도록 보안 그룹 설정
- 모든 민감한 환경 변수는 Doppler를 통해 주입되며,
DOPPLER_TOKEN
은 런타임 시 주입 - DB 초기화 및 마이그레이션은 Flyway를 사용하여 애플리케이션 실행 시 자동 수행
- 테스트 실패 시:
코드 재작성 → 다시 PR
루트로 회귀 - 배포 실패 시, GitHub Actions 로그를 통해 원인 추적 후 동일한 태그로 수동 재배포 가능
- CI/CD: GitHub Actions
- 이미지 저장소: GitHub Container Registry (GHCR)
- 서버: AWS EC2 (SSM 명령 기반 비SSH 접근)
- 인프라 관리: Terraform
- 환경 변수 관리: Doppler
- DB 마이그레이션: Flyway
- 캐시 서버: Redis (Docker 내부 실행)
- 데이터베이스: AWS RDS (MySQL)
- 자동 배포 시 EC2 인스턴스 접근은 SSM 기반으로 이뤄짐
- Docker 이미지 버전 관리는 태그를 기준으로 진행됨
- 배포 시 모든 로그는 GitHub Actions 콘솔에서 확인할 수 있음