feat(deploy): Add production deployment scripts for v9 quantengine
Add deploy-production.sh (new): - Automated deployment to hz-prod-01 (178.104.200.7) - Service lifecycle management: systemctl stop/start quantengine - Automatic backup to /home/kjh2064/quantengine_backup - File transfer via rsync to /home/kjh2064/quantengine_active - Health checks against public URL and service status - Rollback instructions with backup restoration Update deploy-manual.sh: - Interactive deployment with user confirmation - Updated for quantengine service (not nginx) - Deployment path: /home/kjh2064/quantengine_active - Backup path: /home/kjh2064/quantengine_backup - Nginx reverse proxy structure documentation - Comprehensive rollback procedures Both scripts: - SSH connection validation (178.104.200.7) - Environment diagnostics - Comprehensive logging and error handling - Support for internal and public IP access - Pre/post deployment validation Deployment Architecture: Public: http://178.104.200.7/quant/ → Nginx (reverse proxy) → localhost:5000 (quantengine service) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
+79
-52
@@ -1,6 +1,8 @@
|
||||
#!/bin/bash
|
||||
# Quant Engine Manual Deployment Script
|
||||
# 원격 서버에 직접 SSH 접속하여 환경 파악 후 배포
|
||||
# Quant Engine Manual Deployment Script (v9)
|
||||
# 환경: hz-prod-01 (178.104.200.7/172.17.0.1)
|
||||
# 배포 경로: /home/kjh2064/quantengine_active
|
||||
# 서비스: quantengine (systemd)
|
||||
|
||||
set -e
|
||||
|
||||
@@ -8,18 +10,23 @@ set -e
|
||||
# 설정
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
DEPLOY_HOST="${1:-192.168.123.100}"
|
||||
DEPLOY_HOST="${1:-178.104.200.7}"
|
||||
DEPLOY_USER="kjh2064"
|
||||
SSH_KEY="${HOME}/.ssh/id_ed25519"
|
||||
LOCAL_PUBLISH_DIR="$(pwd)/src/dotnet/QuantEngine.Web/publish"
|
||||
REMOTE_DEPLOY_PATH="/var/www/quant"
|
||||
REMOTE_DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
REMOTE_BACKUP_PATH="/home/kjh2064/quantengine_backup"
|
||||
SERVICE_NAME="quantengine"
|
||||
|
||||
echo "🚀 Quant Engine Manual Deployment"
|
||||
echo "🚀 Quant Engine v9 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 "Deploy Host: $DEPLOY_HOST"
|
||||
echo "Deploy User: $DEPLOY_USER"
|
||||
echo "Local Path: $LOCAL_PUBLISH_DIR"
|
||||
echo "Remote Path: $REMOTE_DEPLOY_PATH"
|
||||
echo "Backup Path: $REMOTE_BACKUP_PATH"
|
||||
echo "Service: $SERVICE_NAME"
|
||||
echo "Public URL: http://178.104.200.7/quant/"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
@@ -33,6 +40,7 @@ ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'ENVCHECK'
|
||||
echo "✓ SSH 연결 성공"
|
||||
echo ""
|
||||
echo "시스템 정보:"
|
||||
hostname
|
||||
uname -a
|
||||
echo ""
|
||||
|
||||
@@ -41,25 +49,25 @@ df -h | grep -E "^/dev|Filesystem|/$"
|
||||
echo ""
|
||||
|
||||
echo "서비스 상태:"
|
||||
sudo systemctl status nginx --no-pager 2>/dev/null | grep -E "Active:|Loaded:" || echo "⚠️ nginx 상태 확인 필요"
|
||||
sudo systemctl status "$SERVICE_NAME" --no-pager 2>/dev/null | grep -E "Active:|Loaded:" || echo "⚠️ 서비스 상태 확인 필요"
|
||||
echo ""
|
||||
|
||||
echo "웹 서버 디렉토리:"
|
||||
if [ -d /var/www/quant/publish ]; then
|
||||
echo "✓ /var/www/quant/publish 존재"
|
||||
ls -lh /var/www/quant/publish | head -5
|
||||
echo "배포 디렉토리:"
|
||||
if [ -d "/home/kjh2064/quantengine_active" ]; then
|
||||
echo "✓ /home/kjh2064/quantengine_active 존재"
|
||||
ls -lh /home/kjh2064/quantengine_active | head -5
|
||||
echo "..."
|
||||
else
|
||||
echo "✗ /var/www/quant/publish 없음 (첫 배포)"
|
||||
echo "✗ /home/kjh2064/quantengine_active 없음 (첫 배포)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "웹 서버 권한:"
|
||||
ls -ld /var/www/quant 2>/dev/null || echo "⚠️ /var/www/quant 없음"
|
||||
echo "Nginx 포트 확인:"
|
||||
sudo netstat -tuln 2>/dev/null | grep ":80\|:443" || echo "⚠️ 포트 확인 필요"
|
||||
echo ""
|
||||
|
||||
echo "Nginx 포트 확인:"
|
||||
sudo netstat -tuln 2>/dev/null | grep :80 || echo "⚠️ 포트 80 확인 필요"
|
||||
echo "Nginx 설정:"
|
||||
cat /etc/nginx/sites-available/gitea-ip.conf | grep -A 5 "location /quant" || echo "⚠️ Nginx 설정 확인 필요"
|
||||
ENVCHECK
|
||||
|
||||
echo ""
|
||||
@@ -105,20 +113,27 @@ fi
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 4: 백업 생성
|
||||
# Step 4: 서비스 중지 및 백업 생성
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "💾 Step 3: 백업 생성..."
|
||||
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)"
|
||||
SERVICE_NAME="quantengine"
|
||||
DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
BACKUP_DIR="/home/kjh2064/quantengine_backup"
|
||||
BACKUP_NAME="quantengine_$(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 " 서비스 중지 중..."
|
||||
sudo systemctl stop "$SERVICE_NAME" 2>/dev/null || true
|
||||
sleep 2
|
||||
echo " ✓ 서비스 중지"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
if [ -d "$DEPLOY_PATH" ]; then
|
||||
cp -r "$DEPLOY_PATH" "$BACKUP_DIR/$BACKUP_NAME"
|
||||
echo "✓ 백업 생성: $BACKUP_DIR/$BACKUP_NAME"
|
||||
|
||||
# 최근 5개만 유지
|
||||
@@ -126,12 +141,13 @@ if [ -d /var/www/quant/publish ]; then
|
||||
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"
|
||||
rm -rf "$BACKUP_DIR/$backup"
|
||||
echo "🧹 오래된 백업 삭제: $backup"
|
||||
done
|
||||
fi
|
||||
else
|
||||
echo "⚠️ 기존 배포 없음 (첫 배포)"
|
||||
mkdir -p "$DEPLOY_PATH"
|
||||
fi
|
||||
BACKUP
|
||||
|
||||
@@ -146,7 +162,7 @@ echo "📤 Step 4: 파일 전송 (rsync)..."
|
||||
rsync -avz --delete \
|
||||
--rsh="ssh -i $SSH_KEY" \
|
||||
"$LOCAL_PUBLISH_DIR/" \
|
||||
"$DEPLOY_USER@$DEPLOY_HOST:$REMOTE_DEPLOY_PATH/publish/"
|
||||
"$DEPLOY_USER@$DEPLOY_HOST:$REMOTE_DEPLOY_PATH/"
|
||||
|
||||
echo "✓ 파일 전송 완료"
|
||||
echo ""
|
||||
@@ -155,26 +171,31 @@ echo ""
|
||||
# Step 6: 권한 설정 및 서비스 재시작
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🔧 Step 5: 권한 설정 및 서비스 재시작..."
|
||||
echo "🔧 Step 5: 파일 검증 및 서비스 시작..."
|
||||
|
||||
ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'FINALIZE'
|
||||
set -e
|
||||
|
||||
DEPLOY_PATH="/var/www/quant"
|
||||
SERVICE_NAME="quantengine"
|
||||
DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
|
||||
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 재시작 완료"
|
||||
echo " 파일 검증 중..."
|
||||
if [ -f "$DEPLOY_PATH/QuantEngine.Web.dll" ]; then
|
||||
echo " ✓ QuantEngine.Web.dll 확인됨"
|
||||
else
|
||||
echo " ⚠️ nginx 상태 확인 필요"
|
||||
echo " ❌ QuantEngine.Web.dll 없음 (배포 실패)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " 서비스 시작 중..."
|
||||
sudo systemctl start "$SERVICE_NAME" 2>/dev/null || echo " ⚠️ 서비스 시작 실패"
|
||||
sleep 3
|
||||
|
||||
if sudo systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null; then
|
||||
echo " ✓ $SERVICE_NAME 시작 완료"
|
||||
else
|
||||
echo " ⚠️ 서비스 상태 확인"
|
||||
sudo systemctl status "$SERVICE_NAME" || true
|
||||
fi
|
||||
FINALIZE
|
||||
|
||||
@@ -186,16 +207,16 @@ echo ""
|
||||
|
||||
echo "🧪 Step 6: 헬스 체크..."
|
||||
|
||||
for i in {1..5}; do
|
||||
for i in {1..30}; do
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
http://$DEPLOY_HOST/quant/ 2>/dev/null || echo "000")
|
||||
"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 (대기 중...)"
|
||||
echo " 시도 $i/30: HTTP $HTTP_CODE (대기 중...)"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
@@ -210,17 +231,23 @@ echo "✅ 배포 완료!"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "📊 배포 정보:"
|
||||
echo " URL: http://$DEPLOY_HOST/quant/"
|
||||
echo " 경로: $REMOTE_DEPLOY_PATH/publish"
|
||||
echo " 크기: $PACKAGE_SIZE"
|
||||
echo " 공인 URL: http://$DEPLOY_HOST/quant/"
|
||||
echo " 배포 경로: $REMOTE_DEPLOY_PATH"
|
||||
echo " 백업 경로: $REMOTE_BACKUP_PATH"
|
||||
echo " 서비스: $SERVICE_NAME"
|
||||
echo " 패키지 크기: $PACKAGE_SIZE"
|
||||
echo ""
|
||||
echo "🌐 구조:"
|
||||
echo " Nginx: reverse proxy /quant/ → localhost:5000"
|
||||
echo " 설정: /etc/nginx/sites-available/gitea-ip.conf"
|
||||
echo ""
|
||||
echo "🔍 로그 확인:"
|
||||
echo " ssh -i $SSH_KEY $DEPLOY_USER@$DEPLOY_HOST 'sudo tail -50 /var/log/nginx/error.log'"
|
||||
echo " ssh -i $SSH_KEY $DEPLOY_USER@$DEPLOY_HOST 'sudo journalctl -u $SERVICE_NAME -f'"
|
||||
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 " LATEST=\$(ls -t $REMOTE_BACKUP_PATH | head -1)"
|
||||
echo " cp -r $REMOTE_BACKUP_PATH/\$LATEST/* $REMOTE_DEPLOY_PATH/"
|
||||
echo " sudo systemctl restart $SERVICE_NAME"
|
||||
echo " EOF"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user