Skip to content

Deployment

TAEHEON KIM edited this page Jun 26, 2026 · 2 revisions

Deployment

인프라 구성

AWS EC2 t3.large (2 vCPU / 8GB)
  └─ Docker Compose
       ├─ Nginx (80, 443)
       ├─ App1 (8080)
       ├─ App2 (8081)
       ├─ MySQL 8.0 (3306)
       ├─ Redis 7 (6379)
       ├─ Kafka KRaft (9092)
       ├─ Elasticsearch (9200)
       ├─ Logstash (5044)
       └─ Kibana (5601)

모든 서비스가 단일 EC2 인스턴스에서 실행됩니다.


CI/CD 파이프라인

PR 생성 시 (CI)

PR 오픈 / 푸시
  -> GitHub Actions 트리거
  -> ./gradlew build -x generateJooq
  -> ./gradlew test (TestContainers 통합 테스트 포함)
  -> 빌드 실패 시 머지 차단

develop 머지 시 (CD)

develop 브랜치 머지
  -> GitHub Actions 트리거
  -> Docker 이미지 빌드
  -> Docker Hub 푸시 (kth1007/study-recruit-platform:latest)
  -> EC2 SSH 접속
  -> docker compose pull
  -> docker compose up -d --no-deps app1 app2

App 컨테이너만 롤링 재시작 — MySQL, Redis, Kafka 등 인프라 컨테이너는 중단 없이 유지


환경 변수 관리

GitHub Actions Secrets으로 관리하며 CD 실행 시 EC2에 .env 파일로 주입

항목 변수명
DB 비밀번호 MYSQL_PASSWORD
JWT 시크릿 JWT_SECRET
Kakao Client ID/Secret KAKAO_CLIENT_ID, KAKAO_CLIENT_SECRET
Docker Hub 자격증명 DOCKERHUB_USERNAME, DOCKERHUB_TOKEN
EC2 SSH 키 EC2_SSH_KEY, EC2_HOST

SSL / 도메인

항목 내용
도메인 DuckDNS (무료 동적 도메인)
SSL 인증서 Let's Encrypt + Certbot (90일, 자동 갱신)
SSL 종료 Nginx에서 처리 -> 내부 통신은 HTTP

Nginx 설정 요약

upstream app {
    server app1:8080;
    server app2:8081;
}

# HTTPS
server {
    listen 443 ssl;
    gzip on;

    location / {
        proxy_pass http://app;
    }

    # WebSocket
    location /ws {
        proxy_pass http://app;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# HTTP -> HTTPS 리다이렉트
server {
    listen 80;
    return 301 https://$host$request_uri;
}

Clone this wiki locally