Skip to content

[chore] 배포 환경 구축 (가비아 2대 · dev/prod · CD) #7

Description

@theminjunchoi

작업 내용

GAMSS 백엔드를 가비아 클라우드 2대(dev · prod) 로 배포하고 CD 파이프라인을 구축한다.
서버는 dev·prod로 나누되, 각 서버 안에서 app·db 컨테이너를 Docker로 함께 띄운다.

dev 서버 :  [dev-app 컨테이너] ─ 도커 네트워크 ─ [dev-db(MySQL) 컨테이너]
prod 서버:  [prod-app 컨테이너] ─ 도커 네트워크 ─ [prod-db(MySQL) 컨테이너]
  • 예산: 가비아 크레딧 300만/년(월 약 25만) 이내에서 운영, 크레딧 소진 후 추가지출 없이 축소 가능하게 구성
  • 이미지 레지스트리: ghcr.io 권장 (확정 필요)
  • DB: 서버 내 자체 MySQL(도커) (확정 필요)

작업이 필요한 이유

  • 지금까지 로컬·테스트(Testcontainers)만 있고 실제 dev/prod 배포 환경이 없다.
  • dev↔prod는 서버를 분리해 prod 안정성을 확보하고, app↔db는 같은 서버 컨테이너로 두어 비용·운영을 최적화한다(현재 트래픽 규모에 물리 4대 분리는 과함).

✅ 완료 조건 (DoD)

1. 이미지 빌드

  • 멀티스테이지 Dockerfile 작성 (Gradle 빌드 → JRE 런타임 이미지)
  • GitHub Actions에서 이미지 빌드 후 레지스트리(ghcr.io) push (태그: commit SHA · dev · prod)

2. 서버 프로비저닝 (수동 작업 + 문서화)

  • 가비아 g클라우드 VM 2대 생성 (dev / prod, 월 25만 이내 사양)
  • Docker · docker compose 설치, SSH 배포용 키 등록
  • 방화벽 설정 (22 / 80 / 443만 오픈, DB 포트 외부 차단)
  • 서버 접속·초기 설정 절차 문서화

3. 환경별 설정 · 시크릿

  • application-dev.yml · application-prod.yml 복구 (datasource · jwt · oauth 를 env 주입)
  • GitHub Environments(dev/prod)에 시크릿 등록 (DB_URL · DB_USERNAME · DB_PASSWORD · JWT_SECRET · GOOGLE_CLIENT_IDS · APPLE_CLIENT_IDS · 서버 SSH 접속정보)

4. DB

  • dev-db · prod-db MySQL 컨테이너 기동 (볼륨 영속화, 포트 외부 비공개=localhost/도커망 전용)
  • 앱 전용 계정 · 데이터베이스 생성 (스키마는 Flyway가 마이그레이션)
  • 정기 백업(덤프) 정책 마련

5. CD 파이프라인

  • 헬스체크용 actuator(/actuator/health) 추가
  • dev 브랜치 머지 → dev 서버 자동 배포 (이미지 pull + docker compose up)
  • prod 릴리즈(dev→prod) → prod 서버 배포
  • 배포 후 헬스체크 및 실패 시 롤백(이전 이미지 유지)

6. 리버스 프록시 · HTTPS · 도메인

  • Nginx 리버스 프록시 구성
  • 가비아 도메인 연결 (dev/prod 서브도메인)
  • Let's Encrypt(certbot) HTTPS 적용

검증

  • dev · prod 각각 배포 1회 성공, /actuator/health UP
  • dev · prod Swagger(/swagger-ui.html) 접속 확인

우선순위

P1 - 높음

연관 이슈

관련 #5

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions