1+ #! /bin/bash
2+ source ./app-variables.sh # cd deploy/scripts
3+
4+ exec > >( gawk ' { print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' >> ../logs/deploy.log) 2>&1
5+
6+ BACKEND_DIR=../backend
7+ FRONTEND_DIR=../frontend
8+ AI_DIR=../ai-server
9+ VERSION_TAG=$( date +v%Y%m%d%H%M%S)
10+
11+ echo " ========== [0] 코드 rsync로 서버로 전송 =========="
12+
13+ rsync -avz -e " ssh -i $SSH_KEY " --exclude=node_modules $BACKEND_DIR ubuntu@$SERVER_IP :~ /tmp/
14+ rsync -avz -e " ssh -i $SSH_KEY " --exclude=node_modules $FRONTEND_DIR ubuntu@$SERVER_IP :~ /tmp/
15+ rsync -avz -e " ssh -i $SSH_KEY " $AI_DIR ubuntu@$SERVER_IP :~ /tmp/
16+
17+ echo " ✅ 임시 디렉토리로 코드 전송 완료"
18+
19+ echo " ========== [1] 서버 내 빌드/배포 및 롤백 준비 =========="
20+
21+ ssh -i $SSH_KEY ubuntu@$SERVER_IP << EOF
22+ sudo cp -r ~/tmp/backend ~/release/
23+ sudo cp -r ~/tmp/frontend ~/release/
24+ sudo cp -r ~/tmp/ai-server ~/release/
25+ sudo chown -R ubuntu:ubuntu ~/release
26+ echo "✅ release 디렉토리로 복사 완료"
27+
28+ echo "[1-1] 백엔드 빌드 시작..."
29+ cd ~/release/backend
30+ ./gradlew clean build -x test || {
31+ echo "❌ Gradle 빌드 실패. 배포 중단."
32+ exit 1
33+ }
34+
35+ echo "[1-2] 백엔드 실행 중단 및 새로운 JAR 연결..."
36+ pkill -f 'app.jar' || echo "기존 백엔드 없음"
37+
38+ JAR_PATH=\$ (ls -t build/libs/*.jar | grep -v plain | head -n 1)
39+ # echo "[디버그] 선택된 JAR_PATH: \$ JAR_PATH"
40+
41+ cp \$ JAR_PATH ~/release/app-${VERSION_TAG} .jar
42+ ln -sfn ~/release/app-${VERSION_TAG} .jar ~/app.jar
43+
44+ if [ -L ~/app.jar ]; then
45+ TARGET=\$ (readlink -f ~/app.jar)
46+ # echo "[디버그] 현재 TARGET 심볼릭 링크 대상: \$ TARGET"
47+ echo "$VERSION_TAG → \$ TARGET" >> ~/release/deployment-history.log
48+ echo "버전 기록 완료: $VERSION_TAG → \$ TARGET"
49+ fi
50+
51+ echo "[1-2-1] 새로운 백엔드 실행..."
52+ nohup java \
53+ -Dspring.profiles.active=dev \
54+ -DDB_URL="${DB_URL} " \
55+ -DDB_USERNAME="${DB_USERNAME} " \
56+ -DDB_PASSWORD="${DB_PASSWORD} " \
57+ -DJWT_SECRETS="${JWT_SECRETS} " \
58+ -DKAKAO_CLIENT_ID="${KAKAO_CLIENT_ID} " \
59+ -DKAKAO_REDIRECT_URI="${KAKAO_REDIRECT_URI} " \
60+ -jar ~/app.jar > ~/logs/backend.log 2>&1 &
61+
62+ sleep 5
63+ RUNNING=\$ (pgrep -f 'app.jar' || true)
64+
65+ if [ -z "\$ RUNNING" ]; then
66+ echo "❌ 새 백엔드 실행 실패 → 롤백 시작..."
67+ PREVIOUS_LINE=$( tail -n 2 ~ /release/deployment-history.log | head -n 1)
68+ PREVIOUS_VERSION=\$ (echo "\$ PREVIOUS_LINE" | awk '{print $3 }')
69+
70+ if [ -f "\$ PREVIOUS_VERSION" ]; then
71+ echo "🔄 이전 버전 (\$ PREVIOUS_VERSION)으로 롤백 중..."
72+ ln -sfn "\$ PREVIOUS_VERSION" ~/app.jar
73+
74+ nohup java \
75+ -Dspring.profiles.active=dev \
76+ -DDB_URL="${DB_URL} " \
77+ -DDB_USERNAME="${DB_USERNAME} " \
78+ -DDB_PASSWORD="${DB_PASSWORD} " \
79+ -DJWT_SECRETS="${JWT_SECRETS} " \
80+ -DKAKAO_CLIENT_ID="${KAKAO_CLIENT_ID} " \
81+ -DKAKAO_REDIRECT_URI="${KAKAO_REDIRECT_URI} " \
82+ -jar ~/app.jar > ~/logs/backend.log 2>&1 &
83+
84+ echo "✅ 이전 버전으로 롤백 완료."
85+ else
86+ echo "⚠️ 롤백 불가: 이전 JAR 없음."
87+ fi
88+ else
89+ echo "✅ 백엔드 새 버전 정상 실행됨."
90+ fi
91+
92+ echo "[1-3] 프론트엔드 빌드 시작..."
93+ cd ~/release/frontend
94+ pnpm install
95+
96+ echo "[1-3-1] 환경변수 파일(.env) 생성..."
97+ echo "VITE_KAKAOMAP_KEY=${VITE_KAKAOMAP_KEY} " > ~/release/frontend/.env
98+ echo "VITE_API_URL=\"https://api.${DOMAIN} \"" >> ~/release/frontend/.env
99+
100+ pnpm build
101+
102+ echo "[1-4] 프론트엔드 파일 배포..."
103+ sudo rm -rf /var/www/html/*
104+ sudo cp -r dist/* /var/www/html/
105+
106+ echo "[1-5] AI 서버 준비 및 패키지 설치..."
107+ cd ~/release/ai-server/summarizer_pipeline
108+ if [ ! -d "venv" ]; then
109+ python3.12 -m venv venv
110+ fi
111+ source venv/bin/activate
112+ pip install -r requirements.txt
113+
114+ EOF
115+
116+ echo " ✅ 서버 내 빌드 및 배포 완료 🎉"
0 commit comments