#!/bin/bash # Quant Engine Manual Deployment Script # 원격 서버에 직접 SSH 접속하여 환경 파악 후 배포 set -e # ═══════════════════════════════════════════════════════════════ # 설정 # ═══════════════════════════════════════════════════════════════ DEPLOY_HOST="${1:-192.168.123.100}" DEPLOY_USER="kjh2064" SSH_KEY="${HOME}/.ssh/id_ed25519" LOCAL_PUBLISH_DIR="$(pwd)/src/dotnet/QuantEngine.Web/publish" REMOTE_DEPLOY_PATH="/var/www/quant" echo "🚀 Quant Engine Manual Deployment" echo "═══════════════════════════════════════════════════════════════" echo "Deploy Host: $DEPLOY_HOST" echo "Deploy User: $DEPLOY_USER" echo "Local Path: $LOCAL_PUBLISH_DIR" echo "Remote Path: $REMOTE_DEPLOY_PATH" echo "═══════════════════════════════════════════════════════════════" echo "" # ═══════════════════════════════════════════════════════════════ # Step 1: SSH 연결 확인 # ═══════════════════════════════════════════════════════════════ echo "📊 Step 1: SSH 연결 및 환경 파악..." ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'ENVCHECK' echo "✓ SSH 연결 성공" echo "" echo "시스템 정보:" uname -a echo "" echo "디스크 상태:" df -h | grep -E "^/dev|Filesystem|/$" echo "" echo "서비스 상태:" sudo systemctl status nginx --no-pager 2>/dev/null | grep -E "Active:|Loaded:" || echo "⚠️ nginx 상태 확인 필요" echo "" echo "웹 서버 디렉토리:" if [ -d /var/www/quant/publish ]; then echo "✓ /var/www/quant/publish 존재" ls -lh /var/www/quant/publish | head -5 echo "..." else echo "✗ /var/www/quant/publish 없음 (첫 배포)" fi echo "" echo "웹 서버 권한:" ls -ld /var/www/quant 2>/dev/null || echo "⚠️ /var/www/quant 없음" echo "" echo "Nginx 포트 확인:" sudo netstat -tuln 2>/dev/null | grep :80 || echo "⚠️ 포트 80 확인 필요" ENVCHECK echo "" # ═══════════════════════════════════════════════════════════════ # Step 2: 배포 파일 준비 확인 # ═══════════════════════════════════════════════════════════════ echo "📦 Step 2: 배포 파일 확인..." if [ ! -d "$LOCAL_PUBLISH_DIR" ]; then echo "❌ 오류: $LOCAL_PUBLISH_DIR 없음" echo "먼저 'dotnet publish -c Release'를 실행하세요" exit 1 fi PACKAGE_SIZE=$(du -sh "$LOCAL_PUBLISH_DIR" | cut -f1) FILE_COUNT=$(find "$LOCAL_PUBLISH_DIR" -type f | wc -l) echo "✓ 배포 패키지:" echo " 크기: $PACKAGE_SIZE" echo " 파일 수: $FILE_COUNT" echo "" # ═══════════════════════════════════════════════════════════════ # Step 3: 사전 확인 # ═══════════════════════════════════════════════════════════════ echo "✅ 배포 전 확인 사항:" echo " [ ] Release 빌드 완료됨" echo " [ ] publish 폴더 확인됨 ($PACKAGE_SIZE)" echo " [ ] SSH 키 설정됨 ($SSH_KEY)" echo "" read -p "배포를 진행하시겠습니까? (y/n) " -n 1 -r echo "" if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "❌ 배포 취소됨" exit 1 fi echo "" # ═══════════════════════════════════════════════════════════════ # Step 4: 백업 생성 # ═══════════════════════════════════════════════════════════════ echo "💾 Step 3: 백업 생성..." ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'BACKUP' set -e BACKUP_DIR="/var/www/quant_backup" BACKUP_NAME="quant_backup_$(date +%Y%m%d_%H%M%S)" if [ -d /var/www/quant/publish ]; then sudo mkdir -p "$BACKUP_DIR" sudo cp -r /var/www/quant/publish "$BACKUP_DIR/$BACKUP_NAME" echo "✓ 백업 생성: $BACKUP_DIR/$BACKUP_NAME" # 최근 5개만 유지 BACKUP_COUNT=$(ls -1 "$BACKUP_DIR" | wc -l) if [ "$BACKUP_COUNT" -gt 5 ]; then OLD_BACKUPS=$(ls -1t "$BACKUP_DIR" | tail -n +6) for backup in $OLD_BACKUPS; do sudo rm -rf "$BACKUP_DIR/$backup" echo "🧹 오래된 백업 삭제: $backup" done fi else echo "⚠️ 기존 배포 없음 (첫 배포)" fi BACKUP echo "" # ═══════════════════════════════════════════════════════════════ # Step 5: 파일 전송 # ═══════════════════════════════════════════════════════════════ echo "📤 Step 4: 파일 전송 (rsync)..." rsync -avz --delete \ --rsh="ssh -i $SSH_KEY" \ "$LOCAL_PUBLISH_DIR/" \ "$DEPLOY_USER@$DEPLOY_HOST:$REMOTE_DEPLOY_PATH/publish/" echo "✓ 파일 전송 완료" echo "" # ═══════════════════════════════════════════════════════════════ # Step 6: 권한 설정 및 서비스 재시작 # ═══════════════════════════════════════════════════════════════ echo "🔧 Step 5: 권한 설정 및 서비스 재시작..." ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'FINALIZE' set -e DEPLOY_PATH="/var/www/quant" echo " 권한 설정 중..." sudo chown -R www-data:www-data "$DEPLOY_PATH/publish" 2>/dev/null || true sudo chmod -R 755 "$DEPLOY_PATH/publish" 2>/dev/null || true echo " ✓ 권한 설정 완료" echo " nginx 재시작 중..." sudo systemctl restart nginx 2>/dev/null || echo " ⚠️ nginx 재시작 실패 (sudo 권한 확인)" sleep 2 if sudo systemctl is-active --quiet nginx 2>/dev/null; then echo " ✓ nginx 재시작 완료" else echo " ⚠️ nginx 상태 확인 필요" fi FINALIZE echo "" # ═══════════════════════════════════════════════════════════════ # Step 7: 헬스 체크 # ═══════════════════════════════════════════════════════════════ echo "🧪 Step 6: 헬스 체크..." for i in {1..5}; do HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \ http://$DEPLOY_HOST/quant/ 2>/dev/null || echo "000") if [ "$HTTP_CODE" = "200" ]; then echo "✓ Health check PASS (HTTP 200)" break fi echo " 시도 $i/5: HTTP $HTTP_CODE (대기 중...)" sleep 2 done echo "" # ═══════════════════════════════════════════════════════════════ # 배포 완료 # ═══════════════════════════════════════════════════════════════ echo "═══════════════════════════════════════════════════════════════" echo "✅ 배포 완료!" echo "═══════════════════════════════════════════════════════════════" echo "" echo "📊 배포 정보:" echo " URL: http://$DEPLOY_HOST/quant/" echo " 경로: $REMOTE_DEPLOY_PATH/publish" echo " 크기: $PACKAGE_SIZE" echo "" echo "🔍 로그 확인:" echo " ssh -i $SSH_KEY $DEPLOY_USER@$DEPLOY_HOST 'sudo tail -50 /var/log/nginx/error.log'" echo "" echo "🔄 롤백 (필요시):" echo " ssh -i $SSH_KEY $DEPLOY_USER@$DEPLOY_HOST << 'EOF'" echo " LATEST=\$(ls -t /var/www/quant_backup | head -1)" echo " sudo cp -r /var/www/quant_backup/\$LATEST/* /var/www/quant/publish/" echo " sudo systemctl restart nginx" echo " EOF" echo ""