-
Notifications
You must be signed in to change notification settings - Fork 0
Deployment
TAEHEON KIM edited this page Jun 26, 2026
·
2 revisions
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 인스턴스에서 실행됩니다.
PR 오픈 / 푸시
-> GitHub Actions 트리거
-> ./gradlew build -x generateJooq
-> ./gradlew test (TestContainers 통합 테스트 포함)
-> 빌드 실패 시 머지 차단
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
|
| 항목 | 내용 |
|---|---|
| 도메인 | DuckDNS (무료 동적 도메인) |
| SSL 인증서 | Let's Encrypt + Certbot (90일, 자동 갱신) |
| SSL 종료 | Nginx에서 처리 -> 내부 통신은 HTTP |
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;
}