Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f18beed
test: prod-cicd-pipeline 테스트용으로 workflows 수정
dev-ant Jan 18, 2026
3c24271
feat: docker-compose-prod 추가
dev-ant Jan 18, 2026
3e89f36
feat: github actions workflow 테스트용 수정
dev-ant Jan 18, 2026
7e88db2
feat: workflow 디버깅용 로그 추가
dev-ant Jan 18, 2026
d225e62
fix: cd-pipeline workflows ssh key-gen 시 포트 반영
dev-ant Jan 18, 2026
1fa5310
feat:ixod-cd workflows 오타 수정
dev-ant Jan 18, 2026
c16ddaf
fix: worflows 오타 수정
dev-ant Jan 18, 2026
41353be
fix: workflows scp -p 옵션 오타 수정
dev-ant Jan 18, 2026
b6570f2
feat: cd workflows app port, server port 혼돈 문제 수정
dev-ant Jan 18, 2026
799edec
fix: cd workflows env 파일명 수정
dev-ant Jan 18, 2026
a2866cc
fix: cd workflows docker hub login 추가
dev-ant Jan 18, 2026
28a9869
feat: docker-compose-prod network 설정 추가
dev-ant Jan 18, 2026
6c2fd32
fix: docker compose 설정 파일명 수정
dev-ant Jan 19, 2026
27212a8
feat: cd workflow 변수명 통일
dev-ant Jan 19, 2026
c96370c
fix: env_file에서 하드코딩 가능한 값 docker-compose로 이식
dev-ant Jan 19, 2026
4842249
fix: cd workflows에 변경된 도커 컨테이너명 반영
dev-ant Jan 19, 2026
8056d8a
fix: push-cd-prod.yml 오타 수정
dev-ant Jan 19, 2026
5c9aeab
feat: docker-compose java opt 기본값 보장
dev-ant Jan 20, 2026
4cdcbf3
fix: push-cd-prod 배포 디렉터리 경로 수정
dev-ant Jan 20, 2026
6a605fb
fix: push-cd-prod pull request trigger 제거
dev-ant Jan 20, 2026
be42177
feat: prod dev cd workflows 스타일 통일
dev-ant Jan 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 19 additions & 80 deletions .env.local.sample
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,37 @@
# 사용법:
# 1. 이 파일을 .env.local로 복사하세요
# 2. 필요한 값들을 채워넣으세요
# 3. docker-compose -f docker-compose.local.yml up --build 로 실행하세요
# 3. docker-compose -f docker-compose-local.yml --env-file .env.local up -d --build 로 실행하세요
#
# 참고: JVM, Docker 리소스, Healthcheck, Autoheal, Logging 설정은
# docker-compose-local.yml에 하드코딩되어 있습니다.
# =============================================================================

# =============================================================================
# Application Configuration
# =============================================================================
SERVER_PORT=8080
SPRING_PROFILES_ACTIVE=local
SERVER_PORT=8092

# =============================================================================
# Database Configuration
# =============================================================================
# 로컬 MySQL 사용 시 (Docker로 MySQL 실행하는 경우)
DB_IP=host.docker.internal # Docker 컨테이너에서 호스트 머신 접근
# DB_IP=localhost # 호스트 머신에서 직접 실행 시
DB_PORT=3306
DB_SCHEMA=devnogi
DB_USER=root
# Docker Compose 내부 MySQL 사용 시 (docker-compose-local.yml에 MySQL 포함)
DB_IP=mysql # Docker 서비스 이름
DB_PORT=3318 # Docker 내부 포트
DB_SCHEMA=local_oab
DB_USER=local_oab
DB_PASSWORD=your_local_password
DB_ROOT_PASSWORD=your_root_password

# 외부 MySQL 접속용 포트 (호스트에서 MySQL 컨테이너 접근 시)
MYSQL_EXTERNAL_PORT=3318

# =============================================================================
# Security Configuration (로컬 개발용 - 운영 환경과 다른 값 사용)
# =============================================================================
JWT_SECRET_KEY=local-development-secret-key-do-not-use-in-production-change-this
JWT_ACCESS_TOKEN_VALIDITY=3600000 # 1시간 (밀리초)
JWT_REFRESH_TOKEN_VALIDITY=86400000 # 24시간 (밀리초)
JWT_REFRESH_TOKEN_VALIDITY=86400000 # 24시간 (밀리초)

# =============================================================================
# External API Configuration
Expand All @@ -41,74 +46,8 @@ NEXON_OPEN_API_KEY=your_nexon_api_key_here

# 경매 데이터 수집 설정
AUCTION_HISTORY_DELAY_MS=1000 # API 호출 간 딜레이 (1초)
AUCTION_HISTORY_CRON=0 0 * * * * # 매시간 정각에 실행 (초 분 시 일 월 요일)
AUCTION_HISTORY_MIN_PRICE_CRON=0 30 * * * * # 매시간 30분에 실행

# =============================================================================
# Docker Configuration (로컬 개발에서는 불필요)
# =============================================================================
# DOCKER_USERNAME=your_dockerhub_username
# DOCKER_PASSWORD=your_dockerhub_password
# DOCKER_REPO=open-api-batch-server
# DOCKER_IMAGE_TAG=local

# =============================================================================
# JVM Memory Configuration (로컬 개발용 - 메모리 사용량 감소)
# =============================================================================
# Heap Memory - 로컬에서는 적은 메모리로 실행
JAVA_OPTS_XMS=256m # 초기 힙 메모리
JAVA_OPTS_XMX=512m # 최대 힙 메모리

# Non-Heap Memory
JAVA_OPTS_MAX_METASPACE_SIZE=128m # Metaspace 최대 크기
JAVA_OPTS_RESERVED_CODE_CACHE_SIZE=64m # JIT 컴파일된 코드 캐시
JAVA_OPTS_MAX_DIRECT_MEMORY_SIZE=64m # Direct Buffer 최대 크기
JAVA_OPTS_XSS=512k # 스레드 스택 크기

# =============================================================================
# JVM GC Configuration (G1GC)
# =============================================================================
JAVA_OPTS_MAX_GC_PAUSE_MILLIS=200 # GC 일시정지 목표 시간
JAVA_OPTS_G1_HEAP_REGION_SIZE=1m # G1 힙 영역 크기
JAVA_OPTS_INITIATING_HEAP_OCCUPANCY_PERCENT=45 # GC 시작 힙 점유율

# =============================================================================
# JVM Compiler Configuration
# =============================================================================
# 로컬 개발에서는 빠른 시작을 위해 TieredStopAtLevel=1 (C1 컴파일러만 사용)
JAVA_OPTS_TIERED_STOP_AT_LEVEL=1 # 1: 빠른 시작, 4: 최적 성능
JAVA_OPTS_CI_COMPILER_COUNT=2 # 컴파일러 스레드 수
AUCTION_HISTORY_CRON=0 0 * * * * # 매시간 정각에 실행 (초 분 시 일 월 요일)

# =============================================================================
# Docker Container Resource Limits (로컬 개발용)
# =============================================================================
DOCKER_MEMORY_LIMIT=1g # 컨테이너 최대 메모리
DOCKER_MEMORY_RESERVATION=512m # 예약 메모리

# =============================================================================
# Container Restart Policy
# =============================================================================
RESTART_POLICY_MAX_RETRIES=3 # 실패 시 최대 재시작 횟수

# =============================================================================
# Health Check Configuration (로컬 개발용 - 더 짧은 간격)
# =============================================================================
HEALTHCHECK_INTERVAL=30s # 헬스 체크 주기
HEALTHCHECK_TIMEOUT=10s # 헬스 체크 타임아웃
HEALTHCHECK_RETRIES=3 # 연속 실패 횟수
HEALTHCHECK_START_PERIOD=60s # 시작 유예 기간

# =============================================================================
# Autoheal Configuration
# =============================================================================
AUTOHEAL_INTERVAL=30 # unhealthy 체크 주기 (초)
AUTOHEAL_START_PERIOD=0 # 체크 시작 유예 시간
AUTOHEAL_DEFAULT_STOP_TIMEOUT=10 # 재시작 시 강제 종료 대기 시간
AUTOHEAL_MEMORY_LIMIT=50M # autoheal 최대 메모리
AUTOHEAL_MEMORY_RESERVATION=20M # autoheal 예약 메모리

# =============================================================================
# Logging Configuration
# =============================================================================
LOGGING_MAX_SIZE=10m # 로그 파일 최대 크기
LOGGING_MAX_FILE=3 # 로그 파일 보관 개수
# 통계 스케줄러 설정
STATISTICS_DAILY_CRON=0 0 3 * * * # 매일 오전 3시
STATISTICS_WEEKLY_CRON=0 0 4 * * MON # 매주 월요일 오전 4시
82 changes: 0 additions & 82 deletions .env.sample

This file was deleted.

50 changes: 37 additions & 13 deletions .github/workflows/push-cd-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ jobs:
- name: Setup SSH key and config
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/my-key.pem
echo "${{ secrets.SSH_PRIVATE_KEY }}" | tr -d '\r' > ~/.ssh/my-key.pem
chmod 400 ~/.ssh/my-key.pem
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
echo -e "Host *\n ServerAliveInterval 60\n ServerAliveCountMax 3" >> ~/.ssh/config
Expand All @@ -91,26 +91,29 @@ jobs:
run: |
ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p /home/${{ secrets.SERVER_USER }}/app/logs"

- name: Copy docker-compose-dev.yaml to server
- name: Copy docker-compose-dev.yml to server
run: |
scp -i ~/.ssh/my-key.pem docker-compose-dev.yaml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/
scp -i ~/.ssh/my-key.pem docker-compose-dev.yml ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/home/${{ secrets.SERVER_USER }}/app/

- name: Deploy to Dev Server
run: |
ssh -i ~/.ssh/my-key.pem ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF'
cd /home/${{ secrets.SERVER_USER }}/app

# Write .env.dev content to .env
echo "${{ secrets.ENV_FILE_DEV }}" > .env
# Write .env.dev content to .env.dev
echo "${{ secrets.ENV_FILE_DEV }}" > .env.dev

# Docker Hub 로그인
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

# Pull latest dev image
docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:dev

# Stop and remove existing containers
docker compose down
docker compose -f docker-compose-dev.yml down

# Start new containers
docker compose up -d
docker compose -f docker-compose-dev.yml --env-file .env.dev up -d

echo "✅ Dev deployment complete"
EOF
Expand All @@ -124,19 +127,19 @@ jobs:
echo "=== Starting Health Check ==="

# 1. Check if container is running
CONTAINER_ID=$(docker ps -q --filter "name=spring-app")
CONTAINER_ID=$(docker ps -q --filter "name=devnogi-batch-app-dev")
if [ -z "$CONTAINER_ID" ]; then
echo "❌ Container not running"
docker ps -a
docker logs spring-app --tail 50
docker logs devnogi-batch-app-dev --tail 50
exit 1
fi
echo "✅ Container is running (ID: $CONTAINER_ID)"

# 2. Wait for Docker health check
echo "Waiting for container to become healthy..."
for i in {1..30}; do
HEALTH_STATUS=$(docker inspect --format='{{.State.Health.Status}}' spring-app 2>/dev/null || echo "no-healthcheck")
HEALTH_STATUS=$(docker inspect --format='{{.State.Health.Status}}' devnogi-batch-app-dev 2>/dev/null || echo "no-healthcheck")

if [ "$HEALTH_STATUS" == "healthy" ]; then
echo "✅ Container is healthy"
Expand All @@ -151,7 +154,7 @@ jobs:

if [ $i -eq 30 ]; then
echo "❌ Container failed to become healthy after 5 minutes"
docker logs spring-app --tail 100
docker logs devnogi-batch-app-dev --tail 100
exit 1
fi
done
Expand All @@ -173,13 +176,23 @@ jobs:
if [ $i -eq 20 ]; then
echo "❌ Application health check failed after 3+ minutes"
echo "Last response: $HEALTH_RESPONSE"
docker logs spring-app --tail 100
docker logs devnogi-batch-app-dev --tail 100
exit 1
fi
done

# 4. Smoke test: Check if API responds
echo "Running smoke test..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:${{ secrets.SERVER_PORT || 8080 }}/actuator/health)
if [ "$HTTP_CODE" == "200" ]; then
echo "✅ Smoke test passed (HTTP $HTTP_CODE)"
else
echo "❌ Smoke test failed (HTTP $HTTP_CODE)"
exit 1
fi

echo "=== Health Check Complete ==="
docker ps --filter "name=spring-app"
docker ps --filter "name=devnogi-batch-app-dev"
EOF

- name: Display deployment info
Expand All @@ -189,3 +202,14 @@ jobs:
echo "🔗 Dev Server: http://${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PORT || 8080 }}"
echo "🐳 Image: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:dev"
echo "📦 Commit: ${{ github.sha }}"

# ========================================
# Rollback on Failure
# ========================================
- name: Rollback on failure
if: failure()
run: |
echo "❌ Deployment failed! Consider manual rollback if needed."
echo "To rollback, SSH to server and run:"
echo " docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:dev-<previous-sha>"
echo " docker compose -f docker-compose-dev.yml down && docker compose -f docker-compose-dev.yml --env-file .env.dev up -d"
Loading