chore: root 경로의 미사용/과거 문서 및 스크립트를 docs/ 하위로 정리 격리
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
#!/bin/bash
|
||||
# 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
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# 설정
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
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="/home/kjh2064/quantengine_active"
|
||||
REMOTE_BACKUP_PATH="/home/kjh2064/quantengine_backup"
|
||||
SERVICE_NAME="quantengine"
|
||||
|
||||
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 "Backup Path: $REMOTE_BACKUP_PATH"
|
||||
echo "Service: $SERVICE_NAME"
|
||||
echo "Public URL: http://178.104.200.7/quant/"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 1: SSH 연결 확인
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "📊 Step 1: SSH 연결 및 환경 파악..."
|
||||
|
||||
ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'ENVCHECK'
|
||||
echo "✓ SSH 연결 성공"
|
||||
echo ""
|
||||
echo "시스템 정보:"
|
||||
hostname
|
||||
uname -a
|
||||
echo ""
|
||||
|
||||
echo "디스크 상태:"
|
||||
df -h | grep -E "^/dev|Filesystem|/$"
|
||||
echo ""
|
||||
|
||||
echo "서비스 상태:"
|
||||
sudo systemctl status "$SERVICE_NAME" --no-pager 2>/dev/null | grep -E "Active:|Loaded:" || echo "⚠️ 서비스 상태 확인 필요"
|
||||
echo ""
|
||||
|
||||
echo "배포 디렉토리:"
|
||||
if [ -d "/home/kjh2064/quantengine_active" ]; then
|
||||
echo "✓ /home/kjh2064/quantengine_active 존재"
|
||||
ls -lh /home/kjh2064/quantengine_active | head -5
|
||||
echo "..."
|
||||
else
|
||||
echo "✗ /home/kjh2064/quantengine_active 없음 (첫 배포)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "Nginx 포트 확인:"
|
||||
sudo netstat -tuln 2>/dev/null | grep ":80\|:443" || echo "⚠️ 포트 확인 필요"
|
||||
echo ""
|
||||
|
||||
echo "Nginx 설정:"
|
||||
cat /etc/nginx/sites-available/gitea-ip.conf | grep -A 5 "location /quant" || echo "⚠️ Nginx 설정 확인 필요"
|
||||
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
|
||||
|
||||
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)"
|
||||
|
||||
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개만 유지
|
||||
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
|
||||
rm -rf "$BACKUP_DIR/$backup"
|
||||
echo "🧹 오래된 백업 삭제: $backup"
|
||||
done
|
||||
fi
|
||||
else
|
||||
echo "⚠️ 기존 배포 없음 (첫 배포)"
|
||||
mkdir -p "$DEPLOY_PATH"
|
||||
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/"
|
||||
|
||||
echo "✓ 파일 전송 완료"
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 6: 권한 설정 및 서비스 재시작
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🔧 Step 5: 파일 검증 및 서비스 시작..."
|
||||
|
||||
ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" << 'FINALIZE'
|
||||
set -e
|
||||
|
||||
SERVICE_NAME="quantengine"
|
||||
DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
|
||||
echo " 파일 검증 중..."
|
||||
if [ -f "$DEPLOY_PATH/QuantEngine.Web.dll" ]; then
|
||||
echo " ✓ QuantEngine.Web.dll 확인됨"
|
||||
else
|
||||
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
|
||||
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 7: 헬스 체크
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🧪 Step 6: 헬스 체크..."
|
||||
|
||||
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")
|
||||
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
echo "✓ Health check PASS (HTTP 200)"
|
||||
break
|
||||
fi
|
||||
|
||||
echo " 시도 $i/30: HTTP $HTTP_CODE (대기 중...)"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# 배포 완료
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo "✅ 배포 완료!"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "📊 배포 정보:"
|
||||
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 journalctl -u $SERVICE_NAME -f'"
|
||||
echo ""
|
||||
echo "🔄 롤백 (필요시):"
|
||||
echo " ssh -i $SSH_KEY $DEPLOY_USER@$DEPLOY_HOST << 'EOF'"
|
||||
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 ""
|
||||
@@ -0,0 +1,225 @@
|
||||
#!/bin/bash
|
||||
# Quant Engine Production Deployment Script (v9)
|
||||
# 환경: hz-prod-01, 공인IP 178.104.200.7, 내부 172.17.0.1
|
||||
# 배포 경로: /home/kjh2064/quantengine_active
|
||||
# Nginx 설정: /etc/nginx/sites-available/gitea-ip.conf (reverse proxy → localhost:5000)
|
||||
|
||||
set -e
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# 설정
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
DEPLOY_HOST="178.104.200.7"
|
||||
DEPLOY_INTERNAL_IP="172.17.0.1"
|
||||
DEPLOY_USER="kjh2064"
|
||||
DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
SERVICE_NAME="quantengine"
|
||||
BACKUP_PATH="/home/kjh2064/quantengine_backup"
|
||||
LOCAL_PUBLISH_DIR="$(pwd)/src/dotnet/QuantEngine.Web/publish"
|
||||
|
||||
echo "🚀 Quant Engine v9 Production Deployment"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo "Public URL: http://$DEPLOY_HOST/quant/"
|
||||
echo "Internal IP: $DEPLOY_INTERNAL_IP"
|
||||
echo "Deploy Path: $DEPLOY_PATH"
|
||||
echo "Service: $SERVICE_NAME"
|
||||
echo "Backup Path: $BACKUP_PATH"
|
||||
echo "Hostname: hz-prod-01"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 1: 배포 파일 준비
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "📦 Step 1: 배포 파일 확인..."
|
||||
|
||||
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 2: SSH 연결 확인
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🔐 Step 2: SSH 연결 확인..."
|
||||
|
||||
if ! ssh -o ConnectTimeout=10 "$DEPLOY_USER@$DEPLOY_HOST" "echo '✅ SSH 연결 성공'" &>/dev/null; then
|
||||
echo "❌ SSH 연결 실패"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ SSH 연결 확인됨"
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 3: 배포 전 확인
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "✅ 배포 전 확인:"
|
||||
echo " [ ] Release 빌드 완료됨 ($PACKAGE_SIZE)"
|
||||
echo " [ ] SSH 연결 가능"
|
||||
echo ""
|
||||
|
||||
read -p "배포를 진행하시겠습니까? (y/n) " -n 1 -r
|
||||
echo ""
|
||||
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "❌ 배포 취소됨"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 4: 서비스 중지 및 백업 생성
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🛑 Step 3: 서비스 중지 및 백업 생성..."
|
||||
|
||||
ssh "$DEPLOY_USER@$DEPLOY_HOST" << 'EOF'
|
||||
set -e
|
||||
|
||||
SERVICE_NAME="quantengine"
|
||||
DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
BACKUP_PATH="/home/kjh2064/quantengine_backup"
|
||||
BACKUP_NAME="quantengine_$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
echo " 서비스 중지 중..."
|
||||
sudo systemctl stop "$SERVICE_NAME" 2>/dev/null || true
|
||||
sleep 2
|
||||
echo " ✓ 서비스 중지 완료"
|
||||
|
||||
echo " 백업 생성 중..."
|
||||
mkdir -p "$BACKUP_PATH"
|
||||
if [ -d "$DEPLOY_PATH" ]; then
|
||||
cp -r "$DEPLOY_PATH" "$BACKUP_PATH/$BACKUP_NAME"
|
||||
echo " ✓ 백업 생성: $BACKUP_PATH/$BACKUP_NAME"
|
||||
|
||||
# 최근 5개만 유지
|
||||
BACKUP_COUNT=$(ls -1 "$BACKUP_PATH" | wc -l)
|
||||
if [ "$BACKUP_COUNT" -gt 5 ]; then
|
||||
OLD_BACKUPS=$(ls -1t "$BACKUP_PATH" | tail -n +6)
|
||||
for backup in $OLD_BACKUPS; do
|
||||
rm -rf "$BACKUP_PATH/$backup"
|
||||
echo " 🧹 오래된 백업 삭제: $backup"
|
||||
done
|
||||
fi
|
||||
else
|
||||
echo " ⚠️ 기존 배포 없음 (첫 배포)"
|
||||
mkdir -p "$DEPLOY_PATH"
|
||||
fi
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 5: 파일 전송
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "📤 Step 4: 파일 전송 (rsync)..."
|
||||
|
||||
rsync -avz --delete \
|
||||
--rsh="ssh" \
|
||||
"$LOCAL_PUBLISH_DIR/" \
|
||||
"$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/"
|
||||
|
||||
echo "✓ 파일 전송 완료"
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 6: 서비스 시작
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🚀 Step 5: 서비스 시작..."
|
||||
|
||||
ssh "$DEPLOY_USER@$DEPLOY_HOST" << 'EOF'
|
||||
set -e
|
||||
|
||||
SERVICE_NAME="quantengine"
|
||||
DEPLOY_PATH="/home/kjh2064/quantengine_active"
|
||||
|
||||
echo " 파일 검증 중..."
|
||||
if [ -f "$DEPLOY_PATH/QuantEngine.Web.dll" ]; then
|
||||
echo " ✓ QuantEngine.Web.dll 확인됨"
|
||||
else
|
||||
echo " ❌ QuantEngine.Web.dll 없음 (배포 실패)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " 서비스 시작 중..."
|
||||
sudo systemctl start "$SERVICE_NAME"
|
||||
sleep 3
|
||||
|
||||
if sudo systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
echo " ✓ $SERVICE_NAME 시작 완료"
|
||||
else
|
||||
echo " ❌ $SERVICE_NAME 시작 실패"
|
||||
sudo systemctl status "$SERVICE_NAME" || true
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Step 7: 헬스 체크
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "🧪 Step 6: 헬스 체크..."
|
||||
|
||||
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")
|
||||
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
echo "✓ Health check PASS (HTTP 200)"
|
||||
break
|
||||
fi
|
||||
|
||||
echo " 시도 $i/30: HTTP $HTTP_CODE (대기 중...)"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# 배포 완료
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo "✅ 배포 완료!"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "📊 배포 정보:"
|
||||
echo " 공인 URL: http://$DEPLOY_HOST/quant/"
|
||||
echo " 내부 IP: $DEPLOY_INTERNAL_IP"
|
||||
echo " 배포 경로: $DEPLOY_PATH"
|
||||
echo " 서비스: $SERVICE_NAME"
|
||||
echo " 백업: $BACKUP_PATH"
|
||||
echo ""
|
||||
echo "🔍 로그 확인:"
|
||||
echo " ssh $DEPLOY_USER@$DEPLOY_HOST 'sudo journalctl -u $SERVICE_NAME -f'"
|
||||
echo ""
|
||||
echo "🔄 롤백 (필요시):"
|
||||
echo " ssh $DEPLOY_USER@$DEPLOY_HOST << 'ROLLBACK'"
|
||||
echo " LATEST=\$(ls -t $BACKUP_PATH | head -1)"
|
||||
echo " cp -r $BACKUP_PATH/\$LATEST/* $DEPLOY_PATH/"
|
||||
echo " sudo systemctl restart $SERVICE_NAME"
|
||||
echo " ROLLBACK"
|
||||
echo ""
|
||||
echo "🌐 Nginx 역방향 프록시 구조:"
|
||||
echo " 공인 IP:178.104.200.7/quant/ → localhost:5000 (Nginx reverse proxy)"
|
||||
echo " Nginx 설정: /etc/nginx/sites-available/gitea-ip.conf"
|
||||
echo ""
|
||||
@@ -0,0 +1,123 @@
|
||||
#!/bin/bash
|
||||
# Quant Engine Web Service Deployment Script
|
||||
# 목표: publish 폴더를 웹 서버에 배포
|
||||
|
||||
set -e
|
||||
|
||||
# 설정
|
||||
SOURCE_DIR="src/dotnet/QuantEngine.Web/publish"
|
||||
DEPLOY_USER="kjh2064"
|
||||
DEPLOY_HOST="178.104.200.7"
|
||||
DEPLOY_PATH="/var/www/quant"
|
||||
SSH_KEY="${HOME}/.ssh/id_ed25519"
|
||||
|
||||
echo "🚀 Quant Engine 웹 서비스 배포 시작"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "소스: $SOURCE_DIR"
|
||||
echo "대상: $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# 1. 배포 폴더 생성/준비
|
||||
echo ""
|
||||
echo "📦 Step 1: 배포 폴더 준비..."
|
||||
if [ ! -d "$SOURCE_DIR" ]; then
|
||||
echo "❌ 오류: publish 폴더 없음. 먼저 'dotnet publish -c Release'를 실행하세요"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ publish 폴더 크기: $(du -sh $SOURCE_DIR | cut -f1)"
|
||||
echo "✓ 파일 수: $(find $SOURCE_DIR -type f | wc -l)"
|
||||
|
||||
# 2. SSH 연결 확인
|
||||
echo ""
|
||||
echo "🔐 Step 2: SSH 연결 확인..."
|
||||
if [ ! -f "$SSH_KEY" ]; then
|
||||
echo "❌ SSH 키 없음: $SSH_KEY"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ssh -i "$SSH_KEY" -o ConnectTimeout=10 "$DEPLOY_USER@$DEPLOY_HOST" "echo '✓ SSH 연결 성공'" || {
|
||||
echo "❌ SSH 연결 실패"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 3. 원격 백업
|
||||
echo ""
|
||||
echo "💾 Step 3: 원격 백업 생성..."
|
||||
BACKUP_DIR="/var/www/quant_backup_$(date +%Y%m%d_%H%M%S)"
|
||||
ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" \
|
||||
"sudo mkdir -p $DEPLOY_PATH && \
|
||||
if [ -d $DEPLOY_PATH/publish ]; then \
|
||||
sudo cp -r $DEPLOY_PATH/publish $BACKUP_DIR; \
|
||||
echo '✓ 백업 생성: $BACKUP_DIR'; \
|
||||
else \
|
||||
echo '✓ 기존 배포 없음'; \
|
||||
fi"
|
||||
|
||||
# 4. 배포
|
||||
echo ""
|
||||
echo "📤 Step 4: 파일 전송 중... (이 작업은 시간이 걸릴 수 있습니다)"
|
||||
rsync -av -e "ssh -i $SSH_KEY" \
|
||||
--delete \
|
||||
"$SOURCE_DIR/" \
|
||||
"$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/publish/" \
|
||||
|| {
|
||||
echo "❌ 배포 실패"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "✓ 파일 전송 완료"
|
||||
|
||||
# 5. 권한 설정
|
||||
echo ""
|
||||
echo "🔧 Step 5: 원격 권한 설정..."
|
||||
ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" \
|
||||
"sudo chown -R www-data:www-data $DEPLOY_PATH/publish && \
|
||||
sudo chmod -R 755 $DEPLOY_PATH/publish && \
|
||||
echo '✓ 권한 설정 완료'"
|
||||
|
||||
# 6. 웹 서버 재시작
|
||||
echo ""
|
||||
echo "🔄 Step 6: 웹 서버 재시작 중..."
|
||||
ssh -i "$SSH_KEY" "$DEPLOY_USER@$DEPLOY_HOST" \
|
||||
"sudo systemctl restart nginx && \
|
||||
sleep 2 && \
|
||||
sudo systemctl status nginx | grep Active && \
|
||||
echo '✓ nginx 재시작 완료'" \
|
||||
|| {
|
||||
echo "⚠️ nginx 재시작 실패 (수동으로 확인 필요)"
|
||||
}
|
||||
|
||||
# 7. 배포 확인
|
||||
echo ""
|
||||
echo "🧪 Step 7: 배포 확인..."
|
||||
sleep 2
|
||||
HEALTH_URL="http://178.104.200.7/quant/"
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" || echo "000")
|
||||
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
echo "✅ 배포 성공! URL: $HEALTH_URL"
|
||||
elif [ "$HTTP_CODE" = "301" ] || [ "$HTTP_CODE" = "302" ]; then
|
||||
echo "✓ 배포 완료 (리다이렉트: $HTTP_CODE)"
|
||||
else
|
||||
echo "⚠️ HTTP 상태: $HTTP_CODE (nginx 설정 확인 필요)"
|
||||
fi
|
||||
|
||||
# 8. 최종 보고
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✅ 배포 완료!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
echo "📋 배포 정보:"
|
||||
echo " 웹사이트: http://178.104.200.7/quant/"
|
||||
echo " 배포 경로: $DEPLOY_PATH/publish"
|
||||
echo " 백업 위치: $BACKUP_DIR (필요시)"
|
||||
echo ""
|
||||
echo "🔍 로그 확인:"
|
||||
echo " ssh $DEPLOY_USER@$DEPLOY_HOST"
|
||||
echo " sudo tail -f /var/log/nginx/error.log"
|
||||
echo " sudo tail -f /var/log/nginx/access.log"
|
||||
echo ""
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,202 @@
|
||||
#!/bin/bash
|
||||
# 원격 서버 환경 진단 스크립트
|
||||
# SSH로 접속한 후 이 스크립트를 실행하여 환경 정보를 수집합니다.
|
||||
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " 원격 서버 환경 진단"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# 1. 네트워크 정보
|
||||
echo "1️⃣ 네트워크 정보"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
echo "공인 IP (외부에서 접속 가능):"
|
||||
curl -s https://api.ipify.org
|
||||
echo ""
|
||||
|
||||
echo "내부 IP 목록:"
|
||||
ip addr show | grep -E "inet |inet6 " | grep -v "127.0.0.1"
|
||||
echo ""
|
||||
|
||||
echo "호스트명:"
|
||||
hostname
|
||||
echo ""
|
||||
|
||||
echo "네트워크 인터페이스:"
|
||||
ip link show | grep -E "^[0-9]+:|UP|DOWN"
|
||||
echo ""
|
||||
|
||||
# 2. 디렉토리 구조
|
||||
echo "2️⃣ 웹 서버 디렉토리 구조"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
# /var/www 확인
|
||||
if [ -d /var/www ]; then
|
||||
echo "✓ /var/www 존재"
|
||||
ls -la /var/www/ | head -20
|
||||
else
|
||||
echo "✗ /var/www 없음"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# /var/www/quant 확인
|
||||
if [ -d /var/www/quant ]; then
|
||||
echo "✓ /var/www/quant 존재"
|
||||
ls -la /var/www/quant/
|
||||
du -sh /var/www/quant/*
|
||||
else
|
||||
echo "✗ /var/www/quant 없음"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# /var/www/quant/publish 확인
|
||||
if [ -d /var/www/quant/publish ]; then
|
||||
echo "✓ /var/www/quant/publish 존재"
|
||||
ls -la /var/www/quant/publish/ | head -10
|
||||
du -sh /var/www/quant/publish
|
||||
else
|
||||
echo "✗ /var/www/quant/publish 없음 (첫 배포)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 3. Nginx 설정
|
||||
echo "3️⃣ Nginx 설정"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
if command -v nginx &> /dev/null; then
|
||||
echo "✓ Nginx 설치됨"
|
||||
nginx -v
|
||||
echo ""
|
||||
|
||||
echo "Nginx 설정 파일 위치:"
|
||||
nginx -T 2>/dev/null | grep "configuration file" | head -1
|
||||
echo ""
|
||||
|
||||
echo "Nginx 실행 사용자:"
|
||||
ps aux | grep nginx | grep -v grep | head -1
|
||||
echo ""
|
||||
|
||||
echo "/quant 관련 설정:"
|
||||
cat /etc/nginx/sites-available/default 2>/dev/null | grep -A 10 -B 2 "quant" || echo "quant 관련 설정 없음"
|
||||
echo ""
|
||||
else
|
||||
echo "✗ Nginx 미설치"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 4. 웹 서버 권한
|
||||
echo "4️⃣ 파일 권한 및 소유자"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
echo "웹 서버 사용자:"
|
||||
ps aux | grep -E "nginx|apache" | grep -v grep | head -1 | awk '{print $1}' || echo "확인 필요"
|
||||
echo ""
|
||||
|
||||
echo "/var/www 권한:"
|
||||
ls -ld /var/www
|
||||
echo ""
|
||||
|
||||
if [ -d /var/www/quant ]; then
|
||||
echo "/var/www/quant 권한:"
|
||||
ls -ld /var/www/quant
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ -d /var/www/quant/publish ]; then
|
||||
echo "/var/www/quant/publish 권한:"
|
||||
ls -ld /var/www/quant/publish
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 5. 포트 상태
|
||||
echo "5️⃣ 포트 상태"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
netstat -tuln 2>/dev/null | grep -E "^Proto|:80|:443" || ss -tuln | grep -E "LISTEN|:80|:443"
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
|
||||
# 6. 시스템 정보
|
||||
echo "6️⃣ 시스템 정보"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
echo "OS:"
|
||||
uname -a
|
||||
echo ""
|
||||
|
||||
echo "Linux 배포판:"
|
||||
lsb_release -a 2>/dev/null || cat /etc/os-release | head -3
|
||||
echo ""
|
||||
|
||||
echo "디스크 공간:"
|
||||
df -h | grep -E "^/dev|Filesystem"
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
|
||||
# 7. Sudo 권한
|
||||
echo "7️⃣ 현재 사용자 정보"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
echo "현재 사용자:"
|
||||
whoami
|
||||
echo ""
|
||||
|
||||
echo "사용자 그룹:"
|
||||
groups
|
||||
echo ""
|
||||
|
||||
echo "Sudo 권한:"
|
||||
sudo -l 2>/dev/null | grep -E "NOPASSWD|nginx|systemctl" || echo "sudo 권한 확인 필요"
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
|
||||
# 8. Git/Gitea 정보
|
||||
echo "8️⃣ Git/Gitea 정보"
|
||||
echo "───────────────────────────────────────────────────────────────"
|
||||
|
||||
if command -v git &> /dev/null; then
|
||||
echo "✓ Git 설치됨"
|
||||
git --version
|
||||
else
|
||||
echo "✗ Git 미설치"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
if command -v gitea &> /dev/null; then
|
||||
echo "✓ Gitea 설치됨"
|
||||
gitea -v
|
||||
else
|
||||
echo "✗ Gitea 미설치"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
if [ -d /var/lib/gitea ] || [ -d /home/git/gitea-repositories ]; then
|
||||
echo "Gitea 데이터 위치:"
|
||||
[ -d /var/lib/gitea ] && echo " /var/lib/gitea"
|
||||
[ -d /home/git/gitea-repositories ] && echo " /home/git/gitea-repositories"
|
||||
else
|
||||
echo "Gitea 데이터 위치: 확인 필요"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo "✅ 진단 완료"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "위 정보를 바탕으로 배포 스크립트를 업데이트합니다."
|
||||
echo ""
|
||||
echo "특히 확인할 사항:"
|
||||
echo " 1. 내부 IP 주소 (172로 시작하는 IP)"
|
||||
echo " 2. /var/www/quant 경로 (또는 다른 경로?)"
|
||||
echo " 3. 웹 서버 사용자 (www-data? nobody? 다른 사용자?)"
|
||||
echo " 4. Nginx 설정 파일 위치"
|
||||
echo " 5. /quant에 대한 nginx 설정"
|
||||
echo ""
|
||||
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env python3
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
|
||||
print("="*80)
|
||||
print("어드민 서버 & DB 연결 검증")
|
||||
print("="*80)
|
||||
|
||||
dbs = {
|
||||
'kis_data_collection.db': 'src/quant_engine/kis_data_collection.db',
|
||||
'snapshot_admin.db': 'src/quant_engine/snapshot_admin.db'
|
||||
}
|
||||
|
||||
all_ok = True
|
||||
|
||||
for name, path in dbs.items():
|
||||
if not Path(path).exists():
|
||||
print(f'[FAIL] {name} not found')
|
||||
all_ok = False
|
||||
continue
|
||||
|
||||
try:
|
||||
conn = sqlite3.connect(path)
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
||||
tables = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
# 각 테이블 행 수
|
||||
table_info = {}
|
||||
for table in tables:
|
||||
if table == 'sqlite_sequence':
|
||||
continue
|
||||
cursor.execute(f'SELECT COUNT(*) FROM {table}')
|
||||
count = cursor.fetchone()[0]
|
||||
table_info[table] = count
|
||||
|
||||
conn.close()
|
||||
|
||||
file_size = Path(path).stat().st_size / 1024
|
||||
print(f'\n[OK] {name} ({file_size:.2f} KB)')
|
||||
for table, count in sorted(table_info.items()):
|
||||
print(f' └─ {table}: {count} records')
|
||||
except Exception as e:
|
||||
print(f'\n[FAIL] {name}: {e}')
|
||||
all_ok = False
|
||||
|
||||
print("\n" + "="*80)
|
||||
if all_ok:
|
||||
print("[결과] [OK] 어드민 서버 & DB 모두 정상 접속")
|
||||
else:
|
||||
print("[결과] [FAIL] DB 연결 실패")
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python3
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
|
||||
db_path = 'src/quant_engine/kis_data_collection.db'
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 테이블 확인
|
||||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
||||
tables = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
print('='*80)
|
||||
print('KIS Data Collection DB Status')
|
||||
print('='*80)
|
||||
print(f'File size: {Path(db_path).stat().st_size / 1024:.2f} KB')
|
||||
print(f'Tables: {tables}')
|
||||
|
||||
# data_feed 레코드 조회
|
||||
if 'data_feed' in tables:
|
||||
cursor.execute('SELECT COUNT(*) FROM data_feed')
|
||||
count = cursor.fetchone()[0]
|
||||
print(f'\ndata_feed table: {count} records')
|
||||
|
||||
# 샘플 출력
|
||||
cursor.execute('''
|
||||
SELECT ticker, name, close_price, entry_date, entry_stage, sector
|
||||
FROM data_feed
|
||||
ORDER BY entry_date DESC
|
||||
''')
|
||||
|
||||
print('\n[Loaded Records]')
|
||||
for row in cursor.fetchall():
|
||||
ticker, name, price, date, stage, sector = row
|
||||
print(f' {ticker:8} | {name:15} | {price:>10.0f} KRW | {date} | {stage:4} | {sector}')
|
||||
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user