Files
QuantEngineByItz/deploy-manual.sh
T
kjh2064 f44e116e7f feat(deployment): Add SSH deployment script and comprehensive guide
SSH 기반 배포 자동화:

deploy-manual.sh:
  - 대화형 배포 스크립트
  - 환경 파악 (자동 SSH 확인)
  - 백업 생성 (5개 보관)
  - rsync 파일 전송
  - 권한 설정 (www-data)
  - nginx 재시작
  - 헬스 체크 (HTTP 200)

DEPLOYMENT_SSH_GUIDE.md:
  - SSH 키 설정 (최초 1회)
  - 환경 파악 단계별 가이드
  - Release 빌드
  - 배포 스크립트 실행
  - 검증 절차
  - 롤백 방법
  - 문제 해결 가이드

배포 방식:
  1. 자동: ./deploy-manual.sh 192.168.123.100
  2. 수동: SSH 접속 후 단계별 진행

네트워크:
  - 내부 IP: 192.168.123.100 (SSH 배포)
  - 외부 IP: 178.104.200.7 (사용자 접속)
  - 포트포워딩: 80/443

검증:
  - curl -I http://178.104.200.7/quant/
  - nginx 로그 확인
  - 브라우저 테스트

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-25 18:13:46 +09:00

227 lines
9.0 KiB
Bash

#!/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 ""