#!/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 키를 누르세요..."