ERP-node/scripts/prod/start-all-linux-force.sh

289 lines
9.2 KiB
Bash
Executable File

#!/bin/bash
echo "============================================"
echo "WACE 솔루션 - 전체 서비스 시작 (강제 업데이트) - Linux"
echo "============================================"
echo ""
echo "🚀 최신 코드로 백엔드와 프론트엔드를 강제 업데이트하여 시작합니다..."
echo ""
# 시스템 정보 출력
echo "시스템 정보:"
echo " OS: $(uname -s)"
echo " Architecture: $(uname -m)"
echo " Kernel: $(uname -r)"
echo ""
# Docker 및 Docker Compose 버전 확인
echo "Docker 환경 확인:"
docker --version 2>/dev/null || echo " ❌ Docker가 설치되지 않았습니다."
docker-compose --version 2>/dev/null || echo " ❌ Docker Compose가 설치되지 않았습니다."
echo ""
# Git 상태 확인
echo "============================================"
echo "0. Git 상태 확인 및 최신 코드 동기화"
echo "============================================"
echo "현재 Git 상태:"
git status --porcelain
echo ""
echo "현재 브랜치: $(git branch --show-current)"
echo "최신 커밋: $(git log -1 --oneline)"
# 수정된 파일이 있는지 확인
if [ -n "$(git status --porcelain)" ]; then
echo ""
echo "⚠️ 수정된 파일이 있습니다. 다음 중 선택하세요:"
echo "1. 수정사항을 커밋하고 계속"
echo "2. 수정사항을 임시 저장(stash)하고 계속"
echo "3. 수정사항을 무시하고 강제 리셋 후 계속"
echo "4. 현재 상태로 빌드 계속"
echo ""
read -p "선택하세요 (1-4): " choice
case $choice in
1)
echo "변경사항을 커밋합니다..."
git add .
git commit -m "Auto commit before deployment - $(date)"
;;
2)
echo "변경사항을 임시 저장합니다..."
git stash push -m "Auto stash before deployment - $(date)"
;;
3)
echo "변경사항을 무시하고 강제 리셋합니다..."
git reset --hard HEAD
git clean -fd
;;
4)
echo "현재 상태로 계속합니다..."
;;
*)
echo "잘못된 선택입니다. 현재 상태로 계속합니다..."
;;
esac
fi
# 원격 저장소에서 최신 코드 가져오기
echo ""
echo "원격 저장소에서 최신 코드를 가져옵니다..."
git fetch origin
current_branch=$(git branch --show-current)
git pull origin $current_branch || echo "⚠️ Pull 실패 - 현재 상태로 계속합니다."
# 기존 컨테이너 및 이미지 완전 정리
echo ""
echo "============================================"
echo "1. 기존 서비스 완전 정리 중..."
echo "============================================"
# 모든 관련 컨테이너 중지 및 제거
echo "기존 컨테이너 중지 및 제거 중..."
docker-compose -f docker/prod/docker-compose.backend.prod.yml down -v --remove-orphans 2>/dev/null || true
docker-compose -f docker/prod/docker-compose.frontend.prod.yml down -v --remove-orphans 2>/dev/null || true
# 관련 컨테이너 강제 제거
docker stop pms-backend-prod pms-frontend-linux 2>/dev/null || true
docker rm pms-backend-prod pms-frontend-linux 2>/dev/null || true
# 관련 이미지 제거 (캐시 무효화)
echo "기존 이미지 제거 중..."
docker rmi $(docker images | grep -E "(pms-|erp-node)" | awk '{print $3}') 2>/dev/null || true
# Docker 시스템 정리
echo "Docker 시스템 정리 중..."
docker system prune -f --volumes 2>/dev/null || true
docker builder prune -f 2>/dev/null || true
# 네트워크 재생성
echo "네트워크 재생성..."
docker network rm pms-network 2>/dev/null || true
docker network create pms-network 2>/dev/null || echo "네트워크 생성 실패 - 기본 네트워크 사용"
# 백엔드 먼저 시작
echo ""
echo "============================================"
echo "2. 백엔드 서비스 시작 중..."
echo "============================================"
# 백엔드 의존성 체크
echo "백엔드 의존성 확인 중..."
if [ ! -f "backend-node/package.json" ]; then
echo "❌ backend-node/package.json을 찾을 수 없습니다."
exit 1
fi
if [ ! -f "backend-node/src/app.ts" ]; then
echo "❌ backend-node/src/app.ts를 찾을 수 없습니다."
exit 1
fi
# 백엔드 빌드 (캐시 무시)
echo "백엔드 이미지 빌드 중... (캐시 무시)"
docker-compose -f docker/prod/docker-compose.backend.prod.yml build --no-cache --pull
if [ $? -ne 0 ]; then
echo "❌ 백엔드 빌드 실패"
exit 1
fi
echo "백엔드 서비스 시작 중..."
docker-compose -f docker/prod/docker-compose.backend.prod.yml up -d
echo ""
echo "⏳ 백엔드 서비스 안정화 대기 중... (45초)"
sleep 45
# 백엔드 상태 확인
echo "백엔드 서비스 상태 확인:"
docker-compose -f docker/prod/docker-compose.backend.prod.yml ps
# 백엔드 로그 확인
echo ""
echo "백엔드 최근 로그:"
docker-compose -f docker/prod/docker-compose.backend.prod.yml logs --tail=10
# 프론트엔드 시작
echo ""
echo "============================================"
echo "3. 프론트엔드 서비스 시작 중..."
echo "============================================"
# 프론트엔드 의존성 체크
echo "프론트엔드 의존성 확인 중..."
if [ ! -f "frontend/package.json" ]; then
echo "❌ frontend/package.json을 찾을 수 없습니다."
exit 1
fi
if [ ! -f "frontend/next.config.mjs" ]; then
echo "❌ frontend/next.config.mjs를 찾을 수 없습니다."
exit 1
fi
echo "프론트엔드 이미지 빌드 중... (캐시 무시)"
docker-compose -f docker/prod/docker-compose.frontend.prod.yml build --no-cache --pull
if [ $? -ne 0 ]; then
echo "❌ 프론트엔드 빌드 실패"
exit 1
fi
echo "프론트엔드 서비스 시작 중..."
docker-compose -f docker/prod/docker-compose.frontend.prod.yml up -d
echo ""
echo "⏳ 프론트엔드 서비스 안정화 대기 중... (30초)"
sleep 30
# 프론트엔드 상태 확인
echo "프론트엔드 서비스 상태 확인:"
docker-compose -f docker/prod/docker-compose.frontend.prod.yml ps
# 프론트엔드 로그 확인
echo ""
echo "프론트엔드 최근 로그:"
docker-compose -f docker/prod/docker-compose.frontend.prod.yml logs --tail=10
echo ""
echo "============================================"
echo "🎉 모든 서비스가 시작되었습니다!"
echo "============================================"
echo ""
echo "📊 서비스 접속 정보:"
echo " [DATABASE] PostgreSQL: http://39.117.244.52:11132"
echo " [BACKEND] Spring Boot: http://localhost:8080/api"
echo " [FRONTEND] Next.js: http://localhost:5555"
echo ""
# 서비스 헬스체크
echo ""
echo "🏥 서비스 헬스체크 수행 중..."
echo ""
# 백엔드 헬스체크 (최대 2분 대기)
echo "백엔드 헬스체크..."
backend_healthy=false
for i in {1..24}; do
if curl -s -f http://localhost:8080/health >/dev/null 2>&1; then
echo " ✅ 백엔드 서비스 정상"
backend_healthy=true
break
else
echo " ⏳ 백엔드 응답 대기 중... ($i/24)"
sleep 5
fi
done
if [ "$backend_healthy" = false ]; then
echo " ❌ 백엔드 헬스체크 실패"
echo " 백엔드 로그:"
docker-compose -f docker/prod/docker-compose.backend.prod.yml logs --tail=20
fi
# 프론트엔드 헬스체크 (최대 1분 대기)
echo "프론트엔드 헬스체크..."
frontend_healthy=false
for i in {1..12}; do
if curl -s -f http://localhost:5555 >/dev/null 2>&1; then
echo " ✅ 프론트엔드 서비스 정상"
frontend_healthy=true
break
else
echo " ⏳ 프론트엔드 응답 대기 중... ($i/12)"
sleep 5
fi
done
if [ "$frontend_healthy" = false ]; then
echo " ❌ 프론트엔드 헬스체크 실패"
echo " 프론트엔드 로그:"
docker-compose -f docker/prod/docker-compose.frontend.prod.yml logs --tail=20
fi
# 최종 상태 요약
echo ""
echo "============================================"
echo "🎯 배포 완료 요약"
echo "============================================"
echo ""
echo "Git 정보:"
echo " 브랜치: $(git branch --show-current)"
echo " 커밋: $(git log -1 --oneline)"
echo " 상태: $(git status --porcelain | wc -l) 개의 수정된 파일"
echo ""
echo "서비스 상태:"
if [ "$backend_healthy" = true ]; then
echo " ✅ 백엔드: 정상"
else
echo " ❌ 백엔드: 오류"
fi
if [ "$frontend_healthy" = true ]; then
echo " ✅ 프론트엔드: 정상"
else
echo " ❌ 프론트엔드: 오류"
fi
echo ""
echo "🔧 유용한 명령어:"
echo " 전체 로그 확인: docker-compose -f docker/prod/docker-compose.backend.prod.yml -f docker/prod/docker-compose.frontend.prod.yml logs -f"
echo " 백엔드 로그: docker-compose -f docker/prod/docker-compose.backend.prod.yml logs -f"
echo " 프론트엔드 로그: docker-compose -f docker/prod/docker-compose.frontend.prod.yml logs -f"
echo " 컨테이너 상태: docker ps"
echo " 서비스 중지: ./stop-all-linux.sh"
echo ""
if [ "$backend_healthy" = true ] && [ "$frontend_healthy" = true ]; then
echo "🎯 성공! 브라우저에서 http://localhost:5555 을 확인하세요."
else
echo "⚠️ 일부 서비스에 문제가 있습니다. 로그를 확인해주세요."
fi
echo ""
read -p "계속하려면 Enter 키를 누르세요..."