#!/bin/bash # # SAM React 배포 스크립트 # 사용법: ./deploy.sh [dev|prod] # set -e # 에러 발생 시 중단 # =========================================== # 설정 # =========================================== ENV="${1:-dev}" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BUILD_FILE="next-build.tar.gz" # 개발 서버 설정 DEV_SSH="hskwon@114.203.209.83" DEV_PATH="/home/webservice/react" DEV_PM2="sam-react" # 운영 서버 설정 (추후 설정) # PROD_SSH="user@prod-server" # PROD_PATH="/var/www/react" # PROD_PM2="sam-react-prod" # 환경별 설정 선택 case $ENV in dev) SSH_TARGET=$DEV_SSH REMOTE_PATH=$DEV_PATH PM2_APP=$DEV_PM2 ;; prod) echo "❌ 운영 환경은 아직 설정되지 않았습니다." exit 1 ;; *) echo "❌ 알 수 없는 환경: $ENV" echo "사용법: ./deploy.sh [dev|prod]" exit 1 ;; esac # =========================================== # 함수 정의 # =========================================== log() { echo "" echo "==========================================" echo "🚀 $1" echo "==========================================" } error() { echo "" echo "❌ 에러: $1" exit 1 } # =========================================== # 1. 빌드 # =========================================== log "Step 1/5: 빌드 시작" # .env.local 백업 if [ -f .env.local ]; then echo "📦 .env.local 백업..." mv .env.local .env.local.bak fi # 빌드 실행 echo "🔨 npm run build..." npm run build || { # 빌드 실패 시 .env.local 복원 if [ -f .env.local.bak ]; then mv .env.local.bak .env.local fi error "빌드 실패" } # .env.local 복원 if [ -f .env.local.bak ]; then echo "📦 .env.local 복원..." mv .env.local.bak .env.local fi echo "✅ 빌드 완료" # =========================================== # 2. 압축 # =========================================== log "Step 2/5: 압축 시작" # 기존 압축 파일 삭제 rm -f $BUILD_FILE # .next 폴더 압축 (캐시 제외) echo "📦 .next 폴더 압축 중..." COPYFILE_DISABLE=1 tar --exclude='.next/cache' -czf $BUILD_FILE .next # 파일 크기 확인 FILE_SIZE=$(ls -lh $BUILD_FILE | awk '{print $5}') echo "✅ 압축 완료: $BUILD_FILE ($FILE_SIZE)" # =========================================== # 3. 업로드 # =========================================== log "Step 3/5: 서버 업로드" echo "📤 $SSH_TARGET:$REMOTE_PATH 로 업로드 중..." scp $BUILD_FILE $SSH_TARGET:$REMOTE_PATH/ echo "✅ 업로드 완료" # =========================================== # 4. 원격 배포 실행 # =========================================== log "Step 4/5: 원격 배포 실행" echo "🔧 서버에서 배포 스크립트 실행 중..." ssh $SSH_TARGET << EOF cd $REMOTE_PATH echo "🗑️ 기존 .next 폴더 삭제..." rm -rf .next echo "📦 압축 해제 중..." tar xzf $BUILD_FILE echo "🔄 PM2 재시작..." pm2 restart $PM2_APP echo "🧹 압축 파일 정리..." rm -f $BUILD_FILE echo "✅ 서버 배포 완료" EOF # =========================================== # 5. 정리 # =========================================== log "Step 5/5: 로컬 정리" echo "🧹 로컬 압축 파일 삭제..." rm -f $BUILD_FILE # =========================================== # 완료 # =========================================== echo "" echo "==========================================" echo "🎉 배포 완료!" echo "==========================================" echo "환경: $ENV" echo "서버: $SSH_TARGET" echo "경로: $REMOTE_PATH" echo "시간: $(date '+%Y-%m-%d %H:%M:%S')" echo "=========================================="